Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correct index: /<INDEX_NAME>/_doc/<ID> caused failed to parse errors #126

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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());
}
}