3
0

Compare commits

...

22 Commits

Author SHA1 Message Date
brabli efc9b17136 Fix outdated code 2026-05-05 11:00:43 +01:00
brabli d3de91ea0b Update deps 2026-05-05 11:00:29 +01:00
brabli f9700e1959 Add general composer command 2026-05-05 10:41:53 +01:00
brabli 92bd22ad99 Update container php ver 2026-05-05 10:41:46 +01:00
brabli 5548df12bd Replace makefile with justfile 2026-05-05 10:38:28 +01:00
mf 6e2c241349 Adding formatting 2023-01-09 16:19:16 +00:00
mf 802413f754 Fixing deprecation 2023-01-09 16:07:13 +00:00
mf e56ea29018 Adding batching to index command for performance 2023-01-09 16:06:37 +00:00
mf 3faec6370c Merge tag '0.0.18' into develop
Trying to load custom Doctrine config
2022-07-29 11:27:46 +01:00
mf 361cd7baf8 Merge branch 'release/0.0.18' 2022-07-29 11:27:31 +01:00
mf 6111bd07e5 Updating Doctrine settings 2022-07-29 11:27:21 +01:00
mf 76ab724d1a Merge branch 'develop' of ssh://git.pcmdev.co.uk:2222/pcm-libraries/pcm-search-bundle into develop 2022-07-29 11:18:59 +01:00
mf d7a7d0b6e8 Merge tag '0.0.17' into develop
- Adding loader for doctrine.yaml to bring in MATCH AGAINST function
2022-07-29 11:18:49 +01:00
mf 3f57c78d01 Merge branch 'release/0.0.17' 2022-07-29 11:18:35 +01:00
mf e88da82267 Added loader for doctrine.yaml to bring in MATCH AGAINST method 2022-07-29 11:18:20 +01:00
Brabli 709c641fc9 Migrate xml schema 2022-07-21 15:10:19 +01:00
Brabli ff506e2aef Add tests command 2022-07-21 15:10:05 +01:00
Brabli 702fe24be4 Add space 2022-07-21 11:51:47 +01:00
mf 319334834b Merge tag '0.0.16' into develop
Working on DI 0.0.16
2022-07-20 21:29:45 +01:00
mf 9bad1cb2b9 Merge branch 'release/0.0.16' 2022-07-20 21:29:43 +01:00
mf df927a8197 Adding doctrine.yaml config 2022-07-20 21:29:33 +01:00
mf 5c98989631 Merge tag '0.0.15' into develop
Working on DI 0.0.15
2022-07-20 21:26:13 +01:00
11 changed files with 115 additions and 69 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
FROM php:8.1-alpine FROM php:8.4-alpine
WORKDIR /code WORKDIR /code
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
-10
View File
@@ -1,10 +0,0 @@
PHP = docker compose run php
composer_install:
@$(PHP) composer install
composer_update:
@$(PHP) composer update
static_analysis:
@$(PHP) vendor/bin/psalm
+9 -8
View File
@@ -3,16 +3,17 @@
"description": "Provides a search system for Symfony projects", "description": "Provides a search system for Symfony projects",
"type": "symfony-bundle", "type": "symfony-bundle",
"require": { "require": {
"php": ">=8.0", "php": ">=8.2",
"beberlei/doctrineextensions": "^1.3", "beberlei/doctrineextensions": "^1.5",
"doctrine/doctrine-bundle": "^2.7", "doctrine/doctrine-bundle": "^2.13",
"doctrine/orm": "^2.12", "doctrine/orm": "^2.20 || ^3.3",
"symfony/framework-bundle": "*" "doctrine/persistence": "^3.3 || ^4.0",
"symfony/framework-bundle": "^6.4 || ^7.0"
}, },
"require-dev": { "require-dev": {
"vimeo/psalm": "^4.24", "vimeo/psalm": "^6.0",
"psalm/plugin-symfony": "^3.1", "psalm/plugin-symfony": "^5.2",
"phpunit/phpunit": "^9.5" "phpunit/phpunit": "^11.0 || ^12.0"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
+1 -5
View File
@@ -8,11 +8,7 @@ services:
tags: tags:
- { name: 'console.command', command: 'pcm:search:reindex' } - { name: 'console.command', command: 'pcm:search:reindex' }
pcm_search.searchable_subscriber: Pcm\SearchBundle\EventSubscriber\SearchableSubscriber: ~
class: Pcm\SearchBundle\EventSubscriber\SearchableSubscriber
public: true
tags:
- { name: doctrine.event_subscriber }
pcm_search.search_service: pcm_search.search_service:
alias: Pcm\SearchBundle\Service\SearchService alias: Pcm\SearchBundle\Service\SearchService
+17
View File
@@ -0,0 +1,17 @@
php := "docker compose run php"
composer-install:
@{{php}} composer install
composer-update:
@{{php}} composer update
composer *args:
@{{php}} composer {{args}}
static-analysis:
@{{php}} vendor/bin/psalm
tests:
@{{php}} rm -rf var/cache
@{{php}} vendor/bin/phpunit
-13
View File
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true" bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="Test Suite">
<directory suffix="Test.php">./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./src</directory>
</whitelist>
</filter>
</phpunit>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd" backupGlobals="false" colors="true" bootstrap="./vendor/autoload.php">
<coverage>
<include>
<directory>./src</directory>
</include>
</coverage>
<php>
<ini name="error_reporting" value="-1"/>
<ini name="intl.default_locale" value="en"/>
<ini name="intl.error_level" value="0"/>
<ini name="memory_limit" value="-1"/>
</php>
<testsuites>
<testsuite name="Test suite">
<directory suffix="Test.php">./tests</directory>
</testsuite>
</testsuites>
</phpunit>
+36 -7
View File
@@ -2,10 +2,12 @@
namespace Pcm\SearchBundle\Command; namespace Pcm\SearchBundle\Command;
use Doctrine\ORM\EntityManagerInterface;
use Pcm\SearchBundle\Entity\SearchIndex; use Pcm\SearchBundle\Entity\SearchIndex;
use Pcm\SearchBundle\Service\SearchService; use Pcm\SearchBundle\Service\SearchService;
use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Attribute\AsCommand;
@@ -23,7 +25,16 @@ class SearchIndexCommand extends Command
parent::__construct(); parent::__construct();
} }
protected function configure(): void {} protected function configure(): void
{
$this->addOption(
'batchsize',
'b',
InputOption::VALUE_REQUIRED,
'Number of rows to process before flushing',
2000
);
}
protected function execute(InputInterface $input, OutputInterface $output): int protected function execute(InputInterface $input, OutputInterface $output): int
{ {
@@ -42,29 +53,47 @@ class SearchIndexCommand extends Command
$progress_bar->setProgressCharacter("<fg=green>➤</>"); $progress_bar->setProgressCharacter("<fg=green>➤</>");
$progress_bar->start(); $progress_bar->start();
$batchSize = $input->getOption('batchsize');
$searchEntities = null;
foreach ($searchables as $searchable) { foreach ($searchables as $searchable) {
$entities = $this $entities = $this
->em ->em
->getRepository($searchable) ->getRepository($searchable)
->findAll(); ->findAll();
$searchEntities[] = [$searchable, count($entities)];
$this->em->clear();
$counter = 1;
foreach ($entities as $entity) { foreach ($entities as $entity) {
$search_result = $this->searchService->createSearchResult($entity); $search_result = $this->searchService->createSearchResult($entity);
$this->em->persist($search_result); $this->em->persist($search_result);
if (($counter % $batchSize) === 0) {
$this->em->flush();
$this->em->clear();
}
$counter++;
} }
$progress_bar->advance(); $progress_bar->advance();
$this->em->flush();
$this->em->clear();
} }
$this->em->flush();
$progress_bar->finish(); $progress_bar->finish();
$io->writeln('');
$io->writeln(''); $io->writeln('');
$table = new Table($output);
$table
->setHeaders(['Class', 'Count'])
->setRows($searchEntities)
;
$table->render();
$io->writeln('');
$io->success('Index updated'); $io->success('Index updated');
return Command::SUCCESS; return Command::SUCCESS;
+18 -1
View File
@@ -6,11 +6,28 @@ namespace Pcm\SearchBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class PcmSearchExtension extends Extension class PcmSearchExtension extends Extension implements PrependExtensionInterface
{ {
public function prepend(ContainerBuilder $container)
{
$container->loadFromExtension(
'doctrine',
[
'orm' => [
'dql' => [
'string_functions' => [
'match' => 'DoctrineExtensions\Query\Mysql\MatchAgainst'
]
]
]
]
);
}
public function load(array $configs, ContainerBuilder $container) public function load(array $configs, ContainerBuilder $container)
{ {
$loader = new YamlFileLoader( $loader = new YamlFileLoader(
+11 -15
View File
@@ -6,24 +6,20 @@ namespace Pcm\SearchBundle\EventSubscriber;
use Pcm\SearchBundle\Entity\Interface\SearchableInterface; use Pcm\SearchBundle\Entity\Interface\SearchableInterface;
use Pcm\SearchBundle\Service\SearchService; use Pcm\SearchBundle\Service\SearchService;
use Doctrine\Common\EventSubscriber; use Doctrine\Bundle\DoctrineBundle\Attribute\AsDoctrineListener;
use Doctrine\Persistence\Event\LifecycleEventArgs; use Doctrine\ORM\Event\PostPersistEventArgs;
use Doctrine\ORM\Event\PostUpdateEventArgs;
use Doctrine\ORM\Event\PreRemoveEventArgs;
use Doctrine\ORM\Events; use Doctrine\ORM\Events;
class SearchableSubscriber implements EventSubscriber #[AsDoctrineListener(event: Events::postPersist)]
#[AsDoctrineListener(event: Events::postUpdate)]
#[AsDoctrineListener(event: Events::preRemove)]
class SearchableSubscriber
{ {
public function __construct(private SearchService $searchService) {} public function __construct(private SearchService $searchService) {}
public function getSubscribedEvents() public function postUpdate(PostUpdateEventArgs $args): void
{
return [
Events::postPersist,
Events::postUpdate,
Events::preRemove
];
}
public function postUpdate(LifecycleEventArgs $args)
{ {
$entity = $args->getObject(); $entity = $args->getObject();
@@ -32,7 +28,7 @@ class SearchableSubscriber implements EventSubscriber
} }
} }
public function postPersist(LifecycleEventArgs $args) public function postPersist(PostPersistEventArgs $args): void
{ {
$entity = $args->getObject(); $entity = $args->getObject();
@@ -41,7 +37,7 @@ class SearchableSubscriber implements EventSubscriber
} }
} }
public function preRemove(LifecycleEventArgs $args) public function preRemove(PreRemoveEventArgs $args): void
{ {
$entity = $args->getObject(); $entity = $args->getObject();
+2 -8
View File
@@ -6,9 +6,7 @@ namespace Pcm\SearchBundle\Service;
use Pcm\SearchBundle\Entity\SearchIndex; use Pcm\SearchBundle\Entity\SearchIndex;
use Pcm\SearchBundle\Entity\Interface\SearchableInterface; use Pcm\SearchBundle\Entity\Interface\SearchableInterface;
use Doctrine\Common\Util\ClassUtils;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Proxy\Proxy;
class SearchService class SearchService
{ {
@@ -38,7 +36,7 @@ class SearchService
*/ */
public function unIndex(SearchableInterface $entity) public function unIndex(SearchableInterface $entity)
{ {
$class = get_class($entity); $class = $this->em->getClassMetadata($entity::class)->getName();
$search_result = $this $search_result = $this
->em ->em
@@ -69,11 +67,7 @@ class SearchService
$data = implode(' ', $values); $data = implode(' ', $values);
$class = get_class($entity); $class = $this->em->getClassMetadata($entity::class)->getName();
if ($entity instanceof Proxy) {
$class = ClassUtils::getRealClass($class);
}
$searchResult = $this $searchResult = $this
->em ->em