public function Condition::compile in Apigee Edge 8
Compiles this conditional clause.
Parameters
$query: The query object this conditional clause belongs to.
Overrides ConditionInterface::compile
File
- src/
Entity/ Query/ Condition.php, line 48  
Class
- Condition
 - Defines the condition class for the Apigee Edge entity query.
 
Namespace
Drupal\apigee_edge\Entity\QueryCode
public function compile($query) {
  if (empty($this->conditions)) {
    return function () {
      return TRUE;
    };
  }
  // This closure will fold the conditions into a single closure if there are
  // more than one, depending on the conjunction.
  $fold = strtoupper($this->conjunction) === 'AND' ? function (array $filters) : callable {
    return function ($item) use ($filters) : bool {
      foreach ($filters as $filter) {
        if (!$filter($item)) {
          return FALSE;
        }
      }
      return TRUE;
    };
  } : function (array $filters) : callable {
    return function ($item) use ($filters) : bool {
      foreach ($filters as $filter) {
        if ($filter($item)) {
          return TRUE;
        }
      }
      return FALSE;
    };
  };
  $filters = [];
  foreach ($this->conditions as $condition) {
    // If the field is a condition object, compile it and add it to the
    // filters.
    if ($condition['field'] instanceof ConditionInterface) {
      $filters[] = $condition['field']
        ->compile($query);
    }
    else {
      // Set the default operator if it is not set.
      if (!isset($condition['operator'])) {
        $condition['operator'] = is_array($condition['value']) ? 'IN' : '=';
      }
      // Normalize the value to lower case.
      if (is_array($condition['value'])) {
        $condition['value'] = array_map('mb_strtolower', $condition['value']);
      }
      elseif (is_string($condition['value'])) {
        $condition['value'] = mb_strtolower($condition['value']);
      }
      $filters[] = static::matchProperty($condition);
    }
  }
  // Only fold in case of multiple filters.
  return count($filters) > 1 ? $fold($filters) : reset($filters);
}