Changeset 81384 in spip-zone


Ignore:
Timestamp:
Mar 14, 2014, 7:43:40 PM (5 years ago)
Author:
severo@…
Message:

tickets - début de dev pour critere {mots_pargroupe}

ça marche sur les boucles de tickets, mais il reste
un peu de travail encore (voir commentaires)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/tickets/trunk/tickets_fonctions.php

    r73520 r81384  
    314314}
    315315
     316// Critere {mots_pargroupe} : "l'article est lie a au moins un mot de tous les groupes demandes"
     317// {mots?} ne s'applique que si au moins un mot est demande
     318/*
     319 * ATTENTION, c'est un peu en cours de dev, il faudrait :
     320 * - virer la référence aux tickets
     321 * - revoir peut être la jonction avec spip_mots
     322 * - ne pas écrire directement 'spip_mots'/'spip_mots_liens' si le préfixe est différent ?
     323 * - prendre en compte le cas où id_mot[] est un tableau de strings (comme critere_mots) ?
     324 */
     325function critere_mots_pargroupe_dist($idb, &$boucles, $crit,$id_ou_titre=false) {
     326
     327        $boucle = &$boucles[$idb];
     328
     329        if (isset($crit->param[0][0])) {
     330                $mots = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucles[$idb]->id_parent);
     331        } else{
     332                $mots = '@$Pile[0]["mots"]';
     333        }
     334
     335        $t = $boucle->id_table . '.' . $boucle->primary;
     336        if (!in_array($t, $boucles[$idb]->select))
     337          $boucle->select[]= $t; # pour postgres, neuneu ici
     338
     339        /* On calcule la liste des groupes
     340         *
     341         * SELECT id_groupe
     342         * FROM spip_mots
     343         * WHERE id_mot IN (1,2,3)
     344         * GROUP BY id_groupe
     345         */
     346        $groupes = "'('.sql_get_select('id_groupe','spip_mots',sql_in('id_mot',".$mots."),'id_groupe').') AS g'";
     347
     348        /* Maintenant le nombre de groupes
     349         *
     350         * SELECT COUNT(id_groupe)
     351         * FROM ($groupes) AS nb
     352         */
     353        $nb_groupes = "('.sql_get_select('COUNT(id_groupe)',".$groupes.").')";
     354
     355        /* Maintenant les doublets (id_objet,id_groupe)
     356         *
     357         * attention : on écrit directement JOIN dans le code, peut être
     358         * qu'il faudrait faire plus gaffe à la compatibilité SQL ?
     359         *
     360         * SELECT ml.id_objet,m.id_groupe
     361         * FROM spip_mots_liens AS ml
     362         * JOIN spip_mots AS m USING (id_mot)
     363         * WHERE ml.objet='ticket'
     364         *   AND ml.id_mot IN (1,2,3)
     365         * GROUP BY ml.id_objet,ml.objet,m.id_groupe
     366         */
     367        $doublets = "'('.sql_get_select('id_objet,id_groupe','spip_mots_liens JOIN spip_mots USING (id_mot)','objet=\'ticket\' AND '.sql_in('id_mot',".$mots."),'id_objet,objet,id_groupe').') AS d'";
     368
     369        /* Enfin, la boucle complete
     370         * SELECT id_objet
     371         * FROM (
     372         *   SELECT id_objet,id_groupe
     373         *   FROM spip_mots_liens AS ml
     374         *   JOIN spip_mots AS m USING (id_mot)
     375         *   WHERE objet='ticket'
     376         *     AND id_mot IN (1,2,3)
     377         *   GROUP BY id_objet,objet,id_groupe
     378         * ) AS d
     379         * GROUP BY id_objet
     380         * HAVING SUM(1) >= (
     381         *   SELECT COUNT(*)
     382         *   FROM (
     383         *     SELECT id_groupe
     384         *     FROM spip_mots
     385         *     WHERE id_mot IN (1,2,3)
     386         *     GROUP BY id_groupe
     387         *   ) AS g
     388         * )
     389         */
     390        $where = "sql_get_select('id_objet',".$doublets.",'','id_objet','','','SUM(1) >= ".$nb_groupes."')";
     391
     392        /* On ajoute ce critère à la boucle (TICKETS)
     393         *
     394         */
     395        $boucle->where[] = "sql_in('id_ticket', ".$where.")";
     396
     397}
     398
    316399?>
Note: See TracChangeset for help on using the changeset viewer.