Line 300... |
Line 300... |
300 |
$communeMotif = $this->bdd->proteger("$commune%");
|
300 |
$communeMotif = $this->bdd->proteger("$commune%");
|
301 |
$this->addWhere('masque.commune', "vdi.zone_geo LIKE $communeMotif");
|
301 |
$this->addWhere('masque.commune', "vdi.zone_geo LIKE $communeMotif");
|
302 |
}
|
302 |
}
|
303 |
}
|
303 |
}
|
Line -... |
Line 304... |
- |
|
304 |
|
- |
|
305 |
public function ajouterConstrainteAppliObs() {
|
- |
|
306 |
$this->ajouterContrainteTagCel();
|
- |
|
307 |
$this->ajouterContrainteType();
|
- |
|
308 |
// TODO : ATTENTION -> vue que l'on utilise une vue basée sur les images, nous devons grouper par obs
|
- |
|
309 |
$this->addGroupBy('vdi.id_observation');
|
- |
|
310 |
}
|
- |
|
311 |
|
- |
|
312 |
/**
|
- |
|
313 |
* @param $req: la représentation de la requête MySQL complète, à amender.
|
- |
|
314 |
*/
|
- |
|
315 |
private function ajouterContrainteType() {
|
- |
|
316 |
if (array_key_exists('adeterminer', $this->parametres['masque.type'])) {
|
- |
|
317 |
// Récupèration de toutes les observations qui on le tag "aDeterminer" *ou* qui n'ont pas de nom d'espèce
|
- |
|
318 |
// *ou* qui ont la "certitude" à ("aDeterminer" *ou* "douteux")
|
- |
|
319 |
$this->addWhere('masque.type', '('.
|
- |
|
320 |
'vdi.certitude = "aDeterminer" '.
|
- |
|
321 |
'OR vdi.certitude = "douteux" '.
|
- |
|
322 |
'OR vdi.mots_cles_texte LIKE "%aDeterminer%" '.
|
- |
|
323 |
'OR vdi.nom_sel_nn IS NULL '.
|
- |
|
324 |
'OR vdi.nom_sel_nn = 0 '.// il ne DEVRAIT pas y avoir d'entrées à 0, mais il y en a quand-même !!
|
- |
|
325 |
')');
|
- |
|
326 |
}
|
- |
|
327 |
if (array_key_exists('validees', $this->parametres['masque.type'])) {
|
- |
|
328 |
// Récupèration de toutes les observations ayant un commentaire doté de proposition_retenue = 1
|
- |
|
329 |
$this->addJoin('INNER JOIN del_commentaire AS dc '.
|
- |
|
330 |
'ON (vdi.id_observation = dc.ce_observation AND dc.proposition_retenue = 1) ');
|
- |
|
331 |
}
|
- |
|
332 |
|
- |
|
333 |
if (array_key_exists('endiscussion', $this->parametres['masque.type'])) {
|
- |
|
334 |
$nbreCommentaire =(int) ($this->conteneur->getParametre('observations.nb_commentaires_discussion'));
|
- |
|
335 |
$this->addWhere('masque.type', '(SELECT COUNT(id_commentaire) FROM del_commentaire AS dc '.
|
- |
|
336 |
"WHERE ce_observation = id_observation) > $nbreCommentaire ");
|
- |
|
337 |
}
|
- |
|
338 |
}
|
304 |
|
339 |
|
305 |
/**
|
340 |
/**
|
306 |
* in $p: un tableau de paramètres, dont:
|
341 |
* in $p: un tableau de paramètres, dont:
|
307 |
* - 'masque.tag_cel': *tableau* de mots-clefs à chercher parmi cel_image.mots_clefs_texte
|
342 |
* - 'masque.tag_cel': *tableau* de mots-clefs à chercher parmi cel_image.mots_clefs_texte
|
308 |
* - 'masque.tag_del': *tableau* de mots-clefs à chercher parmi del_image_tag.tag_normalise
|
343 |
* - 'masque.tag_del': *tableau* de mots-clefs à chercher parmi del_image_tag.tag_normalise
|
Line 375... |
Line 410... |
375 |
* Car il ne sont pas traités par la générique requestFilterParams() les clefs "masque.tag_*"
|
410 |
* Car il ne sont pas traités par la générique requestFilterParams() les clefs "masque.tag_*"
|
376 |
* sont toujours présentes; bien que parfois NULL.
|
411 |
* sont toujours présentes; bien que parfois NULL.
|
377 |
*/
|
412 |
*/
|
378 |
// TODO: utiliser les tables de mots clefs normaliées dans tb_cel ? et auquel cas laisser au client le choix du couteux "%" ?
|
413 |
// TODO: utiliser les tables de mots clefs normaliées dans tb_cel ? et auquel cas laisser au client le choix du couteux "%" ?
|
379 |
private function ajouterContrainteTagCel() {
|
414 |
private function ajouterContrainteTagCel() {
|
380 |
if ($this->parametres['masque.tag_cel']) {
|
415 |
if (isset($this->parametres['masque.tag_cel'])) {
|
381 |
if (isset($this->parametres['masque.tag_cel']['AND'])) {
|
416 |
if (isset($this->parametres['masque.tag_cel']['AND'])) {
|
382 |
$tags = $this->parametres['masque.tag_cel']['AND'];
|
417 |
$tags = $this->parametres['masque.tag_cel']['AND'];
|
383 |
$clausesWhere = array();
|
418 |
$clausesWhere = array();
|
384 |
foreach ($tags as $tag) {
|
419 |
foreach ($tags as $tag) {
|
385 |
$tagMotif = $this->bdd->proteger("%$tag%");
|
420 |
$tagMotif = $this->bdd->proteger("%$tag%");
|
Line 397... |
Line 432... |
397 |
}
|
432 |
}
|
398 |
}
|
433 |
}
|
399 |
}
|
434 |
}
|
Line 400... |
Line 435... |
400 |
|
435 |
|
401 |
/**
|
436 |
/**
|
402 |
* Plusieurs solutions disponibles pour la gestion des contraintes des tags DEL :
|
- |
|
403 |
* - inutilisable pour l'instant : ajouterContrainteTagDelSolution1();
|
- |
|
404 |
* - intéressante, mais problème d'optimiseur MySQL 5.5 (dependant subquery) : ajouterContrainteTagDelSolution2();
|
- |
|
405 |
* - approche fiable mais sous-optimale : ajouterContrainteTagDelSolution3();
|
437 |
* Plusieurs solutions sont disponibles dans les anciennes versions (voir DelTk).
|
406 |
*/
|
438 |
*/
|
407 |
private function ajouterContrainteTagDel() {
|
439 |
private function ajouterContrainteTagDel() {
|
408 |
if (isset($this->parametres['masque.tag_del'])) {
|
440 |
if (isset($this->parametres['masque.tag_del'])) {
|
409 |
$this->ajouterContrainteTagDelSolution3();
|
- |
|
410 |
}
|
- |
|
411 |
}
|
- |
|
412 |
|
441 |
if (isset($this->parametres['masque.tag_del']['AND'])) {
|
413 |
/** Approche intéressante si les deux problèmes suivants peuvent être résolu:
|
442 |
$tags = $this->parametres['masque.tag_del']['AND'];
|
414 |
* - LEFT JOIN => dup => *gestion de multiples GROUP BY* (car in-fine un LIMIT est utilisé)
|
443 |
// optimisation: en cas de "AND" on sort() l'input et le GROUP_CONCAT()
|
415 |
* - dans le cas d'un ET logique, comment chercher les observations correspondantes ?
|
444 |
// donc nous utilisons des ".*" plutôt que de multiples conditions et "|"
|
416 |
*/
|
445 |
sort($tags);
|
417 |
private function ajouterContrainteTagDelSolution1() {
|
446 |
$tagsMotif = $this->bdd->proteger(implode('.*', $tags));
|
418 |
// XXX: utiliser tag plutôt que tag_normalise ?
|
447 |
$requete = 'SELECT ce_image '.
|
419 |
$req['join'][] = 'LEFT JOIN del_image_tag dit ON dit.ce_image = vdi.id_image';
|
448 |
'FROM del_image_tag '.
|
- |
|
449 |
'WHERE actif = 1 '.
|
420 |
$req['where'][] = 'dit.actif = 1';
|
450 |
'GROUP BY ce_image '.
|
- |
|
451 |
"HAVING GROUP_CONCAT(tag_normalise ORDER BY tag_normalise) REGEXP $tagsMotif ".
|
- |
|
452 |
' -- '.__FILE__.' : '.__LINE__;
|
- |
|
453 |
$sql = $this->recupererSqlContrainteTag($requete);
|
- |
|
454 |
$this->addWhere('masque.tag_del', $sql);
|
421 |
$req['groupby'][] = 'vdi.id_image'; // TODO: nécessaire (car dup') mais risque de conflict en cas de tri (multiple GROUP BY)
|
455 |
|
422 |
// XXX: en cas de ET, possibilité du GROUP_CONCAT(), mais probablement sans grand intérêt, d'où une boucle
|
456 |
} else if (isset($this->parametres['masque.tag_del']['OR'])) {
|
423 |
if (isset($p['masque.tag_del']['AND'])) {
|
457 |
$tags = $this->parametres['masque.tag_del']['OR'];
|
424 |
// TODO/XXX : comment matcher les observations ayant tous les mots-clef passés ?
|
458 |
$tagsMotif = $this->bdd->proteger(implode('|', $tags));
|
425 |
// ... le LEFT-JOIN n'y semble pas adapté
|
459 |
$requete = 'SELECT ce_image '.
|
426 |
} else {
|
460 |
'FROM del_image_tag '.
|
- |
|
461 |
'WHERE actif = 1 '.
|
427 |
$protected_tags = array();
|
462 |
'GROUP BY ce_image '.
|
- |
|
463 |
"HAVING GROUP_CONCAT(tag_normalise) REGEXP $tagsMotif ".
|
428 |
foreach ($p['masque.tag_del']['OR'] as $tag) {
|
464 |
' -- '.__FILE__.' : '.__LINE__;
|
- |
|
465 |
$sql = $this->recupererSqlContrainteTag($requete);
|
429 |
$protected_tags[] = $db->proteger(strtolower($tag));
|
466 |
$this->addWhere('masque.tag_del', $sql);
|
430 |
}
|
- |
|
431 |
$req['where'][] = sprintf('tag_normalise IN (%s)', implode(',', $protected_tags));
|
- |
|
432 |
}
|
- |
|
433 |
}
|
- |
|
434 |
|
- |
|
435 |
/**
|
- |
|
436 |
* Inutilisé pour l'instant pour cause de soucis d'optimiseur MySQL (cf commentaire en intro)
|
- |
|
437 |
*/
|
- |
|
438 |
private function ajouterContrainteTagDelSolution2() {
|
- |
|
439 |
// Note à propos des 4 "@ instruction" ci-dessous (notamment sur recupererTous())
|
- |
|
440 |
// REGEXP permet un puissant mécanisme de sélection des obs/image à qui sait
|
- |
|
441 |
// l'utiliser, mais peut sortir une erreur en cas de REGEXP invalide
|
- |
|
442 |
// ex: REGEX "^(".
|
- |
|
443 |
// Pour l'heure nous ignorons ce type d'erreur car aucun de nos champ de recherche
|
- |
|
444 |
// ne peuvent (ou ne devrait) comporter des meta-caractères
|
- |
|
445 |
// ([])?*+\\
|
- |
|
446 |
if (isset($p['masque.tag_del']['AND'])) {
|
- |
|
447 |
// optimsation: en cas de "AND" on sort() l'input et le GROUP_CONCAT()
|
- |
|
448 |
// donc nous utilisons des ".*" plutôt que de multiples conditions et "|"
|
- |
|
449 |
sort($p['masque.tag_del']['AND']);
|
- |
|
450 |
$req['where'][] = sprintf("vdi.id_image IN (SELECT ce_image FROM del_image_tag WHERE actif = 1".
|
- |
|
451 |
" GROUP BY ce_image".
|
- |
|
452 |
" HAVING GROUP_CONCAT(tag_normalise ORDER BY tag_normalise) REGEXP %s)",
|
- |
|
453 |
$db->proteger(implode('.*', $p['masque.tag_del']['AND'])));
|
- |
|
454 |
} else {
|
- |
|
455 |
$req['where'][] = sprintf("vdi.id_image IN (SELECT ce_image FROM del_image_tag WHERE actif = 1".
|
- |
|
456 |
" GROUP BY ce_image".
|
- |
|
457 |
" HAVING GROUP_CONCAT(tag_normalise) REGEXP %s)",
|
- |
|
458 |
$db->proteger(implode('|', $p['masque.tag_del']['OR'])));
|
- |
|
459 |
}
|
- |
|
460 |
}
|
- |
|
461 |
|
- |
|
462 |
/**
|
- |
|
463 |
* Si l'on est bassiné par les "DEPENDENT SUBQUERY", nous la faisons donc indépendemment via cette fonction
|
- |
|
464 |
*/
|
- |
|
465 |
private function ajouterContrainteTagDelSolution3() {
|
- |
|
466 |
if (isset($this->parametres['masque.tag_del']['AND'])) {
|
- |
|
467 |
$tags = $this->parametres['masque.tag_del']['AND'];
|
- |
|
468 |
// optimisation: en cas de "AND" on sort() l'input et le GROUP_CONCAT()
|
- |
|
469 |
// donc nous utilisons des ".*" plutôt que de multiples conditions et "|"
|
- |
|
470 |
sort($tags);
|
- |
|
471 |
$tagsMotif = $this->bdd->proteger(implode('.*', $tags));
|
- |
|
472 |
$requete = 'SELECT ce_image '.
|
- |
|
473 |
'FROM del_image_tag '.
|
- |
|
474 |
'WHERE actif = 1 '.
|
- |
|
475 |
'GROUP BY ce_image '.
|
- |
|
476 |
"HAVING GROUP_CONCAT(tag_normalise ORDER BY tag_normalise) REGEXP $tagsMotif ".
|
- |
|
477 |
' -- '.__FILE__.' : '.__LINE__;
|
- |
|
478 |
$sql = $this->recupererSqlContrainteTag($requete);
|
- |
|
479 |
$this->addWhere('masque.tag_del', $sql);
|
- |
|
480 |
|
- |
|
481 |
} else if (isset($this->parametres['masque.tag_del']['OR'])) {
|
- |
|
482 |
$tags = $this->parametres['masque.tag_del']['OR'];
|
- |
|
483 |
$tagsMotif = $this->bdd->proteger(implode('|', $tags));
|
- |
|
484 |
$requete = 'SELECT ce_image '.
|
- |
|
485 |
'FROM del_image_tag '.
|
- |
|
486 |
'WHERE actif = 1 '.
|
- |
|
487 |
'GROUP BY ce_image '.
|
- |
|
488 |
"HAVING GROUP_CONCAT(tag_normalise) REGEXP $tagsMotif ".
|
- |
|
489 |
' -- '.__FILE__.' : '.__LINE__;
|
- |
|
490 |
$sql = $this->recupererSqlContrainteTag($requete);
|
- |
|
491 |
$this->addWhere('masque.tag_del', $sql);
|
467 |
}
|
492 |
}
|
468 |
}
|
Line 493... |
Line 469... |
493 |
}
|
469 |
}
|
494 |
|
470 |
|
Line 535... |
Line 511... |
535 |
default:
|
511 |
default:
|
536 |
$this->addOrderBy("date_transmission $ordre, id_observation $ordre");
|
512 |
$this->addOrderBy("date_transmission $ordre, id_observation $ordre");
|
537 |
}
|
513 |
}
|
538 |
}
|
514 |
}
|
Line -... |
Line 515... |
- |
|
515 |
|
- |
|
516 |
public function definirOrdreSqlAppliObs() {
|
- |
|
517 |
$ordre = $this->parametres['ordre'];
|
- |
|
518 |
|
- |
|
519 |
// parmi self::$tri_possible
|
- |
|
520 |
switch ($this->parametres['tri']) {
|
- |
|
521 |
case 'date_observation' :
|
- |
|
522 |
$this->addOrderBy("date_observation $ordre, id_observation $ordre");
|
- |
|
523 |
break;
|
- |
|
524 |
default:
|
- |
|
525 |
$this->addOrderBy("date_transmission $ordre, id_observation $ordre");
|
- |
|
526 |
}
|
- |
|
527 |
}
|
539 |
|
528 |
|
540 |
public function getAliasDesChamps($champsEtAlias, $select = null, $prefix = null) {
|
529 |
public function getAliasDesChamps($champsEtAlias, $select = null, $prefix = null) {
|
541 |
$arr = ($select) ? array_intersect_key($champsEtAlias, array_flip($select)) : $champsEtAlias;
|
530 |
$arr = ($select) ? array_intersect_key($champsEtAlias, array_flip($select)) : $champsEtAlias;
|
Line 542... |
Line 531... |
542 |
$keys = array_keys($arr);
|
531 |
$keys = array_keys($arr);
|
Line 582... |
Line 571... |
582 |
* cf ListeImages::reformateImagesDoubleIndex() à qui revient la tâche de créer ces deux versions
|
571 |
* cf ListeImages::reformateImagesDoubleIndex() à qui revient la tâche de créer ces deux versions
|
583 |
* simultanément lorsque c'est encore possible.
|
572 |
* simultanément lorsque c'est encore possible.
|
584 |
*/
|
573 |
*/
|
585 |
public function ajouterInfosVotesProtocoles($votes, &$images) {
|
574 |
public function ajouterInfosVotesProtocoles($votes, &$images) {
|
586 |
if (!$votes) return;
|
575 |
if (!$votes) return;
|
587 |
|
576 |
|
588 |
$mappingVotes = $this->conteneur->getParametreTableau('votes.mapping');
|
577 |
$mappingVotes = $this->conteneur->getParametreTableau('votes.mapping');
|
589 |
$mappingProtocoles = $this->conteneur->getParametreTableau('protocoles.mapping');
|
578 |
$mappingProtocoles = $this->conteneur->getParametreTableau('protocoles.mapping');
|
Line 590... |
Line 579... |
590 |
|
579 |
|
591 |
// pour chaque vote
|
580 |
// pour chaque vote
|
Line 604... |
Line 593... |
604 |
$voteSelection = array_intersect_key($mappingVotes, array_flip($chpsVotes));
|
593 |
$voteSelection = array_intersect_key($mappingVotes, array_flip($chpsVotes));
|
605 |
$vote = array_intersect_key($vote, array_flip($voteSelection));
|
594 |
$vote = array_intersect_key($vote, array_flip($voteSelection));
|
606 |
$images[$imgId]['protocoles_votes'][$protoId]['votes'][$vote['vote.id']] = $vote;
|
595 |
$images[$imgId]['protocoles_votes'][$protoId]['votes'][$vote['vote.id']] = $vote;
|
607 |
}
|
596 |
}
|
608 |
}
|
597 |
}
|
- |
|
598 |
|
- |
|
599 |
public function getTotalLignesTrouvees() {
|
- |
|
600 |
$resultat = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre');
|
- |
|
601 |
return intval($resultat['nbre']);
|
- |
|
602 |
}
|
609 |
}
|
603 |
}
|
610 |
|
604 |
|