Skip to content

Commit

Permalink
feat: added null and not null conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
valmoz committed Dec 7, 2021
1 parent fb3d93b commit 693c8d6
Show file tree
Hide file tree
Showing 24 changed files with 1,336 additions and 489 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ phpunit.xml
.idea
.vscode
.DS_Store
.antlr

13 changes: 12 additions & 1 deletion grammar/ApiFilter.g4
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,15 @@ expression:
| expression AND expression # conjunctionExp
| expression OR expression # disjunctionExp;

condition: FIELD op value;
condition:
comparison # comparisonCondition
| emptyfield # emptyCondition
| filledfield # filledCondition;

comparison: FIELD op value;
emptyfield: FIELD (EQ | IS) NULL;
filledfield: FIELD (NEQ | IS NOT) NULL;

op: EQ | GT | GTE | LT | LTE | NEQ | LIKE;
value: (BOOL | STRING | integer | decimal);

Expand All @@ -39,6 +47,9 @@ AND: ('and' | 'AND');
OR: ('or' | 'OR');
NOT: ('not' | 'NOT');

IS: ('is' | 'IS');
NULL: ('null' | 'NULL');

OPEN_PAR: '(';
CLOSE_PAR: ')';

Expand Down
75 changes: 75 additions & 0 deletions src/ApiFilter/Filter/Comparison.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

namespace FattureInCloud\ApiFilter\Filter;

class Comparison implements Condition
{
private $field;
private $op;
private $value;

/**
* @param $field
* @param $op
* @param $value
*/
public function __construct($field, $op, $value)
{
$this->field = $field;
$this->op = $op;
$this->value = $value;
}

/**
* @return string
*/
public function getField(): string
{
return $this->field;
}

/**
* @param string $field
*/
public function setField(string $field): void
{
$this->field = $field;
}

/**
* @return string
*/
public function getOp(): string
{
return $this->op;
}

/**
* @param string $op
*/
public function setOp(string $op): void
{
$this->op = $op;
}

/**
* @return mixed
*/
public function getValue()
{
return $this->value;
}

/**
* @param mixed $value
*/
public function setValue($value): void
{
$this->value = $value;
}

public function __toString(): string
{
return $this->field . " " . $this->op . " " . $this->value;
}
}
70 changes: 1 addition & 69 deletions src/ApiFilter/Filter/Condition.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,74 +2,6 @@

namespace FattureInCloud\ApiFilter\Filter;

class Condition implements Expression
interface Condition extends Expression
{
private $field;
private $op;
private $value;

/**
* @param $field
* @param $op
* @param $value
*/
public function __construct($field, $op, $value)
{
$this->field = $field;
$this->op = $op;
$this->value = $value;
}

/**
* @return string
*/
public function getField(): string
{
return $this->field;
}

/**
* @param string $field
*/
public function setField(string $field): void
{
$this->field = $field;
}

/**
* @return string
*/
public function getOp(): string
{
return $this->op;
}

/**
* @param string $op
*/
public function setOp(string $op): void
{
$this->op = $op;
}

/**
* @return mixed
*/
public function getValue()
{
return $this->value;
}

/**
* @param mixed $value
*/
public function setValue($value): void
{
$this->value = $value;
}

public function __toString(): string
{
return $this->field . " " . $this->op . " " . $this->value;
}
}
37 changes: 37 additions & 0 deletions src/ApiFilter/Filter/EmptyField.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace FattureInCloud\ApiFilter\Filter;

class EmptyField implements Condition
{
private $field;

/**
* @param $field
*/
public function __construct($field)
{
$this->field = $field;
}

/**
* @return string
*/
public function getField(): string
{
return $this->field;
}

/**
* @param string $field
*/
public function setField(string $field): void
{
$this->field = $field;
}

public function __toString(): string
{
return $this->field . " = NULL";
}
}
37 changes: 37 additions & 0 deletions src/ApiFilter/Filter/FilledField.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace FattureInCloud\ApiFilter\Filter;

