/** * @param \Zend_Search_Lucene_Search_Query_Phrase $po_query * @return array */ public function getFiltersForPhraseQuery($po_query) { $va_terms = $va_return = array(); $vs_fld = null; foreach ($po_query->getQueryTerms() as $o_term) { $o_term = caRewriteElasticSearchTermFieldSpec($o_term); $vs_fld = str_replace('\\', '', $o_term->field); $va_terms[] = $o_term->text; } $va_parsed_values = caGetISODates(join(' ', $va_terms)); $va_return[] = array('range' => array($vs_fld => array('lte' => $va_parsed_values['end']))); $va_return[] = array('range' => array($vs_fld => array('gte' => $va_parsed_values['start']))); return $va_return; }
/** * @param $o_subquery * @return string|\Zend_Search_Lucene_Search_Query * @throws \Exception * @throws \Zend_Search_Lucene_Exception */ public function rewriteSubquery($o_subquery) { switch (get_class($o_subquery)) { case 'Zend_Search_Lucene_Search_Query_Range': /** @var $o_subquery \Zend_Search_Lucene_Search_Query_Range */ $o_lower_term = caRewriteElasticSearchTermFieldSpec($o_subquery->getLowerTerm()); $o_lower_fld = $this->getFieldTypeForTerm($o_lower_term); $o_upper_term = caRewriteElasticSearchTermFieldSpec($o_subquery->getUpperTerm()); $o_upper_fld = $this->getFieldTypeForTerm($o_upper_term); $o_new_subquery = null; if ($o_lower_fld instanceof FieldTypes\Geocode) { $this->opa_additional_filters[]['geo_shape'] = $o_lower_fld->getFilterForRangeQuery($o_lower_term, $o_upper_term); } else { $o_lower_rewritten_term = $o_lower_fld->getRewrittenTerm($o_lower_term); $o_upper_rewritten_term = $o_upper_fld->getRewrittenTerm($o_upper_term); if ($o_lower_rewritten_term && $o_upper_rewritten_term) { $o_new_subquery = new \Zend_Search_Lucene_Search_Query_Range($o_lower_fld->getRewrittenTerm($o_lower_term), $o_upper_fld->getRewrittenTerm($o_upper_term), $o_subquery->isInclusive()); } } return $this->getSubqueryWithAdditionalTerms($o_new_subquery, $o_lower_fld, $o_lower_term); case 'Zend_Search_Lucene_Search_Query_Term': /** @var $o_subquery \Zend_Search_Lucene_Search_Query_Term */ $o_term = caRewriteElasticSearchTermFieldSpec($o_subquery->getTerm()); $o_fld = $this->getFieldTypeForTerm($o_term); $o_new_subquery = null; if ($o_fld instanceof FieldTypes\DateRange || $o_fld instanceof FieldTypes\Timestamp) { $o_new_subquery = null; $this->opa_additional_filters['range'] = $o_fld->getFilterForTerm($o_term); break; } else { if ($o_rewritten_term = $o_fld->getRewrittenTerm($o_term)) { $o_new_subquery = new \Zend_Search_Lucene_Search_Query_Term($o_fld->getRewrittenTerm($o_term)); } } return $this->getSubqueryWithAdditionalTerms($o_new_subquery, $o_fld, $o_term); case 'Zend_Search_Lucene_Search_Query_Phrase': /** @var $o_subquery \Zend_Search_Lucene_Search_Query_Phrase */ $o_new_subquery = new \Zend_Search_Lucene_Search_Query_Phrase(); foreach ($o_subquery->getTerms() as $o_term) { $o_term = caRewriteElasticSearchTermFieldSpec($o_term); $o_fld = $this->getFieldTypeForTerm($o_term); if ($o_fld instanceof FieldTypes\Geocode) { $o_new_subquery = null; $this->opa_additional_filters['geo_shape'] = $o_fld->getFilterForPhraseQuery($o_subquery); break; } elseif ($o_fld instanceof FieldTypes\DateRange || $o_fld instanceof FieldTypes\Timestamp) { $o_new_subquery = null; foreach ($o_fld->getFiltersForPhraseQuery($o_subquery) as $va_filter) { $this->opa_additional_filters[] = $va_filter; } break; } else { if ($o_rewritten_term = $o_fld->getRewrittenTerm($o_term)) { $o_new_subquery->addTerm($o_rewritten_term); } } } return $this->getSubqueryWithAdditionalTerms($o_new_subquery, $o_fld, $o_term); case 'Zend_Search_Lucene_Search_Query_MultiTerm': /** @var @o_subquery \Zend_Search_Lucene_Search_Query_MultiTerm */ $va_terms = $o_subquery->getTerms(); $va_new_terms = array(); foreach ($va_terms as $o_term) { $o_term = caRewriteElasticSearchTermFieldSpec($o_term); $o_fld = $this->getFieldTypeForTerm($o_term); $va_new_terms[] = $o_fld->getRewrittenTerm($o_term); } $o_new_subquery = new \Zend_Search_Lucene_Search_Query_MultiTerm($va_new_terms, $o_subquery->getSigns()); return $this->getSubqueryWithAdditionalTerms($o_new_subquery, $o_fld, $o_term); default: throw new \Exception('Encountered unknown Zend subquery type in ElasticSearch\\Query: ' . get_class($o_subquery)); break; } }
/** * @param \Zend_Search_Lucene_Search_Query_Phrase $o_subquery * @return mixed */ public function getFilterForPhraseQuery($o_subquery) { $va_terms = array(); foreach ($o_subquery->getQueryTerms() as $o_term) { $o_term = caRewriteElasticSearchTermFieldSpec($o_term); $va_terms[] = $o_term->text; } $va_parsed_search = caParseGISSearch(join(' ', $va_terms)); $va_return[str_replace('\\', '', $o_term->field)] = array('shape' => array('type' => 'envelope', 'coordinates' => array(array((double) $va_parsed_search['min_longitude'], (double) $va_parsed_search['min_latitude']), array((double) $va_parsed_search['max_longitude'], (double) $va_parsed_search['max_latitude'])))); return $va_return; }