Commit 77dbb450 authored by Виктор Волков's avatar Виктор Волков
Browse files

feat: implement multiple similar parameters in one expression

parent 0ca35b9d
......@@ -28,6 +28,8 @@ class ApiQueryBuilder
*/
private $expression;
private static $parameters = [];
/**
* Construct query builder
*
......@@ -35,6 +37,7 @@ class ApiQueryBuilder
*/
public function __construct(QueryBuilder $builder)
{
self::$parameters = [];
$this->builder = $builder;
$this->expression = $builder->expr();
}
......@@ -294,6 +297,7 @@ class ApiQueryBuilder
} else {
$spec = new $specName($data);
}
$spec->reset();
return $spec->match($this->builder);
}
......
......@@ -67,6 +67,12 @@ trait JsonField
if (is_array($value) && array_key_first($value) !== 0) {
$field = $field . '_' . array_key_first($value) . '_';
}
if (array_key_exists($field, self::$parameters)) {
self::$parameters[$field] += 1;
$field .= self::$parameters[$field];
} else {
self::$parameters[$field] = 0;
}
return $this->transliterate($field);
}
......
<?php
namespace ApiQL\Language\Specs;
/**
* Class AbstractSpec
*
* @package ApiQL\Language\Specs
*/
abstract class AbstractSpec
{
protected static $parameters = [];
public function reset(): void
{
self::$parameters = [];
}
}
......@@ -11,7 +11,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class Between
class Between extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class ContainsString
class ContainsString extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class EndsWith
class EndsWith extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class Equals
class Equals extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class EqualsAny
class EqualsAny extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class GreaterThan
class GreaterThan extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class GreaterThanOrEqual
class GreaterThanOrEqual extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class In
class In extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class IsNotNull
class IsNotNull extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class IsNull
class IsNull extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class LessThan
class LessThan extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class LessThanOrEqual
class LessThanOrEqual extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class Like
class Like extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class NotContainsString
class NotContainsString extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class NotEquals
class NotEquals extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class NotIn
class NotIn extends AbstractSpec
{
use JsonField;
......
......@@ -10,7 +10,7 @@ use ApiQL\Language\JsonField;
*
* @package ApiQL\Language\Specs
*/
class NotLike
class NotLike extends AbstractSpec
{
use JsonField;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment