Skip to content

Commit 7976e50

Browse files
Remanufactured graph clauses
1 parent b59cdbb commit 7976e50

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+394
-491
lines changed

src/AQL/HasGraphClauses.php

+22-49
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
namespace LaravelFreelancerNL\FluentAQL\AQL;
44

55
use LaravelFreelancerNL\FluentAQL\Clauses\EdgeCollectionsClause;
6+
use LaravelFreelancerNL\FluentAQL\Clauses\FilterClause;
67
use LaravelFreelancerNL\FluentAQL\Clauses\GraphClause;
78
use LaravelFreelancerNL\FluentAQL\Clauses\PruneClause;
89
use LaravelFreelancerNL\FluentAQL\Clauses\TraverseClause;
10+
use LaravelFreelancerNL\FluentAQL\Clauses\TraverseKShortestPathClause;
11+
use LaravelFreelancerNL\FluentAQL\Clauses\TraverseShortestPathClause;
912
use LaravelFreelancerNL\FluentAQL\Clauses\WithClause;
1013
use LaravelFreelancerNL\FluentAQL\QueryBuilder;
1114

@@ -25,13 +28,7 @@ trait HasGraphClauses
2528
*/
2629
public function with(): QueryBuilder
2730
{
28-
$collections = func_get_args();
29-
foreach ($collections as $key => $collection) {
30-
$this->registerCollections($collection, 'read');
31-
$collections[$key] = $this->normalizeArgument($collection, 'Collection');
32-
}
33-
34-
$this->addClause(new WithClause($collections));
31+
$this->addClause(new WithClause(func_get_args()));
3532

3633
return $this;
3734
}
@@ -57,14 +54,7 @@ public function traverse(
5754
$toVertex = null,
5855
$kShortestPaths = false
5956
): QueryBuilder {
60-
$fromVertex = $this->normalizeArgument($fromVertex, 'Id');
61-
$inDirection = $this->normalizeArgument($inDirection, 'Direction');
62-
63-
if ($toVertex !== null) {
64-
$toVertex = $this->normalizeArgument($toVertex, 'Id');
65-
}
66-
67-
$this->addClause(new TraverseClause($fromVertex, $inDirection, $toVertex, $kShortestPaths));
57+
$this->addClause(new TraverseClause($fromVertex, $inDirection, $toVertex));
6858

6959
return $this;
7060
}
@@ -82,7 +72,7 @@ public function traverse(
8272
*/
8373
public function shortestPath($fromVertex, $inDirection, $toVertex): QueryBuilder
8474
{
85-
$this->traverse($fromVertex, $inDirection, $toVertex);
75+
$this->addClause(new TraverseShortestPathClause($fromVertex, $inDirection, $toVertex));
8676

8777
return $this;
8878
}
@@ -100,7 +90,7 @@ public function shortestPath($fromVertex, $inDirection, $toVertex): QueryBuilder
10090
*/
10191
public function kShortestPaths($fromVertex, $inDirection, $toVertex): QueryBuilder
10292
{
103-
$this->traverse($fromVertex, $inDirection, $toVertex, true);
93+
$this->addClause(new TraverseKShortestPathClause($fromVertex, $inDirection, $toVertex));
10494

10595
return $this;
10696
}
@@ -117,8 +107,6 @@ public function kShortestPaths($fromVertex, $inDirection, $toVertex): QueryBuild
117107
*/
118108
public function graph(string $graphName): QueryBuilder
119109
{
120-
$graphName = $this->normalizeArgument($graphName, 'Graph');
121-
122110
$this->addClause(new GraphClause($graphName));
123111

124112
return $this;
@@ -131,28 +119,11 @@ public function graph(string $graphName): QueryBuilder
131119
*
132120
* @link https://www.arangodb.com/docs/stable/aql/graphs-traversals.html
133121
*
134-
* @param string|array $edgeCollection
135-
* @param string|null $direction
136-
*
137122
* @return QueryBuilder
138123
*/
139-
public function edgeCollections($edgeCollection): QueryBuilder
124+
public function edgeCollections(): QueryBuilder
140125
{
141-
$collections = [];
142-
143-
//normalize string|null $edgeCollections and $direction
144-
if (is_string($edgeCollection)) {
145-
$collections[] = $this->normalizeEdgeCollections($edgeCollection);
146-
}
147-
148-
if (is_array($edgeCollection)) {
149-
//Wandel door de array
150-
$collections = array_map(function ($expression) {
151-
return $this->normalizeEdgeCollections($expression);
152-
}, $edgeCollection);
153-
}
154-
155-
$this->addClause(new EdgeCollectionsClause($collections));
126+
$this->addClause(new EdgeCollectionsClause(func_get_args()));
156127

157128
return $this;
158129
}
@@ -162,22 +133,24 @@ public function edgeCollections($edgeCollection): QueryBuilder
162133
*
163134
* @link https://www.arangodb.com/docs/stable/aql/graphs-traversals.html#pruning
164135
*
165-
* @param string $attribute
166-
* @param string $comparisonOperator
167-
* @param mixed $value
168-
* @param string $logicalOperator
136+
* @param $leftOperand
137+
* @param string $comparisonOperator
138+
* @param null $rightOperand
139+
* @param string $logicalOperator
169140
*
170141
* @return QueryBuilder
171142
*/
172-
public function prune($attribute, $comparisonOperator = '==', $value = null, $logicalOperator = 'AND'): QueryBuilder
173-
{
174-
//create array of predicates if $leftOperand isn't an array already
175-
if (is_string($attribute)) {
176-
$attribute = [[$attribute, $comparisonOperator, $value, $logicalOperator]];
143+
public function prune(
144+
$leftOperand,
145+
$comparisonOperator = null,
146+
$rightOperand = null,
147+
$logicalOperator = null
148+
): QueryBuilder {
149+
$predicates = $leftOperand;
150+
if (is_string($comparisonOperator)) {
151+
$predicates = [[$leftOperand, $comparisonOperator, $rightOperand, $logicalOperator]];
177152
}
178153

179-
$predicates = $this->normalizePredicates($attribute);
180-
181154
$this->addClause(new PruneClause($predicates));
182155

183156
return $this;

src/AQL/HasQueryClauses.php

-3
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ public function filter(
8282
$rightOperand = null,
8383
$logicalOperator = null
8484
): QueryBuilder {
85-
8685
$predicates = $leftOperand;
8786
if (is_string($comparisonOperator)) {
8887
$predicates = [[$leftOperand, $comparisonOperator, $rightOperand, $logicalOperator]];
@@ -111,7 +110,6 @@ public function search(
111110
$rightOperand = null,
112111
$logicalOperator = null
113112
): QueryBuilder {
114-
115113
$predicates = $leftOperand;
116114
if (is_string($comparisonOperator)) {
117115
$predicates = [[$leftOperand, $comparisonOperator, $rightOperand, $logicalOperator]];
@@ -270,5 +268,4 @@ public function options($options): QueryBuilder
270268

271269
return $this;
272270
}
273-
274271
}

src/Clauses/AggregateClause.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function __construct($variableName, $aggregateExpression)
1616
$this->aggregateExpression = $aggregateExpression;
1717
}
1818

19-
public function compile(QueryBuilder $queryBuilder)
19+
public function compile(QueryBuilder $queryBuilder): string
2020
{
2121
$this->variableName = $queryBuilder->normalizeArgument($this->variableName, 'Variable');
2222
$queryBuilder->registerVariable($this->variableName);
@@ -26,6 +26,7 @@ public function compile(QueryBuilder $queryBuilder)
2626
['Reference', 'Function', 'Query', 'Bind']
2727
);
2828

29-
return "AGGREGATE {$this->variableName->compile($queryBuilder)} = {$this->aggregateExpression->compile($queryBuilder)}";
29+
return "AGGREGATE {$this->variableName->compile($queryBuilder)}
30+
= {$this->aggregateExpression->compile($queryBuilder)}";
3031
}
3132
}

src/Clauses/CollectClause.php

+7-3
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,22 @@ public function __construct($variableName = null, $expression = null)
2323
$this->expression = $expression;
2424
}
2525

26-
public function compile(QueryBuilder $queryBuilder)
26+
public function compile(QueryBuilder $queryBuilder): string
2727
{
2828
if (isset($this->variableName)) {
2929
$this->variableName = $queryBuilder->normalizeArgument($this->variableName, 'Variable');
3030
}
3131
if (isset($this->expression)) {
32-
$this->expression = $queryBuilder->normalizeArgument($this->expression, ['Reference', 'Function', 'Query', 'Bind']);
32+
$this->expression = $queryBuilder->normalizeArgument(
33+
$this->expression,
34+
['Reference', 'Function', 'Query', 'Bind']
35+
);
3336
}
3437

3538
$output = 'COLLECT';
3639
if (isset($this->variableName) && isset($this->expression)) {
37-
$output .= ' ' . $this->variableName->compile($queryBuilder) . ' = ' . $this->expression->compile($queryBuilder);
40+
$output .= ' ' . $this->variableName->compile($queryBuilder)
41+
. ' = ' . $this->expression->compile($queryBuilder);
3842
}
3943

4044
return $output;

src/Clauses/EdgeCollectionsClause.php

+27-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
namespace LaravelFreelancerNL\FluentAQL\Clauses;
44

5+
use LaravelFreelancerNL\FluentAQL\Expressions\LiteralExpression;
6+
use LaravelFreelancerNL\FluentAQL\Expressions\StringExpression;
7+
use LaravelFreelancerNL\FluentAQL\QueryBuilder;
8+
59
class EdgeCollectionsClause extends Clause
610
{
711
protected $edgeCollections;
@@ -13,15 +17,31 @@ public function __construct(array $edgeCollections)
1317
$this->edgeCollections = $edgeCollections;
1418
}
1519

16-
public function compile()
20+
public function compile(QueryBuilder $queryBuilder): string
1721
{
18-
return implode(', ', array_map(function ($expression) {
19-
$output = '';
20-
if (isset($expression[1])) {
21-
$output = $expression[1] . ' ';
22+
$this->edgeCollections = array_map(function ($edgeCollection) use ($queryBuilder) {
23+
if (is_string($edgeCollection)) {
24+
return $queryBuilder->normalizeArgument($edgeCollection, 'Collection');
25+
}
26+
27+
$edgeCollection[0] = $queryBuilder->normalizeArgument($edgeCollection[0], 'Collection');
28+
if (isset($edgeCollections[1]) && !$this->grammar->isDirection($edgeCollections[1])) {
29+
unset($edgeCollections[1]);
2230
}
31+
return $edgeCollection;
32+
}, $this->edgeCollections);
33+
34+
$output = array_map(function ($edgeCollection) use ($queryBuilder) {
35+
if ($edgeCollection instanceof LiteralExpression) {
36+
return $edgeCollection->compile($queryBuilder) . ' ';
37+
}
38+
39+
$edgeCollectionOutput = '';
40+
41+
$edgeCollectionOutput .= $edgeCollection[0]->compile($queryBuilder);
42+
return $edgeCollectionOutput;
43+
}, $this->edgeCollections);
2344

24-
return $output . $expression[0];
25-
}, $this->edgeCollections));
45+
return implode(', ', $output);
2646
}
2747
}

src/Clauses/FilterClause.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ public function __construct(array $predicates)
2323
$this->predicates = $predicates;
2424
}
2525

26-
public function compile(QueryBuilder $queryBuilder)
26+
public function compile(QueryBuilder $queryBuilder): string
2727
{
28-
2928
$this->predicates = $queryBuilder->normalizePredicates($this->predicates);
3029

3130
$compiledPredicates = $this->compilePredicates($queryBuilder, $this->predicates);

src/Clauses/ForClause.php

+8-4
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,17 @@ public function __construct($variables, $in = null)
2626
$this->in = $in;
2727
}
2828

29-
public function compile(QueryBuilder $queryBuilder)
29+
public function compile(QueryBuilder $queryBuilder): string
3030
{
31-
foreach ($this->variables as $key => $value) {
31+
foreach ($this->variables as $key => $value) {
3232
$this->variables [$key] = $queryBuilder->normalizeArgument($value, 'Variable');
33-
$queryBuilder->registerVariable($this->variables [$key]);
33+
$queryBuilder->registerVariable($this->variables[$key]->compile($queryBuilder));
3434
}
35-
$variableExpression = implode(', ', $this->variables);
35+
$variableExpression = array_map(function ($variable) use ($queryBuilder) {
36+
return $variable->compile($queryBuilder);
37+
}, $this->variables);
38+
39+
$variableExpression = implode(', ',$variableExpression);
3640

3741
if ($this->in !== null) {
3842
$this->in = $queryBuilder

src/Clauses/GraphClause.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace LaravelFreelancerNL\FluentAQL\Clauses;
44

5+
use LaravelFreelancerNL\FluentAQL\QueryBuilder;
6+
57
class GraphClause extends Clause
68
{
79
protected $graphName;
@@ -11,8 +13,10 @@ public function __construct($graphName)
1113
$this->graphName = $graphName;
1214
}
1315

14-
public function compile()
16+
public function compile(QueryBuilder $queryBuilder): string
1517
{
16-
return 'GRAPH ' . $this->graphName;
18+
$this->graphName = $queryBuilder->normalizeArgument($this->graphName, 'Graph');
19+
20+
return 'GRAPH ' . $this->graphName->compile($queryBuilder);
1721
}
1822
}

src/Clauses/GroupClause.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function __construct($groupsVariable, $projectionExpression = null)
1717
$this->projectionExpression = $projectionExpression;
1818
}
1919

20-
public function compile(QueryBuilder $queryBuilder)
20+
public function compile(QueryBuilder $queryBuilder): string
2121
{
2222
$this->groupsVariable = $queryBuilder->normalizeArgument($this->groupsVariable, 'Variable');
2323
$queryBuilder->registerVariable($this->groupsVariable);

src/Clauses/InsertClause.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function __construct($document, $collection)
1616
$this->collection = $collection;
1717
}
1818

19-
public function compile()
19+
public function compile(): string
2020
{
2121
return "INSERT {$this->document} IN {$this->collection}";
2222
}

src/Clauses/KeepClause.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public function __construct($keepVariable)
1313
$this->keepVariable = $keepVariable;
1414
}
1515

16-
public function compile(QueryBuilder $queryBuilder)
16+
public function compile(QueryBuilder $queryBuilder): string
1717
{
1818
$this->keepVariable = $queryBuilder->normalizeArgument($this->keepVariable, 'Variable');
1919
$queryBuilder->registerVariable($this->keepVariable);

src/Clauses/LetClause.php

+5-2
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@ public function __construct($variableName, $expression)
1818
$this->expression = $expression;
1919
}
2020

21-
public function compile(QueryBuilder $queryBuilder)
21+
public function compile(QueryBuilder $queryBuilder): string
2222
{
2323
$this->variableName = $queryBuilder->normalizeArgument($this->variableName, 'Variable');
2424
$queryBuilder->registerVariable($this->variableName);
2525

26-
$this->expression = $queryBuilder->normalizeArgument($this->expression, ['List', 'Object', 'Query', 'Range', 'Number', 'Bind']);
26+
$this->expression = $queryBuilder->normalizeArgument(
27+
$this->expression,
28+
['List', 'Object', 'Query', 'Range', 'Number', 'Bind']
29+
);
2730

2831

2932

src/Clauses/LimitClause.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function __construct($offsetOrCount, $count = null)
2828
}
2929
}
3030

31-
public function compile(QueryBuilder $queryBuilder)
31+
public function compile(QueryBuilder $queryBuilder): string
3232
{
3333
$this->count = $queryBuilder->normalizeArgument($this->count, ['Number', 'Reference', 'Query', 'Bind']);
3434

src/Clauses/OptionsClause.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public function __construct($options)
1313
$this->options = $options;
1414
}
1515

16-
public function compile(QueryBuilder $queryBuilder)
16+
public function compile(QueryBuilder $queryBuilder): string
1717
{
1818
$this->options = $queryBuilder->normalizeArgument($this->options, 'Object');
1919

src/Clauses/PruneClause.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
namespace LaravelFreelancerNL\FluentAQL\Clauses;
44

5+
use LaravelFreelancerNL\FluentAQL\QueryBuilder;
6+
57
class PruneClause extends FilterClause
68
{
7-
protected $predicates = [];
8-
9-
protected $defaultLogicalOperator = 'AND';
10-
11-
public function compile()
9+
public function compile(QueryBuilder $queryBuilder): string
1210
{
13-
$compiledPredicates = $this->compilePredicates($this->predicates);
11+
$this->predicates = $queryBuilder->normalizePredicates($this->predicates);
12+
13+
$compiledPredicates = $this->compilePredicates($queryBuilder, $this->predicates);
1414

1515
return 'PRUNE ' . rtrim($compiledPredicates);
1616
}

0 commit comments

Comments
 (0)