public function testBooleanQuery()
 {
     $objSearchTerm1 = new class_module_search_term("hallo");
     $objSearchTerm2 = new class_module_search_term("welt");
     $objBooleanSearch = new class_module_search_boolean_query();
     $objBooleanSearch->add($objSearchTerm1, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST);
     $objBooleanSearch->add($objSearchTerm2, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST);
     $arrResult = $this->getResultsFromQuery($objBooleanSearch);
     $this->assertEquals(count($arrResult), 2);
     $this->assertEquals($arrResult[0]["score"], 2);
     $this->assertEquals($this->getCountFromQuery($objBooleanSearch), 2);
     // One more optional search term
     $objSearchTerm3 = new class_module_search_term("blub");
     $objBooleanSearch->add($objSearchTerm3, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_SHOULD);
     $arrResult = $this->getResultsFromQuery($objBooleanSearch);
     $this->assertEquals(count($arrResult), 2);
     $this->assertEquals($arrResult[0]["score"], 4);
     $this->assertEquals($arrResult[1]["score"], 2);
     $this->assertEquals($this->getCountFromQuery($objBooleanSearch), 2);
     // Module metadata filter
     $objMetadataFilter = new class_module_search_metadata_filter();
     $objMetadataFilter->setFilterModules(array(_system_modul_id_));
     $objBooleanSearch->setMetadataFilter($objMetadataFilter);
     $arrResult = $this->getResultsFromQuery($objBooleanSearch);
     $this->assertEquals(count($arrResult), 1, "Metadata module filter");
     $this->assertEquals($arrResult[0]["score"], 4);
     $this->assertEquals($this->getCountFromQuery($objBooleanSearch), 1);
     $objMetadataFilter->setFilterModules(array(_system_modul_id_, _search_module_id_));
     $objBooleanSearch->setMetadataFilter($objMetadataFilter);
     $arrResult = $this->getResultsFromQuery($objBooleanSearch);
     $this->assertEquals(count($arrResult), 2, "Metadata module filter");
     $this->assertEquals($this->getCountFromQuery($objBooleanSearch), 2);
     // must must mustNot Search
     $objParser = new class_module_search_query_parser();
     $objQuery = $objParser->parseText("+hallo +welt -blub");
     $arrResult = $this->getResultsFromQuery($objQuery);
     $this->assertEquals(count($arrResult), 1);
     $this->assertEquals($this->getCountFromQuery($objQuery), 1);
     $objParser = new class_module_search_query_parser();
     $objQuery = $objParser->parseText("+hallo +subtitle:blub");
     $arrResult = $this->getResultsFromQuery($objQuery);
     $this->assertEquals(count($arrResult), 1);
     $this->assertEquals($arrResult[0]["score"], 2, "field filter scoring");
     $this->assertEquals($this->getCountFromQuery($objQuery), 1);
     $objQuery = $objParser->parseText("title:hallo");
     $arrResult = $this->getResultsFromQuery($objQuery);
     $this->assertEquals(count($arrResult), 2);
     $this->assertEquals($arrResult[0]["score"], 1, "field filter scoring");
     $this->assertEquals($this->getCountFromQuery($objQuery), 2);
     //test new Scoring
     $objQuery = $objParser->parseText("lorem ipsum");
     $arrResult = $this->getResultsFromQuery($objQuery);
     $this->assertEquals(count($arrResult), 1);
     $this->assertEquals($arrResult[0]["score"], 4, "'lorem ipsum' scoring");
     $this->assertEquals($this->getCountFromQuery($objQuery), 1);
 }
 /**
  * @param string $strSearchQuery
  * @return interface_search_query
  */
 public function parseText($strSearchQuery)
 {
     $arrHits = array();
     preg_match_all('/(?<must>[+-]?)(?<field>\\w{1,}(?<semperator>:)){0,1}(?<term>\\w{1,})/u', $strSearchQuery, $arrHits, PREG_SET_ORDER);
     if (count($arrHits) == 1) {
         $objSearchQuery = new class_module_search_term_query(new class_module_search_term(str_replace(":", "", $arrHits[0]['term']), substr($arrHits[0]['field'], 0, -1)));
         return $objSearchQuery;
     }
     if (count($arrHits) > 1) {
         $objSearchQuery = new class_module_search_boolean_query();
         $arrMusts = array();
         $arrMustNots = array();
         $arrNoOperators = array();
         foreach ($arrHits as $arrHit) {
             $objTerm = new class_module_search_term(str_replace(":", "", $arrHit['term']), substr($arrHit['field'], 0, -1));
             switch ($arrHit['must']) {
                 case "+":
                     $arrMusts[] = $objTerm;
                     break;
                 case "-":
                     $arrMustNots[] = $objTerm;
                     break;
                 case "":
                     $arrNoOperators[] = $objTerm;
                     break;
             }
         }
         /** @var $objTerm class_module_search_term */
         foreach ($arrMusts as $objTerm) {
             $objSearchQuery->add($objTerm, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST);
         }
         /** @var $objTerm class_module_search_term */
         foreach ($arrMustNots as $objTerm) {
             $objSearchQuery->add($objTerm, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST_NOT);
         }
         if (count($arrMusts) > 0) {
             foreach ($arrNoOperators as $objTerm) {
                 $objSearchQuery->add($objTerm, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_SHOULD);
             }
         } elseif (count($arrMustNots) > 0 || count($arrMusts) == 0 && count($arrMustNots) == 0) {
             foreach ($arrNoOperators as $objTerm) {
                 $objSearchQuery->add($objTerm, class_module_search_boolean_query::BOOLEAN_CLAUSE_OCCUR_MUST);
             }
         }
         return $objSearchQuery;
     }
     return null;
 }