Entity/DocumentRepository.php
changeset 30 d2fba1e3b94b
parent 29 7496254cfead
child 34 21fab44f46fe
--- a/Entity/DocumentRepository.php	Mon Nov 07 17:25:39 2011 +0100
+++ b/Entity/DocumentRepository.php	Wed Nov 09 16:25:13 2011 +0100
@@ -6,6 +6,7 @@
 use IRI\Bundle\WikiTagBundle\Entity\Document;
 use Doctrine\ORM\Query\ResultSetMapping;
 use \ReflectionClass;
+use Doctrine\ORM\AbstractQuery;
 
 /**
  * DocumentRepository
@@ -215,31 +216,86 @@
      */
     function search(array $values, array $conditions=NULL)
     {
-/*        $em = $this->getEntityManager();
+        $em = $this->getEntityManager();
         
         $rsm = new ResultSetMapping();
-        $rsm->addEntityResult("IRI/Bundle/WikiTagBundle/Entity/Document", "d");
+        $rsm->addEntityResult("IRI\Bundle\WikiTagBundle\Entity\Document", "d");
         $rsm->addFieldResult("d", "id", "id");
-        $rsm->addFieldResult("d", "external_id", "externalId");
-        $rsm->addScalarResult("d", "score");
+        $rsm->addScalarResult("score", "score");
+        $rsm->addMetaResult("d", "external_id", "externalId");
+        
         
-        $score = "";
+        $score = array();
+        $i = 0;
         foreach ($values as $fielddef) {
-            
+            $i++;
             $columns = $fielddef["columns"];
             $value = $fielddef["value"];
-            $value = isset($fielddef["weight"])?$fielddef["weight"]:1.0;
+            $weight = isset($fielddef["weight"])?$fielddef["weight"]:1.0;
             
-            $score = "(MATCH($columns) AGAINST (:value))*:weight";
-            $parameters[] =
+            $score[] = "(MATCH($columns) AGAINST (:value_$i))*:weight_$i";
+            $parameters["value_$i"] = $value;
+            $parameters["weight_$i"] = $weight;
         }
         
+        $score_def = "(".implode("+", $score).")";
         
-        $query = $em->createNativeQuery("SELECT d.id, d.external_id, MATCH(title) AGAINST('$value') FROM wikitag_document d WHERE MATCH(title) AGAINST('$value') > 0", $rsm);
+        $conditions_str = "";
         
-        $res = $query->getScalarResult();
+        if(!is_null($conditions))
+        {
+            $conditions_array = array();
+            $i = 0;
+            foreach ($conditions as $field => $conddef)
+            {
+                $i++;
+                if(is_array($conddef) && isset($conddef['operator']))
+                {
+                    $operator = $conddef["operator"];
+                    $values = $conddef["value"];
+                }
+                elseif(is_array($conddef))
+                {
+                    $operator = "IN";
+                    $values = $conddef;
+                }
+                else
+                {
+                    $operator = "=";
+                    $values = $conddef;
+                }
+                   
+                if($operator === "IN")
+                {
+                    $in_parameters = array();
+                    for ($j = 0; $j < count($values); $j++) {
+                        $parameters["cond_val_$i_$j"] = $values[$j];
+                        $in_parameters[] = ":cond_val_$i_$j";
+                    }
+                    $cond = "($field IN (".implode(",",$in_parameters)."))";
+                }
+                else
+                {
+                    $cond = "($field $operator :cond_val_$i)";
+                    $parameters["cond_val_$i"] = $values;
+                }
+                $conditions_array[] = $cond;
+            }
+            
+            if(count($conditions_array) > 0)
+            {
+                $conditions_str = " AND ".implode(" AND ", $conditions_array);
+            }
+                
+        }
         
-        return $res;*/
+        $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);
+        
+        $query->setParameters($parameters);
+        
+        $res = $query->getResult();
+        
+        return $res;
         
         
     }