123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <?php
- /**
- * @package Grav\Framework\Object
- *
- * @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
- * @license MIT License; see LICENSE file for details.
- */
- namespace Grav\Framework\Object\Collection;
- use Doctrine\Common\Collections\Expr\ClosureExpressionVisitor;
- use Doctrine\Common\Collections\Expr\Comparison;
- class ObjectExpressionVisitor extends ClosureExpressionVisitor
- {
- /**
- * Accesses the field of a given object.
- *
- * @param object $object
- * @param string $field
- *
- * @return mixed
- */
- public static function getObjectFieldValue($object, $field)
- {
- $op = $value = null;
- $pos = strpos($field, '(');
- if (false !== $pos) {
- list ($op, $field) = explode('(', $field, 2);
- $field = rtrim($field, ')');
- }
- if (isset($object[$field])) {
- $value = $object[$field];
- } else {
- $accessors = array('', 'get', 'is');
- foreach ($accessors as $accessor) {
- $accessor .= $field;
- if (!method_exists($object, $accessor)) {
- continue;
- }
- $value = $object->{$accessor}();
- break;
- }
- }
- if ($op) {
- $function = 'filter' . ucfirst(strtolower($op));
- if (method_exists(static::class, $function)) {
- $value = static::$function($value);
- }
- }
- return $value;
- }
- public static function filterLower($str)
- {
- return mb_strtolower($str);
- }
- public static function filterUpper($str)
- {
- return mb_strtoupper($str);
- }
- public static function filterLength($str)
- {
- return mb_strlen($str);
- }
- public static function filterLtrim($str)
- {
- return ltrim($str);
- }
- public static function filterRtrim($str)
- {
- return rtrim($str);
- }
- public static function filterTrim($str)
- {
- return trim($str);
- }
- /**
- * Helper for sorting arrays of objects based on multiple fields + orientations.
- *
- * @param string $name
- * @param int $orientation
- * @param \Closure $next
- *
- * @return \Closure
- */
- public static function sortByField($name, $orientation = 1, \Closure $next = null)
- {
- if (!$next) {
- $next = function() {
- return 0;
- };
- }
- return function ($a, $b) use ($name, $next, $orientation) {
- $aValue = static::getObjectFieldValue($a, $name);
- $bValue = static::getObjectFieldValue($b, $name);
- if ($aValue === $bValue) {
- return $next($a, $b);
- }
- return (($aValue > $bValue) ? 1 : -1) * $orientation;
- };
- }
- /**
- * {@inheritDoc}
- */
- public function walkComparison(Comparison $comparison)
- {
- $field = $comparison->getField();
- $value = $comparison->getValue()->getValue(); // shortcut for walkValue()
- switch ($comparison->getOperator()) {
- case Comparison::EQ:
- return function ($object) use ($field, $value) {
- return static::getObjectFieldValue($object, $field) === $value;
- };
- case Comparison::NEQ:
- return function ($object) use ($field, $value) {
- return static::getObjectFieldValue($object, $field) !== $value;
- };
- case Comparison::LT:
- return function ($object) use ($field, $value) {
- return static::getObjectFieldValue($object, $field) < $value;
- };
- case Comparison::LTE:
- return function ($object) use ($field, $value) {
- return static::getObjectFieldValue($object, $field) <= $value;
- };
- case Comparison::GT:
- return function ($object) use ($field, $value) {
- return static::getObjectFieldValue($object, $field) > $value;
- };
- case Comparison::GTE:
- return function ($object) use ($field, $value) {
- return static::getObjectFieldValue($object, $field) >= $value;
- };
- case Comparison::IN:
- return function ($object) use ($field, $value) {
- return \in_array(static::getObjectFieldValue($object, $field), $value, true);
- };
- case Comparison::NIN:
- return function ($object) use ($field, $value) {
- return !\in_array(static::getObjectFieldValue($object, $field), $value, true);
- };
- case Comparison::CONTAINS:
- return function ($object) use ($field, $value) {
- return false !== strpos(static::getObjectFieldValue($object, $field), $value);
- };
- case Comparison::MEMBER_OF:
- return function ($object) use ($field, $value) {
- $fieldValues = static::getObjectFieldValue($object, $field);
- if (!is_array($fieldValues)) {
- $fieldValues = iterator_to_array($fieldValues);
- }
- return \in_array($value, $fieldValues, true);
- };
- case Comparison::STARTS_WITH:
- return function ($object) use ($field, $value) {
- return 0 === strpos(static::getObjectFieldValue($object, $field), $value);
- };
- case Comparison::ENDS_WITH:
- return function ($object) use ($field, $value) {
- return $value === substr(static::getObjectFieldValue($object, $field), -strlen($value));
- };
- default:
- throw new \RuntimeException("Unknown comparison operator: " . $comparison->getOperator());
- }
- }
- }
|