diff --git a/app/workers/database.php b/app/workers/database.php index 6cdcead7b..0ca7aa45f 100644 --- a/app/workers/database.php +++ b/app/workers/database.php @@ -120,24 +120,53 @@ class DatabaseV1 extends Worker $dbForInternal->updateDocument('attributes', $attribute->getId(), $attribute->setAttribute('status', 'failed')); } - // the underlying database removes/rebuilds indexes when attribute is removed - // update indexes table with changes + // The underlying database removes/rebuilds indexes when attribute is removed + // Update indexes table with changes /** @var Document[] $indexes */ $indexes = $collection->getAttribute('indexes', []); foreach ($indexes as $index) { /** @var string[] $attributes */ - $attributes = $index->getAttribute('attributes'); - $found = array_search($key, $attributes); + $attributes = $index->getAttribute('attributes'); + $lengths = $index->getAttribute('lengths'); + $orders = $index->getAttribute('orders'); + + $found = \array_search($key, $attributes); if ($found !== false) { - $remove = [$attributes[$found]]; - $attributes = array_diff($attributes, $remove); // remove attribute from array + // If found, remove entry from attributes, lengths, and orders + // array_values wraps array_diff to reindex array keys + // when found attribute is removed from array + $attributes = \array_values(\array_diff($attributes, [$attributes[$found]])); + $lengths = \array_values(\array_diff($lengths, [$lengths[$found]])); + $orders = \array_values(\array_diff($orders, [$orders[$found]])); if (empty($attributes)) { $dbForInternal->deleteDocument('indexes', $index->getId()); } else { - $dbForInternal->updateDocument('indexes', $index->getId(), $index->setAttribute('attributes', $attributes, Document::SET_TYPE_ASSIGN)); + $index + ->setAttribute('attributes', $attributes, Document::SET_TYPE_ASSIGN) + ->setAttribute('lengths', $lengths, Document::SET_TYPE_ASSIGN) + ->setAttribute('orders', $orders, Document::SET_TYPE_ASSIGN) + ; + + // Check if an index exists with the same attributes and orders + $exists = false; + foreach ($indexes as $existing) { + if ($existing->getAttribute('key') !== $index->getAttribute('key') // Ignore itself + && $existing->getAttribute('attributes') === $index->getAttribute('attributes') + && $existing->getAttribute('orders') === $index->getAttribute('orders') + ) { + $exists = true; + break; + } + } + + if ($exists) { // Delete the duplicate if created, else update in db + $this->deleteIndex($collection, $index, $projectId); + } else { + $dbForInternal->updateDocument('indexes', $index->getId(), $index); + } } } } @@ -190,7 +219,7 @@ class DatabaseV1 extends Worker try { if(!$dbForExternal->deleteIndex($collectionId, $key)) { - throw new Exception('Failed to delete Attribute'); + throw new Exception('Failed to delete index'); } $dbForInternal->deleteDocument('indexes', $index->getId());