/** * @param Comparison $comparison * * @return ExpressionException */ public static function unknownExpressionOperator(Comparison $comparison) { return new self(sprintf('Unknown comparison operator: %s', $comparison->getOperator())); }
/** * Convert a comparison expression into the target query language output. * * @param Comparison $comparison * * @return callable * * @throws ExpressionException */ public function walkComparison(Comparison $comparison) { $field = $comparison->getField(); $value = $comparison->getValue(); switch ($comparison->getOperator()) { case Comparison::EQUAL: case Comparison::IS_NULL: return function ($object) use($field, $value) { return ClosureExpressionVisitor::getObjectFieldValue($object, $field) === $value; }; case Comparison::NOT_EQUAL: case Comparison::IS_NOT_NULL: return function ($object) use($field, $value) { return ClosureExpressionVisitor::getObjectFieldValue($object, $field) !== $value; }; case Comparison::LOWER_THAN: return function ($object) use($field, $value) { return ClosureExpressionVisitor::getObjectFieldValue($object, $field) < $value; }; case Comparison::LOWER_THAN_EQUAL: return function ($object) use($field, $value) { return ClosureExpressionVisitor::getObjectFieldValue($object, $field) <= $value; }; case Comparison::GREATER_THAN: return function ($object) use($field, $value) { return ClosureExpressionVisitor::getObjectFieldValue($object, $field) > $value; }; case Comparison::GREATER_THAN_EQUAL: return function ($object) use($field, $value) { return ClosureExpressionVisitor::getObjectFieldValue($object, $field) >= $value; }; case Comparison::IN: return function ($object) use($field, $value) { return in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value); }; case Comparison::NOT_IN: return function ($object) use($field, $value) { return !in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value); }; case Comparison::EXISTS: return function ($object) use($value) { foreach ($value as $row) { if ($row !== $object || serialize($row) === serialize($object)) { return true; } } return false; }; case Comparison::NOT_EXISTS: return function ($object) use($value) { foreach ($value as $row) { if ($row !== $object || serialize($row) === serialize($object)) { return false; } } return true; }; case Comparison::LIKE: return function ($object) use($field, $value) { return ClosureExpressionVisitor::findString(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value); }; case Comparison::NOT_LIKE: return function ($object) use($field, $value) { return !ClosureExpressionVisitor::findString(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value); }; default: throw ExpressionException::unknownExpressionOperator($comparison); } }