예제 #1
0
 /**
  * @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;
 }
예제 #2
0
 /**
  * @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;
     }
 }
예제 #3
0
 /**
  * @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;
 }