diff -r 7496254cfead -r d2fba1e3b94b Entity/DocumentRepository.php --- 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; }