/** * 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); } }
/** * {@inheritdoc} */ public function select($fields) { $elements = array(); $fields = func_get_args(); $this->each(function ($element) use(&$elements, $fields) { $temp = array(); foreach ($fields as $field) { $alias = $field; if (is_array($field) && !is_int(key($field))) { $alias = reset($field); $field = key($field); } $value = ClosureExpressionVisitor::getObjectFieldValue($element, $field); if ($value) { $temp[$alias] = $value; } } if ($temp) { $elements[] = $temp; } }); return new static($elements); }