diff --git a/src/Query/Concerns/CompilesColumns.php b/src/Query/Concerns/CompilesColumns.php index 0340ba3..8270da8 100644 --- a/src/Query/Concerns/CompilesColumns.php +++ b/src/Query/Concerns/CompilesColumns.php @@ -246,7 +246,7 @@ protected function determineReturnValues(IlluminateQueryBuilder $query, $returnA // Aggregate functions only return the aggregate, so we can clear out everything else. if ($query->aggregate !== null) { $returnDocs = []; - $returnAttributes = ['`aggregate`' => 'aggregateResult']; + $returnAttributes = ['aggregate' => 'aggregateResult']; } // Return a single value for certain subqueries diff --git a/src/Query/Concerns/HandlesAqlGrammar.php b/src/Query/Concerns/HandlesAqlGrammar.php index cd4c88d..eaffee8 100644 --- a/src/Query/Concerns/HandlesAqlGrammar.php +++ b/src/Query/Concerns/HandlesAqlGrammar.php @@ -181,6 +181,21 @@ protected function wrapValue($value) return '`' . str_replace('`', '``', $value) . '`' . $postfix; } + /** + * Wrap a single string in keyword identifiers. + * + * @param string $value + * @return string + */ + protected function wrapAttribute($value) + { + if (!is_string($value)) { + return $value; + } + return '`' . str_replace('`', '``', $value) . '`'; + } + + /** * Wrap a subquery single string in braces. */ @@ -196,7 +211,7 @@ public function wrapSubquery(string $subquery): string public function generateAqlObject(array $data): string { $data = Arr::undot($data); - +ray($this->generateAqlObjectString($data)); return $this->generateAqlObjectString($data); } @@ -207,7 +222,7 @@ public function generateAqlObject(array $data): string protected function generateAqlObjectString(array $data): string { foreach($data as $key => $value) { - $prefix = $key . ': '; + $prefix = $this->wrapAttribute($key) . ': '; if (is_numeric($key)) { $prefix = ''; diff --git a/tests/Query/GrammarTest.php b/tests/Query/GrammarTest.php index b997356..644e928 100644 --- a/tests/Query/GrammarTest.php +++ b/tests/Query/GrammarTest.php @@ -6,7 +6,7 @@ ->from('users'); $this->assertSame( - 'FOR userDoc IN users RETURN {id: `userDoc`.`_key`, _id: `userDoc`.`_id`, email: `userDoc`.`email`}', + 'FOR userDoc IN users RETURN {`id`: `userDoc`.`_key`, `_id`: `userDoc`.`_id`, `email`: `userDoc`.`email`}', $builder->toSql(), ); }); diff --git a/tests/Query/GroupingTest.php b/tests/Query/GroupingTest.php index 0dd0dcc..e39ce89 100644 --- a/tests/Query/GroupingTest.php +++ b/tests/Query/GroupingTest.php @@ -62,7 +62,7 @@ $this->assertSame( 'FOR characterDoc IN characters COLLECT surname = `characterDoc`.`surname`' . ' FILTER `surname` LIKE "Lannister"' - . ' RETURN {surname: `surname`}', + . ' RETURN {`surname`: `surname`}', $query->toSql(), ); diff --git a/tests/Query/IdKeyConversionTest.php b/tests/Query/IdKeyConversionTest.php index 3bf009a..c659147 100644 --- a/tests/Query/IdKeyConversionTest.php +++ b/tests/Query/IdKeyConversionTest.php @@ -28,7 +28,7 @@ $builder = $builder->select('id')->from('users'); $this->assertSame( - 'FOR userDoc IN users RETURN {id: `userDoc`.`_key`}', + 'FOR userDoc IN users RETURN {`id`: `userDoc`.`_key`}', $builder->toSql(), ); }); @@ -39,7 +39,7 @@ $result = $query->first(); $this->assertSame( - 'FOR characterDoc IN characters LIMIT 1 RETURN {id: `characterDoc`.`_key`, name: `characterDoc`.`name`}', + 'FOR characterDoc IN characters LIMIT 1 RETURN {`id`: `characterDoc`.`_key`, `name`: `characterDoc`.`name`}', $query->toSql(), ); @@ -54,7 +54,7 @@ $result = $query->first(); $this->assertSame( - 'FOR characterDoc IN characters LIMIT 1 RETURN {i: `characterDoc`.`_key`, name: `characterDoc`.`name`}', + 'FOR characterDoc IN characters LIMIT 1 RETURN {`i`: `characterDoc`.`_key`, `name`: `characterDoc`.`name`}', $query->toSql(), ); @@ -69,7 +69,7 @@ $result = $query->first(); $this->assertSame( - 'FOR characterDoc IN characters LIMIT 1 RETURN {id: `characterDoc`.`_key`, i: `characterDoc`.`_key`, name: `characterDoc`.`name`}', + 'FOR characterDoc IN characters LIMIT 1 RETURN {`id`: `characterDoc`.`_key`, `i`: `characterDoc`.`_key`, `name`: `characterDoc`.`name`}', $query->toSql(), ); @@ -84,7 +84,7 @@ $result = $query->first(); $this->assertSame( - 'FOR characterDoc IN characters LIMIT 1 RETURN {i: `characterDoc`.`_key`, i2: `characterDoc`.`_key`, name: `characterDoc`.`name`}', + 'FOR characterDoc IN characters LIMIT 1 RETURN {`i`: `characterDoc`.`_key`, `i2`: `characterDoc`.`_key`, `name`: `characterDoc`.`name`}', $query->toSql(), ); diff --git a/tests/Query/SelectTest.php b/tests/Query/SelectTest.php index 731d0d8..89d51af 100644 --- a/tests/Query/SelectTest.php +++ b/tests/Query/SelectTest.php @@ -171,7 +171,7 @@ expect($query->toSql()) ->toBe( "FOR houseDoc IN houses " - . "OPTIONS {indexHint: @{$queryId}_fromOptions_1, forceIndexHint: @{$queryId}_fromOptions_2} " + . "OPTIONS {`indexHint`: @{$queryId}_fromOptions_1, `forceIndexHint`: @{$queryId}_fromOptions_2} " . "FILTER `houseDoc`.`en`.`description` LIKE @{$queryId}_where_1 RETURN houseDoc", ); diff --git a/tests/Query/SetTest.php b/tests/Query/SetTest.php index 94e5e7c..42089e3 100644 --- a/tests/Query/SetTest.php +++ b/tests/Query/SetTest.php @@ -58,7 +58,7 @@ ->set('y', [1,2,3,4,5], VariablePosition::postIterations); $this->assertSame( - 'FOR characterDoc IN characters LET y = @' . $query->getQueryId() . '_postIterationVariables_1 RETURN MERGE(characterDoc, {yColumn: `y`})', + 'FOR characterDoc IN characters LET y = @' . $query->getQueryId() . '_postIterationVariables_1 RETURN MERGE(characterDoc, {`yColumn`: `y`})', $query->toSql(), );