From 5a2c4b6988b292a1cb52776151f405e004ec5f31 Mon Sep 17 00:00:00 2001 From: Bas Date: Sat, 4 Sep 2021 16:30:56 +0200 Subject: [PATCH] - Fixed improper passing of collection registration from a subquery to its parent. - Correct tests namespacing --- composer.json | 3 +- src/Expressions/QueryExpression.php | 12 ++--- tests/Unit/AQL/ArrayFunctionsTest.php | 2 +- tests/Unit/AQL/DateFunctionsTest.php | 2 +- tests/Unit/AQL/DocumentFunctionsTest.php | 2 +- .../{Clauses => AQL}/FilterClauseTest.php | 4 +- tests/Unit/AQL/GeoFunctionsTest.php | 2 +- tests/Unit/AQL/GraphClausesTest.php | 2 +- tests/Unit/AQL/MiscellaneousFunctionsTest.php | 2 +- tests/Unit/AQL/NumericFunctionsTest.php | 2 +- tests/Unit/AQL/OperatorExpressionsTest.php | 2 +- tests/Unit/AQL/QueryClausesTest.php | 5 +- tests/Unit/AQL/StatementClausesTest.php | 7 +-- tests/Unit/AQL/StringFunctionsTest.php | 2 +- tests/Unit/AQL/SupportCommandsTest.php | 2 +- .../Expressions/LiteralExpressionTest.php | 2 +- tests/Unit/Expressions/NullExpressionTest.php | 2 +- .../Expressions/PredicateExpressionTest.php | 6 +-- .../Unit/Expressions/QueryExpressionTest.php | 2 +- tests/Unit/GrammarTest.php | 5 +- tests/Unit/QueryBuilderTest.php | 2 +- tests/Unit/SubqueryTest.php | 46 ++++++++++++++++++- 22 files changed, 81 insertions(+), 35 deletions(-) rename tests/Unit/{Clauses => AQL}/FilterClauseTest.php (77%) diff --git a/composer.json b/composer.json index 3858202..51e4e75 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,8 @@ }, "autoload": { "psr-4": { - "LaravelFreelancerNL\\FluentAQL\\": "src" + "LaravelFreelancerNL\\FluentAQL\\": "src", + "Tests\\": "tests" } }, "autoload-dev": { diff --git a/src/Expressions/QueryExpression.php b/src/Expressions/QueryExpression.php index 4aea92e..b348378 100644 --- a/src/Expressions/QueryExpression.php +++ b/src/Expressions/QueryExpression.php @@ -17,18 +17,18 @@ public function __construct(QueryBuilder $expression) parent::__construct($expression); } - public function compile(QueryBuilder $parentQueryBuilder): string + public function compile(QueryBuilder $queryBuilder): string { - $this->expression->registerVariable($parentQueryBuilder->getVariables()); + $this->expression->registerVariable($queryBuilder->getVariables()); - $this->expression = $this->expression->compile($parentQueryBuilder); + $this->expression = $this->expression->compile($queryBuilder); - $parentQueryBuilder->binds = array_unique(array_merge($parentQueryBuilder->binds, $this->expression->binds)); + $queryBuilder->binds = array_unique(array_merge($queryBuilder->binds, $this->expression->binds)); // Extract collections if (isset($this->expression->collections)) { - foreach ($this->expression->collections as $collection => $mode) { - $parentQueryBuilder->registerCollections($this->expression->collections[$collection], $mode); + foreach ($this->expression->collections as $mode => $collections) { + $queryBuilder->registerCollections($this->expression->collections[$mode], $mode); } } diff --git a/tests/Unit/AQL/ArrayFunctionsTest.php b/tests/Unit/AQL/ArrayFunctionsTest.php index c088836..693537a 100644 --- a/tests/Unit/AQL/ArrayFunctionsTest.php +++ b/tests/Unit/AQL/ArrayFunctionsTest.php @@ -1,6 +1,6 @@ for('u', 'Users') ->filter('u.active', '==', 'true') diff --git a/tests/Unit/AQL/GeoFunctionsTest.php b/tests/Unit/AQL/GeoFunctionsTest.php index fe01d76..0fd9fc1 100644 --- a/tests/Unit/AQL/GeoFunctionsTest.php +++ b/tests/Unit/AQL/GeoFunctionsTest.php @@ -1,6 +1,6 @@ method = 'sorted'; $result = (new QueryBuilder()) ->options($options) diff --git a/tests/Unit/AQL/StatementClausesTest.php b/tests/Unit/AQL/StatementClausesTest.php index d6b59df..b085bcc 100644 --- a/tests/Unit/AQL/StatementClausesTest.php +++ b/tests/Unit/AQL/StatementClausesTest.php @@ -1,9 +1,10 @@ getQueryId() . '_1', $result->query); $qb = new QueryBuilder(); - $object = new \stdClass(); + $object = new stdClass(); $object->name = 'Catelyn'; $object->surname = 'Stark'; $object->alive = false; @@ -89,7 +90,7 @@ public function testUpdateClause() public function testUpdateMaintainsNullValue() { - $data = new \stdClass(); + $data = new stdClass(); $data->name['first_name'] = null; $data->name['last_name'] = null; $result = (new QueryBuilder()) diff --git a/tests/Unit/AQL/StringFunctionsTest.php b/tests/Unit/AQL/StringFunctionsTest.php index 843605a..a71ad9b 100644 --- a/tests/Unit/AQL/StringFunctionsTest.php +++ b/tests/Unit/AQL/StringFunctionsTest.php @@ -1,6 +1,6 @@ compile($qb); + $expression->compile($qb); self::assertEquals('AND', $expression->logicalOperator); } @@ -36,7 +36,7 @@ public function testPredicateExpressionWithLogicalOperatorOr() { $qb = new QueryBuilder(); $expression = new PredicateExpression((new LiteralExpression('x')), '==', (new LiteralExpression(10)), "OR"); - $result = $expression->compile($qb); + $expression->compile($qb); self::assertEquals('OR', $expression->logicalOperator); } diff --git a/tests/Unit/Expressions/QueryExpressionTest.php b/tests/Unit/Expressions/QueryExpressionTest.php index 7e71a2a..46d4053 100644 --- a/tests/Unit/Expressions/QueryExpressionTest.php +++ b/tests/Unit/Expressions/QueryExpressionTest.php @@ -1,6 +1,6 @@ attribute1 = 'test'; $result = $this->grammar->isObject($doc); self::assertTrue($result); diff --git a/tests/Unit/QueryBuilderTest.php b/tests/Unit/QueryBuilderTest.php index 4eb3488..7e51337 100644 --- a/tests/Unit/QueryBuilderTest.php +++ b/tests/Unit/QueryBuilderTest.php @@ -1,6 +1,6 @@ filter('u.active', '==', 'true') ->return('u._key') ->get(); + self::assertEquals( 'FOR u IN users FILTER u.active == true RETURN u._key', $subQuery->query @@ -107,4 +108,47 @@ public function testSubQueryWithFunction() $result->query ); } + + public function testSubqueryWithLet() + { + $vertexGetQuery = (new QueryBuilder()) + ->for('v', '0..99') + ->traverse('persons/123') + ->edgeCollections('relations') + ->return('v._key'); + + $vertexRemovalQuery = (new QueryBuilder()) + ->for('vertexKey', 'verteces') + ->remove('vertexKey', 'persons') + ->get(); + + $edgeGetQuery = (new QueryBuilder()) + ->for(['v', 'e'], '1..99') + ->traverse('persons/123') + ->edgeCollections('relations') + ->return('e._key'); + + $edgeRemovalQuery = (new QueryBuilder()) + ->for('edgeKey', 'edges') + ->remove('edgeKey', 'relations'); + + $deleteQuery = (new QueryBuilder()) + ->with('persons') + ->let('verteces', $vertexGetQuery) + ->let('edges', $edgeGetQuery) + ->let('vertexRemovals', $vertexRemovalQuery) + ->let('edgeRemovals', $edgeRemovalQuery) + ->return(['vertexRemovals', 'edgeRemovals']) + ->get(); + + self::assertEquals( + 'WITH persons' + . ' LET verteces = (FOR v IN 0..99 OUTBOUND "persons/123" relations RETURN v._key)' + . ' LET edges = (FOR v, e IN 1..99 OUTBOUND "persons/123" relations RETURN e._key)' + . ' LET vertexRemovals = (FOR vertexKey IN verteces REMOVE vertexKey IN persons)' + . ' LET edgeRemovals = (FOR edgeKey IN edges REMOVE edgeKey IN relations)' + . ' RETURN [vertexRemovals,edgeRemovals]', + $deleteQuery->query + ); + } }