class FilledField implements Condition
{
private $field;

/**
* @param $field
*/
public function __construct($field)
{
$this->field = $field;
}

/**
* @return string
*/
public function getField(): string
{
return $this->field;
}

/**
* @param string $field
*/
public function setField(string $field): void
{
$this->field = $field;
}

public function __toString(): string
{
return $this->field . " <> NULL";
}
}
36 changes: 33 additions & 3 deletions src/ApiFilter/FilterFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,20 @@
use Antlr\Antlr4\Runtime\Error\BailErrorStrategy;
use Antlr\Antlr4\Runtime\InputStream;
use Antlr\Antlr4\Runtime\Tree\AbstractParseTreeVisitor;
use FattureInCloud\ApiFilter\Filter\Comparison;
use FattureInCloud\ApiFilter\Filter\Condition;
use FattureInCloud\ApiFilter\Filter\Conjunction;
use FattureInCloud\ApiFilter\Filter\Disjunction;
use FattureInCloud\ApiFilter\Filter\EmptyField;
use FattureInCloud\ApiFilter\Filter\Expression;
use FattureInCloud\ApiFilter\Filter\FilledField;
use FattureInCloud\ApiFilter\Filter\Filter;
use FattureInCloud\ApiFilter\Filter\Negation;
use FattureInCloud\ApiFilter\Filter\Operator;
use FattureInCloud\ApiFilter\Parser\ApiFilterLexer;
use FattureInCloud\ApiFilter\Parser\ApiFilterParser;
use FattureInCloud\ApiFilter\Parser\ApiFilterVisitor;
use FattureInCloud\ApiFilter\Parser\Context;
use FattureInCloud\ApiFilter\Parser\Context\FilterContext;
use FattureInCloud\ApiFilter\Parser\Context\ConditionExpContext;
use FattureInCloud\ApiFilter\Parser\Context\IntegerContext;
Expand All @@ -24,7 +28,6 @@
use FattureInCloud\ApiFilter\Parser\Context\NegationExpContext;
use FattureInCloud\ApiFilter\Parser\Context\ConjunctionExpContext;
use FattureInCloud\ApiFilter\Parser\Context\DisjunctionExpContext;
use FattureInCloud\ApiFilter\Parser\Context\ConditionContext;
use FattureInCloud\ApiFilter\Parser\Context\ValueContext;
use FattureInCloud\ApiFilter\Parser\Context\OpContext;

Expand Down Expand Up @@ -77,12 +80,17 @@ public function visitDisjunctionExp(DisjunctionExpContext $context): Disjunction
return new Disjunction($left, $right);
}

public function visitCondition(ConditionContext $context): Condition
public function visitComparisonCondition(Context\ComparisonConditionContext $context): Comparison
{
return $this->visit($context->comparison());
}

public function visitComparison(Context\ComparisonContext $context): Comparison
{
$field = $context->FIELD()->getText();
$op = $this->visit($context->op());
$value = $this->visit($context->value());
return new Condition($field, $op, $value);
return new Comparison($field, $op, $value);
}

public function visitValue(ValueContext $context)
Expand Down Expand Up @@ -130,4 +138,26 @@ public function visitOp(OpContext $context)
}
return $operator;
}

public function visitEmptyCondition(Context\EmptyConditionContext $context): EmptyField
{
return $this->visit($context->emptyfield());
}

public function visitEmptyfield(Context\EmptyfieldContext $context): EmptyField
{
$field = $context->FIELD()->getText();
return new EmptyField($field);
}

public function visitFilledCondition(Context\FilledConditionContext $context): FilledField
{
return $this->visit($context->filledfield());
}

public function visitFilledfield(Context\FilledfieldContext $context): FilledField
{
$field = $context->FIELD()->getText();
return new FilledField($field);
}
}
9 changes: 8 additions & 1 deletion src/ApiFilter/Parser/ApiFilter.interp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ null
null
null
null
null
null
'('
')'
'.'
Expand All @@ -33,6 +35,8 @@ STRING
AND
OR
NOT
IS
NULL
OPEN_PAR
CLOSE_PAR
DOT
Expand All @@ -44,11 +48,14 @@ rule names:
filter
expression
condition
comparison
emptyfield
filledfield
op
value
integer
decimal


