JaliosXperience
Link

JCMS 5.7 : Développement de recherches étendues avec l'API des QueryFilter > Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Sylvain DEVAUX

Sylvain DEVAUX

Post August 6, 2007 10:20 AM

Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Bonjour,

j'ai branché mon queryFilter sur une portletSearch pour efffectuer une recherche vers une base de données externe. Cependant, j'apercois dans mes logs que JCMS rentre 6 fois dans la méthode filterResultSet. Pouvez-vous m'expliquer pourquoi ? Voilà le peu d'informations que j'ai obtenu :

qh.getQueryString() : types=com.jalios.jcms.Content&sort=relevance
qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@176ed77
qh.getQueryString() : types=generated.SmallNews&pstatus=0
qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@600a08
qh.getQueryString() : types=generated.WebPage&pstatus=0
qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@35ee49
qh.getQueryString() : types=generated.Forum&pstatus=0
qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@ce8e44
qh.getQueryString() : types=generated.Faq&pstatus=0
qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@127ffd7
qh.getQueryString() : types=generated.Glossary&pstatus=0
qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@1202afe

Où dois-je spécifier que je veux uniquement rechercher dans cette DB et non pas une recherche standard sur Content et autres publications ? Sylvain

Olivier Jaquemet

Olivier Jaquemet

Post August 6, 2007 11:10 AM

Re: Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Bonjour,

Les QueryFilters sont branchés sur toutes les requetes (query) du site, ceci inclus notamment :

  • les requetes qui ont lieues pour des portlet Requete/Itération (portlet Query/Foreach), ce qui est votre cas dans les logs.
  • les requetes utilisées pour les notifications
  • les requetes du back office (pubBrowser par exemple)
  • les recherches (portlet search, recherche avancé, recherches back office, etc...)
  • etc

Vous devez donc ajouter une conditions avec votre QueryFilter pour n'executer votre code que lorsque vous êtes dans votre formulaire de recherche. Par exemple avec un champ caché.
Attention ! Les QueryFilters sont appelées aussi dans des circonstances ou aucune HttpServletRequest n'est défini (Les notifications par exemple), veillez à rendre votre code robuste à cela si vous devez lire des parametres dans la request.

Vous pouvez éditer le fichier log4j.xml et y activer les log de debug sur la classe com.jalios.jcms.QueryManager pour voir passer une trace à chaque appelle de la mécanique des Query internes de JCMS. Ceci vous évitera d'avoir à instrumenter votre code.

Sylvain DEVAUX

Sylvain DEVAUX

Post August 6, 2007 11:26 AM

Re: Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Je pensais que la recherche était effectuée 6 fois par mon formulaire de recherche. En fait, j'ai sur ma page les portlets standards d'un JCMS, a savoir des remontées de :

membre connecté, interviews, web page, forum, faq, glossaire.

Donc elle est juste effectuée une fois par portlet répondant à la condition.

J'avais bien mis un input caché dans mon formulaire (condition en question) pour rentrer ou pas dans ce filterResultSet spécifique (condition en amont comme pour la googleKey, avec test si l'objet request est non null, si ce dernier est null, je renvoie le set), mais ce champ étant posté, les autres portlets citées ci dessus étendent le périmètre de leur recherche à mon queryFilter.

