Ejemplo n.º 1
0
 /**
  * @param SearchQueryInterface $query
  * @param bool $asFilter
  * @return array
  */
 protected function mapQuery(SearchQueryInterface $query, $asFilter = false)
 {
     $queryArr = [];
     if ($query instanceof Boolean) {
         $signs = $query->getSigns();
         $boolean = [];
         foreach ($query->getSubQueries() as $key => $subQuery) {
             $sign = isset($signs[$key]) ? $signs[$key] : null;
             if ($sign === true) {
                 if ($subQueryArr = $this->mapQuery($subQuery, $asFilter)) {
                     if (!isset($boolean['must'])) {
                         $boolean['must'] = [];
                     }
                     $boolean['must'][] = $this->mapQuery($subQuery, $asFilter);
                 }
             } elseif ($sign === false) {
                 if ($subQueryArr = $this->mapQuery($subQuery, $asFilter)) {
                     if (!isset($booleanr['must_not'])) {
                         $boolean['must_not'] = [];
                     }
                     $boolean['must_not'][] = $this->mapQuery($subQuery, $asFilter);
                 }
             } elseif ($sign === null) {
                 if ($subQueryArr = $this->mapQuery($subQuery, $asFilter)) {
                     if (!isset($boolean['should'])) {
                         $boolean['should'] = [];
                     }
                     $boolean['should'][] = $this->mapQuery($subQuery, $asFilter);
                 }
             }
         }
         if ($boolean) {
             $queryArr['bool'] = $boolean;
         }
     } elseif ($query instanceof Term) {
         $queryArr['term'] = [$query->getField() => $query->getTerm()];
     } elseif ($query instanceof Range) {
         $range = [];
         if (($from = $query->getLowerBound()) !== null) {
             $range[$query->isIncludeLowerBound() ? 'gte' : 'gt'] = $from;
         }
         if (($to = $query->getUpperBound()) !== null) {
             $range[$query->isIncludeUpperBound() ? 'lte' : 'lt'] = $to;
         }
         $queryArr['range'] = [$query->getField() => $range];
     } elseif ($query instanceof Match) {
         $matchQuery = [$query->getField() => $query->getTerm()->getTerm()];
         if ($asFilter) {
             $queryArr['query']['match'] = $matchQuery;
         } else {
             $queryArr['match'] = $matchQuery;
         }
     } elseif ($query instanceof MultiMatch) {
         $multiMatchQuery = ['query' => $query->getTerm()->getTerm(), 'type' => 'most_fields', 'fields' => array_values($query->getFields()), 'minimum_should_match' => '75%'];
         if ($asFilter) {
             $queryArr['query']['multi_match'] = $multiMatchQuery;
         } else {
             $queryArr['multi_match'] = $multiMatchQuery;
         }
     }
     return $queryArr;
 }