atn:
[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 20, 59, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 28, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 36, 10, 3, 12, 3, 14, 3, 39, 11, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 51, 10, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 2, 3, 4, 9, 2, 4, 6, 8, 10, 12, 14, 2, 3, 3, 2, 3, 9, 2, 58, 2, 16, 3, 2, 2, 2, 4, 27, 3, 2, 2, 2, 6, 40, 3, 2, 2, 2, 8, 44, 3, 2, 2, 2, 10, 50, 3, 2, 2, 2, 12, 52, 3, 2, 2, 2, 14, 54, 3, 2, 2, 2, 16, 17, 5, 4, 3, 2, 17, 18, 7, 2, 2, 3, 18, 3, 3, 2, 2, 2, 19, 20, 8, 3, 1, 2, 20, 28, 5, 6, 4, 2, 21, 22, 7, 15, 2, 2, 22, 23, 5, 4, 3, 2, 23, 24, 7, 16, 2, 2, 24, 28, 3, 2, 2, 2, 25, 26, 7, 14, 2, 2, 26, 28, 5, 4, 3, 5, 27, 19, 3, 2, 2, 2, 27, 21, 3, 2, 2, 2, 27, 25, 3, 2, 2, 2, 28, 37, 3, 2, 2, 2, 29, 30, 12, 4, 2, 2, 30, 31, 7, 12, 2, 2, 31, 36, 5, 4, 3, 5, 32, 33, 12, 3, 2, 2, 33, 34, 7, 13, 2, 2, 34, 36, 5, 4, 3, 4, 35, 29, 3, 2, 2, 2, 35, 32, 3, 2, 2, 2, 36, 39, 3, 2, 2, 2, 37, 35, 3, 2, 2, 2, 37, 38, 3, 2, 2, 2, 38, 5, 3, 2, 2, 2, 39, 37, 3, 2, 2, 2, 40, 41, 7, 19, 2, 2, 41, 42, 5, 8, 5, 2, 42, 43, 5, 10, 6, 2, 43, 7, 3, 2, 2, 2, 44, 45, 9, 2, 2, 2, 45, 9, 3, 2, 2, 2, 46, 51, 7, 10, 2, 2, 47, 51, 7, 11, 2, 2, 48, 51, 5, 12, 7, 2, 49, 51, 5, 14, 8, 2, 50, 46, 3, 2, 2, 2, 50, 47, 3, 2, 2, 2, 50, 48, 3, 2, 2, 2, 50, 49, 3, 2, 2, 2, 51, 11, 3, 2, 2, 2, 52, 53, 7, 18, 2, 2, 53, 13, 3, 2, 2, 2, 54, 55, 7, 18, 2, 2, 55, 56, 7, 17, 2, 2, 56, 57, 7, 18, 2, 2, 57, 15, 3, 2, 2, 2, 6, 27, 35, 37, 50]
[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 22, 82, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 34, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 42, 10, 3, 12, 3, 14, 3, 45, 11, 3, 3, 4, 3, 4, 3, 4, 5, 4, 50, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 64, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 74, 10, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 2, 3, 4, 12, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 2, 4, 4, 2, 3, 3, 15, 15, 3, 2, 3, 9, 2, 81, 2, 22, 3, 2, 2, 2, 4, 33, 3, 2, 2, 2, 6, 49, 3, 2, 2, 2, 8, 51, 3, 2, 2, 2, 10, 55, 3, 2, 2, 2, 12, 59, 3, 2, 2, 2, 14, 67, 3, 2, 2, 2, 16, 73, 3, 2, 2, 2, 18, 75, 3, 2, 2, 2, 20, 77, 3, 2, 2, 2, 22, 23, 5, 4, 3, 2, 23, 24, 7, 2, 2, 3, 24, 3, 3, 2, 2, 2, 25, 26, 8, 3, 1, 2, 26, 34, 5, 6, 4, 2, 27, 28, 7, 17, 2, 2, 28, 29, 5, 4, 3, 2, 29, 30, 7, 18, 2, 2, 30, 34, 3, 2, 2, 2, 31, 32, 7, 14, 2, 2, 32, 34, 5, 4, 3, 5, 33, 25, 3, 2, 2, 2, 33, 27, 3, 2, 2, 2, 33, 31, 3, 2, 2, 2, 34, 43, 3, 2, 2, 2, 35, 36, 12, 4, 2, 2, 36, 37, 7, 12, 2, 2, 37, 42, 5, 4, 3, 5, 38, 39, 12, 3, 2, 2, 39, 40, 7, 13, 2, 2, 40, 42, 5, 4, 3, 4, 41, 35, 3, 2, 2, 2, 41, 38, 3, 2, 2, 2, 42, 45, 3, 2, 2, 2, 43, 41, 3, 2, 2, 2, 43, 44, 3, 2, 2, 2, 44, 5, 3, 2, 2, 2, 45, 43, 3, 2, 2, 2, 46, 50, 5, 8, 5, 2, 47, 50, 5, 10, 6, 2, 48, 50, 5, 12, 7, 2, 49, 46, 3, 2, 2, 2, 49, 47, 3, 2, 2, 2, 49, 48, 3, 2, 2, 2, 50, 7, 3, 2, 2, 2, 51, 52, 7, 21, 2, 2, 52, 53, 5, 14, 8, 2, 53, 54, 5, 16, 9, 2, 54, 9, 3, 2, 2, 2, 55, 56, 7, 21, 2, 2, 56, 57, 9, 2, 2, 2, 57, 58, 7, 16, 2, 2, 58, 11, 3, 2, 2, 2, 59, 63, 7, 21, 2, 2, 60, 64, 7, 8, 2, 2, 61, 62, 7, 15, 2, 2, 62, 64, 7, 14, 2, 2, 63, 60, 3, 2, 2, 2, 63, 61, 3, 2, 2, 2, 64, 65, 3, 2, 2, 2, 65, 66, 7, 16, 2, 2, 66, 13, 3, 2, 2, 2, 67, 68, 9, 3, 2, 2, 68, 15, 3, 2, 2, 2, 69, 74, 7, 10, 2, 2, 70, 74, 7, 11, 2, 2, 71, 74, 5, 18, 10, 2, 72, 74, 5, 20, 11, 2, 73, 69, 3, 2, 2, 2, 73, 70, 3, 2, 2, 2, 73, 71, 3, 2, 2, 2, 73, 72, 3, 2, 2, 2, 74, 17, 3, 2, 2, 2, 75, 76, 7, 20, 2, 2, 76, 19, 3, 2, 2, 2, 77, 78, 7, 20, 2, 2, 78, 79, 7, 19, 2, 2, 79, 80, 7, 20, 2, 2, 80, 21, 3, 2, 2, 2, 8, 33, 41, 43, 49, 63, 73]
Loading

0 comments on commit 693c8d6

Please sign in to comment.