SOLR-1237: firstSearcher and newSearcher now identify themselves as such when querying

git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@801417 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Grant Ingersoll 2009-08-05 21:25:06 +00:00
parent 167a03b576
commit ece497f832
8 changed files with 138 additions and 10 deletions

View File

@ -254,6 +254,10 @@ New Features
that allows disabling of english possessive stemming (removal of trailing 's from tokens) that allows disabling of english possessive stemming (removal of trailing 's from tokens)
(Robert Muir via yonik) (Robert Muir via yonik)
66. SOLR-1237: firstSearcher and newSearcher can now be identified via the CommonParams.EVENT (evt) parameter in a request. This allows a
RequestHandler or SearchComponent to know when a newSearcher or firstSearcher event happened. QuerySenderListender is the only implementation
in Solr that implements this, but outside implementations may wish to. See the AbstractSolrEventListener for a helper method. (gsingers)
Optimizations Optimizations
---------------------- ----------------------

View File

@ -0,0 +1,13 @@
package org.apache.solr.common.params;
/**
*
*
**/
public interface EventParams {
/** Event param for things like newSearcher, firstSearcher**/
public static final String EVENT = "event";
public static final String NEW_SEARCHER = "newSearcher";
public static final String FIRST_SEARCHER = "firstSearcher";
}

View File

@ -18,6 +18,7 @@
package org.apache.solr.core; package org.apache.solr.core;
import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.params.EventParams;
import org.apache.solr.search.SolrIndexSearcher; import org.apache.solr.search.SolrIndexSearcher;
/** /**
@ -44,4 +45,25 @@ class AbstractSolrEventListener implements SolrEventListener {
public String toString() { public String toString() {
return getClass().getName() + args; return getClass().getName() + args;
} }
/**
* Add the {@link org.apache.solr.common.params.EventParams#EVENT} with either the {@link org.apache.solr.common.params.EventParams#NEW_SEARCHER}
* or {@link org.apache.solr.common.params.EventParams#FIRST_SEARCHER} values depending on the value of currentSearcher.
* <p/>
* Makes a copy of NamedList and then adds the parameters.
*
*
* @param currentSearcher If null, add FIRST_SEARCHER, otherwise NEW_SEARCHER
* @param nlst The named list to add the EVENT value to
*/
protected NamedList addEventParms(SolrIndexSearcher currentSearcher, NamedList nlst) {
NamedList result = new NamedList();
result.addAll(nlst);
if (currentSearcher != null) {
result.add(EventParams.EVENT, EventParams.NEW_SEARCHER);
} else {
result.add(EventParams.EVENT, EventParams.FIRST_SEARCHER);
}
return result;
}
} }

View File

@ -42,7 +42,8 @@ class QuerySenderListener extends AbstractSolrEventListener {
for (NamedList nlst : (List<NamedList>)args.get("queries")) { for (NamedList nlst : (List<NamedList>)args.get("queries")) {
try { try {
// bind the request to a particular searcher (the newSearcher) // bind the request to a particular searcher (the newSearcher)
LocalSolrQueryRequest req = new LocalSolrQueryRequest(core,nlst) { NamedList params = addEventParms(currentSearcher, nlst);
LocalSolrQueryRequest req = new LocalSolrQueryRequest(core,params) {
@Override public SolrIndexSearcher getSearcher() { return searcher; } @Override public SolrIndexSearcher getSearcher() { return searcher; }
@Override public void close() { } @Override public void close() { }
}; };
@ -75,5 +76,4 @@ class QuerySenderListener extends AbstractSolrEventListener {
} }
} }

View File

@ -36,6 +36,28 @@ public interface SolrEventListener {
/** The searchers passed here are only guaranteed to be valid for the duration /** The searchers passed here are only guaranteed to be valid for the duration
* of this method call, so care should be taken not to spawn threads or asynchronous * of this method call, so care should be taken not to spawn threads or asynchronous
* tasks with references to these searchers. * tasks with references to these searchers.
* <p/>
* Implementations should add the {@link org.apache.solr.common.params.EventParams#EVENT} parameter and set it to a value of either:
* <ul>
* <li>{@link org.apache.solr.common.params.EventParams#FIRST_SEARCHER} - First Searcher event</li>
* <li>{@link org.apache.solr.common.params.EventParams#NEW_SEARCHER} - New Searcher event</li>
* </ul>
*
* Sample:
* <pre>
if (currentSearcher != null) {
nlst.add(CommonParams.EVENT, CommonParams.NEW_SEARCHER);
} else {
nlst.add(CommonParams.EVENT, CommonParams.FIRST_SEARCHER);
}
*
* </pre>
*
* @see org.apache.solr.core.AbstractSolrEventListener#addEventParms(org.apache.solr.search.SolrIndexSearcher, org.apache.solr.common.util.NamedList)
*
* @param newSearcher The new {@link org.apache.solr.search.SolrIndexSearcher} to use
* @param currentSearcher The existing {@link org.apache.solr.search.SolrIndexSearcher}. null if this is a firstSearcher event.
*
*/ */
public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher); public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher);

View File

@ -0,0 +1,40 @@
package org.apache.solr.core;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrQueryResponse;
/**
*
*
**/
public class MockQuerySenderListenerReqHandler extends RequestHandlerBase {
public SolrQueryRequest req;
public SolrQueryResponse rsp;
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
this.req = req;
this.rsp = rsp;
}
public String getDescription() {
String result = null;
return result;
}
public String getSourceId() {
String result = null;
return result;
}
public String getSource() {
String result = null;
return result;
}
public String getVersion() {
String result = null;
return result;
}
}

