SOLR-7201: HttpSolrClient can handle collection parameters

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1665199 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Alan Woodward 2015-03-09 11:54:45 +00:00
parent a8fd826f4a
commit 68d180346a
3 changed files with 56 additions and 9 deletions

View File

@ -136,8 +136,8 @@ New Features
* SOLR-7164: BBoxField defaults sub fields to not-stored (ryan) * SOLR-7164: BBoxField defaults sub fields to not-stored (ryan)
* SOLR-7155: All SolrClient methods now take an optional 'collection' argument * SOLR-7155,SOLR-7201: All SolrClient methods now take an optional 'collection' argument
(Alan Woodward) (Alan Woodward, Shawn Heisey)
* SOLR-7073: Support adding a jar to a collections classpath (Noble Paul) * SOLR-7073: Support adding a jar to a collections classpath (Noble Paul)

View File

@ -75,6 +75,27 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
/**
* A SolrClient implementation that talks directly to a Solr server via HTTP
*
* There are two ways to use an HttpSolrClient:
*
* 1) Pass a URL to the constructor that points directly at a particular core
* <pre>
* SolrClient client = new HttpSolrClient("http://my-solr-server:8983/solr/core1");
* QueryResponse resp = client.query(new SolrQuery("*:*"));
* </pre>
* In this case, you can query the given core directly, but you cannot query any other
* cores or issue CoreAdmin requests with this client.
*
* 2) Pass the base URL of the node to the constructor
* <pre>
* SolrClient client = new HttpSolrClient("http://my-solr-server:8983/solr");
* QueryResponse resp = client.query("core1", new SolrQuery("*:*"));
* </pre>
* In this case, you must pass the name of the required core for all queries and updates,
* but you may use the same client for all cores, and for CoreAdmin requests.
*/
public class HttpSolrClient extends SolrClient { public class HttpSolrClient extends SolrClient {
private static final String UTF_8 = StandardCharsets.UTF_8.name(); private static final String UTF_8 = StandardCharsets.UTF_8.name();
@ -204,11 +225,15 @@ public class HttpSolrClient extends SolrClient {
if (responseParser == null) { if (responseParser == null) {
responseParser = parser; responseParser = parser;
} }
return request(request, responseParser); return request(request, responseParser, collection);
}
public NamedList<Object> request(final SolrRequest request, final ResponseParser processor) throws SolrServerException, IOException {
return request(request, processor, null);
} }
public NamedList<Object> request(final SolrRequest request, final ResponseParser processor) throws SolrServerException, IOException { public NamedList<Object> request(final SolrRequest request, final ResponseParser processor, String collection) throws SolrServerException, IOException {
return executeMethod(createMethod(request),processor); return executeMethod(createMethod(request, collection),processor);
} }
/** /**
@ -236,7 +261,7 @@ public class HttpSolrClient extends SolrClient {
*/ */
public HttpUriRequestResponse httpUriRequest(final SolrRequest request, final ResponseParser processor) throws SolrServerException, IOException { public HttpUriRequestResponse httpUriRequest(final SolrRequest request, final ResponseParser processor) throws SolrServerException, IOException {
HttpUriRequestResponse mrr = new HttpUriRequestResponse(); HttpUriRequestResponse mrr = new HttpUriRequestResponse();
final HttpRequestBase method = createMethod(request); final HttpRequestBase method = createMethod(request, null);
ExecutorService pool = Executors.newFixedThreadPool(1, new SolrjNamedThreadFactory("httpUriRequest")); ExecutorService pool = Executors.newFixedThreadPool(1, new SolrjNamedThreadFactory("httpUriRequest"));
try { try {
mrr.future = pool.submit(new Callable<NamedList<Object>>(){ mrr.future = pool.submit(new Callable<NamedList<Object>>(){
@ -271,7 +296,7 @@ public class HttpSolrClient extends SolrClient {
return queryModParams; return queryModParams;
} }
protected HttpRequestBase createMethod(final SolrRequest request) throws IOException, SolrServerException { protected HttpRequestBase createMethod(final SolrRequest request, String collection) throws IOException, SolrServerException {
HttpRequestBase method = null; HttpRequestBase method = null;
InputStream is = null; InputStream is = null;
SolrParams params = request.getParams(); SolrParams params = request.getParams();
@ -296,6 +321,10 @@ public class HttpSolrClient extends SolrClient {
if (invariantParams != null) { if (invariantParams != null) {
wparams.add(invariantParams); wparams.add(invariantParams);
} }
String basePath = baseUrl;
if (collection != null)
basePath += "/" + collection;
int tries = maxRetries + 1; int tries = maxRetries + 1;
try { try {
@ -309,11 +338,11 @@ public class HttpSolrClient extends SolrClient {
if( streams != null ) { if( streams != null ) {
throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "GET can't send streams!" ); throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "GET can't send streams!" );
} }
method = new HttpGet( baseUrl + path + ClientUtils.toQueryString( wparams, false ) ); method = new HttpGet(basePath + path + ClientUtils.toQueryString(wparams, false));
} }
else if( SolrRequest.METHOD.POST == request.getMethod() || SolrRequest.METHOD.PUT == request.getMethod() ) { else if( SolrRequest.METHOD.POST == request.getMethod() || SolrRequest.METHOD.PUT == request.getMethod() ) {
String url = baseUrl + path; String url = basePath + path;
boolean hasNullStreamName = false; boolean hasNullStreamName = false;
if (streams != null) { if (streams != null) {
for (ContentStream cs : streams) { for (ContentStream cs : streams) {

View File

@ -509,6 +509,24 @@ public class BasicHttpSolrClientTest extends SolrJettyTestBase {
assertEquals(0, response.getStatus()); assertEquals(0, response.getStatus());
} }
} }
@Test
public void testCollectionParameters() throws IOException, SolrServerException {
try (HttpSolrClient client = new HttpSolrClient(jetty.getBaseUrl().toString())) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "collection");
client.add("collection1", doc);
client.commit("collection1");
assertEquals(1, client.query("collection1", new SolrQuery("id:collection")).getResults().getNumFound());
}
try (HttpSolrClient client = new HttpSolrClient(jetty.getBaseUrl().toString() + "/collection1")) {
assertEquals(1, client.query(new SolrQuery("id:collection")).getResults().getNumFound());
}
}
@Test @Test
public void testSetParametersExternalClient() throws IOException{ public void testSetParametersExternalClient() throws IOException{