--- 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;
}