View File

@ -17,11 +17,10 @@
package org.apache.solr.core; package org.apache.solr.core;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrQueryResponse;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.util.AbstractSolrTestCase; import org.apache.solr.util.AbstractSolrTestCase;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.common.params.EventParams;
import org.apache.lucene.store.Directory;
public class TestQuerySenderListener extends AbstractSolrTestCase { public class TestQuerySenderListener extends AbstractSolrTestCase {
@ -35,5 +34,28 @@ public class TestQuerySenderListener extends AbstractSolrTestCase {
assertEquals( 1, core.firstSearcherListeners.size() ); assertEquals( 1, core.firstSearcherListeners.size() );
assertEquals( 1, core.newSearcherListeners.size() ); assertEquals( 1, core.newSearcherListeners.size() );
} }
public void testSearcherEvents() throws Exception {
SolrCore core = h.getCore();
SolrEventListener newSearcherListener = core.newSearcherListeners.get(0);
assertTrue("Not an instance of QuerySenderListener", newSearcherListener instanceof QuerySenderListener);
QuerySenderListener qsl = (QuerySenderListener) newSearcherListener;
SolrIndexSearcher currentSearcher = core.getSearcher().get();
qsl.newSearcher(currentSearcher, null);//test new Searcher
MockQuerySenderListenerReqHandler mock = (MockQuerySenderListenerReqHandler) core.getRequestHandler("mock");
assertNotNull("Mock is null", mock);
String evt = mock.req.getParams().get(EventParams.EVENT);
assertNotNull("Event is null", evt);
assertTrue(evt + " is not equal to " + EventParams.FIRST_SEARCHER, evt.equals(EventParams.FIRST_SEARCHER) == true);
Directory dir = currentSearcher.getReader().directory();
SolrIndexSearcher newSearcher = new SolrIndexSearcher(core, core.getSchema(), "testQuerySenderListener", dir, true, false);
qsl.newSearcher(newSearcher, currentSearcher);
evt = mock.req.getParams().get(EventParams.EVENT);
assertNotNull("Event is null", evt);
assertTrue(evt + " is not equal to " + EventParams.NEW_SEARCHER, evt.equals(EventParams.NEW_SEARCHER) == true);
}
} }

View File

@ -34,8 +34,8 @@
local query request for each NamedList in sequence. --> local query request for each NamedList in sequence. -->
<listener event="newSearcher" class="solr.QuerySenderListener"> <listener event="newSearcher" class="solr.QuerySenderListener">
<arr name="queries"> <arr name="queries">
<lst> <str name="q">solr</str> <str name="start">0</str> <str name="rows">10</str> </lst> <lst> <str name="q">solr</str> <str name="start">0</str> <str name="rows">10</str> <str name="qt">mock</str></lst>
<lst> <str name="q">rocks</str> <str name="start">0</str> <str name="rows">10</str> </lst> <lst> <str name="q">rocks</str> <str name="start">0</str> <str name="rows">10</str> <str name="qt">mock</str></lst>
</arr> </arr>
</listener> </listener>
@ -44,10 +44,15 @@
requests or to gain prewarming data from. --> requests or to gain prewarming data from. -->
<listener event="firstSearcher" class="solr.QuerySenderListener"> <listener event="firstSearcher" class="solr.QuerySenderListener">
<arr name="queries"> <arr name="queries">
<lst> <str name="q">fast_warm</str> <str name="start">0</str> <str name="rows">10</str> </lst> <lst> <str name="q">fast_warm</str> <str name="start">0</str> <str name="rows">10</str>
<str name="qt">mock</str>
</lst>
</arr> </arr>
</listener> </listener>
</query> </query>
<requestHandler name="mock" class="org.apache.solr.core.MockQuerySenderListenerReqHandler" default="true">
<!-- default values for query parameters -->
</requestHandler>
</config> </config>