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