Dotclear

Vous n'êtes pas identifié(e).

Annonce

#1 2016-08-24 09:18:09

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Usage de extStaticRecord() pour tri alpha des billets

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.

Hors ligne

#2 2016-08-24 11:26:59

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Je fais quelques tests et je reviens…


Dotclear addicted since 2004

Hors ligne

#3 2016-08-24 11:53:37

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

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

#4 2016-08-25 06:45:13

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

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)

Hors ligne

#5 2016-08-25 08:13:49

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

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.

Hors ligne

#6 2016-08-25 09:05:57

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Mirovinben a écrit :

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

#7 2016-08-25 09:07:16

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Mirovinben a écrit :

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

#8 2016-08-25 12:07:22

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Franck a écrit :

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.

Franck a écrit :

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

Hors ligne

#9 2016-08-25 13:53:21

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

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

#10 2016-08-26 05:36:01

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

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. :-)

Hors ligne

#11 2016-08-26 08:32:21

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Mirovinben a écrit :

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

#12 2016-08-26 08:35:37

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Super !
Bientôt...
Bisous

Hors ligne

#13 2016-08-26 12:51:35

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

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)

Hors ligne

#14 2016-08-26 14:35:01

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Mirovinben a écrit :

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

#15 2016-08-26 14:38:33

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Parce que faire un lexicalSort sur un recordset trié avec un COLLATE, ça ne sert pas à grand chose (en gros le job est fait 2 fois).


Dotclear addicted since 2004

Hors ligne

#16 2016-08-26 15:49:44

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

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.

Hors ligne

#17 2016-08-26 17:31:58

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Usage de extStaticRecord() pour tri alpha des billets

Faudrait aussi tester avec PostgreSQL, ce que je n'ai pas fait.


Dotclear addicted since 2004

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map