Wikitty-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
January 2012
- 4 participants
- 128 discussions
Author: bpoussin
Date: 2012-01-03 19:04:34 +0100 (Tue, 03 Jan 2012)
New Revision: 1279
Url: http://nuiton.org/repositories/revision/wikitty/1279
Log:
correction des urls avec des []&
Modified:
trunk/src/site/site_en.xml
trunk/src/site/site_fr.xml
Modified: trunk/src/site/site_en.xml
===================================================================
--- trunk/src/site/site_en.xml 2012-01-03 17:11:50 UTC (rev 1278)
+++ trunk/src/site/site_en.xml 2012-01-03 18:04:34 UTC (rev 1279)
@@ -48,7 +48,7 @@
<menu name="Overview">
<item name="Home" href="index.html"/>
- <item name="Changes" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[…"/>
+ <item name="Changes" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&…"/>
<item name="Download" href="http://nuiton.org/projects/wikitty/files"/>
</menu>
Modified: trunk/src/site/site_fr.xml
===================================================================
--- trunk/src/site/site_fr.xml 2012-01-03 17:11:50 UTC (rev 1278)
+++ trunk/src/site/site_fr.xml 2012-01-03 18:04:34 UTC (rev 1279)
@@ -50,7 +50,7 @@
<item name="Accueil" href="index.html"/>
<item name="Fonctionnalités" href="features.html"/>
<item name="Fonctionnement" href="fonctionnement.html"/>
- <item name="Changements" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[…"/>
+ <item name="Changements" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&…"/>
<item name="Téléchargement" href="http://nuiton.org/projects/wikitty/files"/>
</menu>
1
0
03 Jan '12
Author: bpoussin
Date: 2012-01-03 18:11:50 +0100 (Tue, 03 Jan 2012)
New Revision: 1278
Url: http://nuiton.org/repositories/revision/wikitty/1278
Log:
support Calendar as valid object to toDate method
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-01-03 16:10:28 UTC (rev 1277)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-01-03 17:11:50 UTC (rev 1278)
@@ -535,6 +535,8 @@
if (value != null) {
if (value instanceof Date) {
result = (Date) value;
+ } else if (value instanceof Calendar) {
+ result = ((Calendar)value).getTime();
} else {
// try to convert to Date
try {
1
0
r1277 - in trunk: src/site src/site/en/rst src/site/rst src/site/rst/devel src/site/rst/user wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/query
by bpoussin@users.nuiton.org 03 Jan '12
by bpoussin@users.nuiton.org 03 Jan '12
03 Jan '12
Author: bpoussin
Date: 2012-01-03 17:10:28 +0100 (Tue, 03 Jan 2012)
New Revision: 1277
Url: http://nuiton.org/repositories/revision/wikitty/1277
Log:
documentation de l'API query fini
relecture de toute la documentation
quelques modifs de code suite a la relecture de la doc
- parser de query ignore la case des OR, AND, NOT, TO, IN, SELECT, WHERE
Added:
trunk/src/site/rst/devel/
trunk/src/site/rst/devel/Spec.rst
Removed:
trunk/src/site/en/rst/changes.rst
trunk/src/site/rst/Spec.rst
trunk/src/site/rst/changes.rst
trunk/src/site/rst/todo.rst
Modified:
trunk/src/site/rst/features.rst
trunk/src/site/rst/fonctionnement.rst
trunk/src/site/rst/index.rst
trunk/src/site/rst/user/faq.rst
trunk/src/site/rst/user/generation.rst.vm
trunk/src/site/rst/user/hessian.rst
trunk/src/site/rst/user/migration.rst
trunk/src/site/rst/user/query.rst
trunk/src/site/rst/user/security.rst
trunk/src/site/site_en.xml
trunk/src/site/site_fr.xml
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
Deleted: trunk/src/site/en/rst/changes.rst
===================================================================
--- trunk/src/site/en/rst/changes.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/en/rst/changes.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -1,38 +0,0 @@
-.. -
-.. * #%L
-.. * Wikitty
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * Copyright (C) 2009 - 2010 CodeLutin
-.. * %%
-.. * This program is free software: you can redistribute it and/or modify
-.. * it under the terms of the GNU Lesser General Public License as
-.. * published by the Free Software Foundation, either version 3 of the
-.. * License, or (at your option) any later version.
-.. *
-.. * This program is distributed in the hope that it will be useful,
-.. * but WITHOUT ANY WARRANTY; without even the implied warranty of
-.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-.. * GNU General Lesser Public License for more details.
-.. *
-.. * You should have received a copy of the GNU General Lesser Public
-.. * License along with this program. If not, see
-.. * <http://www.gnu.org/licenses/lgpl-3.0.html>.
-.. * #L%
-.. -
-Changes
-=======
-
-TreeNode
---------
-
-Since 2.2, attribute "children" in tree node has been renamed to "attachment"
-du to confusion between attached wikitty and sub node children.
-
-TreeNode extension version has been increased to ``2.0``.
-
-You will need to migrate_ your wikitties.
-
-.. _migrate: migration.html
\ No newline at end of file
Deleted: trunk/src/site/rst/Spec.rst
===================================================================
--- trunk/src/site/rst/Spec.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/Spec.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -1,167 +0,0 @@
-.. -
-.. * #%L
-.. * Wikitty
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * Copyright (C) 2009 - 2010 CodeLutin
-.. * %%
-.. * This program is free software: you can redistribute it and/or modify
-.. * it under the terms of the GNU Lesser General Public License as
-.. * published by the Free Software Foundation, either version 3 of the
-.. * License, or (at your option) any later version.
-.. *
-.. * This program is distributed in the hope that it will be useful,
-.. * but WITHOUT ANY WARRANTY; without even the implied warranty of
-.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-.. * GNU General Lesser Public License for more details.
-.. *
-.. * You should have received a copy of the GNU General Lesser Public
-.. * License along with this program. If not, see
-.. * <http://www.gnu.org/licenses/lgpl-3.0.html>.
-.. * #L%
-.. -
-
-Ce document est fait pour contenir toutes les normalisations autour de Wikitty
-
-Identifiant des wikitties
-=========================
-
-Les identifiants sont de la forme UUID[_<specifique extension>]. Donc tous les
-identifiants commencent par un UUID et peuvent être séparé d'une extension
-spécifique pour certains besoins par un '_' (underscore).
-
-C'est le mécanisme de base de génération des wikitty-id. Il y a toutefois
-des exceptions :
-* Pour les méta-extensions : chacun des wikitties aura pour
-identifiant par exemple « WikittySecurity:MonExtension ».
-Cela permet de court-cuircuiter la recherche solR, et un passage par
-le réseau à chaque store/restore.
-
-Un wikitty en base a toujours un identifiant, dès instanciation.
-
-WikittyServiceNotifier
-======================
-
-Tous les évènements passant par le WikittyServiceNotifier sont envoyé au
-RemoteNotifier s'il est indiqué, dans la configuratio,n qu'il faut propager les
-évènements (wikitty.service.event.propagateEvent). Il faut alors dans ce cas
-définir le transporter à utiliser (wikitty.notifier.transporter.class).
-
-Le transporter sert à envoyer(serveur) et recevoir(client) les évènements. Le
-même transporter doit être utilisé pour le client et le serveur.
-
-Il existe aujourd'hui deux types de transporter différents (jgroups, xmpp).
-L'implantation jgroups pose quelque soucis (ne fonctionne pas toujours). Il
-est donc préférable d'utiliser le transporter xmpp.
-
-Il est bien sûr possible d'empiler deux couches de WikittyServiceNotifier
-avec des transporters différents coté serveur pour permettre à différents
-types de client de fonctionner en même temps (FIXME poussin 20101115 il n'est
-pas actuellement possible de configurer ce fonctionnement)
-
-Pour utiliser le transporter xmpp il faut que vous ayez un serveur xmpp avec
-une room acceptant le login anonyme. Pour cette fonctionnalité, il n'y a pas
-besoin que la room soit archivée.
-
-Synchronisation de serveur
-==========================
-
-On peut avoir besoin d'avoir deux serveurs qui soit synchronisé.
-Actuellement il n'existe que du maitre/esclave.
-
-Pour mettre en place la synchronisation il faut que le serveur maitre
-utilise la couche de notification avec le transporter xmpp. Il faut que la
-room xmpp soit archivée.
-
-Pour que la synchornisation fonctionne il faut:
-- garantir que tous les events soient bien envoyés
-- garantir que tous les events soitent bien reçus
-
-et ceci même si le serveur xmpp s'arrête ou que le client s'arrête. Si le
-serveur s'arrête plus aucun event ne sera produit. Il faut seulement
-garantir que lorsqu'un event à été enregistrer sur le serveur il sera bien
-envoyé aux clients.
-
-Lorsque le serveur envoie un event, il lui fixe un numero d'ordre qu'il
-stocke et qu'il incrémentera et réutilisera pour l'envoi suivant.
-
-Lorsque le client réceptionne l'event, il vérifie qu'il n'y a pas de rupture
-dans la séquence des numeros d'envois. Si c'est le cas, il doit récupérer
-les numeros manquants. (il redemande l'historique des messages pour les N
-messages qui lui manque)
-
-A intervale régulier il enregistre un fichier de synchro contenant, la date du serveur
-(il lui demande via le protocole xmpp) et le numero (+id?) du dernier event
-reçu. Ce fichier n'est enregistré que si on est bien à jour dans les données
-reçu (pas de rupture détectée dans la sequence des events).
-
-Lorsque le client démarera pour la 1ère fois, il faut que la base de données
-ait été remplie manuellement, son indexe recréer, et le fichier de synchro
-créé convenablement.
-
-Lorsque le client redémarre après un arrêt, il redemande l'historique depuis
-la date du fichier de synchro.
-
-Le numéro unique d'event est généré par la couche de persistance et stocké
-sur le serveur en même temps que les données.
-
-
-Deux types de client:
-- volatile: ceux intéressé pour récupérer les events lorsqu'ils sont présent
-- persistant: ceux intéressé pour récupérer tous les events même lorsqu'ils sont non dispo (coupure réseau)
-
-Le client ouvre un socket et le serveur laisse la connexion ouverte pour pouvoir
-envoyer régulièrement les infos de notification.
-Si un client volatile disparait (impossible de lui envoyer l'info), on
-l'enleve de la liste des clients a prevenir
-Si un client persistant disparait, on met dans une file toutes les
-notifications qu'on a pas pu lui envoyer et on lui renvera tout ce qu'il a
-manqué lorsqu'il sera de retour. (utile pour la synchro serveur)
-
-Localisation
-============
-
-Il s'agit de traduire les noms de champs et pas les valeurs.On rajoute une méta-extension WikittyI18n aux extensions du wikitty.
-
-Cette pseudo-extension a deux champs :
-* language String
-* translation String
-
-personne:wikittyI18n.language=fr,en,es
-personne:wikittyI18n.translation=[fr:name=prénom,surname=nom],[en:name=name,surname=surname]
-personne.name=value
-
-ton extension : security des champs de sécurité
-ton extension : i18n des champs i18n
-ton extension.champs=valeur dans la langue
-
-un wikitty ne peut exister que dans une langue à la fois, si tu veux plusieurs langues,
-tu charges plusieurs fois le wikitty.
-
-du coup ton wikitty a une version et une langue.
-On stocke dans la définition de l'extension chargée la langue dans laquelle elle a été chargée.
-si pas de i18n, du coup c'est la langue par défaut à chaque fois.
-
-Au moins les writers peuvent créer une nouvelle langue.
-
-pas de sécurité par langue, trop le bordel !
-
-il serait agréable que seules les extensions demandées soient chargées.
-
-dans les restore il faut ajouter (extensions, id, + préchargement d'extensions)
-
-attention au moment de la migration
-au moment du chargement
-
-
-
-
-On ajoute WikittyService#allowTranslation(token, extension, boolean)
-
-
-Pseudo extension
-================
-
-migration : méthode migrate(oldExtension, newExtension, Wikitty, Locale) Locale pouvant etre null.
Deleted: trunk/src/site/rst/changes.rst
===================================================================
--- trunk/src/site/rst/changes.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/changes.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -1,37 +0,0 @@
-.. -
-.. * #%L
-.. * Wikitty
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * Copyright (C) 2009 - 2010 CodeLutin
-.. * %%
-.. * This program is free software: you can redistribute it and/or modify
-.. * it under the terms of the GNU Lesser General Public License as
-.. * published by the Free Software Foundation, either version 3 of the
-.. * License, or (at your option) any later version.
-.. *
-.. * This program is distributed in the hope that it will be useful,
-.. * but WITHOUT ANY WARRANTY; without even the implied warranty of
-.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-.. * GNU General Lesser Public License for more details.
-.. *
-.. * You should have received a copy of the GNU General Lesser Public
-.. * License along with this program. If not, see
-.. * <http://www.gnu.org/licenses/lgpl-3.0.html>.
-.. * #L%
-.. -
-Changements
-===========
-
-TreeNode
---------
-
-Depuis la version 2.2, l'attribut "children" des TreeNode a été renommé en
-"attachment" pour éviter la confusion entre les wikitty attachés à un noeud et
-les noeuds fils.
-
-Vous aurez besoin de migrer_ vos Wikitty.
-
-.. _migrer: migration.html
\ No newline at end of file
Added: trunk/src/site/rst/devel/Spec.rst
===================================================================
--- trunk/src/site/rst/devel/Spec.rst (rev 0)
+++ trunk/src/site/rst/devel/Spec.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -0,0 +1,167 @@
+.. -
+.. * #%L
+.. * Wikitty
+.. *
+.. * $Id: Spec.rst 1136 2011-08-12 14:24:03Z tchemit $
+.. * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/src/site/rst/Spec.rst $
+.. * %%
+.. * Copyright (C) 2009 - 2010 CodeLutin
+.. * %%
+.. * This program is free software: you can redistribute it and/or modify
+.. * it under the terms of the GNU Lesser General Public License as
+.. * published by the Free Software Foundation, either version 3 of the
+.. * License, or (at your option) any later version.
+.. *
+.. * This program is distributed in the hope that it will be useful,
+.. * but WITHOUT ANY WARRANTY; without even the implied warranty of
+.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+.. * GNU General Lesser Public License for more details.
+.. *
+.. * You should have received a copy of the GNU General Lesser Public
+.. * License along with this program. If not, see
+.. * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+.. * #L%
+.. -
+
+Ce document est fait pour contenir toutes les normalisations autour de Wikitty
+
+Identifiant des wikitties
+=========================
+
+Les identifiants sont de la forme UUID[_<specifique extension>]. Donc tous les
+identifiants commencent par un UUID et peuvent être séparé d'une extension
+spécifique pour certains besoins par un '_' (underscore).
+
+C'est le mécanisme de base de génération des wikitty-id. Il y a toutefois
+des exceptions :
+* Pour les méta-extensions : chacun des wikitties aura pour
+identifiant par exemple « WikittySecurity:MonExtension ».
+Cela permet de court-cuircuiter la recherche solR, et un passage par
+le réseau à chaque store/restore.
+
+Un wikitty en base a toujours un identifiant, dès instanciation.
+
+WikittyServiceNotifier
+======================
+
+Tous les évènements passant par le WikittyServiceNotifier sont envoyé au
+RemoteNotifier s'il est indiqué dans la configuration, qu'il faut propager les
+évènements (wikitty.service.event.propagateEvent). Il faut alors dans ce cas
+définir le transporter à utiliser (wikitty.notifier.transporter.class).
+
+Le transporter sert à envoyer(serveur) et recevoir(client) les évènements. Le
+même transporter doit être utilisé pour le client et le serveur.
+
+Il existe aujourd'hui deux types de transporter différents (jgroups, xmpp).
+L'implantation jgroups pose quelque soucis (ne fonctionne pas toujours). Il
+est donc préférable d'utiliser le transporter xmpp.
+
+Il est bien sûr possible d'empiler deux couches de WikittyServiceNotifier
+avec des transporters différents coté serveur pour permettre à différents
+types de client de fonctionner en même temps (FIXME poussin 20101115 il n'est
+pas actuellement possible de configurer ce fonctionnement)
+
+Pour utiliser le transporter xmpp il faut que vous ayez un serveur xmpp avec
+une room acceptant le login anonyme. Pour cette fonctionnalité, il n'y a pas
+besoin que la room soit archivée.
+
+Synchronisation de serveur
+==========================
+
+On peut avoir besoin d'avoir deux serveurs qui soit synchronisé.
+Actuellement il n'existe que du maitre/esclave.
+
+Pour mettre en place la synchronisation il faut que le serveur maitre
+utilise la couche de notification avec le transporter xmpp. Il faut que la
+room xmpp soit archivée.
+
+Pour que la synchornisation fonctionne il faut:
+- garantir que tous les events soient bien envoyés
+- garantir que tous les events soitent bien reçus
+
+et ceci même si le serveur xmpp s'arrête ou que le client s'arrête. Si le
+serveur s'arrête plus aucun event ne sera produit. Il faut seulement
+garantir que lorsqu'un event à été enregistrer sur le serveur il sera bien
+envoyé aux clients.
+
+Lorsque le serveur envoie un event, il lui fixe un numero d'ordre qu'il
+stocke et qu'il incrémentera et réutilisera pour l'envoi suivant.
+
+Lorsque le client réceptionne l'event, il vérifie qu'il n'y a pas de rupture
+dans la séquence des numeros d'envois. Si c'est le cas, il doit récupérer
+les numeros manquants. (il redemande l'historique des messages pour les N
+messages qui lui manque)
+
+A intervale régulier il enregistre un fichier de synchro contenant, la date du serveur
+(il lui demande via le protocole xmpp) et le numero (+id?) du dernier event
+reçu. Ce fichier n'est enregistré que si on est bien à jour dans les données
+reçu (pas de rupture détectée dans la sequence des events).
+
+Lorsque le client démarera pour la 1ère fois, il faut que la base de données
+ait été remplie manuellement, son indexe recréer, et le fichier de synchro
+créé convenablement.
+
+Lorsque le client redémarre après un arrêt, il redemande l'historique depuis
+la date du fichier de synchro.
+
+Le numéro unique d'event est généré par la couche de persistance et stocké
+sur le serveur en même temps que les données.
+
+
+Deux types de client:
+- volatile: ceux intéressé pour récupérer les events lorsqu'ils sont présent
+- persistant: ceux intéressé pour récupérer tous les events même lorsqu'ils sont non dispo (coupure réseau)
+
+Le client ouvre un socket et le serveur laisse la connexion ouverte pour pouvoir
+envoyer régulièrement les infos de notification.
+Si un client volatile disparait (impossible de lui envoyer l'info), on
+l'enleve de la liste des clients a prevenir
+Si un client persistant disparait, on met dans une file toutes les
+notifications qu'on a pas pu lui envoyer et on lui renvera tout ce qu'il a
+manqué lorsqu'il sera de retour. (utile pour la synchro serveur)
+
+Localisation
+============
+
+Il s'agit de traduire les noms de champs et pas les valeurs.On rajoute une méta-extension WikittyI18n aux extensions du wikitty.
+
+Cette pseudo-extension a deux champs :
+* language String
+* translation String
+
+personne:wikittyI18n.language=fr,en,es
+personne:wikittyI18n.translation=[fr:name=prénom,surname=nom],[en:name=name,surname=surname]
+personne.name=value
+
+ton extension : security des champs de sécurité
+ton extension : i18n des champs i18n
+ton extension.champs=valeur dans la langue
+
+un wikitty ne peut exister que dans une langue à la fois, si tu veux plusieurs langues,
+tu charges plusieurs fois le wikitty.
+
+du coup ton wikitty a une version et une langue.
+On stocke dans la définition de l'extension chargée la langue dans laquelle elle a été chargée.
+si pas de i18n, du coup c'est la langue par défaut à chaque fois.
+
+Au moins les writers peuvent créer une nouvelle langue.
+
+pas de sécurité par langue, trop le bordel !
+
+il serait agréable que seules les extensions demandées soient chargées.
+
+dans les restore il faut ajouter (extensions, id, + préchargement d'extensions)
+
+attention au moment de la migration
+au moment du chargement
+
+
+
+
+On ajoute WikittyService#allowTranslation(token, extension, boolean)
+
+
+Pseudo extension
+================
+
+migration : méthode migrate(oldExtension, newExtension, Wikitty, Locale) Locale pouvant etre null.
Modified: trunk/src/site/rst/features.rst
===================================================================
--- trunk/src/site/rst/features.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/features.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -43,25 +43,24 @@
Wikitty fournit un système de gestion des droits en lecture et en écriture pour
les entitées. Vous pouvez aller jusqu'à limiter l'accès à certains objet d'un
type à certains utilisateurs. Vous pouvez également accorder des droits
-différents à certains champs des objets.
+différents à certains groupes de champs des objets (sécurité au niveau des extensions).
Prenons par example un objet Employe.
Cet objet peut avoir des champs de type salaire,... qui ne sont modifiables que
-par les memebres du service RH, mais visibles par l'employé, alors que les
+par les membres du service RH, mais visibles par l'employé, alors que les
champs adresse par example sont modifiables par l'employé et les membres du
service RH.
Transactions
~~~~~~~~~~~~
-Wikitty fournit un système de transactions qui embarque une base locale H2 et un
-index SolR. A la lecture des données, il recherche dans la base locale puis dans
-la base de donnée s'il ne trouve pas la donnée. Lorsqu'il écrit une donnée, il
-l'écrit dans la base locale. Au commit de la transaction, toutes les opérations
-sont envoyées à la base de donnée Wikitty, si un problème survient (mauvais
-droits, ...), la transaction n'est pas enregistrée. Pour les recherches, une
-fusion est opérée entre les résultats sur la base locale et ceux sur la
-base Wikitty.
+Wikitty fournit un système de transactions. A la lecture des données, il
+recherche dans la transaction puis dans la base de donnée s'il ne trouve pas la
+donnée. Lorsqu'il écrit une donnée, il l'écrit dans la transaction. Au commit de
+la transaction, toutes les opérations sont envoyées à la base de donnée Wikitty,
+si un problème survient (mauvais droits, ...), la transaction n'est pas
+enregistrée. Pour les recherches, une fusion est opérée entre les résultats sur
+la transaction et ceux sur la base Wikitty.
Notifications
~~~~~~~~~~~~~
Modified: trunk/src/site/rst/fonctionnement.rst
===================================================================
--- trunk/src/site/rst/fonctionnement.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/fonctionnement.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -64,8 +64,8 @@
Le coeur de Wikitty apporte les services de base:
- génération de Bean métier pour une utilisation simple par le développeur
-- une classe WikittyProxy qui masque les objets Wikitty et manipule les Bean
- métier généré
+- une classe WikittyClient qui masque les objets Wikitty et manipule les Bean
+ métier généré et offre tout un ensemble de service complémentaire.
- Création, sauvegarde, restoration des Entités
- Recherche des entités (fulltext, facette, ...)
- notion d'arbre
@@ -98,22 +98,22 @@
Les nouveaux services (cache, securité, notification, ...) s'intercale en
couche au dessus du coeur pour founir les services.
-Le coeur delegue le travail à trois services qui peuvent être implanté avec
+Le coeur délègue le travail à trois services qui peuvent être implanté avec
des techologies différentes:
-- stockage des extensions (memoire, jdbc, hbase, jpa, ...)
-- stockage des données (memoire, jdbc, hbase, jpa, ...)
-- indexation et recherche (memoire, SolR, ...)
+- stockage des extensions (mémoire, jdbc, hbase, jpa, ...)
+- stockage des données (mémoire, jdbc, hbase, jpa, ...)
+- indexation et recherche (mémoire, SolR, ...)
Il est donc possible d'ajouter de nouveau service de haut niveau, ou
d'ajouter de nouvelle façon de stocker l'information.
-Pour certain besoin il n'y a pas besoin d'implanter une nouvelle
+Pour certain besoin il n'y a pas d'obligation d'implanter une nouvelle
chouche (WikittyService). On parle alors de AddOn. C'est addon travail
directement grace à l'API WikittyService, c'est le cas par exemple de
l'import/export.
-La partie cliente des applications ne travail qu'avec le WikittyProxy qui
+La partie cliente des applications ne travail qu'avec le WikittyClient qui
masque la notion d'objet Wikitty pour retourner des beans metiers facilement
manipulable par le développeur.
Modified: trunk/src/site/rst/index.rst
===================================================================
--- trunk/src/site/rst/index.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/index.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -96,7 +96,7 @@
- Migration
- Import/Export
- Réplication
-- Label
+- Label/Groupe
Pour plus d'informations sur les différentes fonctionnalités, référez-vous à la
`page correspondante`_
@@ -154,5 +154,3 @@
.. image:: schemes/multiServerDeployment.png
-
-
Deleted: trunk/src/site/rst/todo.rst
===================================================================
--- trunk/src/site/rst/todo.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/todo.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -1,31 +0,0 @@
-.. -
-.. * #%L
-.. * Wikitty
-.. *
-.. * $Id$
-.. * $HeadURL$
-.. * %%
-.. * Copyright (C) 2009 - 2010 CodeLutin
-.. * %%
-.. * This program is free software: you can redistribute it and/or modify
-.. * it under the terms of the GNU Lesser General Public License as
-.. * published by the Free Software Foundation, either version 3 of the
-.. * License, or (at your option) any later version.
-.. *
-.. * This program is distributed in the hope that it will be useful,
-.. * but WITHOUT ANY WARRANTY; without even the implied warranty of
-.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-.. * GNU General Lesser Public License for more details.
-.. *
-.. * You should have received a copy of the GNU General Lesser Public
-.. * License along with this program. If not, see
-.. * <http://www.gnu.org/licenses/lgpl-3.0.html>.
-.. * #L%
-.. -
-TODO
-====
-
-Code
-----
-
-- Voir pour changer la WikittyExtension en non-RuntimeException
Modified: trunk/src/site/rst/user/faq.rst
===================================================================
--- trunk/src/site/rst/user/faq.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/faq.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -47,7 +47,7 @@
WikittyGroup privateGroup = getPrivateGroup();
// Récupère l'utilisateur authentifié
-WikittyUser user = getLoggedInUser();
+WikittyUser user = wikittyClient.getUser();
// Récupère les membres du privateGroup
Set<String> members = privateGroup.getMembers();
Modified: trunk/src/site/rst/user/generation.rst.vm
===================================================================
--- trunk/src/site/rst/user/generation.rst.vm 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/generation.rst.vm 2012-01-03 16:10:28 UTC (rev 1277)
@@ -93,8 +93,8 @@
chaîne de caractère. En fait, dans vos entité Wikitty, un lien vers un autre
Wikitty estreprésenté par son identifiant qui est une chaîne de caractères.
Ainsi, un getXXXXX vous retournera l'identifiant d'un Wikitty qu'il faudra
-récupérer en passant par le proxy. Vous pouvez alors utiliser le cache pour
-limiter les appels côté serveur.
+récupérer en passant par le WikittyClient. Vous pouvez alors utiliser le cache
+pour limiter les appels côté serveur.
Subtilités de modélisation
==========================
@@ -104,7 +104,7 @@
Il est possible de rajouter une dépendance vers un objet de l'API Wikitty (par
example WikittyUser) en rajoutant simplement la classe dans votre modèle dans le
-package* org.nuiton.wikitty.api*. Elle ne sera pas générée mais interviendra
+package *org.nuiton.wikitty.entities*. Elle ne sera pas générée mais interviendra
comme une autre classe de votre modèle (héritage,...).
.. image:: wikittyDependency.png
Modified: trunk/src/site/rst/user/hessian.rst
===================================================================
--- trunk/src/site/rst/user/hessian.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/hessian.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -32,7 +32,7 @@
* d'une application war qui, en lisant une configuration, est capable de
fournir un service sur n'importe quel type de stockage wikitty
- * d'une factory revoyant un proxy sur un service distant
+ * d'une factory revoyant un proxy hessian sur un service distant
Serveur
-------
@@ -69,7 +69,7 @@
wikitty.service.cache.listenevents=true
# solr configuration
- solr.data.dir=/var/lib/myapp/solr
+ solr.data.dir=/var/local/myapp/solr
L'application est ensuite accessible sur l'uri "/wikitty" suivant le contexte
de déploiement.
Modified: trunk/src/site/rst/user/migration.rst
===================================================================
--- trunk/src/site/rst/user/migration.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/migration.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -48,11 +48,11 @@
enregistrer toutes les extensions dont votre application a besoin dans leur
dernière version::
- store(myExtension);
+ wikittyClient.storeExtension(myExtension);
ou::
- store(myEntityImpl.extensionMyEntity)
+ wikittyClient.storeExtension(myEntityImpl.extensionMyEntity)
Si vous avez des migrations spécifiques à effectuer, ajoutez au registre toutes
les migrations spécifiques des extensions::
@@ -62,17 +62,29 @@
Vous pouvez maintenant utiliser vos données simplement, elles seront migrées
au chargement.
-Si vous voulez migrer vos objets avant de les utiliser (pour des histoires de
-requêtes par exemple), pour chaque version, recherchez vos objets, restaurez
-les puis enregistrez-les::
+Si vous voulez migrer vos objets avant de les utiliser (pour quelle soit
+convenablement indexée par exemple), pour chaque version, recherchez vos objets,
+restaurez les puis enregistrez-les::
- search(Client)
- restore(Client)
- store(Client)
+ WikittyQueryResult<Client> all = wikittyClient.findAllByExample(new Client());
+ wikittyClient.store(all.getAll());
Attention au coût d'une indexation au vu du volume de données, il n'est pas
-toujours judicieux de réindexer toutes les données.
+toujours judicieux de réindexer toutes les données. Si vous avez beaucoup
+d'objet, il est potentiellement judicieux d'utiliser la pagination pour restaurer
+les objets par paquet de 1000 par exemple.
+ int LIMIT = 1000;
+ int first = 0;
+ Client example = new Client();
+ WikittyQueryResult<Client> all = wikittyClient.findAllByExample(example, first, LIMIT);;
+ while (all.size() >= LIMIT) {
+ wikittyClient.store(all.getAll());
+ first += LIMIT;
+ all = wikittyClient.findAllByExample(example, first, LIMIT);
+ }
+ wikittyClient.store(all.getAll());
+
Migrations spécifiques
======================
Modified: trunk/src/site/rst/user/query.rst
===================================================================
--- trunk/src/site/rst/user/query.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/query.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -258,7 +258,6 @@
* False : rFalse - retourne toujours faux::
-
WikittyQuery q = new WikittyQueryMaker()
.rFalse().end();
@@ -277,18 +276,108 @@
* Les noeuds à sous requêtes permettent de faire des requêtes complexes.
-* Non : not - Résultat inverse de la sous-requête.
+* Non : not - Résultat inverse de la sous-requête. Permet de faire la négation
+ d'une condition. On ne peut ajouter qu'un condition dans un not, il faut
+ donc ajouter en premier un or ou un and pour mettre plusieurs condition::
-* Ou : or - Ou entre les différentes sous-requêtes.
+ WikittyQuery q = new WikittyQueryMaker()
+ .not().rFalse().end(); // condition toujours vrai
-* Et : and - Et entre les différentes sous-requêtes.
+ WikittyQuery q = WikittyQueryParser.parse("NOT(FALSE)");
-* Requête associée : in - Permet d'effectuer des jointures.
+ WikittyQuery q = new WikittyQueryMaker()
+ .not().or().rFalse().rFalse().rTrue().end(); // condition toujours fausse
+ WikittyQuery q = WikittyQueryParser.parse("NOT(FALSE OR FALSE OR TRUE)");
+
+* Ou : or - Ou entre les différentes sous-requêtes. On peut ajouter autant
+ d'élément dans le or que l'on souhaite, en fait les éléments lui sont ajouté
+ tant qu'il n'est pas fermé (close).
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .or().rFalse().rTrue().rFalse().end(); // condition toujours vrai
+
+ WikittyQuery q = WikittyQueryParser.parse("FALSE OR TRUE OR FALSE");
+
+* Et : and - Et entre les différentes sous-requêtes. On peut ajouter autant
+ d'élément dans le and que l'on souhaite, en fait les éléments lui sont ajouté
+ tant qu'il n'est pas fermé (close).
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .and().rFalse().rTrue().rTrue().end(); // condition toujours fausse
+
+ WikittyQuery q = WikittyQueryParser.parse("FALSE AND TRUE AND TRUE");
+ WikittyQuery q = WikittyQueryParser.parse("FALSE TRUE TRUE");
+
+* Requête associée : in - Permet d'effectuer des jointures. Cette opérateur lie
+ deux requêtes entres elle. Le résultat d'un requête est utilisé comme un
+ containsOne dans l'autre. La requête suivante recherche tous les employers
+ en CDI, mais seulement ceux dont le nom de leur entreprise contient 'lutin'.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ and()
+ .eq("Employee.contract", "CDI")
+ .in("Employee.company").like("Company.name", "*Lutin*").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "Employee.contract=CDI AND Employee.company in (Company.name LIKE *Lutin*)");
+
* Selection : select - Ajout d'un select pour définir le champs à retourner au
- lieu de l'id
+ lieu de l'id. Le select doit toujours être le premier élément de la condition
+ ou du in. Dans l'exemple suivant au lieu de retourner l'id des employés
+ en CDI, on retourne leur nom. Si deux personnes avait le même nom, ce nom
+ ne serait retourné qu'une seul fois.::
+ WikittyQuery q = new WikittyQueryMaker()
+ select("Employee.name").eq("Employee.contract", "CDI").end();
+ WikittyQuery q = WikittyQueryParser.parse(
+ "SELECT Employee.name WHERE Employee.contract=CDI");
+
+ Il est possible de coupler le select et le in, par exemple pour recherche
+ toutes les personnes nés le même jour qu'un évênement qui a eu lieu en france::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .in("Person.birthday")
+ .select("Event.date").like("Event.country", "france").end();
+
+ WikittyQuery q = WikittyQueryParser.parse(
+ "Person.birthday IN (SELECT Event.date WHERE Event.country LIKE france)");
+
+Spécificité de WikittyQueryMaker
+--------------------------------
+
+* Fermeture d'un noeud: close. Lorsqu'on ouvre un element a sous noeud comme
+ or, and, not, in, select, il faut pouvoir le fermer pour continuer la
+ construction de la condition. Pour cela on utilise close(), qui ferme la
+ derniere condition non terminal.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .and().or()....close(/*fermeture du or*/).close(/*fermeture du or*/)
+ .not().and().....end(/*fermeture de tous les elements non ferme (and, not)*/);
+
+* conversion de type: Il est possible de passer en argument des méthodes des
+ objets qui seront directement converti en leur representation String. Les
+ types supportés sont BusinessEntity, Wikitty, Date, Calendar, Number, Boolean.
+ Pour un objet Wikitty ou un BusinessEntity on utilise l'id.
+
+* wikitty: Normalement si l'on passe un wikitty en parametre de méthode
+ de WikittyQueryMaker, la condition se fait sur l'id, mais on peut vouloir
+ que le Wikitty soit pris comme exemple de condition (query by exemple)
+ Dans ce cas, on peut utiliser::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .wikitty(monWikitty).end();
+
+* Condition: Il est aussi possible d'ajouter toutes une condition déjà
+ construite pour l'intégrer à une nouvelle. Dans ce cas cette condition est
+ prise comme une boîte noir, c'est dire comme une condition terminal.::
+
+ WikittyQuery qold = ...
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .and().condition(qold).eq(...).end();
+
Recherche avancée
-----------------
@@ -332,23 +421,31 @@
* Nom : name - Nommage de la requêtes.
-* Les requêtes permettent d'ajouter un ordre ou des facettes :
+* Premier index : first - Permet de définir le premier index à retourner.
+ Principalement utilisé pour la pagination.
-* Premier index : first - Permet de définir le premier index à retourner. Principalement utilisé pour la pagination.
+* Nombre : limit - Permet de définir le nombre de résultat à retourner.
+ Principalement utilisé pour la pagination.
-* Nombre : limit - Permet de définir le dernier index à retourner. Principalement utilisé pour la pagination.
+* facetMinCount: les topics des facettes ayant moins d'occurence que cette valeur
+ ne sont pas retournés
-* [TODO] facetMinCount
+* facetLimit: les facettes ramenent au plus se nombre de topics
-* [TODO] facetLimit
+* facetSort: determine l'ordre de tri des topics, il est possible de trier sur
+ le nombre d'occurence du topic ou le nom du topic
-* [TODO] facetSort
+* facetExtension indique de créer une facette sur les extensions des wikitties
-* [TODO] facetExtension
+* facetField indique de créer une facette sur un champs
-* [TODO] facetField
+* facetQuery indique de créer une facette grace a une condition. Par exemple au
+ lieu de creer une facette sur Product.price qui retournerait trop de topics
+ il est préférable de créer plusieur facetQuery pour regrouper des prix::
-* [TODO] facetQuery
+ query.addFacetQuery("0-5", new WikittyQueryMaker().bw("Product.price", 0, 5));
+ query.addFacetQuery("5-10", new WikittyQueryMaker().bw("Product.price", 5, 10));
+ query.addFacetQuery("10-+", new WikittyQueryMaker().gt("Product.price", 10));
* Tri : sortAscending - Ajout d'un ou plusieurs champs pour le tri ascendant du résultat.
Modified: trunk/src/site/rst/user/security.rst
===================================================================
--- trunk/src/site/rst/user/security.rst 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/rst/user/security.rst 2012-01-03 16:10:28 UTC (rev 1277)
@@ -44,6 +44,30 @@
Cela rajoute la couche de sécurité à Wikitty. Vous pouvez maintenant rajouter
des droits à certaines entitées pour en limiter l'accès.
+Si vous souhaitez utiliser le module de cache en même temps que le module
+de sécurité, cela implique une bonne utilisation et de faire attention à certaine
+chose. Il faut faire attention qu'un utilisateur qui a récupéré un objet ne le
+rende pas disponible à un autre utilisateur au travers du cache.
+Il faut donc que la couche de sécurité soit toujours au dessus de la couche de
+cache.
+
+De la même façon, si l'on a mis du cache côté client dans certain cas, il faudra
+aussi remettre la couche de sécurité. Cela arrive si le côté client est
+multi-utilisateur. Si ce n'est pas le cas, il n'est pas nécessaire de le faire.
+
+::
+
+ +--------------+ +--------------+
+ WClient ----->| sécurité |<----+ | sécurité |<------ WClient
+ +--------------+ | +--------------+
+ | cache | | | cache |
+ +--------------+ | +--------------+
+ | notification | | | notification |
+ +--------------+ | +--------------+
+ | WS Impl | +----| WS Hessian |
+ +--------------+ +--------------+
+ serveur client
+
Utilisateurs et groupes
-----------------------
Modified: trunk/src/site/site_en.xml
===================================================================
--- trunk/src/site/site_en.xml 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/site_en.xml 2012-01-03 16:10:28 UTC (rev 1277)
@@ -48,7 +48,8 @@
<menu name="Overview">
<item name="Home" href="index.html"/>
- <item name="Changes" href="changes.html"/>
+ <item name="Changes" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[…"/>
+ <item name="Download" href="http://nuiton.org/projects/wikitty/files"/>
</menu>
<menu name="User">
@@ -57,12 +58,8 @@
</menu>
<menu name="Developer">
- <item name="Todo" href="todo.html"/>
- </menu>
-
- <menu name="Community">
+ <item name="Todo" href="http://www.nuiton.org/projects/wikitty/roadmap"/>
<item name="Bug tracker" href="http://nuiton.org/projects/wikitty/issues"/>
- <item name="Download" href="http://nuiton.org/projects/wikitty/files"/>
<item name="SVN Repository" href="http://svn.nuiton.org/svn/wikitty/"/>
<item name="Continuous Integration" href="http://hudson.nuiton.org/hudson/job/wikitty/"/>
<item name="Sonar analysis" href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/>
Modified: trunk/src/site/site_fr.xml
===================================================================
--- trunk/src/site/site_fr.xml 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/src/site/site_fr.xml 2012-01-03 16:10:28 UTC (rev 1277)
@@ -48,10 +48,10 @@
<menu name="Overview">
<item name="Accueil" href="index.html"/>
- <item name="Fonctionnement" href="fonctionnement.html"/>
<item name="Fonctionnalités" href="features.html"/>
- <item name="Changements" href="changes.html"/>
- <item name="Spécifications" href="Spec.html"/>
+ <item name="Fonctionnement" href="fonctionnement.html"/>
+ <item name="Changements" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[…"/>
+ <item name="Téléchargement" href="http://nuiton.org/projects/wikitty/files"/>
</menu>
<menu name="Utilisateur">
@@ -59,27 +59,19 @@
<item name="Migration" href="user/migration.html"/>
<item name="Hessian" href="user/hessian.html"/>
<item name="Sécurité" href="user/security.html"/>
- <item name="Recherche" href="user/search.html"/>
+ <item name="Recherche" href="user/query.html"/>
<item name="FAQ" href="user/faq.html"/>
</menu>
<menu name="Developpeur">
- <item name="Todo" href="todo.html"/>
+ <item name="Spécifications" href="devel/Spec.html"/>
+ <item name="Todo" href="http://www.nuiton.org/projects/wikitty/roadmap"/>
+ <item name="Bug tracker" href="http://nuiton.org/projects/wikitty/issues"/>
+ <item name="Dépot SVN" href="http://svn.nuiton.org/svn/wikitty/"/>
+ <item name="Intégration continue" href="http://hudson.nuiton.org/hudson/job/wikitty/"/>
+ <item name="Analyse Sonar" href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/>
</menu>
- <menu name="Communauté">
- <item name="Bug tracker"
- href="http://nuiton.org/projects/wikitty/issues"/>
- <item name="Téléchargement"
- href="http://nuiton.org/projects/wikitty/files"/>
- <item name="Dépot SVN"
- href="http://svn.nuiton.org/svn/wikitty/"/>
- <item name="Intégration continue"
- href="http://hudson.nuiton.org/hudson/job/wikitty/"/>
- <item name="Analyse Sonar"
- href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/>
- </menu>
-
<menu ref="modules"/>
<menu ref="reports"/>
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-01-03 16:10:28 UTC (rev 1277)
@@ -83,9 +83,9 @@
public WikittyClient(ApplicationConfig config) {
if (config != null) {
long timeToLogInfo = config.getOptionAsInt(WikittyConfigOption.
- WIKITTY_PROXY_TIME_TO_LOG_INFO.getKey());
+ WIKITTY_CLIENT_TIME_TO_LOG_INFO.getKey());
long timeToLogWarn = config.getOptionAsInt(WikittyConfigOption.
- WIKITTY_PROXY_TIME_TO_LOG_WARN.getKey());
+ WIKITTY_CLIENT_TIME_TO_LOG_WARN.getKey());
timeLog.setTimeToLogInfo(timeToLogInfo);
timeLog.setTimeToLogWarn(timeToLogWarn);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2012-01-03 16:10:28 UTC (rev 1277)
@@ -283,16 +283,28 @@
+ " this room must have history activated"),
"test(a)conference.im.codelutin.com",
String.class, false, false),
+ @Deprecated
WIKITTY_PROXY_TIME_TO_LOG_INFO(
"wikitty.proxy.timeToLog.info",
n_("maximum time before send log info with time consumed"),
"1000",
Integer.class, false, false),
+ @Deprecated
WIKITTY_PROXY_TIME_TO_LOG_WARN(
"wikitty.proxy.timeToLog.warn",
n_("maximum time before send log warn with time consumed"),
"3000",
Integer.class, false, false),
+ WIKITTY_CLIENT_TIME_TO_LOG_INFO(
+ "wikitty.client.timeToLog.info",
+ n_("maximum time before send log info with time consumed"),
+ "1000",
+ Integer.class, false, false),
+ WIKITTY_CLIENT_TIME_TO_LOG_WARN(
+ "wikitty.client.timeToLog.warn",
+ n_("maximum time before send log warn with time consumed"),
+ "3000",
+ Integer.class, false, false),
WIKITTY_SECURITY_TIME_TO_LOG_INFO(
"wikitty.security.timeToLog.info",
n_("maximum time before send log info with time consumed"),
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-01-02 18:45:36 UTC (rev 1276)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-01-03 16:10:28 UTC (rev 1277)
@@ -93,6 +93,21 @@
public static final String SQUARE_BRACKET_CLOSE = "]";
public static final String SQUARE_BRACKET_OPEN = "[";
+ public Rule icEXTENSION = IgnoreCase(EXTENSION);
+ public Rule icID = IgnoreCase(ID);
+ public Rule icNOT = IgnoreCase(NOT);
+ public Rule icAND = IgnoreCase(AND);
+ public Rule icOR = IgnoreCase(OR);
+ public Rule icSELECT = IgnoreCase(SELECT);
+ public Rule icWHERE = IgnoreCase(WHERE);
+ public Rule icIN = IgnoreCase(IN);
+ public Rule icTO = IgnoreCase(TO);
+ public Rule icFALSE = IgnoreCase(FALSE);
+ public Rule icTRUE = IgnoreCase(TRUE);
+ public Rule icLIKE = IgnoreCase(LIKE);
+ public Rule icUNLIKE = IgnoreCase(UNLIKE);
+ public Rule icNULL = IgnoreCase(NULL);
+
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(WikittyQueryParser.class);
@@ -165,7 +180,7 @@
}
Rule or() {
- return Sequence(and(), ZeroOrMore(space(), OR, space(), and(),
+ return Sequence(and(), ZeroOrMore(space(), icOR, space(), and(),
push(new Or((Condition)pop(1), (Condition)pop()))));
}
@@ -173,7 +188,7 @@
return Sequence(term(), ZeroOrMore(
// when no AND or OR is used, AND is default
// don't change order of FirstOf, this order is important
- FirstOf(Sequence(space(), AND, space()), Sequence(space(), TestNot(OR))),
+ FirstOf(Sequence(space(), icAND, space()), Sequence(space(), TestNot(icOR))),
term(),
push(new And((Condition)pop(1), (Condition)pop()))));
}
@@ -196,7 +211,7 @@
}
Rule not() {
- return Sequence(space(), NOT, space(), term(),
+ return Sequence(space(), icNOT, space(), term(),
push(new Not((Condition)pop())));
}
@@ -205,7 +220,7 @@
* @return
*/
Rule isNull() {
- return Sequence(field(), push(match()), space(), EQUALS, space(), IgnoreCase(NULL),
+ return Sequence(field(), push(match()), space(), EQUALS, space(), icNULL,
push(new Null(toElement(pop().toString()))));
}
@@ -214,7 +229,7 @@
* @return
*/
Rule isNotNull() {
- return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), IgnoreCase(NULL),
+ return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), icNULL,
push(new NotNull(toElement(pop().toString()))));
}
@@ -253,16 +268,16 @@
push(new GreaterOrEquals(toElement(pop().toString()), removeQuote(match()))));
}
Rule like() {
- return Sequence(field(), push(match()), space(), LIKE, space(), value(),
+ return Sequence(field(), push(match()), space(), icLIKE, space(), value(),
push(new Like(toElement(pop().toString()), removeQuote(match()))));
}
Rule notlike() {
- return Sequence(field(), push(match()), space(), UNLIKE, space(), value(),
+ return Sequence(field(), push(match()), space(), icUNLIKE, space(), value(),
push(new Unlike(toElement(pop().toString()), removeQuote(match()))));
}
Rule between() {
return Sequence(field(), push(match()), space(), EQUALS, space(), SQUARE_BRACKET_OPEN, space(),
- value(), push(removeQuote(match())), space(), TO, space(),
+ value(), push(removeQuote(match())), space(), icTO, space(),
value(), push(removeQuote(match())), space(), SQUARE_BRACKET_CLOSE,
push(new Between(toElement(pop(2).toString()), pop(1).toString(), pop().toString())));
}
@@ -281,11 +296,11 @@
push(new ContainsOne(toElement(pop().toString()), elems.get())));
}
Rule in() {
- return Sequence(field(), push(match()), space(), IN, space(), term(),
+ return Sequence(field(), push(match()), space(), icIN, space(), term(),
push(new In(toElement(pop(1).toString()), (Condition)pop())));
}
Rule select() {
- return Sequence(SELECT, space(), field(), push(match()), space(), WHERE, space(), term(),
+ return Sequence(icSELECT, space(), field(), push(match()), space(), icWHERE, space(), term(),
push(new Select(new ElementField(pop(1).toString()), (Condition)pop())));
}
Rule keyword() {
@@ -297,15 +312,15 @@
}
Rule rTrue() {
- return Sequence(IgnoreCase(TRUE), push(new True()));
+ return Sequence(icTRUE, push(new True()));
}
Rule rFalse() {
- return Sequence(IgnoreCase(FALSE), push(new False()));
+ return Sequence(icFALSE, push(new False()));
}
Rule value() {
- return FirstOf(IgnoreCase(TRUE), IgnoreCase(FALSE), IgnoreCase(NULL), field(), StringLiteral());
+ return FirstOf(field(), StringLiteral());
}
Rule StringLiteral() {
1
0
r1276 - in trunk: src/site/rst/user wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 19:45:36 +0100 (Mon, 02 Jan 2012)
New Revision: 1276
Url: http://nuiton.org/repositories/revision/wikitty/1276
Log:
debut de documentation de l'API Query
Added:
trunk/src/site/rst/user/query.rst
Modified:
trunk/src/site/rst/user/search.rst
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
Added: trunk/src/site/rst/user/query.rst
===================================================================
--- trunk/src/site/rst/user/query.rst (rev 0)
+++ trunk/src/site/rst/user/query.rst 2012-01-02 18:45:36 UTC (rev 1276)
@@ -0,0 +1,364 @@
+======================
+Recherche avec Wikitty
+======================
+
+Wikitty permet de rechercher parmis les entités enregistrées tout en fournissant
+les fonctionalités de pagination. Pour cela vous pouvez construire
+programmatiquement vos recherches en utilisant WikittyQueryMaker ou de façon
+textuel en utilisant WikittyQueryParser.
+
+Au final vous obtenez dans les deux cas un WikittyQuery utilisable pour vos
+recherche pour les méthodes WikittyClient.findXXXX.
+
+Utilisation via WikittyClient
+-----------------------------
+
+Les requêtes peuvent être utilisée dans les méthodes:
+
+- findAllByQuery(Query): WikittyQueryResult<String>
+- findByQuery(Query): String
+- findAllByQuery(Class<E>, Query): WikittyQueryResult<E>
+- findByQuery(Class<E>, Query): E
+
+Dans les deux premières méthodes les résultats seront retournés de façon brut
+sous forme de String. Si le résultat représente une entité, le String sera son
+id. Si le résultat représente une Date, la date sera la valeur tel que retournée
+par la la méthode WikittyUtil.toString(Date)
+
+Les deux dernières méthodes essaient de convertir le résultat en objet de la
+classe passée en paramètre. Par exemple si vous savez que le résultat sont des
+valeurs numeriques vous pouvez passer Number.class en argument.
+
+
+Vous pouvez aussi utiliser les méthodes suivantes qui construiront les requêtes
+pour vous:
+
+- findAllByExample(E): List<E>
+- findByExample(E): E
+
+Structure d'une requête
+-----------------------
+
+Par exemple si vous souhaitez faire la recherche sur::
+
+ User.lastname=poussin AND User.firstname=benjamin
+
+Vous pouvez soit utiliser le WikittyQueryMaker::
+
+ WikittyQuery query = new WikittyQueryMaker()
+ .and()
+ .eq(User.ELEMENT_FIELD_USER_LASTNAME, "poussin")
+ .eq(User.ELEMENT_FIELD_USER_FIRSTNAME, "benjamin")
+ .end();
+
+Le end() indique que la condition est fini et que l'on souhaite la query
+
+Vous pouvez aussi utiliser WikittyQueryParser pour faire le même travail, mais
+il est plus sûr d'utiliser le WikittyQueryMaker tant que vous le pouvez::
+
+ WikittyQueryParser parser = WikittyQueryParser.parse(
+ "User.lastname=poussin User.firstname=benjamin");
+
+S'il n'y a pas d'opérateur entre deux contrainte un AND est automatiquement
+ajouté.
+
+Les contraintes disponibles
+---------------------------
+
+De nombreuses contraintes sont disponibles pour créer vos recherches :
+
+* Egalité : eq - Vérifie si un champ est égal a une valeur, si le champs est un
+ champs texte, il est possible d'ajouter des "*" en début et en fin de la
+ chaîne de recherche pour faire l'équivalent d'un startsWith ou endsWith. Si
+ vous utilisez WikittyQueryMaker les méthodes sw (startsWith) et ew (endsWith)
+ font se travail pour vous.::
+
+ WikittyQuery q = new WikittyQueryMaker().eq(User.ELEMENT_FIELD_USER_LASTNAME, "poussin").end();
+ WikittyQuery q = new WikittyQueryMaker().eq(User.ELEMENT_FIELD_USER_LASTNAME, "*ssin").end();
+ WikittyQuery q = new WikittyQueryMaker().ew(User.ELEMENT_FIELD_USER_LASTNAME, "ssin").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=poussin");
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=*ssin");
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=*ssin");
+
+* Non égalité : neq - Vérifie si un champ n'est pas égal a une valeur. De la
+ même façon que le eq, il est possible d'ajouter des '*'. Ou d'utiliser les
+ méthode notsw et notew.::
+
+ WikittyQuery q = new WikittyQueryMaker().ne(User.ELEMENT_FIELD_USER_LASTNAME, "poussin").end();
+ WikittyQuery q = new WikittyQueryMaker().ne(User.ELEMENT_FIELD_USER_LASTNAME, "*ssin").end();
+ WikittyQuery q = new WikittyQueryMaker().notew(User.ELEMENT_FIELD_USER_LASTNAME, "ssin").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=poussin");
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=*ssin");
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=*ssin");
+
+* Contient tous : containsAll - Vérifie si un champ multivalué contient au moins
+ une valeur de la liste des valeurs passées en argument::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .containsOne(User.ELEMENT_FIELD_USER_LASTNAME, "poussin", "couteau").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname={poussin, couteau}");
+
+* Egalité d'extension : exteq - Vérifie si un Wikitty possède une extension::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .exteq(User.EXT_USER).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("extension=User");
+
+* Non égalité d'extension : extne - Vérifie qu'un Wikitty ne porte pas une
+extension.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .extne(User.EXT_USER).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("extension!=User");
+
+* ContainsAll d'extension : extContainsAll - Vérifie si un Wikitty possède tous
+ les extensions::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .extContainsAll(User.EXT_USER, Employee.EXT_EMPLOYEE).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("extension=[User, Employee]");
+
+* Égalité d'extension : ideq - Vérifie qu'un Wikitty porte l'identifiant::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .ideq(User.EXT_USER).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("id=1234567-1234-1234567");
+
+* Non égalité d'identifiant : idneq - Vérifie qu'un Wikitty ne porte pas
+l'identifiant.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .idne(User.EXT_USER).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("id!=1234567-1234-1234567");
+
+* Similitude : like - Vérifie qu'une chaîne de caractère est égale à une autre
+ sans tenir compte de la case ni des accents. Cette opérateur ne recherche que
+ de façon textuelle, vous pouvez ajouter des '*' en début et fin de d'expression::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .like(User.ELEMENT_FIELD_USER_FIRSTNAME, "helene").end();
+ WikittyQuery q = new WikittyQueryMaker()
+ .like(User.ELEMENT_FIELD_USER_FIRSTNAME, "*lene").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.fistname LIKE helene");
+ WikittyQuery q = WikittyQueryParser.parse("User.fistname LIKE *lene");
+
+* Non similitude : unlike - Vérifie qu'une chaîne de caractère n'est pas égale à une autre
+ sans tenir compte de la case ni des accents. Cette opérateur ne recherche que
+ de façon textuelle, vous pouvez ajouter des '*' en début et fin de d'expression::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .unlike(User.ELEMENT_FIELD_USER_FIRSTNAME, "helene").end();
+ WikittyQuery q = new WikittyQueryMaker()
+ .unlike(User.ELEMENT_FIELD_USER_FIRSTNAME, "*lene").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.fistname UNLIKE helene");
+ WikittyQuery q = WikittyQueryParser.parse("User.fistname UNLIKE *lene");
+
+* Supérieur strictement : gt - Vérifie qu'un champ est strictement supérieur à
+ une valeur. Cette condition s'applique surtout sur les champs de type Date et
+ Number::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .gt(User.ELEMENT_FIELD_USER_AGE, 18).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.age > 18");
+
+* Supérieur ou égal : ge - Vérifie si un champ est supérieur ou égal à une
+valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .ge(User.ELEMENT_FIELD_USER_AGE, 18).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.age >= 18");
+
+* Inférieur strictement : lt - Vérifie si un champ est strictement inférieur à
+une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .lt(User.ELEMENT_FIELD_USER_AGE, 18).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.age < 18");
+
+* Inférieur ou égal : le - Vérifie si un champ est inférieur ou égal à une
+valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .le(User.ELEMENT_FIELD_USER_AGE, 18).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.age <= 18");
+
+* Entre : bw - Vérifie si un champ est compris entre deux valeurs.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .bw(Product.ELEMENT_FIELD_PRODUCT_PRICE, 2, 2.50).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("Product.price=[2 TO 2.5]");
+
+* Commence par : sw - Vérifie si un champ de type chaîne commence par une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .sw(User.ELEMENT_FIELD_USER_LASTNAME, "pous").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=pous*");
+
+* Ne commence pas par : notsw - Vérifie si un champ de type chaîne ne commence pas
+par une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .notsw(User.ELEMENT_FIELD_USER_LASTNAME, "pous").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=pous*");
+
+* Termine par : ew - Vérifie si un champ de type chaîne termine par une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .ew(User.ELEMENT_FIELD_USER_LASTNAME, "sin").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=sin*");
+
+* Ne termine pas par : notew - Vérifie si un champs de type chaîne ne termine
+pas par une valeur.::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .notew(User.ELEMENT_FIELD_USER_LASTNAME, "pous").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=pous*");
+
+* Mot-clé : keyword - Vérifie si la valeur est présente dans n'importe quel
+ champ de n'importe quelle extension en fulltext (pas de prise en compte de la
+ case out des accents).::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .keyword("partout").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("partout");
+
+* Nul : isNull - Vérifie si la valeur d'un champ est nulle::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .isNull(User.ELEMENT_FIELD_USER_LASTNAME).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname=NULL");
+
+* Non nul : isNotNull - Vérifie si la valeur d'un champ n'est pas nulle.
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .isNotNull(User.ELEMENT_FIELD_USER_LASTNAME).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("User.lastname!=NULL");
+
+* False : rFalse - retourne toujours faux::
+
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .rFalse().end();
+
+ WikittyQuery q = WikittyQueryParser.parse("FALSE");
+
+* True : rTrue - retourne toujours vrai::
+
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .rTrue().end();
+
+ WikittyQuery q = WikittyQueryParser.parse("TRUE");
+
+Les noeuds à sous-requête
+-------------------------
+
+* Les noeuds à sous requêtes permettent de faire des requêtes complexes.
+
+* Non : not - Résultat inverse de la sous-requête.
+
+* Ou : or - Ou entre les différentes sous-requêtes.
+
+* Et : and - Et entre les différentes sous-requêtes.
+
+* Requête associée : in - Permet d'effectuer des jointures.
+
+* Selection : select - Ajout d'un select pour définir le champs à retourner au
+ lieu de l'id
+
+
+Recherche avancée
+-----------------
+
+Si vous souhaitez mettre des espaces dans une expression texte avec le parser
+il faut utiliser les guillemets pour encadrer la chaine.::
+
+ WikittyQuery q = WikittyQueryParser.parse("simple OR \"la jolie chaine que je recherche\"");
+
+Il est possible de faire une recherche sur un nom de champs qui peut⁻être utilisé
+par différente extension. Pour cela on remplace le nom d'extension par '*'::
+
+ WikittyQuery q = new WikittyQueryMaker()
+ .eq(new ElementField(ElementField.ALL_EXTENSION, "name"), "poussin").end();
+
+ WikittyQuery q = WikittyQueryParser.parse("*.name==poussin");
+
+Dans ce cas la recherche est une recherche fulltext qui peut-être utilisé
+quelque soit le type du champs. Mais si vous souhaitez restrainte la recherche
+au champs d'un certain type vous pouvez ajouter le type à la fin.::
+
+ Date _1950 = new Date(...);
+ Date _1960 = new Date(...);
+ WikittyQuery q = new WikittyQueryMaker()
+ bw.(new ElementField("birthday", FieldType.TYPE.DATE), _1950, _1960).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("*.birthday.DATE=[\"01/01/1950\" TO \"01/01/1961\"]");
+
+Il est aussi possible de faire une recherche fulltext, c'est à dire sur tous les
+champs de toutes les extentions::
+
+ Date _1950 = new Date(...);
+ Date _1960 = new Date(...);
+ WikittyQuery q = new WikittyQueryMaker()
+ eq.(Element.ALL_FIELD, "poussin).end();
+
+ WikittyQuery q = WikittyQueryParser.parse("*=poussin");
+
+
+Les autres valeurs d'une requête
+--------------------------------
+
+* Nom : name - Nommage de la requêtes.
+
+* Les requêtes permettent d'ajouter un ordre ou des facettes :
+
+* Premier index : first - Permet de définir le premier index à retourner. Principalement utilisé pour la pagination.
+
+* Nombre : limit - Permet de définir le dernier index à retourner. Principalement utilisé pour la pagination.
+
+* [TODO] facetMinCount
+
+* [TODO] facetLimit
+
+* [TODO] facetSort
+
+* [TODO] facetExtension
+
+* [TODO] facetField
+
+* [TODO] facetQuery
+
+* Tri : sortAscending - Ajout d'un ou plusieurs champs pour le tri ascendant du résultat.
+
+* Tri : sortDescending - Ajout d'un ou plusieurs champs pour le tri descendant du résultat.
+
+Les résultats
+-------------
+
+Lorsqu'on effectue une recherche, on obtient un WikittyQueryResult. En effet, les
+résultats étant paginés, on obtient tout ou partie des résultats.
+Un WikittyQueryResult contient le nombre total de résultats, les résultats de la page
+ainsi que le premier index, le nombre de résultats et les facettes si elles ont
+été utilisées pour la recherche.
Modified: trunk/src/site/rst/user/search.rst
===================================================================
--- trunk/src/site/rst/user/search.rst 2012-01-02 17:58:20 UTC (rev 1275)
+++ trunk/src/site/rst/user/search.rst 2012-01-02 18:45:36 UTC (rev 1276)
@@ -26,6 +26,8 @@
Recherche avec Wikitty
======================
+Cette API est complètement dépréciée, il faut maintenant utiliser l'API QUERY
+
Wikitty permet de rechercher parmis les entités enregistrées tout en fournissant
les fonctionalités de pagination. Pour cela vous pouvez construire
programmatiquement vos recherches en utilisant un système de Criteria.
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2012-01-02 17:58:20 UTC (rev 1275)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryMaker.java 2012-01-02 18:45:36 UTC (rev 1276)
@@ -453,7 +453,7 @@
* @return {@code this} with the {@code extneq} restriction added.
* @see {@link NotEquals}
*/
- public WikittyQueryMaker extneq(String extensionName) {
+ public WikittyQueryMaker extne(String extensionName) {
return ne(Element.EXTENSION, extensionName);
}
@@ -463,10 +463,10 @@
* Restrict search to wikitties that do not have the id given in parameter.
*
* @param idOrWikitty the id the wikitties must not have.
- * @return {@code this} with the {@code idneq} restriction added.
+ * @return {@code this} with the {@code idne} restriction added.
* @see {@link NotEquals}
*/
- public WikittyQueryMaker idneq(Object idOrWikitty) {
+ public WikittyQueryMaker idne(Object idOrWikitty) {
return ne(Element.ID, idOrWikitty);
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 17:58:20 UTC (rev 1275)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 18:45:36 UTC (rev 1276)
@@ -4,8 +4,6 @@
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyUtil;
import org.nuiton.wikitty.entities.FieldType;
-import org.nuiton.wikitty.entities.WikittyExtension;
-import org.nuiton.wikitty.entities.WikittyField;
/**
* Element qui porte sur un champs. Le champs doit-ete de la forme
1
0
r1275 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 18:58:20 +0100 (Mon, 02 Jan 2012)
New Revision: 1275
Url: http://nuiton.org/repositories/revision/wikitty/1275
Log:
ajout d'un constructeur pour faciliter la recherche sur toutes les extensions '*', le nouveau constructeur prend en argument le type du champs
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 17:48:40 UTC (rev 1274)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 17:58:20 UTC (rev 1275)
@@ -3,6 +3,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyField;
@@ -28,13 +29,39 @@
final static public String ALL_EXTENSION = "*";
+ /**
+ * Le parametre doit etre completement qualifier c-a-d: extName.fieldName.
+ * ex: User.firstName.
+ * @param fqfield
+ */
public ElementField(String fqfield) {
super(fqfield);
}
+ /**
+ * Ce constructeur permet de creer un champs, si a la place de extensionName
+ * vous passez {@link #ALL_EXTENSION} le champs represente tous les champs
+ * partant se nom sur toutes les extensions
+ * @param extensionName
+ * @param fieldName
+ */
public ElementField(String extensionName, String fieldName) {
super(WikittyUtil.getFQFieldName(extensionName, fieldName));
}
+ /**
+ * Cree un champs sur toutes les extensions ex: "*.name" en specifiant le
+ * type du champs ex: "*.birthday.DATE"
+ *
+ * @param fieldName le champs sans l'extension
+ * @param type le type que le champs doit avoir
+ */
+ public ElementField(String fieldName, FieldType.TYPE type) {
+ // le separateur entre le type et le champs est le meme que entre
+ // l'extension et le champs, on utilise la meme methode
+ super(WikittyUtil.getFQFieldName(
+ WikittyUtil.getFQFieldName(ALL_EXTENSION, fieldName), type.name()));
+ }
+
}
1
0
r1274 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 18:48:40 +0100 (Mon, 02 Jan 2012)
New Revision: 1274
Url: http://nuiton.org/repositories/revision/wikitty/1274
Log:
ajout d'un constructeur pour facilite la recherche sur toutes les extensions '*'
et d'une constante ALL_EXTENSION='*'
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 16:56:31 UTC (rev 1273)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/conditions/ElementField.java 2012-01-02 17:48:40 UTC (rev 1274)
@@ -2,6 +2,9 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.entities.WikittyField;
/**
* Element qui porte sur un champs. Le champs doit-ete de la forme
@@ -23,9 +26,15 @@
private static final long serialVersionUID = 1L;
- public ElementField(String value) {
- super(value);
+ final static public String ALL_EXTENSION = "*";
+
+ public ElementField(String fqfield) {
+ super(fqfield);
}
+ public ElementField(String extensionName, String fieldName) {
+ super(WikittyUtil.getFQFieldName(extensionName, fieldName));
+ }
+
}
1
0
r1273 - in trunk: wikitty-api/src/test/java/org/nuiton/wikitty/api wikitty-generators/src/main/java/org/nuiton/wikitty/generator
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 17:56:31 +0100 (Mon, 02 Jan 2012)
New Revision: 1273
Url: http://nuiton.org/repositories/revision/wikitty/1273
Log:
Evolution #1674: Change method argument for collection adder method in generated object
- addAll(Collection
- add(<Type>...
- remove(<Type>...
Modified:
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -704,7 +704,7 @@
}
@Override
- public void addAllLabels(Set<String> labels) {
+ public void addAllLabels(Collection<String> labels) {
this.labels.addAll(labels);
}
@@ -713,8 +713,10 @@
* @param element
*/
@Override
- public void addLabels(String element) {
- labels.add(element);
+ public void addLabels(String... element) {
+ for (String v : element) {
+ labels.add(v);
+ }
}
/**
@@ -722,8 +724,10 @@
* @param element
*/
@Override
- public void removeLabels(String element) {
- labels.remove(element);
+ public void removeLabels(String... element) {
+ for (String v : element) {
+ labels.remove(v);
+ }
}
/**
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -338,17 +338,23 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+
String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute);
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
getterName = "get" + StringUtils.capitalize(attributeName);
- ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeSimpleNameInSet);
+ ObjectModelOperation getter = addOperation(
+ abstractClass, getterName, attributeTypeCollectionStrict);
addAnnotation(abstractClass, getter, "Override");
String getterBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> result = <%=helperClassName%>.<%=getterName%>(getWikitty());
+ <%=attributeTypeCollectionStrict%> result = <%=helperClassName%>.<%=getterName%>(getWikitty());
return result;
}*/;
setOperationBody(getter, getterBody);
@@ -356,10 +362,10 @@
String setterName = "set" + capitalizedAttributeName;
ObjectModelOperation setter = addOperation(abstractClass, setterName, "void");
addAnnotation(abstractClass, setter, "Override");
- addParameter(setter, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String setterBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> oldValue = get<%=capitalizedAttributeName%>();
+ <%=attributeTypeCollectionStrict%> oldValue = get<%=capitalizedAttributeName%>();
<%=helperClassName%>.<%=setterName%>(getWikitty(), <%=attributeName%>);
getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, oldValue, <%= getter.getName() %>());
}*/;
@@ -368,10 +374,10 @@
String addAllName = "addAll" + capitalizedAttributeName;
ObjectModelOperation addAll = addOperation(abstractClass, addAllName, "void");
addAnnotation(abstractClass, addAll, "Override");
- addParameter(addAll, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addAllBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> oldValue = get<%=capitalizedAttributeName%>();
+ <%=attributeTypeCollectionStrict%> oldValue = get<%=capitalizedAttributeName%>();
<%=helperClassName%>.<%=addAllName%>(getWikitty(), <%=attributeName%>);
getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, oldValue, <%= getter.getName() %>());
}*/;
@@ -380,22 +386,24 @@
String addName = "add" + capitalizedAttributeName;
ObjectModelOperation adder = addOperation(abstractClass, addName, "void");
addAnnotation(abstractClass, adder, "Override");
- addParameter(adder, "String", "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
/*{
+ <%=attributeTypeCollectionStrict%> oldValue = get<%=capitalizedAttributeName%>();
<%=helperClassName%>.<%=addName%>(getWikitty(), element);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%= getter.getName() %>());
+ getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, oldValue, <%= getter.getName() %>());
}*/;
setOperationBody(adder, adderBody);
String removeName = "remove" + StringUtils.capitalize(attributeName);
ObjectModelOperation remover = addOperation(abstractClass, removeName, "void");
addAnnotation(abstractClass, remover, "Override");
- addParameter(remover, "String", "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
+ <%=attributeTypeCollectionStrict%> oldValue = get<%=capitalizedAttributeName%>();
<%=helperClassName%>.<%=removeName%>(getWikitty(), element);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(remover, removerBody);
@@ -586,18 +594,23 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+
String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute);
String attributeNameCapitalized = StringUtils.capitalize(attributeName);
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
getterName = "get" + attributeNameCapitalized;
- ObjectModelOperation getter = addOperation(abstractClassForThisMetaExtension, getterName, attributeTypeSimpleNameInSet);
+ ObjectModelOperation getter = addOperation(abstractClassForThisMetaExtension, getterName, attributeTypeCollectionStrict);
addAnnotation(abstractClassForThisMetaExtension, getter, "Override");
String getterBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> result;
+ <%=attributeTypeCollectionStrict%> result;
if (extensionForMetaExtension == null) {
result = <%=helperClassName%>.<%=getterName%>(getWikitty());
} else {
@@ -610,68 +623,76 @@
String setterName = "set" + attributeNameCapitalized;
ObjectModelOperation setter = addOperation(abstractClassForThisMetaExtension, setterName, "void");
addAnnotation(abstractClassForThisMetaExtension, setter, "Override");
- addParameter(setter, attributeTypeSimpleNameInSet, "values");
+ addParameter(setter, attributeTypeCollectionStrict, "values");
String setterBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=setterName%>(getWikitty(), values);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=setterName%>(extensionForMetaExtension.getName(), getWikitty(), values);
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(setter, setterBody);
String addAllName = "addAll" + attributeNameCapitalized;
ObjectModelOperation addAll = addOperation(abstractClassForThisMetaExtension, addAllName, "void");
addAnnotation(abstractClassForThisMetaExtension, addAll, "Override");
- addParameter(addAll, attributeTypeSimpleNameInSet, "values");
+ addParameter(addAll, attributeTypeCollectionGeneric, "values");
String addAllBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=addAllName%>(getWikitty(), values);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=addAllName%>(extensionForMetaExtension.getName(), getWikitty(), values);
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(addAll, addAllBody);
String addName = "add" + attributeNameCapitalized;
ObjectModelOperation adder = addOperation(abstractClassForThisMetaExtension, addName, "void");
addAnnotation(abstractClassForThisMetaExtension, adder, "Override");
- addParameter(adder, "String", "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=addName%>(getWikitty(), element);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=addName%>(extensionForMetaExtension.getName(), getWikitty(), element);
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(adder, adderBody);
String removeName = "remove" + attributeNameCapitalized;
ObjectModelOperation remover = addOperation(abstractClassForThisMetaExtension, removeName, "void");
addAnnotation(abstractClassForThisMetaExtension, remover, "Override");
- addParameter(remover, "String", "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=removeName%>(getWikitty(), element);
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=removeName%>(extensionForMetaExtension.getName(), getWikitty(), element);
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(remover, removerBody);
@@ -680,14 +701,16 @@
addAnnotation(abstractClassForThisMetaExtension, clear, "Override");
String clearBody = ""
/*{
+ String fieldName;
+ <%=attributeTypeCollectionStrict%> oldValue = <%=getter.getName()%>();
if (extensionForMetaExtension == null) {
<%=helperClassName%>.<%=clearName%>(getWikitty());
- getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%=getter.getName()%>());
+ fieldName = <%=fieldVariableName%>;
} else {
<%=helperClassName%>.<%=clearName%>(extensionForMetaExtension.getName(), getWikitty());
- String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
- getPropertyChangeSupport().firePropertyChange(fieldName, null, <%=getter.getName()%>());
+ fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
}
+ getPropertyChangeSupport().firePropertyChange(fieldName, oldValue, <%=getter.getName()%>());
}*/;
setOperationBody(clear, clearBody);
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -231,28 +231,30 @@
if (attribute.getMaxMultiplicity() > 1 || attribute.getMaxMultiplicity() == -1) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionStrict = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric = "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
String getterName = "get" + StringUtils.capitalize(attributeName);
- getter = addOperation(contract, getterName, attributeTypeSimpleNameInSet);
+ getter = addOperation(contract, getterName, attributeTypeCollectionStrict);
String setterName = "set" + StringUtils.capitalize(attributeName);
ObjectModelOperation setter = addOperation(contract, setterName, "void");
- addParameter(setter, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String addAllName = "addAll" + StringUtils.capitalize(attributeName);
ObjectModelOperation addAll = addOperation(contract, addAllName, "void");
- addParameter(addAll, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addName = "add" + StringUtils.capitalize(attributeName);
ObjectModelOperation adder = addOperation(contract, addName, "void");
- addParameter(adder, "String", "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String removeName = "remove" + StringUtils.capitalize(attributeName);
ObjectModelOperation remover = addOperation(contract, removeName, "void");
- addParameter(remover, "String", "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String clearName = "clear" + StringUtils.capitalize(attributeName);
addOperation(contract, clearName, "void");
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -191,25 +191,31 @@
// get, add, remove and clear
//calculate template parameters
- String attributeTypeInSet = WikittyTransformerUtil.generateResultType(attribute, true);
- String attributeTypeInSetImpl = null;
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+
+
+ String attributeTypeCollectionStrictImpl = null;
String collectionType = WikittyTransformerUtil.getCollectionTypeName(attribute);
if (Set.class.getSimpleName().equals(collectionType)){
addImport(abstractClass, Set.class);
addImport(abstractClass, LinkedHashSet.class);
- attributeTypeInSetImpl = "LinkedHashSet<String>";
+ attributeTypeCollectionStrictImpl = "LinkedHashSet<String>";
}
if (List.class.getSimpleName().equals(collectionType)){
addImport(abstractClass, List.class);
addImport(abstractClass, ArrayList.class);
- attributeTypeInSetImpl = "ArrayList<String>";
+ attributeTypeCollectionStrictImpl = "ArrayList<String>";
}
//adding the attribute
ObjectModelAttribute modelAttribute = addAttribute(abstractClass,
- attributeName + " = new " + attributeTypeInSetImpl + "()",
- attributeTypeInSet);
+ attributeName + " = new " + attributeTypeCollectionStrictImpl + "()",
+ attributeTypeCollectionStrict);
String annotation = "WikittyField(fqn=\""+ businessEntity.getName() + "." + attributeName +"\")";
addAnnotation(abstractClass, modelAttribute, annotation);
addImport(abstractClass, "org.nuiton.wikitty.entities.WikittyField");
@@ -217,7 +223,7 @@
// adding the getter
getterName = "get" + StringUtils.capitalize(attributeName);
- ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeInSet);
+ ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeCollectionStrict);
addAnnotation(abstractClass, getter, "Override");
String getterBody = ""
/*{
@@ -229,14 +235,14 @@
getterName = "set" + StringUtils.capitalize(attributeName);
ObjectModelOperation setter = addOperation(abstractClass, getterName, "void");
addAnnotation(abstractClass, setter, "Override");
- addParameter(setter, attributeTypeInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String setterBody = ""
/*{
if (<%=attributeName%> == null){
- this.<%=attributeName%> = new <%=attributeTypeInSetImpl%>();
+ this.<%=attributeName%> = new <%=attributeTypeCollectionStrictImpl%>();
} else {
// make copy to prevent modification of source collection
- this.<%=attributeName%>=new <%=attributeTypeInSetImpl%>(<%=attributeName%>);
+ this.<%=attributeName%>=new <%=attributeTypeCollectionStrictImpl%>(<%=attributeName%>);
}
modificationCount++;
}*/;
@@ -246,11 +252,11 @@
String addAllName = "addAll" + StringUtils.capitalize(attributeName);
ObjectModelOperation addAll = addOperation(abstractClass, addAllName, "void");
addAnnotation(abstractClass, addAll, "Override");
- addParameter(addAll, attributeTypeInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addAllBody = ""
/*{
if (this.<%=attributeName%> == null){
- this.<%=attributeName%> = new <%=attributeTypeInSetImpl%>();
+ this.<%=attributeName%> = new <%=attributeTypeCollectionStrictImpl%>();
}
this.<%=attributeName%>.addAll(<%=attributeName%>);
modificationCount++;
@@ -261,13 +267,15 @@
String addName = "add" + StringUtils.capitalize(attributeName);
ObjectModelOperation adder = addOperation(abstractClass, addName, "void");
addAnnotation(abstractClass, adder, "Override");
- addParameter(adder, attributeType, "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
/*{
if (this.<%=attributeName%> == null){
- this.<%=attributeName%> = new <%=attributeTypeInSetImpl%>();
+ this.<%=attributeName%> = new <%=attributeTypeCollectionStrictImpl%>();
}
- this.<%=attributeName%>.add(element);
+ for (<%=attributeType%> v : element) {
+ this.<%=attributeName%>.add(v);
+ }
modificationCount++;
}*/;
setOperationBody(adder, adderBody);
@@ -276,11 +284,15 @@
String removeName = "remove" + StringUtils.capitalize(attributeName);
ObjectModelOperation remover = addOperation(abstractClass, removeName, "void");
addAnnotation(abstractClass, remover, "Override");
- addParameter(remover, attributeType, "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
- <%=attributeName%>.remove(element);
- modificationCount++;
+ if (this.<%=attributeName%> != null) {
+ for (<%=attributeType%> v : element) {
+ <%=attributeName%>.remove(element);
+ }
+ modificationCount++;
+ }
}*/;
setOperationBody(remover, removerBody);
@@ -290,8 +302,10 @@
addAnnotation(abstractClass, clear, "Override");
String clearBody = ""
/*{
- <%=attributeName%>.clear();
- modificationCount++;
+ if (this.<%=attributeName%> != null) {
+ <%=attributeName%>.clear();
+ modificationCount++;
+ }
}*/;
setOperationBody(clear, clearBody);
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2012-01-02 15:08:12 UTC (rev 1272)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2012-01-02 16:56:31 UTC (rev 1273)
@@ -121,26 +121,36 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
- String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute);
- String attributeNameCapitalized = StringUtils.capitalize(attributeName);
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+ String getFieldMethodName =
+ WikittyTransformerUtil.generateGetFieldAsCall(attribute);
+ String attributeNameCapitalized =
+ StringUtils.capitalize(attributeName);
+
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
String getterName = "get" + attributeNameCapitalized;
- ObjectModelOperation getter = addOperation(helper, getterName, attributeTypeSimpleNameInSet, ObjectModelModifier.STATIC);
+ ObjectModelOperation getter = addOperation(
+ helper, getterName, attributeTypeCollectionStrict,
+ ObjectModelModifier.STATIC);
addParameter(getter, "Wikitty", "wikitty");
String getterBody = ""
/*{
- <%=attributeTypeSimpleNameInSet%> result = wikitty.<%=getFieldMethodName%>(<%=extensionVariableName%>, <%=fieldVariableName%>, <%=attributeType%>.class);
+ <%=attributeTypeCollectionStrict%> result = wikitty.<%=getFieldMethodName%>(<%=extensionVariableName%>, <%=fieldVariableName%>, <%=attributeType%>.class);
return result;
}*/;
setOperationBody(getter, getterBody);
String setterName = "set" + attributeNameCapitalized;
- ObjectModelOperation setter = addOperation(helper, setterName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation setter = addOperation(
+ helper, setterName, "void", ObjectModelModifier.STATIC);
addParameter(setter, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(setter, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String setterBody = ""
/*{
wikitty.setField(<%=extensionVariableName%>, <%=fieldVariableName%>, <%=attributeName%>);
@@ -148,14 +158,15 @@
setOperationBody(setter, setterBody);
String addAllName = "addAll" + attributeNameCapitalized;
- ObjectModelOperation addAll = addOperation(helper, addAllName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation addAll = addOperation(
+ helper, addAllName, "void", ObjectModelModifier.STATIC);
addParameter(addAll, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(addAll, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addAllBody = ""
/*{
if(<%=attributeName%> != null){
- for (String id:<%=attributeName%>){
- add<%=attributeNameCapitalized%>(wikitty, id);
+ for (<%=attributeType%> v:<%=attributeName%>){
+ add<%=attributeNameCapitalized%>(wikitty, v);
}
}
}*/;
@@ -164,20 +175,24 @@
String addName = "add" + attributeNameCapitalized;
ObjectModelOperation adder = addOperation(helper, addName, "void", ObjectModelModifier.STATIC);
addParameter(adder, "Wikitty", "wikitty");
- addParameter(adder, attributeType, "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
/*{
- wikitty.addToField(<%=extensionVariableName%>, <%=fieldVariableName%>, element);
+ for (<%=attributeType%> v : element) {
+ wikitty.addToField(<%=extensionVariableName%>, <%=fieldVariableName%>, v);
+ }
}*/;
setOperationBody(adder, adderBody);
String removeName = "remove" + StringUtils.capitalize(attributeName);
ObjectModelOperation remover = addOperation(helper, removeName, "void", ObjectModelModifier.STATIC);
addParameter(remover, "Wikitty", "wikitty");
- addParameter(remover, attributeType, "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
- wikitty.removeFromField(<%=extensionVariableName%>, <%=fieldVariableName%>, element);
+ for (<%=attributeType%> v : element) {
+ wikitty.removeFromField(<%=extensionVariableName%>, <%=fieldVariableName%>, v);
+ }
}*/;
setOperationBody(remover, removerBody);
@@ -383,29 +398,37 @@
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
// attributed is a collection, we will generate operations get, add, remove and clear
- String attributeTypeSimpleNameInSet = WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionStrict =
+ WikittyTransformerUtil.generateResultType(attribute, true);
+ String attributeTypeCollectionGeneric =
+ "Collection<" + attributeType + ">";
+ String attributeTypeVarargs = attributeType + "...";
+
String getFieldMethodName = WikittyTransformerUtil.generateGetFieldAsCall(attribute);
String capitalizedAttributeName = StringUtils.capitalize(attributeName);
// now, for this attribute, we will generate add, remove and clear methods
// adding operations to contract
String getterName = "get" + capitalizedAttributeName;
- ObjectModelOperation getter = addOperation(helper, getterName, attributeTypeSimpleNameInSet, ObjectModelModifier.STATIC);
+ ObjectModelOperation getter = addOperation(
+ helper, getterName, attributeTypeCollectionStrict,
+ ObjectModelModifier.STATIC);
addParameter(getter, "String", "extensionName");
addParameter(getter, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
String getterBody = ""
/*{
String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
- <%=attributeTypeSimpleNameInSet%> result = (<%=attributeTypeSimpleNameInSet%>) wikitty.getFqField(fieldName);
+ <%=attributeTypeCollectionStrict%> result = (<%=attributeTypeCollectionStrict%>) wikitty.getFqField(fieldName);
return result;
}*/;
setOperationBody(getter, getterBody);
String setterName = "set" + capitalizedAttributeName;
- ObjectModelOperation setter = addOperation(helper, setterName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation setter = addOperation(
+ helper, setterName, "void", ObjectModelModifier.STATIC);
addParameter(setter, "String", "extensionName");
addParameter(setter, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(setter, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(setter, attributeTypeCollectionStrict, attributeName);
String setterBody = ""
/*{
clear<%=capitalizedAttributeName%>(extensionName, wikitty);
@@ -414,10 +437,11 @@
setOperationBody(setter, setterBody);
String addAllName = "addAll" + capitalizedAttributeName;
- ObjectModelOperation addAll = addOperation(helper, addAllName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation addAll = addOperation(
+ helper, addAllName, "void", ObjectModelModifier.STATIC);
addParameter(addAll, "String", "extensionName");
addParameter(addAll, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(addAll, attributeTypeSimpleNameInSet, attributeName);
+ addParameter(addAll, attributeTypeCollectionGeneric, attributeName);
String addAllBody = ""
/*{
if(<%=attributeName%> != null){
@@ -429,14 +453,17 @@
setOperationBody(addAll, addAllBody);
String addName = "add" + capitalizedAttributeName;
- ObjectModelOperation adder = addOperation(helper, addName, "void", ObjectModelModifier.STATIC);
+ ObjectModelOperation adder = addOperation(
+ helper, addName, "void", ObjectModelModifier.STATIC);
addParameter(adder, "String", "extensionName");
addParameter(adder, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(adder, attributeType, "element");
+ addParameter(adder, attributeTypeVarargs, "element");
String adderBody = ""
-/*{
- String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
- wikitty.addToField(fieldName, element);
+/*{
+ for (<%=attributeType%> v : element) {
+ String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
+ wikitty.addToField(fieldName, v);
+ }
}*/;
setOperationBody(adder, adderBody);
@@ -444,11 +471,13 @@
ObjectModelOperation remover = addOperation(helper, removeName, "void", ObjectModelModifier.STATIC);
addParameter(remover, "String", "extensionName");
addParameter(remover, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
- addParameter(remover, attributeType, "element");
+ addParameter(remover, attributeTypeVarargs, "element");
String removerBody = ""
/*{
- String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
- wikitty.removeFromField(fieldName, element);
+ for (<%=attributeType%> v : element) {
+ String fieldName = getMetaFieldName(extensionName, "<%=attributeName%>");
+ wikitty.removeFromField(fieldName, v);
+ }
}*/;
setOperationBody(remover, removerBody);
1
0
r1272 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/query wikitty-api/src/main/java/org/nuiton/wikitty/storage wikitty-api/src/test/java/org/nuiton/wikitty/storage wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 02 Jan '12
by bpoussin@users.nuiton.org 02 Jan '12
02 Jan '12
Author: bpoussin
Date: 2012-01-02 16:08:12 +0100 (Mon, 02 Jan 2012)
New Revision: 1272
Url: http://nuiton.org/repositories/revision/wikitty/1272
Log:
Evolution #1868: Add facet topic sort order in query
(ajout de l'implantation des facets dans le InMemory)
Added:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetSortType.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetSortType.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetSortType.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetSortType.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -0,0 +1,29 @@
+package org.nuiton.wikitty.query;
+
+import java.util.Comparator;
+
+/**
+ * Use to specify sort order of Facet in result
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public enum FacetSortType {
+ /** sort on count of topic */
+ count("count", FacetTopicCountComparator.instance),
+ /** sort on name of topic */
+ name("index", FacetTopicNameComparator.instance);
+
+ public String solrValue;
+ public Comparator<FacetTopic> compartor;
+
+ private FacetSortType(String solrValue, Comparator<FacetTopic> compartor) {
+ this.solrValue = solrValue;
+ this.compartor = compartor;
+ }
+
+
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicCountComparator.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -20,6 +20,14 @@
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(FacetTopicCountComparator.class);
+ final static public Comparator<FacetTopic> instance = new FacetTopicCountComparator();
+
+ /**
+ * You must use {@link instance}
+ */
+ public FacetTopicCountComparator() {
+ }
+
public int compare(FacetTopic o1, FacetTopic o2) {
int thisVal = o1.getCount();
int anotherVal = o2.getCount();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/FacetTopicNameComparator.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -17,14 +17,22 @@
*/
public class FacetTopicNameComparator implements Comparator<FacetTopic> {
- /** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(FacetTopicNameComparator.class);
+ final static public Comparator<FacetTopic> instance =
+ new FacetTopicNameComparator();
+ final static public Comparator<FacetTopic> instanceCaseSensitive =
+ new FacetTopicNameComparator(false);
protected boolean ignoreCase = true;
+ /**
+ * You must use {@link instance} or {@link instanceCaseSensitive}
+ */
public FacetTopicNameComparator() {
}
+ /**
+ * You must use {@link instance} or {@link instanceCaseSensitive}
+ */
public FacetTopicNameComparator(boolean ignoreCase) {
this.ignoreCase = ignoreCase;
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -53,10 +53,12 @@
*/
protected int facetMinCount = 1;
/**
- * Nombre maximum de facet a retourner apres la requete. Par default on en
+ * Nombre maximum de topic par facet a retourner. Par default on en
* retourne 100.
*/
protected int facetLimit = 100;
+ /** sort topic order, default is sorted on count */
+ protected FacetSortType facetSort = FacetSortType.count;
/** Facet on condition. */
protected List<FacetQuery> facetQuery;
@@ -113,6 +115,7 @@
ObjectUtils.equals(this.getSortAscending(), other.getSortAscending()) &&
ObjectUtils.equals(this.getSortDescending(), other.getSortDescending()) &&
ObjectUtils.equals(this.getFacetLimit(), other.getFacetLimit()) &&
+ ObjectUtils.equals(this.getFacetSort(), other.getFacetSort()) &&
ObjectUtils.equals(this.getFacetMinCount(), other.getFacetMinCount()) &&
ObjectUtils.equals(this.getFacetQuery(), other.getFacetQuery()) &&
ObjectUtils.equals(this.getCondition(), other.getCondition());
@@ -200,6 +203,14 @@
return this;
}
+ public void setFacetSort(FacetSortType facetSort) {
+ this.facetSort = facetSort;
+ }
+
+ public FacetSortType getFacetSort() {
+ return facetSort;
+ }
+
public List<FacetQuery> getFacetQuery() {
if (facetQuery == null) {
facetQuery = new LinkedList<FacetQuery>();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryVisitorCopy.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -71,6 +71,7 @@
q.setFacetMinCount(o.getFacetMinCount());
q.setFirst(o.getFirst());
q.setLimit(o.getLimit());
+ q.setFacetSort(o.getFacetSort());
q.setName(o.getName());
q.setSortAscending(new ArrayList<ElementField>(o.getSortAscending()));
q.setSortDescending(new ArrayList<ElementField>(o.getSortDescending()));
Added: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java (rev 0)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineHelper.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -0,0 +1,107 @@
+package org.nuiton.wikitty.storage;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.FacetSortType;
+import org.nuiton.wikitty.query.FacetTopic;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.conditions.Select;
+import org.nuiton.wikitty.services.WikittyTransaction;
+
+/**
+ * Ensemble de methode reutilisable dans differente implantation de
+ * {@link WikittySearchEngine}
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittySearchEngineHelper {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittySearchEngineHelper.class);
+
+ /**
+ * Gere le travail pour les requetes ayant un {@link Select}
+ *
+ * @param searchEngine le searchEngine a utiliser pour les sous requetes
+ * @param transaction la transaction a utiliser
+ * @param query la requete qui debute par un {@link Select}
+ * @return
+ */
+ static public WikittyQueryResult<String> findAllByQueryWithSelect(
+ WikittySearchEngine searchEngine, WikittyTransaction transaction,
+ WikittyQuery query) {
+
+ if (!(query.getCondition() instanceof Select)) {
+ throw new WikittyException("Query don't start with Select condition");
+ } else {
+ // gere les conditions qui commence par select
+ // il faut recreer deux query, une pour le select, une pour les facettes s'il y en a
+ // car le select est execute via une facette, mais cette facette
+ // n'a pas les meme limites que les autres facette
+
+ Select select = (Select)query.getCondition();
+ String extName = WikittyExtension.extractExtensionName(
+ select.getElement().getValue());
+ WikittyQueryMaker newCond = new WikittyQueryMaker()
+ .and()
+ .exteq(extName)
+ .condition(select.getSubCondition());
+
+ // copy de la query pour les facettes
+ WikittyQuery queryFacet = query.copy();
+ queryFacet.setCondition(newCond.getCondition());
+ queryFacet.setLimit(0);
+
+ // copy de la query pour le select
+ // on part de facet qui a deja la bonne condition
+ WikittyQuery querySelect = queryFacet.copy();
+ querySelect.setLimit(0);
+ querySelect.setFacetMinCount(0);
+ querySelect.setFacetLimit(Integer.MAX_VALUE);
+ // on force le sort pour toujours utiliser le meme
+ querySelect.setFacetSort(FacetSortType.count);
+ querySelect.setFacetQuery();
+ querySelect.setFacetField(select.getElement());
+
+ // execution des requetes
+ WikittyQueryResult<String> resultFacet =
+ searchEngine.findAllByQuery(transaction, queryFacet);
+ WikittyQueryResult<String> resultSelect =
+ searchEngine.findAllByQuery(transaction, querySelect);
+
+ // creation des resultats via la facette select
+ List<FacetTopic> topics = resultSelect.getFacets().get(select.getElement().getValue());
+
+ List<String> selectList = new ArrayList<String>(
+ Math.min(topics.size(), query.getLimit()));
+ if (query.getFirst() < topics.size()) {
+ int first = query.getFirst();
+ int last = Math.min(topics.size(), query.getFirst() + query.getLimit());
+ for (FacetTopic topic : topics.subList(first, last)) {
+ selectList.add(topic.getTopicName());
+ }
+ }
+
+ // fusion des resultats
+ WikittyQueryResult<String> result = new WikittyQueryResult<String>(
+ query.getName(),
+ query.getFirst(),
+ topics.size(),
+ resultSelect.getQueryString(),
+ resultFacet.getFacets(),
+ selectList);
+
+ return result;
+ }
+ }
+}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -38,7 +38,16 @@
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.commons.collections.Bag;
+import org.apache.commons.collections.BagUtils;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Factory;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.bag.HashBag;
+import org.apache.commons.collections.map.LazyMap;
+import org.apache.commons.collections.map.LazySortedMap;
+import org.apache.commons.collections.map.PredicatedMap;
+import org.apache.commons.collections.set.PredicatedSet;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -48,6 +57,8 @@
import org.nuiton.wikitty.entities.FieldType.TYPE;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.FacetQuery;
+import org.nuiton.wikitty.query.FacetTopic;
import org.nuiton.wikitty.query.WikittyQuery;
import org.nuiton.wikitty.query.WikittyQueryResult;
import org.nuiton.wikitty.query.WikittyQueryResultTreeNode;
@@ -56,6 +67,7 @@
import org.nuiton.wikitty.query.conditions.ContainsAll;
import org.nuiton.wikitty.query.conditions.ContainsOne;
import org.nuiton.wikitty.query.conditions.ElementExtension;
+import org.nuiton.wikitty.query.conditions.ElementField;
import org.nuiton.wikitty.query.conditions.ElementId;
import org.nuiton.wikitty.query.conditions.Equals;
import org.nuiton.wikitty.query.conditions.Greater;
@@ -113,38 +125,126 @@
// do nothing
}
- private boolean checkRestriction(WikittyTransaction transaction,
- Condition condition, Wikitty w) {
+ static private boolean checkRestriction(WikittySearchEngine searchEngine,
+ WikittyTransaction transaction, Condition condition, Wikitty w) {
WikittyQueryVisitorCheckCondition v =
- new WikittyQueryVisitorCheckCondition(this, transaction, w);
+ new WikittyQueryVisitorCheckCondition(searchEngine, transaction, w);
condition.accept(v);
boolean result = v.getResult();
return result;
}
+
+ static public class FacetPredicate {
+ WikittyTransaction tx;
+ WikittySearchEngine searchEngine;
+ WikittyQuery query;
+ Map<String, Bag> topic;
+
+ public FacetPredicate(WikittySearchEngine searchEngine,
+ WikittyTransaction tx, WikittyQuery query) {
+ this.searchEngine = searchEngine;
+ this.tx = tx;
+ this.query = query;
+
+ topic = LazyMap.decorate(new HashMap(), new Factory() {
+ public Object create() {
+ return new HashBag();
+ }
+ });
+
+ }
+
+ public Map<String, List<FacetTopic>> getFacets() {
+ Map<String, List<FacetTopic>> result = new HashMap<String, List<FacetTopic>>();
+ for (String facetName : topic.keySet()) {
+ List<FacetTopic> list = new ArrayList<FacetTopic>();
+ Bag b = topic.get(facetName);
+ for (Object topicName : b.uniqueSet()) {
+ int count = b.getCount(topicName);
+ // pour ajouter le topic il faut un minimum indique dans la query
+ if (count >= query.getFacetMinCount()) {
+ FacetTopic ft = new FacetTopic(facetName, String.valueOf(topicName), count);
+ list.add(ft);
+ }
+ }
+ // on tri les facets selon l'ordre demande ...
+ Collections.sort(list, query.getFacetSort().compartor);
+ // ... et on en prend que le nombre demande
+ if (list.size() > query.getFacetLimit()) {
+ list = list.subList(0, query.getFacetLimit());
+ }
+ result.put(facetName, list);
+ }
+ return result;
+ }
+
+ public boolean add(Wikitty w) {
+ boolean result = false;
+
+ // create facet extension
+ if (query.isFacetExtension()) {
+ String facetName = ElementExtension.EXTENSION.getValue();
+ for (String extName : w.getExtensionNames()) {
+ topic.get(facetName).add(extName);
+ result = true;
+ }
+ }
+
+ // create facet field
+ for (ElementField e : query.getFacetField()) {
+ String fqf = e.getValue();
+ Object value = w.getFqField(fqf);
+ topic.get(fqf).add(value);
+ result = true;
+ }
+
+ // create facet query
+ for (FacetQuery q : query.getFacetQuery()) {
+ if (checkRestriction(searchEngine, tx, q.getCondition(), w)) {
+ String facetName = q.getName();
+ if (facetName == null) {
+ facetName = q.getCondition().toString();
+ }
+ topic.get(facetName).add(facetName);
+ }
+ }
+
+ return result;
+ }
+ }
@Override
public WikittyQueryResult<String> findAllByQuery(WikittyTransaction transaction, WikittyQuery query) {
- // throw new UnsupportedOperationException("Not supported yet.");
- int first = query.getFirst();
- int limit = query.getLimit();
- List<String> ids = new LinkedList<String>();
- int currentIndex = 0;
- for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
- Wikitty w = entry.getValue();
- String id = entry.getKey();
- Condition c = query.getCondition();
- if (!w.isDeleted() && checkRestriction(transaction, c, w)) {
- currentIndex++;
- if (currentIndex > first) {
- ids.add(id);
+ WikittyQueryResult<String> result;
+
+ if (query.getCondition() instanceof Select) {
+ result = WikittySearchEngineHelper.findAllByQueryWithSelect(
+ this, transaction, query);
+ } else {
+ int first = query.getFirst();
+ int limit = query.getLimit();
+ List<String> ids = new LinkedList<String>();
+ FacetPredicate facets = new FacetPredicate(this, transaction, query);
+
+ int totalResult = 0;
+ for (Entry<String, Wikitty> entry : wikittyStorage.getWikitties().entrySet()) {
+ Wikitty w = entry.getValue();
+ String id = entry.getKey();
+ Condition c = query.getCondition();
+ if (!w.isDeleted() && checkRestriction(this, transaction, c, w)) {
+ totalResult++;
+ if (totalResult > first && ids.size() < limit) {
+ // ajout en tant que resultat
+ ids.add(id);
+ }
+ facets.add(w);
}
- if (ids.size() >= limit) {
- break;
- }
}
+
+ result = new WikittyQueryResult<String>(query.getName(),
+ first, totalResult, query.getCondition().toString(), facets.getFacets(), ids);
}
- return new WikittyQueryResult<String>(query.getName(),
- first, ids.size(), query.getCondition().toString(), null, ids);
+ return result;
}
@Override
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemoryTest.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -35,6 +35,9 @@
public void testfindAllByQuery() throws Exception {
// initialisation des données
+ // 2 label: l1("toutou", "titi") et l2()
+ // 3 group: g1("MonGroup1", [l1]), g2("MonGroup2", [l2]), g3("MonGroup3", [l1,l2])
+
WikittyLabelImpl l1 = new WikittyLabelImpl(new WikittyImpl("l1"));
l1.addLabels("toutou");
l1.addLabels("titi");
@@ -170,6 +173,19 @@
g3.getWikittyId())));
}
+ { // select (et donc les facets)
+ WikittyQuery q = new WikittyQueryMaker()
+ .select(WikittyGroup.FQ_FIELD_WIKITTYGROUP_NAME)
+ .eq(WikittyGroup.FQ_FIELD_WIKITTYGROUP_MEMBERS, l1)
+ .end();
+ WikittyQueryResult<String> result = se.findAllByQuery(null, q);
+ System.out.println("dd:" + result.getAll());
+ // g3 doit etre retrouve via le join, et g1 est exclue via la not(ideq)
+ Assert.assertEquals(2, result.size());
+ Assert.assertTrue(result.getAll().containsAll(Arrays.asList(
+ g1.getName(), g3.getName())));
+ }
+
// TODO poussin 20111228 do more test to test all possible condition
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-12-31 14:06:23 UTC (rev 1271)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-01-02 15:08:12 UTC (rev 1272)
@@ -69,6 +69,7 @@
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
import org.nuiton.wikitty.query.FacetQuery;
+import org.nuiton.wikitty.query.FacetSortType;
import org.nuiton.wikitty.query.FacetTopic;
import org.nuiton.wikitty.query.WikittyQuery;
import org.nuiton.wikitty.query.WikittyQueryMaker;
@@ -78,6 +79,7 @@
import org.nuiton.wikitty.query.conditions.Select;
import org.nuiton.wikitty.search.Search;
import org.nuiton.wikitty.search.TreeNodeResult;
+import org.nuiton.wikitty.storage.WikittySearchEngineHelper;
/**
*
@@ -662,58 +664,8 @@
WikittyQueryResult<String> result;
if (query.getCondition() instanceof Select) {
- // gere les conditions qui commence par select
- // il faut recreer deux query, une pour le select, une pour les facettes s'il y en a
- // car le select est execute via une facette, mais cette facette
- // n'a pas les meme limites que les autres facette
-
- Select select = (Select)query.getCondition();
- String extName = WikittyExtension.extractExtensionName(
- select.getElement().getValue());
- WikittyQueryMaker newCond = new WikittyQueryMaker()
- .and()
- .exteq(extName)
- .condition(select.getSubCondition());
-
- // copy de la query pour les facettes
- WikittyQuery queryFacet = query.copy();
- queryFacet.setCondition(newCond.getCondition());
- queryFacet.setLimit(0);
-
- // copy de la query pour le select
- // on part de facet qui a deja la bonne condition
- WikittyQuery querySelect = queryFacet.copy();
- querySelect.setLimit(0);
- querySelect.setFacetMinCount(0);
- querySelect.setFacetLimit(Integer.MAX_VALUE);
- querySelect.setFacetQuery();
- querySelect.setFacetField(select.getElement());
-
- // execution des requetes
- WikittyQueryResult<String> resultFacet = findAllByQuery(transaction, queryFacet);
- WikittyQueryResult<String> resultSelect = findAllByQuery(transaction, querySelect);
-
- // creation des resultats via la facette select
- List<FacetTopic> topics = resultSelect.getFacets().get(select.getElement().getValue());
-
- List<String> selectList = new ArrayList<String>(
- Math.min(topics.size(), query.getLimit()));
- if (query.getFirst() < topics.size()) {
- int first = query.getFirst();
- int last = Math.min(topics.size(), query.getFirst() + query.getLimit());
- for (FacetTopic topic : topics.subList(first, last)) {
- selectList.add(topic.getTopicName());
- }
- }
-
- // fusion des resultats
- result = new WikittyQueryResult<String>(
- query.getName(),
- query.getFirst(),
- topics.size(),
- resultSelect.getQueryString(),
- resultFacet.getFacets(),
- selectList);
+ result = WikittySearchEngineHelper.findAllByQueryWithSelect(
+ this, transaction, query);
} else {
// Create querySolr
@@ -768,6 +720,7 @@
querySolr.setFacet(true);
querySolr.setFacetMinCount(query.getFacetMinCount());
querySolr.setFacetLimit(query.getFacetLimit());
+ querySolr.setFacetSort(query.getFacetSort().solrValue);
if (isFacetExtension) {
querySolr.addFacetField(WikittySolrConstant.SOLR_EXTENSIONS);
1
0