/**
  * Generate 'boolean style' query from the context
  * 'term1 and term2   or   term3 and (<subquery1>) and not (<subquery2>)'
  *
  * @return Zend_Search_Lucene_Search_Query
  * @throws Zend_Search_Lucene
  */
 private function _booleanExpressionQuery()
 {
     /**
      * We treat each level of an expression as a boolean expression in
      * a Disjunctive Normal Form
      *
      * AND operator has higher precedence than OR
      *
      * Thus logical query is a disjunction of one or more conjunctions of
      * one or more query entries
      */
     require_once 'Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php';
     $expressionRecognizer = new Zend_Search_Lucene_Search_BooleanExpressionRecognizer();
     require_once 'Zend/Search/Lucene/Exception.php';
     try {
         foreach ($this->_entries as $entry) {
             if ($entry instanceof Zend_Search_Lucene_Search_QueryEntry) {
                 $expressionRecognizer->processLiteral($entry);
             } else {
                 switch ($entry) {
                     case Zend_Search_Lucene_Search_QueryToken::TT_AND_LEXEME:
                         $expressionRecognizer->processOperator(Zend_Search_Lucene_Search_BooleanExpressionRecognizer::IN_AND_OPERATOR);
                         break;
                     case Zend_Search_Lucene_Search_QueryToken::TT_OR_LEXEME:
                         $expressionRecognizer->processOperator(Zend_Search_Lucene_Search_BooleanExpressionRecognizer::IN_OR_OPERATOR);
                         break;
                     case Zend_Search_Lucene_Search_QueryToken::TT_NOT_LEXEME:
                         $expressionRecognizer->processOperator(Zend_Search_Lucene_Search_BooleanExpressionRecognizer::IN_NOT_OPERATOR);
                         break;
                     default:
                         throw new Zend_Search_Lucene('Boolean expression error. Unknown operator type.');
                 }
             }
         }
         $conjuctions = $expressionRecognizer->finishExpression();
     } catch (Zend_Search_Exception $e) {
         // throw new Zend_Search_Lucene_Search_QueryParserException('Boolean expression error. Error message: \'' .
         //                                                          $e->getMessage() . '\'.' );
         // It's query syntax error message and it should be user friendly. So FSM message is omitted
         require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
         throw new Zend_Search_Lucene_Search_QueryParserException('Boolean expression error.', 0, $e);
     }
     // Remove 'only negative' conjunctions
     foreach ($conjuctions as $conjuctionId => $conjuction) {
         $nonNegativeEntryFound = false;
         foreach ($conjuction as $conjuctionEntry) {
             if ($conjuctionEntry[1]) {
                 $nonNegativeEntryFound = true;
                 break;
             }
         }
         if (!$nonNegativeEntryFound) {
             unset($conjuctions[$conjuctionId]);
         }
     }
     $subqueries = array();
     foreach ($conjuctions as $conjuction) {
         // Check, if it's a one term conjuction
         if (count($conjuction) == 1) {
             $subqueries[] = $conjuction[0][0]->getQuery($this->_encoding);
         } else {
             require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
             $subquery = new Zend_Search_Lucene_Search_Query_Boolean();
             foreach ($conjuction as $conjuctionEntry) {
                 $subquery->addSubquery($conjuctionEntry[0]->getQuery($this->_encoding), $conjuctionEntry[1]);
             }
             $subqueries[] = $subquery;
         }
     }
     if (count($subqueries) == 0) {
         require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php';
         return new Zend_Search_Lucene_Search_Query_Insignificant();
     }
     if (count($subqueries) == 1) {
         return $subqueries[0];
     }
     require_once 'Zend/Search/Lucene/Search/Query/Boolean.php';
     $query = new Zend_Search_Lucene_Search_Query_Boolean();
     foreach ($subqueries as $subquery) {
         // Non-requirered entry/subquery
         $query->addSubquery($subquery);
     }
     return $query;
 }
示例#2
0
 private function _booleanExpressionQuery()
 {
     $expressionRecognizer = new Zend_Search_Lucene_Search_BooleanExpressionRecognizer();
     try {
         foreach ($this->_entries as $entry) {
             if ($entry instanceof Zend_Search_Lucene_Search_QueryEntry) {
                 $expressionRecognizer->processLiteral($entry);
             } else {
                 switch ($entry) {
                     case Zend_Search_Lucene_Search_QueryToken::TT_AND_LEXEME:
                         $expressionRecognizer->processOperator(Zend_Search_Lucene_Search_BooleanExpressionRecognizer::IN_AND_OPERATOR);
                         break;
                     case Zend_Search_Lucene_Search_QueryToken::TT_OR_LEXEME:
                         $expressionRecognizer->processOperator(Zend_Search_Lucene_Search_BooleanExpressionRecognizer::IN_OR_OPERATOR);
                         break;
                     case Zend_Search_Lucene_Search_QueryToken::TT_NOT_LEXEME:
                         $expressionRecognizer->processOperator(Zend_Search_Lucene_Search_BooleanExpressionRecognizer::IN_NOT_OPERATOR);
                         break;
                     default:
                         throw new Zend_Search_Lucene('Boolean expression error. Unknown operator type.');
                 }
             }
         }
         $conjuctions = $expressionRecognizer->finishExpression();
     } catch (Zend_Search_Exception $e) {
         throw new Zend_Search_Lucene_Search_QueryParserException('Boolean expression error.', 0, $e);
     }
     foreach ($conjuctions as $conjuctionId => $conjuction) {
         $nonNegativeEntryFound = false;
         foreach ($conjuction as $conjuctionEntry) {
             if ($conjuctionEntry[1]) {
                 $nonNegativeEntryFound = true;
                 break;
             }
         }
         if (!$nonNegativeEntryFound) {
             unset($conjuctions[$conjuctionId]);
         }
     }
     $subqueries = array();
     foreach ($conjuctions as $conjuction) {
         if (count($conjuction) == 1) {
             $subqueries[] = $conjuction[0][0]->getQuery($this->_encoding);
         } else {
             $subquery = new Zend_Search_Lucene_Search_Query_Boolean();
             foreach ($conjuction as $conjuctionEntry) {
                 $subquery->addSubquery($conjuctionEntry[0]->getQuery($this->_encoding), $conjuctionEntry[1]);
             }
             $subqueries[] = $subquery;
         }
     }
     if (count($subqueries) == 0) {
         return new Zend_Search_Lucene_Search_Query_Insignificant();
     }
     if (count($subqueries) == 1) {
         return $subqueries[0];
     }
     $query = new Zend_Search_Lucene_Search_Query_Boolean();
     foreach ($subqueries as $subquery) {
         $query->addSubquery($subquery);
     }
     return $query;
 }