Skip to content

Commit

Permalink
Remanufacture Statement clauses
Browse files Browse the repository at this point in the history
Bugfixes
Code cleanup
  • Loading branch information
LaravelFreelancerNL committed Aug 17, 2020
1 parent 7976e50 commit ce9ae74
Show file tree
Hide file tree
Showing 25 changed files with 188 additions and 161 deletions.
6 changes: 4 additions & 2 deletions src/AQL/HasDateFunctions.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ public function dateNow()
*/
public function dateIso8601()
{
if (empty($arguments = func_get_args())) {
$arguments = func_get_args();
if (empty($arguments)) {
$arguments[] = time();
}

Expand All @@ -52,7 +53,8 @@ public function dateIso8601()
*/
public function dateTimestamp()
{
if (empty($arguments = func_get_args())) {
$arguments = func_get_args();
if (empty($arguments)) {
$arguments[] = time();
}

Expand Down
4 changes: 2 additions & 2 deletions src/AQL/HasQueryClauses.php
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,9 @@ public function aggregate($variableName, $aggregateExpression): QueryBuilder
*
* @return QueryBuilder
*/
public function sort($sortBy = null, $direction = null): QueryBuilder
public function sort(): QueryBuilder
{
$this->addClause(new SortClause($sortBy, $direction));
$this->addClause(new SortClause(func_get_args()));

return $this;
}
Expand Down
25 changes: 0 additions & 25 deletions src/AQL/HasStatementClauses.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,6 @@ public function let($variableName, $expression)
*/
public function insert($document, string $collection): QueryBuilder
{
$document = $this->normalizeArgument($document, ['RegisteredVariable', 'Object', 'Bind']);

$this->registerCollections($collection);
$collection = $this->normalizeArgument($collection, ['Collection', 'Bind']);

$this->addClause(new InsertClause($document, $collection));

return $this;
Expand All @@ -68,11 +63,6 @@ public function insert($document, string $collection): QueryBuilder
*/
public function update($document, $with, $collection): QueryBuilder
{
$document = $this->normalizeArgument($document, ['RegisteredVariable', 'Key', 'Object', 'Bind']);
$with = $this->normalizeArgument($with, ['Object', 'Bind']);
$this->registerCollections($collection);
$collection = $this->normalizeArgument($collection, ['Collection', 'Bind']);

$this->addClause(new UpdateClause($document, $with, $collection));

return $this;
Expand All @@ -91,11 +81,6 @@ public function update($document, $with, $collection): QueryBuilder
*/
public function replace($document, $with, string $collection): QueryBuilder
{
$document = $this->normalizeArgument($document, ['RegisteredVariable', 'Key', 'Object', 'Bind']);
$with = $this->normalizeArgument($with, ['Object', 'Bind']);
$this->registerCollections($collection);
$collection = $this->normalizeArgument($collection, ['Collection', 'Bind']);

$this->addClause(new ReplaceClause($document, $with, $collection));

return $this;
Expand All @@ -118,12 +103,6 @@ public function replace($document, $with, string $collection): QueryBuilder
*/
public function upsert($search, $insert, $with, string $collection, bool $replace = false): QueryBuilder
{
$search = $this->normalizeArgument($search, ['RegisteredVariable', 'Key', 'Bind']);
$insert = $this->normalizeArgument($insert, ['RegisteredVariable', 'Key', 'Bind']);
$with = $this->normalizeArgument($with, ['Object', 'Bind']);
$collection = $this->normalizeArgument($collection, ['Collection', 'Bind']);
$this->registerCollections($collection);

$this->addClause(new UpsertClause($search, $insert, $with, $collection, $replace));

return $this;
Expand All @@ -141,10 +120,6 @@ public function upsert($search, $insert, $with, string $collection, bool $replac
*/
public function remove($document, string $collection): QueryBuilder
{
$document = $this->normalizeArgument($document, ['RegisteredVariable', 'Key', 'Object', 'Bind']);
$this->registerCollections($collection);
$collection = $this->normalizeArgument($collection, ['Collection', 'Bind']);

$this->addClause(new RemoveClause($document, $collection));

return $this;
Expand Down
4 changes: 2 additions & 2 deletions src/Clauses/AggregateClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public function compile(QueryBuilder $queryBuilder): string
['Reference', 'Function', 'Query', 'Bind']
);

return "AGGREGATE {$this->variableName->compile($queryBuilder)}
= {$this->aggregateExpression->compile($queryBuilder)}";
return "AGGREGATE {$this->variableName->compile($queryBuilder)} " .
"= {$this->aggregateExpression->compile($queryBuilder)}";
}
}
14 changes: 12 additions & 2 deletions src/Clauses/EdgeCollectionsClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ public function __construct(array $edgeCollections)
$this->edgeCollections = $edgeCollections;
}

/**
*
* @SuppressWarnings(PHPMD.UndefinedVariable)
*
* @param QueryBuilder $queryBuilder
* @return string
*/
public function compile(QueryBuilder $queryBuilder): string
{
$this->edgeCollections = array_map(function ($edgeCollection) use ($queryBuilder) {
Expand All @@ -25,18 +32,21 @@ public function compile(QueryBuilder $queryBuilder): string
}

$edgeCollection[0] = $queryBuilder->normalizeArgument($edgeCollection[0], 'Collection');
if (isset($edgeCollections[1]) && !$this->grammar->isDirection($edgeCollections[1])) {
if (isset($edgeCollections[1]) && !$queryBuilder->grammar->isGraphDirection($edgeCollections[1])) {
unset($edgeCollections[1]);
}
return $edgeCollection;
}, $this->edgeCollections);

$output = array_map(function ($edgeCollection) use ($queryBuilder) {
if ($edgeCollection instanceof LiteralExpression) {
return $edgeCollection->compile($queryBuilder) . ' ';
return $edgeCollection->compile($queryBuilder);
}

$edgeCollectionOutput = '';
if (isset($edgeCollection[1])) {
$edgeCollectionOutput = $edgeCollection[1] . ' ';
}

$edgeCollectionOutput .= $edgeCollection[0]->compile($queryBuilder);
return $edgeCollectionOutput;
Expand Down
2 changes: 1 addition & 1 deletion src/Clauses/ForClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public function compile(QueryBuilder $queryBuilder): string
return $variable->compile($queryBuilder);
}, $this->variables);

$variableExpression = implode(', ',$variableExpression);
$variableExpression = implode(', ', $variableExpression);

if ($this->in !== null) {
$this->in = $queryBuilder
Expand Down
13 changes: 11 additions & 2 deletions src/Clauses/InsertClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace LaravelFreelancerNL\FluentAQL\Clauses;

use LaravelFreelancerNL\FluentAQL\QueryBuilder;

class InsertClause extends Clause
{
protected $document;
Expand All @@ -13,11 +15,18 @@ public function __construct($document, $collection)
parent::__construct();

$this->document = $document;

$this->collection = $collection;
}

public function compile(): string
public function compile(QueryBuilder $queryBuilder): string
{
return "INSERT {$this->document} IN {$this->collection}";
$this->document = $queryBuilder->normalizeArgument($this->document, ['RegisteredVariable', 'Object', 'Bind']);

$queryBuilder->registerCollections($this->collection);
$this->collection = $queryBuilder->normalizeArgument($this->collection, ['Collection', 'Bind']);


return "INSERT {$this->document->compile($queryBuilder)} IN {$this->collection->compile($queryBuilder)}";
}
}
2 changes: 1 addition & 1 deletion src/Clauses/LetClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public function __construct($variableName, $expression)
public function compile(QueryBuilder $queryBuilder): string
{
$this->variableName = $queryBuilder->normalizeArgument($this->variableName, 'Variable');
$queryBuilder->registerVariable($this->variableName);
$queryBuilder->registerVariable($this->variableName->compile($queryBuilder));

$this->expression = $queryBuilder->normalizeArgument(
$this->expression,
Expand Down
13 changes: 11 additions & 2 deletions src/Clauses/RemoveClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace LaravelFreelancerNL\FluentAQL\Clauses;

use LaravelFreelancerNL\FluentAQL\QueryBuilder;

class RemoveClause extends Clause
{
protected $document;
Expand All @@ -16,8 +18,15 @@ public function __construct($document, $collection)
$this->collection = $collection;
}

public function compile(): string
public function compile(QueryBuilder $queryBuilder): string
{
return "REMOVE {$this->document} IN {$this->collection}";
$this->document = $queryBuilder->normalizeArgument(
$this->document,
['RegisteredVariable', 'Key', 'Object', 'Bind']
);
$queryBuilder->registerCollections($this->collection);
$this->collection = $queryBuilder->normalizeArgument($this->collection, ['Collection', 'Bind']);

return "REMOVE {$this->document->compile($queryBuilder)} IN {$this->collection->compile($queryBuilder)}";
}
}
19 changes: 17 additions & 2 deletions src/Clauses/ReplaceClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace LaravelFreelancerNL\FluentAQL\Clauses;

use LaravelFreelancerNL\FluentAQL\QueryBuilder;

class ReplaceClause extends Clause
{
protected $document;
Expand All @@ -19,8 +21,21 @@ public function __construct($document, $with, $collection)
$this->collection = $collection;
}

public function compile(): string
public function compile(QueryBuilder $queryBuilder): string
{
return "REPLACE {$this->document} WITH {$this->with} IN {$this->collection}";
$this->document = $queryBuilder->normalizeArgument(
$this->document,
['RegisteredVariable', 'Key', 'Object', 'Bind']
);

$this->with = $queryBuilder->normalizeArgument($this->with, ['Object', 'Bind']);

$this->collection = $queryBuilder->normalizeArgument($this->collection, ['Collection', 'Bind']);
$queryBuilder->registerCollections($this->collection->compile($queryBuilder));


return "REPLACE {$this->document->compile($queryBuilder)} " .
"WITH {$this->with->compile($queryBuilder)} " .
"IN {$this->collection->compile($queryBuilder)}";
}
}
62 changes: 42 additions & 20 deletions src/Clauses/SortClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,64 @@

namespace LaravelFreelancerNL\FluentAQL\Clauses;

use LaravelFreelancerNL\FluentAQL\Expressions\ExpressionInterface;
use LaravelFreelancerNL\FluentAQL\QueryBuilder;

class SortClause extends Clause
{
protected $by;
protected $attributes;

protected $direction;

public function __construct($sortBy = null, $direction = null)
public function __construct($attributes)
{
parent::__construct();

$this->by = $sortBy;
$this->direction = $direction;
$this->attributes = $attributes;
}

public function compile(QueryBuilder $queryBuilder): string
{
$sortExpressions = [];

//normalize string|null $by and $direction
if (is_string($this->by) || $this->by == null) {
$sortExpressions[] = $queryBuilder->normalizeSortExpression($this->by, $this->direction);
//Structure input of reference + direction to the regular sort expressions
if (
count($this->attributes) == 2
&& is_string($this->attributes[1])
&& $queryBuilder->grammar->isSortDirection($this->attributes[1])
) {
$this->attributes = [[$this->attributes[0], $this->attributes[1]]];
}

if (is_array($this->by)) {
//Wandel door de array
$sortExpressions = array_map(function ($expression) use ($queryBuilder) {
return $queryBuilder->normalizeSortExpression($expression);
}, $this->by);
if (empty($this->attributes)) {
$this->attributes = [null];
}

$sortExpressions = implode(', ', array_map(function ($expression) {
return implode(' ', $expression);
}, $sortExpressions));
$this->attributes = $this->normalizeSortExpressions($queryBuilder, $this->attributes);

//Generate query output
$sortExpressionOutput = array_map(function ($sortBy) use ($queryBuilder) {
if ($sortBy instanceof ExpressionInterface) {
return $sortBy->compile($queryBuilder);
}

$output = $sortBy[0]->compile($queryBuilder);
if (isset($sortBy[1])) {
$output .= ' ' . $sortBy[1];
}
return $output;
}, $this->attributes);

return 'SORT ' . $sortExpressions;
return 'SORT ' . implode(', ', $sortExpressionOutput);
}

protected function normalizeSortExpressions(QueryBuilder $queryBuilder, array $attributes)
{
return array_map(function ($sortBy) use ($queryBuilder) {
if (is_string($sortBy) || $sortBy === null) {
return $queryBuilder->normalizeArgument($sortBy, ['Null', 'Reference', 'Function', 'Bind']);
}
$sortBy[0] = $queryBuilder->normalizeArgument($sortBy[0], ['Null', 'Reference', 'Function', 'Bind']);
if (isset($sortBy[1]) && ! $queryBuilder->grammar->isSortDirection($sortBy[1])) {
unset($sortBy[1]);
}
return $sortBy;
}, $this->attributes);
}
}
2 changes: 1 addition & 1 deletion src/Clauses/TraverseClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function __construct(
public function compile(QueryBuilder $queryBuilder): string
{
$this->startVertex = $queryBuilder->normalizeArgument($this->startVertex, 'Id');
$this->direction = $queryBuilder->normalizeArgument($this->direction, 'Direction');
$this->direction = $queryBuilder->normalizeArgument($this->direction, 'GraphDirection');

if ($this->toVertex !== null) {
$this->toVertex = $queryBuilder->normalizeArgument($this->toVertex, 'Id');
Expand Down
16 changes: 14 additions & 2 deletions src/Clauses/UpdateClause.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace LaravelFreelancerNL\FluentAQL\Clauses;

use LaravelFreelancerNL\FluentAQL\QueryBuilder;

class UpdateClause extends Clause
{
protected $document;
Expand All @@ -19,8 +21,18 @@ public function __construct($document, $with, $collection)
$this->collection = $collection;
}

public function compile(): string
public function compile(QueryBuilder $queryBuilder): string
{
return "UPDATE {$this->document} WITH {$this->with} IN {$this->collection}";
$this->document = $queryBuilder->normalizeArgument(
$this->document,
['RegisteredVariable', 'Key', 'Object', 'Bind']
);
$this->with = $queryBuilder->normalizeArgument($this->with, ['Object', 'Bind']);
$this->collection = $queryBuilder->normalizeArgument($this->collection, ['Collection', 'Bind']);
$queryBuilder->registerCollections($this->collection->compile($queryBuilder));

return "UPDATE {$this->document->compile($queryBuilder)} " .
"WITH {$this->with->compile($queryBuilder)} " .
"IN {$this->collection->compile($queryBuilder)}";
}
}
Loading

0 comments on commit ce9ae74

Please sign in to comment.