public QueryResultSet filterResultSet(QueryHandler qh, QueryResultSet set, Map context) {

if (Util.isEmpty(qh.getRequest())) return set;
if (Util.isEmpty(qh.getRequest().getParameter(getSearchParam()))) return set;

// vide le set initial
set = new QueryResultSet();

Comment faire pour que si il y a d'autres portlets sur la page du formulaire de recherche, qu'elles n'étendent pas leur périmètre à cause du champ caché posté (posté globalement dans la requete). Donc comment en plus de poster le champ caché, le rattacher uniquement à ma portletSearch ?

Merci

Olivier Jaquemet

Olivier Jaquemet

Post August 6, 2007 12:00 PM

Re: Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Utilisez, si il en existe, les parametres du QueryHandler qui sont spécifiques aux recherches que vous devez traiter. En l'occurence, je pense que le parametre.=getTextSearch()= devrait suffir.

Autre solution, consultez les attributs de request pour y récupérer des informations contextuelles qui vont vous permettre de déterminer si vous devez ou non effectuer votre traitement.
Par exemple, si vous deviez faire un traitement uniquement pour certaines portlet, vous pourriez lire l'attribut de "PortalElement".
Dans le cas d'une recherche textuelle depuis une portlet recherche, il n'y a pas d'attribut de requete qui puisse vous aidez. Je note cette RFE pour que l'on puisse plus facilement faire le test. En attendant, vous pouvez faire une copie de query.jsp (utilisez pour afficher les résultat de rechercher), y ajouter un attribut au début et le supprimer à la fin, puis modifier la propriété jcms.resource.query: front/query.jsp pour utiliser votre nouveau JSP.

Sylvain DEVAUX

Sylvain DEVAUX

Post August 6, 2007 12:00 PM

Re: Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

En suivant mon raisonnement, je me suis dit que la portlet en question à l'origine de la recherche était une portletSearch, donc à chaque fois que j'arrive dans mon queryFilter, je sors si :

  • je n'ai pas mon champ caché
  • OU la portlet à l'origine n'est pas de type PortletSearch

Cependant, je suis étonné de ce que je trouve dans les logs. Aucune recherche sur les 12 fois où je rentre dans mon queryFilter n'est appelée par une portletSearch.

11:50:53,515 DEBUG [Mon site] [QueryManager] - adc446 loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.Interview] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:53,515 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:53,515 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.Interview&pstatus=0
11:50:53,515 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_173
11:50:53,515 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:53,530 DEBUG [Mon site] [QueryManager] - 30e173 loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.SmallNews] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:53,530 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:53,530 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.SmallNews&pstatus=0
11:50:53,530 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_180
11:50:53,530 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:53,546 DEBUG [Mon site] [QueryManager] - 12164ea loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.WebPage] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.WebPage&pstatus=0
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_183
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:53,546 DEBUG [Mon site] [QueryManager] - 1687dcd loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.Forum] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.Forum&pstatus=0
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_181
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:53,546 DEBUG [Mon site] [QueryManager] - 11b456f loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.Faq] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.Faq&pstatus=0
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_185
11:50:53,546 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:53,562 DEBUG [Mon site] [QueryManager] - 16b7e0e loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.Glossary] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:53,562 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:53,562 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.Glossary&pstatus=0
11:50:53,562 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_184
11:50:53,562 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:58,484 DEBUG [Mon site] [QueryManager] - c2ccac loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[com.jalios.jcms.Content] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[] langs=[] wrkspc=[] hist=[null] sort=[relevance]
11:50:58,484 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:58,484 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=com.jalios.jcms.Content&sort=relevance
11:50:58,484 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletSelection id=j_179
11:50:58,484 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:58,484 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@1cb0a16
11:50:58,562 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Objet query lucene : TYPES:mission VILLES:tous
11:50:58,593 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Nombre de hits : 0
11:50:58,624 DEBUG [Mon site] [QueryManager] - 103368e loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.SmallNews] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:58,624 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:58,624 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.SmallNews&pstatus=0
11:50:58,624 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_180
11:50:58,624 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:58,624 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@1f2ae62
11:50:58,624 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Objet query lucene : TYPES:mission VILLES:tous
11:50:58,624 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Nombre de hits : 0
11:50:58,640 DEBUG [Mon site] [QueryManager] - 196c0a0 loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.WebPage] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:58,640 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:58,640 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.WebPage&pstatus=0
11:50:58,640 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_183
11:50:58,640 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:58,640 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@40578d
11:50:58,640 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Objet query lucene : TYPES:mission VILLES:tous
11:50:58,640 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Nombre de hits : 0
11:50:58,640 DEBUG [Mon site] [QueryManager] - 33f45e loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.Forum] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:58,655 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:58,655 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.Forum&pstatus=0
11:50:58,655 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_181
11:50:58,655 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:58,655 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@f04d94
11:50:58,687 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Objet query lucene : TYPES:mission VILLES:tous
11:50:58,687 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Nombre de hits : 0
11:50:58,687 DEBUG [Mon site] [QueryManager] - 94cc7 loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.Faq] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:58,687 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:58,687 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.Faq&pstatus=0
11:50:58,687 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_185
11:50:58,687 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:58,702 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@8fa0f0
11:50:58,702 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Objet query lucene : TYPES:mission VILLES:tous
11:50:58,718 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Nombre de hits : 0
11:50:58,718 DEBUG [Mon site] [QueryManager] - 18efa2f loggedMember=[Admin] text=[null] cids=[] mids=[] gids=[] types=[generated.Glossary] dateType=[] beginDate=[null] endDate=[null] catName=[false] ratings=[] pstatus=[0] langs=[] wrkspc=[] hist=[null] sort=[null]
11:50:58,718 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - ---------------------------------------------------
11:50:58,718 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getQueryString() : types=generated.Glossary&pstatus=0
11:50:58,718 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Type de portlet à l'origine de la query : class generated.PortletQueryForeachDetail id=j_184
11:50:58,718 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - box.getQuery() : pas portlet search ! 
11:50:58,718 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - qh.getRequest() : org.apache.catalina.core.ApplicationHttpRequest@1cb4a6a
11:50:58,734 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Objet query lucene : TYPES:mission VILLES:tous
11:50:58,734 DEBUG [Mon site] [BapsiDbSearchQueryFilter] - Nombre de hits : 0

