Beispiel #1
0
 public function getOperator()
 {
     if (is_null($this->operator)) {
         $this->setOperator(Operator::OP_EQUAL());
     }
     return $this->operator;
 }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
 /**
  * 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;
 }
Beispiel #4
0
 /**
  * @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;
     }
 }