On Fri, 2006-12-22 at 13:29 +0100, Thorsten Scherler wrote: > Hi all, > > I am looking for some information about which is the best way to write a > MultipleFieldRequestHandler.java.
I did a small hack and it works like a charm without the above mentioned handler. I only activated variable substitution for the FQ for testing if you think that is a nice feature I can activate it for the rest. Index: src/java/org/apache/solr/util/SolrPluginUtils.java =================================================================== --- src/java/org/apache/solr/util/SolrPluginUtils.java (revision 489649) +++ src/java/org/apache/solr/util/SolrPluginUtils.java (working copy) @@ -59,7 +59,10 @@ */ public class SolrPluginUtils { - /** + private static final String VARIABLE_DETERMINATOR_CLOSE = "}"; + private static final String VARIABLE_DETERMINATOR_OPEN = "${"; + +/** * Set defaults on a SolrQueryRequest. * * RequestHandlers can use this method to ensure their defaults are @@ -819,13 +822,24 @@ SolrQueryParser qp = new SolrQueryParser(s.getSchema(), null); for (String q : in) { if (null != q && 0 != q.trim().length()) { - out.add(qp.parse(q)); + out.add(qp.parse(substitute(q, req))); } } return out; } - /** + private static String substitute(String q, SolrQueryRequest req) { + if (q.contains(VARIABLE_DETERMINATOR_OPEN)){ + String beforeVariable =q.substring(0,q.indexOf(VARIABLE_DETERMINATOR_OPEN)) ; + String variable = q.substring(q.indexOf(VARIABLE_DETERMINATOR_OPEN)+VARIABLE_DETERMINATOR_OPEN.length(),q.indexOf(VARIABLE_DETERMINATOR_CLOSE)) ; + String afterVariable =q.substring(q.indexOf(VARIABLE_DETERMINATOR_CLOSE)+VARIABLE_DETERMINATOR_CLOSE.length()) ; + String variableValue= req.getParams().get(variable); + q = substitute(beforeVariable+variableValue+afterVariable, req); + } + return q; +} + +/** salu2 > > My use case is that I have a form (the next version of > http://andaluciajunta.es/portal/aj-bojaBuscador/0,22815,,00.html) where > you limit the query via a couple of different fields. > > Imaging I have a form like > <form action="select/" method="get"> > <input name="start" value="0" type="hidden"/> > <input name="rows" value="10" type="hidden"/> term: > <input type="text" name="q"/> > <br/> > <table> > <tr> > <td colspan="3">between dates:</td> > </tr> > <tr> > <td> > <input type="text" name="startDate"/> > </td> > <td>y</td> > <td> > <input type="text" name="endDate"/> > </td> > </tr> > </table> > <input type="submit" value="buscar"></input> </form> > > Using the StandardRequestHandler without prior processing would result > that "startDate" and "endDate" would be ignored since they are not > within the query string and are not solr standard param that got > processed. > > Meaning I can either construct the query string (including this filter) > on the client side or with a request Handler, right? > > JavaScript on the client side is not a possibility for my client so here > I am to write my first RequestHandler. > > I could write a request handler special for my client, but I think a > more generic solution is more beneficial for all of us. > > So my idea is to define: > <requestHandler name="dateRange" > class="solr.MultipleFieldRequestHandler"> > <lst name="defaults"> > <str name="echoParams">explicit</str> > <str name="filterFields">startDate endDate</str> > <str name="startDate">*</str> > <str name="endDate">*</str> > <str name="fq">date:[${startDate} TO ${endDate}]</str> > </lst> > </requestHandler> > > Where filterFields defines the array of fields that can be used to limit > the super set of docs. If this fields are null for the given request > then we use they defined standard e.g. <str name="startDate">*</str> in > the fq. Within the fq ${...} has to be parsed with the actual value of > the variable. Since we defined default values that should work fine, > right? > > The only thing that a simpler more basic solution could be to just tweak > the standard handler to > a) get all params and store them in a hashmap (already done) > b) change SolrPluginUtils.parseFilterQueries to parse the fq string and > replace ${startDate} with the corresponding key="startDate" > req.getParam(key). General speaking implement a variable substitution > parser (which I would have to do as well for the MFRH). > > What do you think is the better approach write a RequestHandler or > extend the standard one or there even an easier way? > > TIA for any infos. > > salu2 >