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