On voit ici que les 6 premières fois, la recherche n'est pas étendue à ma recherche spécifique, puis les 6 suivantes, la ligne "nombre de hits : 0" indique que la recherche a été effectuée. Dans tous les cas, le type de portlet à l'origine est soit :

  • PortletQueryForeachDetail (11 fois)
  • PortletSelection (1 fois)

Mes questions sont donc les suivantes :

  1. Est-ce qu'en plus de la condition sur le champ caché, je dois filtrer sur une portlet de type porletSelection ?
  2. Une recherche par une portletSearch est-elle déléguée à sa portletSelection ? (ce que j'en conclu par les logs)

D'avance merci, et désolé pour les logs quelques peu imposants, mais nécessaires à la compréhension de mes questions.

Sylvain DEVAUX

Sylvain DEVAUX

Post August 6, 2007 3:35 PM

Re: Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Je serais bien d'accord avec vous pour en plus filtrer pour les portlets dont je sais qu'elles doivent effectuer cette recherche, mais ce qui me dérange, c'est qu'apparemment c'est la portletSelection qui l'effectue et non pas la portletSearch comme je l'aurais pensé.

Quelle en est la raison ?

Etant donné que j'avais déjà dupliqué query.jsp en maRechercheQuery.jsp, j'ai inséré les deux lignes suivantes à l'endroit où est lancée la query :

  // do Query
  request.setAttribute("persoQuery", true);
  QueryResultSet queryResultSet = queryHandler.getResultSet();
  request.removeAttribute("persoQuery");

Le résultat est concluant, mais dans les deux solutions (la votre en modifiant la propriété front/query.jsp), où la mienne en dupliquant la jsp, et en la déclarant "en dur" dans l'attribut 'action' du formulaire, je risque d'éventuels problèmes lors de futures migrations si le fonctionnement de la recherche JCMS est modifié.

Olivier Jaquemet

Olivier Jaquemet

Post August 6, 2007 4:02 PM

Re: Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Nous sommes d'accors, mais l'attribut en question n'existant pas à l'heure actuelle, je n'ai pas d'autre solution à vous proposez.

Olivier Jaquemet

Olivier Jaquemet

Post August 6, 2007 4:51 PM

Re: Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Et pour répondre à votre question sur la portlet selection et la portlet recherche :
Le role de la portlet rechercher est d'afficher un formulaire de recherche, qui comme l'avez dit soummait une action vers le jsp query.jsp. C'est donc ce jsp qui traite effectue la recherche, et pour cela, la mécanique des portails execute ce jsp en portlet selection (parametre jsp=).

Olivier Jaquemet

Olivier Jaquemet

Post August 27, 2007 3:10 PM

Re: Annuler la recherche sur les types de contenus JCMS au profil de la recherche sur une DB externe uniquement

Pour répondre à ce besoin, les méthodes suivantes seront disponible dans QueryFilter à partir de JCMS 5.7.2 :

  • boolean isFrontOfficeSearch() -> query effectuée depuis front/query.jsp
  • boolean isBackOfficeSearch() -> query effectuée depuis work/queryWork.jsp
  • boolean isPortletQuery(); -> query effectuée depuis types/PortletQueryForeach/doQuery.jsp
Login   Home   fr en
JALIOS SA - SIREN 440 126 035