Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
Bonjour,
Dans un autre fil de discussion j'évoque ce constat
(...)faire en sorte que dans un tri des titres par ordre alphabétique croissant, le "é" se retrouve avant "f" et non après "z" comme actuellement... ce que ne semble pas savoir faire mySQL.
Franck me donne alors ce conseil
Assez simple à faire une fois récupéré le "recordset" ($rs) résultant de la requête SQL :
$rs_static = new extStaticRecord($rs); $rs_static->lexicalSort('post_title');
Ensuite tu utilises $rs_static comme tu utilisais avant $rs, avec ->fetch(), …
Après avoir initialisé les $params['...'] kivonbien, j'écris donc
$rs = $core->blog->getPosts($params);
if ($rs->isEmpty()) {
return;
}
...
Et teste le reste de mon code, impec.
Par contre si je tente à la place
$rs = $core->blog->getPosts($params);
if ($rs->isEmpty()) {
return;
}
$rs_static = new extStaticRecord($rs);
...
Page blanche et boucle sans fin...
???
Merci d'avance.
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Ah y'est, manquait une ligne, forcément :-)
$rss = $rs->toStatic();
$rse = new extStaticRecord($rss);
$rse->lexicalSort('post_title');
Mainenant pour 1600 billets ça prend une dizaine de secondes pour le tri.
Dotclear addicted since 2004
Hors ligne
Merci Franck, ça fonctionne très bien.
Je me demande si je vais l'utiliser pour un gros blog. Chez moi, en local (Wamp / PHP 5.5.12 / mySQL 5.6.17) , avec 2111 billets + 9 pages + 52 pages statiques, il faut 35 secondes pour afficher la page avec le plugin mrvbToC. Code global non optimisé, certes, mais ça fait beaucoup de temps à attendre.
J'ai besoin d'implémenter 4 fois les 3 lignes car 4 requêtes avec des variantes :
- 1 pour les billets sans catégorie,
- 1 pour les billets avec catégories,
- 1 pour les pages
- 1 pour les pages statiques.
Je suppose que ce qui prend le plus de temps entre "new extStaticRecord" et "lexicalSort" c'est "lexicalSort". Tu confirmes ?
Dernière modification par Mirovinben (2016-08-25 07:49:27)
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Du coup, je me demande si pour optimiser tout ça, je ne devrais pas lancer une seule requête SQL, une seule insertion du bloc
$rss = $rs->toStatic();
$rse = new extStaticRecord($rss);
$rse->lexicalSort('post_title');
et filtrer les résultats à afficher pour chacun des quatre blocs dans quatre boucles
while ($rse->fetch()) {
...
}
Je vais tenter ça et comparer les temps.
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Merci Franck, ça fonctionne très bien.
Je me demande si je vais l'utiliser pour un gros blog. Chez moi, en local (Wamp / PHP 5.5.12 / mySQL 5.6.17) , avec 2111 billets + 9 pages + 52 pages statiques, il faut 35 secondes pour afficher la page avec le plugin mrvbToC. Code global non optimisé, certes, mais ça fait beaucoup de temps à attendre.
J'ai besoin d'implémenter 4 fois les 3 lignes car 4 requêtes avec des variantes :
- 1 pour les billets sans catégorie,
- 1 pour les billets avec catégories,
- 1 pour les pages
- 1 pour les pages statiques.Je suppose que ce qui prend le plus de temps entre "new extStaticRecord" et "lexicalSort" c'est "lexicalSort". Tu confirmes ?
Je confirme, mais seulement dès que la liste d'enregistrements à trier est conséquente. Sinon c'est quasi instantané (l'admin de DC s'en sert pour trier les utilisateurs, les blogs, les mots-clés, …)
Dotclear addicted since 2004
Hors ligne
Du coup, je me demande si pour optimiser tout ça, je ne devrais pas lancer une seule requête SQL, une seule insertion du bloc
$rss = $rs->toStatic(); $rse = new extStaticRecord($rss); $rse->lexicalSort('post_title');
et filtrer les résultats à afficher pour chacun des quatre blocs dans quatre boucles
while ($rse->fetch()) { ... }
Je vais tenter ça et comparer les temps.
Perso je conserverai plutôt 4 requêtes, triées séparément, ça sera plus rapide qu'une grosse !
Quoi qu'il en soit c'est clairement pas applicable en l'état s'il faut attendre plus d'une ou deux secondes pour obtenir le résultat.
Dotclear addicted since 2004
Hors ligne
Perso je conserverai plutôt 4 requêtes, triées séparément, ça sera plus rapide qu'une grosse !
Je préfère également les 4 requêtes. Le facteur le plus important étant le nombre d'items à trier qui est le même avec 1 ou 4 requêtes chacune sur un sous-ensemble. Et l'indépendance des 4 requêtes (comme actuellement) facilitent la programmation derrière.
Quoi qu'il en soit c'est clairement pas applicable en l'état s'il faut attendre plus d'une ou deux secondes pour obtenir le résultat.
Oui, je suis complètement d'accord, ce n'est guère acceptable à partir de 100 billets/pages (3 s).
Du coup j'ai deux options
-1- carrément ne pas proposer le tri PHP "complet" (le "à" se retrouvant avant le "b")
-2- ou alors proposer le tri SQL (incomplet, avec le "à" se retrouvant après le "z") + le tri complet mais avec un message d'avertissement (dans l'admin du widget et la doc du plugin)
J'hésite...
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Sinon une idée comme ça :
dans ton $params['order'] = 'post_title'; essaies de mettre plutôt $params['order'] = 'post_title COLLATE utf8_unicode_ci'; pour voir.
Par contre il y de fortes chances que ça ne fonctionne qu'avec MySQL, faudra voir comment gérer les autres cas… Sachant qu'on peut tester le driver en œuvre pour l'accès à la DB, tu peux indiquer ce tri quand c'est possible (aka mysql ou mysqli)
[après fouillage de doc sur le web] :
Pour PostgreSQL tu peux essayer en remplaçant uft8_unicode_ci par "C.UTF-8" (avec les doubles quotes), sans garantie et pas testé.
Dernière modification par Franck (2016-08-25 14:04:16)
Dotclear addicted since 2004
Hors ligne
Merci Franck pour l'info mais je crois que, pour l'instant je vais éviter tout ce qui peut diverger entre les différents formats de bases de données acceptés par Dotclear. Je garde l'idée dans un coin...
Il fait chaud et je vais laisser refroidir un peu mon neurone de permanence. :-)
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Merci Franck pour l'info mais je crois que, pour l'instant je vais éviter tout ce qui peut diverger entre les différents formats de bases de données acceptés par Dotclear. Je garde l'idée dans un coin...
Il fait chaud et je vais laisser refroidir un peu mon neurone de permanence. :-)
Dommage parce que ce n'est pas compliqué à faire et ça simplifierait ton code tout en résolvant ton souci, mais, comme on dit, t'es le seul maître à bord, hein ? :-)
Je te mets une idée de code possible en dessous (qui devrait tourner pour les 3 types de base utilisés par DC), okazou tu changerais d'idée en vue de faire quelques tests :
$collate = ($con->driver() == 'mysql' || $con->driver() == 'mysqli' ? '"utf8_unicode_ci"' : $con->driver() == 'pgsql' ? '"C.UTF-8"': '"UNICODE"');
$params['order'] = 'post_title COLLATE '.$collate;
Et pis c'est tout :-)
Dotclear addicted since 2004
Hors ligne
Super !
Bientôt...
Bisous
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Après un bon repas et une courte sieste (voui, je raconte ma vie parce qu'elle est passionnante), j'ai testé en local avec un blog contenant 2112 billets (tous dans une des 12 catégories existantes, toutes au 1er niveau), 9 pages et 52 pages statiques (soit 2173 entrées traitées en 3 requêtes) dans une base mysqli (donc $collate = "utf8_unicode_ci") avec ou sans ta proposition (en ajoutant un couple de parenthèses autour du second test contenu dans le premier)
$collate = ($driver == 'mysql' || $driver == 'mysqli' ? '"utf8_unicode_ci"' : ($driver == 'pgsql' ? '"C.UTF-8"': '"UNICODE"'));
J'obtiens :
-1- sans lexicalSort (mais avec ORDER BY LOWER(post_title) ASC dans la requête SQL) : 0,20 secondes
-2- avec lexicalSort sans COLLATE : 32,81 secondes
-3- avec lexicalSort et COLLATE : 31,87 secondes
C'est mieux. ;-)
Dernière modification par Mirovinben (2016-08-26 13:10:53)
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Après un bon repas et une courte sieste (voui, je raconte ma vie parce qu'elle est passionnante), j'ai testé en local avec un blog contenant 2112 billets (tous dans une des 12 catégories existantes, toutes au 1er niveau), 9 pages et 52 pages statiques (soit 2173 entrées traitées en 3 requêtes) dans une base mysqli (donc $collate = "utf8_unicode_ci") avec ou sans ta proposition (en ajoutant un couple de parenthèses autour du second test contenu dans le premier)
$collate = ($driver == 'mysql' || $driver == 'mysqli' ? '"utf8_unicode_ci"' : ($driver == 'pgsql' ? '"C.UTF-8"': '"UNICODE"'));
J'obtiens :
-1- sans lexicalSort (mais avec ORDER BY LOWER(post_title) ASC dans la requête SQL) : 0,20 secondes
-2- avec lexicalSort sans COLLATE : 32,81 secondes
-3- avec lexicalSort et COLLATE : 31,87 secondes
C'est mieux. ;-)
- 4 - sans lexicalSort (mais avec ORDER BY post_title COLLATE … comme je te le conseillais) ?
Dotclear addicted since 2004
Hors ligne
Hors ligne
Oups, je n'avais pas compris...
Du coup, j'ai refait mes tests...
-1- avec ORDER BY LOWER(post_title) ASC dans la requête SQL : 0,20 secondes mais tri incomplet
-4- avec ORDER BY post_title COLLATE dans la requête SQL : 0,25 secondes mais tri complet
Youpi !
Comme tu l'écris ailleurs, il y aurait un pb avec SQLite. Pas simple à résoudre d'après toi. Je peux faire l'impasse dessus en proposant un tri comme en -1- en attendant une éventuelle évolution...
Merci pour tes suggestions... et ta patience.
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Vous n'êtes pas identifié(e).