Skip to content

Commit

Permalink
Merge pull request #126 from maximehuran/feature/avoid-proxies-issues
Browse files Browse the repository at this point in the history
Correct `index: /<INDEX_NAME>/_doc/<ID> caused failed to parse` errors
  • Loading branch information
maximehuran committed Jun 7, 2022
2 parents d2930f0 + 087c288 commit 46d2aab
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 4 deletions.
33 changes: 29 additions & 4 deletions dist/src/Migrations/Version20220406160423.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,42 @@ public function up(Schema $schema): void
{
if ($schema->hasTable('messenger_messages')) {
$this->addSql('ALTER TABLE messenger_messages CHANGE queue_name queue_name VARCHAR(190) NOT NULL');
$this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)');
$this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)');
if (!$this->tableHasIndexOnColumns('messenger_messages', ['queue_name'])) {
$this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)');
}
if (!$this->tableHasIndexOnColumns('messenger_messages', ['available_at'])) {
$this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)');
}
}
}

public function down(Schema $schema): void
{
if ($schema->hasTable('messenger_messages')) {
$this->addSql('DROP INDEX IDX_75EA56E0FB7336F0 ON messenger_messages');
$this->addSql('DROP INDEX IDX_75EA56E0E3BD61CE ON messenger_messages');
if ($this->tableHasIndexOnColumns('messenger_messages', ['queue_name'])) {
$this->addSql('DROP INDEX IDX_75EA56E0FB7336F0 ON messenger_messages');
}
if ($this->tableHasIndexOnColumns('messenger_messages', ['available_at'])) {
$this->addSql('DROP INDEX IDX_75EA56E0E3BD61CE ON messenger_messages');
}
$this->addSql('ALTER TABLE messenger_messages CHANGE queue_name queue_name VARCHAR(255) CHARACTER SET utf8mb4 NOT NULL COLLATE `utf8mb4_unicode_ci`');
}
}

private function tableHasIndexOnColumns(string $table, array $columns): bool
{
$indexes = $this->connection->getSchemaManager()->listTableIndexes($table);
foreach ($indexes as $index) {
foreach ($index->getColumns() as $column) {
// Another column exists in index
if (($key = array_search($column, $columns, true)) === false) {
continue 2;
}
unset($columns[$key]);
}
}

// Table has all columns in index if the given array in empty at the end
return empty($columns);
}
}
26 changes: 26 additions & 0 deletions src/Index/Indexer.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

namespace MonsieurBiz\SyliusSearchPlugin\Index;

use Doctrine\Common\Proxy\Proxy;
use Doctrine\ORM\EntityManagerInterface;
use Elastica\Document;
use Jane\Component\AutoMapper\AutoMapperInterface;
Expand Down Expand Up @@ -149,6 +150,7 @@ private function indexDocumentable(DocumentableInterface $documentable, ?string

$indexer = $this->clientFactory->getIndexer($documentable, $locale);
foreach ($documentable->getDatasource()->getItems($documentable->getSourceClass()) as $item) {
$item = $this->getRealEntity($item);
if (null !== $locale && $item instanceof TranslatableInterface) {
$item->setCurrentLocale($locale);
}
Expand All @@ -167,4 +169,28 @@ private function getIndexName(DocumentableInterface $documentable, ?string $loca
{
return $documentable->getIndexCode() . strtolower(null !== $locale ? '_' . $locale : '');
}

/**
* Convert proxies classes to the entity one.
*
* This avoid to retrieve the incorrect Mapper and have errors like :
* `index: /<INDEX_NAME>/_doc/<ID> caused failed to parse`
*
* @param mixed $entity
*
* @return mixed
*/
private function getRealEntity($entity)
{
if (!$entity instanceof Proxy || !method_exists($entity, 'getId')) {
return $entity;
}

// Clear the entity manager to detach the proxy object
$this->entityManager->clear(\get_class($entity));
// Retrieve the original class name
$entityClassName = $this->entityManager->getClassMetadata(\get_class($entity))->rootEntityName;
// Find the object in repository from the ID
return $this->entityManager->find($entityClassName, $entity->getId());
}
}

0 comments on commit 46d2aab

Please sign in to comment.