Entity/DocumentRepository.php
changeset 30 d2fba1e3b94b
parent 29 7496254cfead
child 34 21fab44f46fe
equal deleted inserted replaced
29:7496254cfead 30:d2fba1e3b94b
     4 
     4 
     5 use Doctrine\ORM\EntityRepository;
     5 use Doctrine\ORM\EntityRepository;
     6 use IRI\Bundle\WikiTagBundle\Entity\Document;
     6 use IRI\Bundle\WikiTagBundle\Entity\Document;
     7 use Doctrine\ORM\Query\ResultSetMapping;
     7 use Doctrine\ORM\Query\ResultSetMapping;
     8 use \ReflectionClass;
     8 use \ReflectionClass;
       
     9 use Doctrine\ORM\AbstractQuery;
     9 
    10 
    10 /**
    11 /**
    11  * DocumentRepository
    12  * DocumentRepository
    12  *
    13  *
    13  * This class was generated by the Doctrine ORM. Add your own custom
    14  * This class was generated by the Doctrine ORM. Add your own custom
   213      * @param array $values : key: the fields to search into, value array('value'=>value, 'weight'=>weight)
   214      * @param array $values : key: the fields to search into, value array('value'=>value, 'weight'=>weight)
   214      * @param unknown_type $conditions
   215      * @param unknown_type $conditions
   215      */
   216      */
   216     function search(array $values, array $conditions=NULL)
   217     function search(array $values, array $conditions=NULL)
   217     {
   218     {
   218 /*        $em = $this->getEntityManager();
   219         $em = $this->getEntityManager();
   219         
   220         
   220         $rsm = new ResultSetMapping();
   221         $rsm = new ResultSetMapping();
   221         $rsm->addEntityResult("IRI/Bundle/WikiTagBundle/Entity/Document", "d");
   222         $rsm->addEntityResult("IRI\Bundle\WikiTagBundle\Entity\Document", "d");
   222         $rsm->addFieldResult("d", "id", "id");
   223         $rsm->addFieldResult("d", "id", "id");
   223         $rsm->addFieldResult("d", "external_id", "externalId");
   224         $rsm->addScalarResult("score", "score");
   224         $rsm->addScalarResult("d", "score");
   225         $rsm->addMetaResult("d", "external_id", "externalId");
   225         
   226         
   226         $score = "";
   227         
       
   228         $score = array();
       
   229         $i = 0;
   227         foreach ($values as $fielddef) {
   230         foreach ($values as $fielddef) {
   228             
   231             $i++;
   229             $columns = $fielddef["columns"];
   232             $columns = $fielddef["columns"];
   230             $value = $fielddef["value"];
   233             $value = $fielddef["value"];
   231             $value = isset($fielddef["weight"])?$fielddef["weight"]:1.0;
   234             $weight = isset($fielddef["weight"])?$fielddef["weight"]:1.0;
   232             
   235             
   233             $score = "(MATCH($columns) AGAINST (:value))*:weight";
   236             $score[] = "(MATCH($columns) AGAINST (:value_$i))*:weight_$i";
   234             $parameters[] =
   237             $parameters["value_$i"] = $value;
   235         }
   238             $parameters["weight_$i"] = $weight;
   236         
   239         }
   237         
   240         
   238         $query = $em->createNativeQuery("SELECT d.id, d.external_id, MATCH(title) AGAINST('$value') FROM wikitag_document d WHERE MATCH(title) AGAINST('$value') > 0", $rsm);
   241         $score_def = "(".implode("+", $score).")";
   239         
   242         
   240         $res = $query->getScalarResult();
   243         $conditions_str = "";
   241         
   244         
   242         return $res;*/
   245         if(!is_null($conditions))
       
   246         {
       
   247             $conditions_array = array();
       
   248             $i = 0;
       
   249             foreach ($conditions as $field => $conddef)
       
   250             {
       
   251                 $i++;
       
   252                 if(is_array($conddef) && isset($conddef['operator']))
       
   253                 {
       
   254                     $operator = $conddef["operator"];
       
   255                     $values = $conddef["value"];
       
   256                 }
       
   257                 elseif(is_array($conddef))
       
   258                 {
       
   259                     $operator = "IN";
       
   260                     $values = $conddef;
       
   261                 }
       
   262                 else
       
   263                 {
       
   264                     $operator = "=";
       
   265                     $values = $conddef;
       
   266                 }
       
   267                    
       
   268                 if($operator === "IN")
       
   269                 {
       
   270                     $in_parameters = array();
       
   271                     for ($j = 0; $j < count($values); $j++) {
       
   272                         $parameters["cond_val_$i_$j"] = $values[$j];
       
   273                         $in_parameters[] = ":cond_val_$i_$j";
       
   274                     }
       
   275                     $cond = "($field IN (".implode(",",$in_parameters)."))";
       
   276                 }
       
   277                 else
       
   278                 {
       
   279                     $cond = "($field $operator :cond_val_$i)";
       
   280                     $parameters["cond_val_$i"] = $values;
       
   281                 }
       
   282                 $conditions_array[] = $cond;
       
   283             }
       
   284             
       
   285             if(count($conditions_array) > 0)
       
   286             {
       
   287                 $conditions_str = " AND ".implode(" AND ", $conditions_array);
       
   288             }
       
   289                 
       
   290         }
       
   291         
       
   292         $query = $em->createNativeQuery("SELECT d.id, d.external_id, $score_def AS score FROM wikitag_document d WHERE $score_def > 0  $conditions_str ORDER BY score DESC", $rsm);
       
   293         
       
   294         $query->setParameters($parameters);
       
   295         
       
   296         $res = $query->getResult();
       
   297         
       
   298         return $res;
   243         
   299         
   244         
   300         
   245     }
   301     }
   246         
   302         
   247 }
   303 }