Esempio n. 1
0
 /**
  * Optimize query in the context of specified index
  *
  * @param \Zend\Search\Lucene\SearchIndexInterface $index
  * @return \Zend\Search\Lucene\Search\Query\AbstractQuery
  */
 public function optimize(Lucene\SearchIndexInterface $index)
 {
     // Check, that index contains specified term
     if (!$index->hasTerm($this->_term)) {
         return new EmptyResult();
     }
     return $this;
 }
Esempio n. 2
0
    /**
     * Optimize query in the context of specified index
     *
     * @param \Zend\Search\Lucene\SearchIndexInterface $index
     * @return \Zend\Search\Lucene\Search\Query\AbstractQuery
     */
    public function optimize(Lucene\SearchIndexInterface $index)
    {
        $terms = $this->_terms;
        $signs = $this->_signs;

        foreach ($terms as $id => $term) {
            if (!$index->hasTerm($term)) {
                if ($signs === null  ||  $signs[$id] === true) {
                    // Term is required
                    return new EmptyResult();
                } else {
                    // Term is optional or prohibited
                    // Remove it from terms and signs list
                    unset($terms[$id]);
                    unset($signs[$id]);
                }
            }
        }

        // Check if all presented terms are prohibited
        $allProhibited = true;
        if ($signs === null) {
            $allProhibited = false;
        } else {
            foreach ($signs as $sign) {
                if ($sign !== false) {
                    $allProhibited = false;
                    break;
                }
            }
        }
        if ($allProhibited) {
            return new EmptyResult();
        }

        /**
         * @todo make an optimization for repeated terms
         * (they may have different signs)
         */

        if (count($terms) == 1) {
            // It's already checked, that it's not a prohibited term

            // It's one term query with one required or optional element
            $optimizedQuery = new Term(reset($terms));
            $optimizedQuery->setBoost($this->getBoost());

            return $optimizedQuery;
        }

        if (count($terms) == 0) {
            return new EmptyResult();
        }

        $optimizedQuery = new MultiTerm($terms, $signs);
        $optimizedQuery->setBoost($this->getBoost());
        return $optimizedQuery;
    }
Esempio n. 3
0
 /**
  * Optimize query in the context of specified index
  *
  * @param \Zend\Search\Lucene\SearchIndexInterface $index
  * @return \Zend\Search\Lucene\Search\Query\AbstractQuery
  */
 public function optimize(Lucene\SearchIndexInterface $index)
 {
     // Check, that index contains all phrase terms
     foreach ($this->_terms as $term) {
         if (!$index->hasTerm($term)) {
             return new EmptyResult();
         }
     }
     if (count($this->_terms) == 1) {
         // It's one term query
         $optimizedQuery = new Term(reset($this->_terms));
         $optimizedQuery->setBoost($this->getBoost());
         return $optimizedQuery;
     }
     if (count($this->_terms) == 0) {
         return new EmptyResult();
     }
     return $this;
 }