diff --git a/src/Database/Database.php b/src/Database/Database.php index 318b795a9..f6ea312d1 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -6754,42 +6754,67 @@ public function getLimitForIndexes(): int * @param array $queries * @return array * @throws QueryException - * @throws Exception + * @throws \Utopia\Database\Exception + */ + public static function convertQueries(Document $collection, array $queries): array + { + foreach ($queries as $index => $query) { + if ($query->isNested()) { + $values = self::convertQueries($collection, $query->getValues()); + $query->setValues($values); + } + + $query = self::convertQuery($collection, $query); + + $queries[$index] = $query; + } + + return $queries; + } + + /** + * @param Document $collection + * @param Query $query + * @return Query + * @throws QueryException + * @throws \Utopia\Database\Exception */ - public function convertQueries(Document $collection, array $queries): array + public static function convertQuery(Document $collection, Query $query): Query { + /** + * @var array $attributes + */ $attributes = $collection->getAttribute('attributes', []); foreach (Database::INTERNAL_ATTRIBUTES as $attribute) { $attributes[] = new Document($attribute); } - foreach ($attributes as $attribute) { - foreach ($queries as $query) { - if ($query->getAttribute() === $attribute->getId()) { - $query->setOnArray($attribute->getAttribute('array', false)); - } + $attribute = new Document(); + + foreach ($attributes as $attr) { + if ($attr->getId() === $query->getAttribute()) { + $attribute = $attr; } + } + + if (! $attribute->isEmpty()) { + $query->setOnArray($attribute->getAttribute('array', false)); if ($attribute->getAttribute('type') == Database::VAR_DATETIME) { - foreach ($queries as $index => $query) { - if ($query->getAttribute() === $attribute->getId()) { - $values = $query->getValues(); - foreach ($values as $valueIndex => $value) { - try { - $values[$valueIndex] = DateTime::setTimezone($value); - } catch (\Throwable $e) { - throw new QueryException($e->getMessage(), $e->getCode(), $e); - } - } - $query->setValues($values); - $queries[$index] = $query; + $values = $query->getValues(); + foreach ($values as $valueIndex => $value) { + try { + $values[$valueIndex] = DateTime::setTimezone($value); + } catch (\Throwable $e) { + throw new QueryException($e->getMessage(), $e->getCode(), $e); } } + $query->setValues($values); } } - return $queries; + return $query; } /** diff --git a/tests/e2e/Adapter/Scopes/AttributeTests.php b/tests/e2e/Adapter/Scopes/AttributeTests.php index 3a7ebea05..89ab81a50 100644 --- a/tests/e2e/Adapter/Scopes/AttributeTests.php +++ b/tests/e2e/Adapter/Scopes/AttributeTests.php @@ -1677,6 +1677,17 @@ public function testCreateDatetime(): void Query::equal('date', [$date]) ]); $this->assertCount(0, $docs); + + /** + * Test convertQueries on nested queries + */ + $docs = $database->find('datetime', [ + Query::or([ + Query::equal('$createdAt', [$date]), + Query::equal('date', [$date]) + ]), + ]); + $this->assertCount(0, $docs); } }