public function getOperator() { if (is_null($this->operator)) { $this->setOperator(Operator::OP_EQUAL()); } return $this->operator; }
/** * @param SQLTokenIterator $tokens * @return Operator */ protected function parseCondition(SQLTokenIterator $tokens) { switch (true) { case $tokens->seekTokenText('='): return Operator::OP_EQUAL(); case $tokens->seekTokenText('<=>'): return Operator::OP_EQUAL_NULLSAFE(); case $tokens->seekTokenText('!='): return Operator::OP_NOT_EQUAL(); case $tokens->seekTokenText('<>'): return Operator::OP_LESSERGREATER(); case $tokens->seekTokenText('<='): return Operator::OP_LESSEREQUAL(); case $tokens->seekTokenText('<'): return Operator::OP_LESSER(); case $tokens->seekTokenText('>='): return Operator::OP_GREATEREQUAL(); case $tokens->seekTokenText('>'): return Operator::OP_GREATER(); case $tokens->seekTokenText('+'): return Operator::OP_ADDITION(); case $tokens->seekTokenText('-'): return Operator::OP_SUBTRACTION(); case $tokens->seekTokenText('*'): return Operator::OP_MULTIPLICATION(); case $tokens->seekTokenText('/'): return Operator::OP_DIVISION(); case $tokens->seekTokenNum(SqlToken::T_IS()): if ($tokens->seekTokenNum(SqlToken::T_NOT())) { return Operator::OP_IS_NOT(); } else { return Operator::OP_IS(); } break; case $tokens->seekTokenNum(SqlToken::T_AND()): return Operator::OP_AND(); case $tokens->seekTokenNum(SqlToken::T_OR()): return Operator::OP_OR(); case $tokens->seekTokenNum(SqlToken::T_BETWEEN(), TokenIterator::NEXT, SqlToken::T_NOT()): if ($tokens->isTokenNum(SqlToken::T_NOT(), TokenIterator::PREVIOUS)) { return Operator::OP_NOT_BETWEEN(); } else { return Operator::OP_BETWEEN(); } default: return null; } }
/** * Extracts part(s) of a (complicated) condition that map a column of the given table directly to a fixed value. * (E.g.: "(foo.a > bar.b && baz.c = 1) && (far.d = faz.e || far.f = 3)" results in "baz.c = 1" for table "baz") * * Only considers the parts that can directly negate the condition result (those liked with AND operators). * * @param ValuePart $condition * @return array (array of ValuePart) */ protected function findFixedConditions(Part $condition) { $tableConditions = array(); if ($condition instanceof ValuePart) { foreach ($condition->getChainValues() as $chainValue) { if ($chainValue instanceof Part) { $tableConditions = array_merge($tableConditions, $this->findFixedConditions($chainValue)); } } } elseif ($condition instanceof ConditionJob) { /* @var $condition ConditionJob */ if ($condition->getOperator() === Operator::OP_AND()) { foreach ([$condition->getFirstParameter(), $condition->getLastParameter()] as $conditionParameter) { if ($conditionParameter instanceof Part) { $tableConditions = array_merge($tableConditions, $this->findFixedConditions($conditionParameter)); } } } elseif (in_array($condition->getOperator(), [Operator::OP_EQUAL(), Operator::OP_EQUAL_NULLSAFE(), Operator::OP_NOT_EQUAL(), Operator::OP_GREATER(), Operator::OP_GREATEREQUAL(), Operator::OP_LESSER(), Operator::OP_LESSEREQUAL(), Operator::OP_BETWEEN(), Operator::OP_NOT_BETWEEN()])) { $column = $condition->getFirstParameter(); $fixedValue = $condition->getLastParameter(); if ($fixedValue instanceof ColumnSpecifier) { list($column, $fixedValue) = [$fixedValue, $column]; } if ($column instanceof ColumnSpecifier && $this->isFixedValue($fixedValue)) { $tableConditions[] = $condition; } } } return $tableConditions; }
public function resolveCondition(ConditionJob $conditionJob, ExecutionContext $context) { $firstValueUnresolved = $conditionJob->getFirstParameter(); $lastValueUnresolved = $conditionJob->getLastParameter(); $firstValue = $this->resolveValue($firstValueUnresolved, $context); $lastValue = $this->resolveValue($lastValueUnresolved, $context); switch ($conditionJob->getOperator()) { case Operator::OP_ADDITION(): return $firstValue + $lastValue; case Operator::OP_SUBTRACTION(): return $firstValue - $lastValue; case Operator::OP_MULTIPLICATION(): return $firstValue * $lastValue; case Operator::OP_DIVISION(): return $firstValue / $lastValue; case Operator::OP_AND(): return $firstValue && $lastValue; case Operator::OP_OR(): return $firstValue || $lastValue; case Operator::OP_GREATER(): return $firstValue > $lastValue; case Operator::OP_GREATEREQUAL(): return $firstValue >= $lastValue; case Operator::OP_BETWEEN(): return; case Operator::OP_NOT_BETWEEN(): return; case Operator::OP_EQUAL(): return $firstValue === $lastValue; case Operator::OP_NOT_EQUAL(): return $firstValue !== $lastValue; case Operator::OP_EQUAL_NULLSAFE(): return; case Operator::OP_LESSER(): return $firstValue < $lastValue; case Operator::OP_LESSEREQUAL(): return $firstValue <= $lastValue; case Operator::OP_LESSERGREATER(): return true; case Operator::OP_IS(): return $firstValue === $lastValue; case Operator::OP_IS_NOT(): return $firstValue !== $lastValue; case Operator::OP_IS_NOT_NULL(): return !is_null($firstValue); case Operator::OP_IS_NULL(): return is_null($firstValue); } }