Spaces:
No application file
No application file
File size: 3,530 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
<?php
namespace Mautic\LeadBundle\Segment\Query\Expression;
use Doctrine\DBAL\Query\Expression\ExpressionBuilder as BaseExpressionBuilder;
use Mautic\LeadBundle\Segment\Exception\SegmentQueryException;
class ExpressionBuilder extends BaseExpressionBuilder
{
public const REGEXP = 'REGEXP';
public const BETWEEN = 'BETWEEN';
/**
* Creates a between comparison expression.
*
* @throws SegmentQueryException
*/
public function between($x, $arr): string
{
if (!is_array($arr) || 2 != count($arr)) {
throw new SegmentQueryException('Between expression expects second argument to be an array with exactly two elements');
}
return $x.' '.self::BETWEEN.' '.$this->comparison($arr[0], 'AND', $arr[1]);
}
/**
* Creates a not between comparison expression.
*
* First argument is considered the left expression and the second is the right expression.
* When converted to string, it will generated a <left expr> = <right expr>. Example:
*
* [php]
* // u.id = ?
* $expr->eq('u.id', '?');
*
* @throws SegmentQueryException
*/
public function notBetween($x, $arr): string
{
return 'NOT '.$this->between($x, $arr);
}
/**
* Creates an equality comparison expression with the given arguments.
*
* First argument is considered the left expression and the second is the right expression.
* When converted to string, it will generated a <left expr> = <right expr>. Example:
*
* [php]
* // u.id = ?
* $expr->eq('u.id', '?');
*
* @param mixed $x the left expression
* @param mixed $y the right expression
*
* @return string
*/
public function regexp($x, $y)
{
return $this->comparison($x, self::REGEXP, $y);
}
/**
* Creates an equality comparison expression with the given arguments.
*
* First argument is considered the left expression and the second is the right expression.
* When converted to string, it will generated a <left expr> = <right expr>. Example:
*
* [php]
* // u.id = ?
* $expr->eq('u.id', '?');
*
* @param mixed $x the left expression
* @param mixed $y the right expression
*/
public function notRegexp($x, $y): string
{
return 'NOT '.$this->comparison($x, self::REGEXP, $y);
}
/**
* Puts argument into EXISTS mysql function.
*/
public function exists($input): string
{
return $this->func('EXISTS', $input);
}
/**
* Puts argument into NOT EXISTS mysql function.
*/
public function notExists($input): string
{
return $this->func('NOT EXISTS', $input);
}
/**
* Creates a functional expression.
*
* @param string $func any function to be applied on $x
* @param mixed $x the left expression
* @param string|array $y the placeholder or the array of values to be used by IN() comparison
*/
public function func($func, $x, $y = null): string
{
$functionArguments = func_get_args();
$additionArguments = array_splice($functionArguments, 2);
foreach ($additionArguments as $k=> $v) {
$additionArguments[$k] = is_numeric($v) && intval($v) === $v ? $v : $this->literal($v);
}
return $func.'('.$x.(count($additionArguments) ? ', ' : '').join(',', $additionArguments).')';
}
}
|