From 64cbbc29b34c1aaf489b7e69674e8365e7888fc6 Mon Sep 17 00:00:00 2001 From: Stephane Rathgeber Date: Fri, 6 Oct 2023 17:38:17 +0200 Subject: [PATCH 1/4] add interface to allow user to add his own logical --- src/Command/ImportCommand.php | 33 +++++----- src/DataProvider/ArrayDataProvider.php | 24 +++++++ src/DataProvider/DataProvider.php | 8 +++ src/DataProvider/EntityDataProvider.php | 23 +++++++ src/Resources/config/services.xml | 5 ++ src/Transformer/AbstractTransformer.php | 58 +++++++++++------ .../ArrayToTypesenseTransformer.php | 63 +++++++++++++++++++ .../DoctrineToTypesenseTransformer.php | 48 +------------- src/Transformer/Transformer.php | 24 +++++++ 9 files changed, 205 insertions(+), 81 deletions(-) create mode 100644 src/DataProvider/ArrayDataProvider.php create mode 100644 src/DataProvider/DataProvider.php create mode 100644 src/DataProvider/EntityDataProvider.php create mode 100644 src/Transformer/ArrayToTypesenseTransformer.php create mode 100644 src/Transformer/Transformer.php diff --git a/src/Command/ImportCommand.php b/src/Command/ImportCommand.php index 0aedef8..e9e04a0 100644 --- a/src/Command/ImportCommand.php +++ b/src/Command/ImportCommand.php @@ -4,9 +4,12 @@ namespace ACSEO\TypesenseBundle\Command; +use ACSEO\TypesenseBundle\DataProvider\DataProvider; use ACSEO\TypesenseBundle\Manager\CollectionManager; use ACSEO\TypesenseBundle\Manager\DocumentManager; -use ACSEO\TypesenseBundle\Transformer\DoctrineToTypesenseTransformer; +use ACSEO\TypesenseBundle\Transformer\Transformer; +use Doctrine\Common\Util\ClassUtils; +use Doctrine\ORM\AbstractQuery; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -22,6 +25,7 @@ class ImportCommand extends Command private $collectionManager; private $documentManager; private $transformer; + private $dataProvider; private const ACTIONS = [ 'create', 'upsert', @@ -33,13 +37,15 @@ public function __construct( EntityManagerInterface $em, CollectionManager $collectionManager, DocumentManager $documentManager, - DoctrineToTypesenseTransformer $transformer + Transformer $transformer, + DataProvider $dataProvider ) { parent::__construct(); $this->em = $em; $this->collectionManager = $collectionManager; $this->documentManager = $documentManager; $this->transformer = $transformer; + $this->dataProvider = $dataProvider; } protected function configure() @@ -65,8 +71,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 1; } - $action = $input->getOption('action'); - // 'setMiddlewares' method only exists for Doctrine version >=3.0.0 if (method_exists($this->em->getConnection()->getConfiguration(), 'setMiddlewares')) { $this->em->getConnection()->getConfiguration()->setMiddlewares( @@ -126,8 +130,8 @@ private function populateIndex(InputInterface $input, OutputInterface $output, s $collectionDefinition = $collectionDefinitions[$index]; $action = $input->getOption('action'); - $firstPage = $input->getOption('first-page'); - $maxPerPage = $input->getOption('max-per-page'); + $firstPage = (int) $input->getOption('first-page'); + $maxPerPage = (int) $input->getOption('max-per-page'); $collectionName = $collectionDefinition['typesense_name']; $class = $collectionDefinition['entity']; @@ -151,21 +155,14 @@ private function populateIndex(InputInterface $input, OutputInterface $output, s $io->text('['.$collectionName.'] '.$class.' '.$nbEntities.' entries to insert splited into '.$nbPages.' pages of '.$maxPerPage.' elements. Insertion from page '.$firstPage.' to '.$lastPage.'.'); - for ($i = $firstPage; $i <= $lastPage; ++$i) { - $q = $this->em->createQuery('select e from '.$class.' e') - ->setFirstResult(($i - 1) * $maxPerPage) - ->setMaxResults($maxPerPage) - ; + $entityClass = ClassUtils::getRealClass($class); - if ($io->isDebug()) { - $io->text('Running request : '.$q->getSQL()); - } - - $entities = $q->toIterable(); + for ($i = $firstPage; $i <= $lastPage; ++$i) { + $elements = $this->dataProvider->getData($class, $i, $maxPerPage); $data = []; - foreach ($entities as $entity) { - $data[] = $this->transformer->convert($entity); + foreach ($elements as $element) { + $data[] = $this->transformer->convert($element, $entityClass); } $io->text('Import ['.$collectionName.'] '.$class.' Page '.$i.' of '.$lastPage.' ('.count($data).' items)'); diff --git a/src/DataProvider/ArrayDataProvider.php b/src/DataProvider/ArrayDataProvider.php new file mode 100644 index 0000000..a8f0370 --- /dev/null +++ b/src/DataProvider/ArrayDataProvider.php @@ -0,0 +1,24 @@ +em = $em; + } + + public function getData(string $className, int $page, int $maxPerPage): iterable + { + return $this->em->createQuery('select e from '.$className.' e') + ->setFirstResult(($page - 1) * $maxPerPage) + ->setMaxResults($maxPerPage) + ->toIterable(hydrationMode: AbstractQuery::HYDRATE_ARRAY); + } +} diff --git a/src/DataProvider/DataProvider.php b/src/DataProvider/DataProvider.php new file mode 100644 index 0000000..3fcd0ec --- /dev/null +++ b/src/DataProvider/DataProvider.php @@ -0,0 +1,8 @@ +em = $em; + } + + public function getData(string $className, int $page, int $maxPerPage): iterable + { + return $this->em->createQuery('select e from '.$className.' e') + ->setFirstResult(($page - 1) * $maxPerPage) + ->setMaxResults($maxPerPage) + ->toIterable(); + } +} diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index 52ee081..00f1629 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -68,6 +68,10 @@ + + + + @@ -80,6 +84,7 @@ + diff --git a/src/Transformer/AbstractTransformer.php b/src/Transformer/AbstractTransformer.php index 2d3e426..8a25dda 100644 --- a/src/Transformer/AbstractTransformer.php +++ b/src/Transformer/AbstractTransformer.php @@ -4,8 +4,10 @@ namespace ACSEO\TypesenseBundle\Transformer; -abstract class AbstractTransformer +abstract class AbstractTransformer implements Transformer { + protected array $entityToCollectionMapping; + protected array $collectionDefinitions; public const TYPE_COLLECTION = 'collection'; public const TYPE_DATETIME = 'datetime'; public const TYPE_PRIMARY = 'primary'; @@ -16,23 +18,6 @@ abstract class AbstractTransformer public const TYPE_INT_64 = 'int64'; public const TYPE_BOOL = 'bool'; - /** - * Convert an object to a array of data indexable by typesense. - * - * @param object $entity the object to convert - * - * @return array the converted data - */ - abstract public function convert(object $entity): array; - - /** - * Convert a value to an acceptable value for typesense. - * - * @param string $objectClass the object class name - * @param string $properyName the property of the object - * @param [type] $value the value to convert - */ - abstract public function castValue(string $objectClass, string $properyName, $value); /** * map a type to a typesense type field. @@ -57,4 +42,41 @@ public function castType(string $type): string return $type; } + + public function castValue(string $entityClass, string $propertyName, $value) + { + $collection = $this->entityToCollectionMapping[$entityClass]; + $key = array_search( + $propertyName, + array_column( + $this->collectionDefinitions[$collection]['fields'], + 'name' + ), true + ); + $collectionFieldsDefinitions = array_values($this->collectionDefinitions[$collection]['fields']); + $originalType = $collectionFieldsDefinitions[$key]['type']; + $castedType = $this->castType($originalType); + + switch ($originalType.$castedType) { + case self::TYPE_DATETIME.self::TYPE_INT_64: + if ($value instanceof \DateTimeInterface) { + return $value->getTimestamp(); + } + + return null; + case self::TYPE_OBJECT.self::TYPE_STRING: + return $value->__toString(); + case self::TYPE_COLLECTION.self::TYPE_ARRAY_STRING: + return array_values( + $value->map(function ($v) { + return $v->__toString(); + })->toArray() + ); + case self::TYPE_STRING.self::TYPE_STRING: + case self::TYPE_PRIMARY.self::TYPE_STRING: + return (string) $value; + default: + return $value; + } + } } diff --git a/src/Transformer/ArrayToTypesenseTransformer.php b/src/Transformer/ArrayToTypesenseTransformer.php new file mode 100644 index 0000000..24c1557 --- /dev/null +++ b/src/Transformer/ArrayToTypesenseTransformer.php @@ -0,0 +1,63 @@ +collectionDefinitions = $collectionDefinitions; + + $this->entityToCollectionMapping = []; + foreach ($this->collectionDefinitions as $collection => $collectionDefinition) { + $this->entityToCollectionMapping[$collectionDefinition['entity']] = $collection; + } + } + + public function convert($element,string $className = null): array + { + if(!is_array($element)){ + throw new \Exception(sprintf('Data must be an array')); + } + + foreach ($this->entityToCollectionMapping as $class => $collection) { + if (is_a($className, $class, true)) { + $className = $class; + break; + } + } + + if (!isset($this->entityToCollectionMapping[$className])) { + throw new \Exception(sprintf('Class %s is not supported for Doctrine To Typesense Transformation', $className)); + } + + $data = []; + + $fields = $this->collectionDefinitions[$this->entityToCollectionMapping[$className]]['fields']; + + foreach ($fields as $fieldsInfo) { + try { + $value = $element[$fieldsInfo['entity_attribute']]; + } catch (RuntimeException $exception) { + $value = null; + } + + $name = $fieldsInfo['name']; + + $data[$name] = $this->castValue( + $className, + $name, + $value + ); + } + + return $data; + } +} diff --git a/src/Transformer/DoctrineToTypesenseTransformer.php b/src/Transformer/DoctrineToTypesenseTransformer.php index d7c9d0f..e9d0501 100644 --- a/src/Transformer/DoctrineToTypesenseTransformer.php +++ b/src/Transformer/DoctrineToTypesenseTransformer.php @@ -11,8 +11,6 @@ class DoctrineToTypesenseTransformer extends AbstractTransformer { - private $collectionDefinitions; - private $entityToCollectionMapping; private $accessor; private $container; @@ -28,7 +26,7 @@ public function __construct(array $collectionDefinitions, PropertyAccessorInterf } } - public function convert($entity): array + public function convert($element, string $className): array { $entityClass = ClassUtils::getClass($entity); @@ -48,7 +46,7 @@ public function convert($entity): array $data = []; - $fields = $this->collectionDefinitions[$this->entityToCollectionMapping[$entityClass]]['fields']; + $fields = $this->collectionDefinitions[$this->entityToCollectionMapping[$className]]['fields']; foreach ($fields as $fieldsInfo) { $entityAttribute = $fieldsInfo['entity_attribute']; @@ -66,7 +64,7 @@ public function convert($entity): array $name = $fieldsInfo['name']; $data[$name] = $this->castValue( - $entityClass, + $className, $name, $value ); @@ -75,45 +73,6 @@ public function convert($entity): array return $data; } - public function castValue(string $entityClass, string $propertyName, $value) - { - $collection = $this->entityToCollectionMapping[$entityClass]; - $key = array_search( - $propertyName, - array_column( - $this->collectionDefinitions[$collection]['fields'], - 'name' - ), true - ); - $collectionFieldsDefinitions = array_values($this->collectionDefinitions[$collection]['fields']); - $originalType = $collectionFieldsDefinitions[$key]['type']; - $castedType = $this->castType($originalType); - - switch ($originalType.$castedType) { - case self::TYPE_DATETIME.self::TYPE_INT_64: - if ($value instanceof \DateTimeInterface) { - return $value->getTimestamp(); - } - - return null; - case self::TYPE_OBJECT.self::TYPE_STRING: - return $value->__toString(); - case self::TYPE_COLLECTION.self::TYPE_ARRAY_STRING: - return array_values( - $value->map(function ($v) { - return $v->__toString(); - })->toArray() - ); - case self::TYPE_STRING.self::TYPE_STRING: - case self::TYPE_PRIMARY.self::TYPE_STRING: - return (string) $value; - case self::TYPE_BOOL.self::TYPE_BOOL: - return (bool) $value; - default: - return $value; - } - } - private function getFieldValueFromService($entity, $entityAttribute) { $values = explode('::', $entityAttribute); @@ -127,5 +86,4 @@ private function getFieldValueFromService($entity, $entityAttribute) return null; } - } diff --git a/src/Transformer/Transformer.php b/src/Transformer/Transformer.php new file mode 100644 index 0000000..d45df8e --- /dev/null +++ b/src/Transformer/Transformer.php @@ -0,0 +1,24 @@ + Date: Wed, 11 Oct 2023 18:16:30 +0200 Subject: [PATCH 2/4] add container for service with tag --- src/DataProvider/ContextAwareDataProvider.php | 8 +++++ src/DataProvider/DataProviderContainer.php | 30 +++++++++++++++++++ src/DataProvider/EntityDataProvider.php | 7 ++++- .../ACSEOTypesenseExtension.php | 16 ++++++++++ src/Resources/config/services.xml | 26 ++++++++++++---- src/Transformer/AbstractTransformer.php | 4 +-- .../ArrayToTypesenseTransformer.php | 11 +++---- src/Transformer/ContextAwareTransformer.php | 8 +++++ .../DoctrineToTypesenseTransformer.php | 9 ++++-- src/Transformer/Transformer.php | 11 +------ src/Transformer/TransformerContainer.php | 30 +++++++++++++++++++ .../DoctrineToTypesenseTransformerTest.php | 2 +- 12 files changed, 136 insertions(+), 26 deletions(-) create mode 100644 src/DataProvider/ContextAwareDataProvider.php create mode 100644 src/DataProvider/DataProviderContainer.php create mode 100644 src/Transformer/ContextAwareTransformer.php create mode 100644 src/Transformer/TransformerContainer.php diff --git a/src/DataProvider/ContextAwareDataProvider.php b/src/DataProvider/ContextAwareDataProvider.php new file mode 100644 index 0000000..21fe81a --- /dev/null +++ b/src/DataProvider/ContextAwareDataProvider.php @@ -0,0 +1,8 @@ + $dataProviders + */ + private iterable $dataProviders; + + /** + * @param iterable $dataProviders + */ + public function __construct(iterable $dataProviders) + { + $this->dataProviders = $dataProviders; + } + + public function getData(string $className, int $page, int $maxPerPage): iterable + { + foreach ($this->dataProviders as $dataProvider) { + if ($dataProvider->supports($className)) { + return $dataProvider->getData($className, $page, $maxPerPage); + } + } + + throw new \RuntimeException('No data provider found for '.$className); + } +} diff --git a/src/DataProvider/EntityDataProvider.php b/src/DataProvider/EntityDataProvider.php index dbc9adf..d4244d2 100644 --- a/src/DataProvider/EntityDataProvider.php +++ b/src/DataProvider/EntityDataProvider.php @@ -4,7 +4,7 @@ use Doctrine\ORM\EntityManagerInterface; -readonly class EntityDataProvider implements DataProvider +class EntityDataProvider implements ContextAwareDataProvider { private EntityManagerInterface $em; @@ -20,4 +20,9 @@ public function getData(string $className, int $page, int $maxPerPage): iterabl ->setMaxResults($maxPerPage) ->toIterable(); } + + public function supports(string $className): bool + { + return $this->em->getMetadataFactory()->hasMetadataFor($className); + } } diff --git a/src/DependencyInjection/ACSEOTypesenseExtension.php b/src/DependencyInjection/ACSEOTypesenseExtension.php index d4a46c2..697af3d 100644 --- a/src/DependencyInjection/ACSEOTypesenseExtension.php +++ b/src/DependencyInjection/ACSEOTypesenseExtension.php @@ -4,6 +4,8 @@ namespace ACSEO\TypesenseBundle\DependencyInjection; +use ACSEO\TypesenseBundle\DataProvider\ContextAwareDataProvider; +use ACSEO\TypesenseBundle\Transformer\ContextAwareTransformer; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -61,9 +63,21 @@ public function load(array $configs, ContainerBuilder $container) $this->loadFinderServices($container); $this->loadTransformer($container); + + $this->loadTaggedServices($container); + $this->configureController($container); } + // Add tag to services + private function loadTaggedServices(ContainerBuilder $container) + { + $container->registerForAutoconfiguration(ContextAwareDataProvider::class) + ->addTag('typesense.context_aware_data_provider'); + $container->registerForAutoconfiguration(ContextAwareTransformer::class) + ->addTag('typesense.context_aware_transformer'); + } + /** * Loads the configured clients. * @@ -160,6 +174,8 @@ private function loadTransformer(ContainerBuilder $container) { $managerDef = $container->getDefinition('typesense.transformer.doctrine_to_typesense'); $managerDef->replaceArgument(0, $this->collectionsConfig); + $managerDef = $container->getDefinition('typesense.transformer.array_to_typesense'); + $managerDef->replaceArgument(0, $this->collectionsConfig); } /** diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index 00f1629..6be02b2 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd"> - + - - + + + + + + + + + + + + + + @@ -83,8 +99,8 @@ - - + + diff --git a/src/Transformer/AbstractTransformer.php b/src/Transformer/AbstractTransformer.php index 8a25dda..b4ae0ea 100644 --- a/src/Transformer/AbstractTransformer.php +++ b/src/Transformer/AbstractTransformer.php @@ -6,8 +6,6 @@ abstract class AbstractTransformer implements Transformer { - protected array $entityToCollectionMapping; - protected array $collectionDefinitions; public const TYPE_COLLECTION = 'collection'; public const TYPE_DATETIME = 'datetime'; public const TYPE_PRIMARY = 'primary'; @@ -18,6 +16,8 @@ abstract class AbstractTransformer implements Transformer public const TYPE_INT_64 = 'int64'; public const TYPE_BOOL = 'bool'; + protected array $entityToCollectionMapping; + protected array $collectionDefinitions; /** * map a type to a typesense type field. diff --git a/src/Transformer/ArrayToTypesenseTransformer.php b/src/Transformer/ArrayToTypesenseTransformer.php index 24c1557..d224519 100644 --- a/src/Transformer/ArrayToTypesenseTransformer.php +++ b/src/Transformer/ArrayToTypesenseTransformer.php @@ -9,7 +9,7 @@ use Symfony\Component\PropertyAccess\Exception\RuntimeException; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; -class ArrayToTypesenseTransformer extends AbstractTransformer implements Transformer +class ArrayToTypesenseTransformer extends AbstractTransformer implements ContextAwareTransformer { public function __construct(array $collectionDefinitions) { @@ -23,10 +23,6 @@ public function __construct(array $collectionDefinitions) public function convert($element,string $className = null): array { - if(!is_array($element)){ - throw new \Exception(sprintf('Data must be an array')); - } - foreach ($this->entityToCollectionMapping as $class => $collection) { if (is_a($className, $class, true)) { $className = $class; @@ -60,4 +56,9 @@ public function convert($element,string $className = null): array return $data; } + + public function supports(mixed $element, string $className = null) + { + return is_array($element) && $className !== null && isset($this->entityToCollectionMapping[$className]); + } } diff --git a/src/Transformer/ContextAwareTransformer.php b/src/Transformer/ContextAwareTransformer.php new file mode 100644 index 0000000..6698a1f --- /dev/null +++ b/src/Transformer/ContextAwareTransformer.php @@ -0,0 +1,8 @@ +entityToCollectionMapping[$className]); + } } diff --git a/src/Transformer/Transformer.php b/src/Transformer/Transformer.php index d45df8e..22c88d9 100644 --- a/src/Transformer/Transformer.php +++ b/src/Transformer/Transformer.php @@ -12,13 +12,4 @@ interface Transformer */ public function convert($element, string $className): array; - /** - * Convert a value to an acceptable value for typesense. - * - * @param string $objectClass the object class name - * @param string $properyName the property of the object - * @param [type] $value the value to convert - */ - public function castValue(string $objectClass, string $properyName, $value); - -} \ No newline at end of file +} diff --git a/src/Transformer/TransformerContainer.php b/src/Transformer/TransformerContainer.php new file mode 100644 index 0000000..b7e0ed1 --- /dev/null +++ b/src/Transformer/TransformerContainer.php @@ -0,0 +1,30 @@ + $transformers + */ + private iterable $transformers; + + /** + * @param iterable $transformers + */ + public function __construct(iterable $transformers) + { + $this->transformers = $transformers; + } + + public function convert($element, string $className): array + { + foreach ($this->transformers as $transformer) { + if ($transformer->supports($element, $className)) { + return $transformer->convert($element, $className); + } + } + + throw new \Exception(sprintf('No transformer found for class %s', $className)); + } +} diff --git a/tests/Unit/Transformer/DoctrineToTypesenseTransformerTest.php b/tests/Unit/Transformer/DoctrineToTypesenseTransformerTest.php index 95a8332..79dd3cf 100644 --- a/tests/Unit/Transformer/DoctrineToTypesenseTransformerTest.php +++ b/tests/Unit/Transformer/DoctrineToTypesenseTransformerTest.php @@ -274,4 +274,4 @@ private function getContainerInstance() $containerInstance->set('ACSEO\TypesenseBundle\Tests\Functional\Service\ExceptionBookConverter', new ExceptionBookConverter()); return $containerInstance; } -} \ No newline at end of file +} From 603b01e387e6cc9007dcec6d288b50b9e078ff04 Mon Sep 17 00:00:00 2001 From: Stephane Rathgeber Date: Wed, 25 Oct 2023 18:20:33 +0200 Subject: [PATCH 3/4] call convert with className --- src/EventListener/TypesenseIndexer.php | 15 +++++++++------ .../DoctrineToTypesenseTransformer.php | 6 +++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/EventListener/TypesenseIndexer.php b/src/EventListener/TypesenseIndexer.php index 01221f3..26233b0 100644 --- a/src/EventListener/TypesenseIndexer.php +++ b/src/EventListener/TypesenseIndexer.php @@ -42,8 +42,9 @@ public function postPersist(LifecycleEventArgs $args) return; } - $collection = $this->getCollectionName($entity); - $data = $this->transformer->convert($entity); + $collection = $this->getCollectionName($entity); + $entityClass = ClassUtils::getRealClass($entity); + $data = $this->transformer->convert($entity, $entityClass); $this->documentsToIndex[] = [$collection, $data]; } @@ -61,8 +62,10 @@ public function postUpdate(LifecycleEventArgs $args) $this->checkPrimaryKeyExists($collectionConfig); - $collection = $this->getCollectionName($entity); - $data = $this->transformer->convert($entity); + $collection = $this->getCollectionName($entity); + $entityClass = ClassUtils::getClass($entity); + + $data = $this->transformer->convert($entity, $entityClass); $this->documentsToUpdate[] = [$collection, $data['id'], $data]; } @@ -85,8 +88,8 @@ public function preRemove(LifecycleEventArgs $args) if ($this->entityIsNotManaged($entity)) { return; } - - $data = $this->transformer->convert($entity); + $entityClass = ClassUtils::getClass($entity); + $data = $this->transformer->convert($entity, $entityClass); $this->objetsIdThatCanBeDeletedByObjectHash[spl_object_hash($entity)] = $data['id']; } diff --git a/src/Transformer/DoctrineToTypesenseTransformer.php b/src/Transformer/DoctrineToTypesenseTransformer.php index 77b9409..7fd216a 100644 --- a/src/Transformer/DoctrineToTypesenseTransformer.php +++ b/src/Transformer/DoctrineToTypesenseTransformer.php @@ -28,12 +28,12 @@ public function __construct(array $collectionDefinitions, PropertyAccessorInterf public function convert($entity, string $className): array { - $entityClass = ClassUtils::getClass($entity); + $entityClass = $className; // See : https://github.com/acseo/TypesenseBundle/pull/91 // Allow subclasses to be recognized as a parent class foreach (array_keys($this->entityToCollectionMapping) as $class) { - if (is_a($entityClass, $class, true)) { + if (is_a($className, $class, true)) { $entityClass = $class; break; } @@ -46,7 +46,7 @@ public function convert($entity, string $className): array $data = []; - $fields = $this->collectionDefinitions[$this->entityToCollectionMapping[$className]]['fields']; + $fields = $this->collectionDefinitions[$this->entityToCollectionMapping[$entityClass]]['fields']; foreach ($fields as $fieldsInfo) { $entityAttribute = $fieldsInfo['entity_attribute']; From d31f551bfc4e632b0ae5ec22f68f6c11d499f727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rathgeber=20St=C3=A9phane?= Date: Mon, 30 Oct 2023 17:15:56 +0100 Subject: [PATCH 4/4] Need the class name not the class --- src/EventListener/TypesenseIndexer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EventListener/TypesenseIndexer.php b/src/EventListener/TypesenseIndexer.php index 26233b0..9007d77 100644 --- a/src/EventListener/TypesenseIndexer.php +++ b/src/EventListener/TypesenseIndexer.php @@ -43,7 +43,7 @@ public function postPersist(LifecycleEventArgs $args) } $collection = $this->getCollectionName($entity); - $entityClass = ClassUtils::getRealClass($entity); + $entityClass = ClassUtils::getClass($entity); $data = $this->transformer->convert($entity, $entityClass); $this->documentsToIndex[] = [$collection, $data];