From ff4e2c66e09beb84120e12fdace2e2eaf08a2359 Mon Sep 17 00:00:00 2001 From: Shalin Shekhar Mangar Date: Fri, 23 Jan 2015 22:25:34 +0000 Subject: [PATCH] SOLR-6449: Add first class support for Real Time Get in Solrj git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1654420 13f79535-47bb-0310-9956-ffa450edef68 --- solr/CHANGES.txt | 3 + .../apache/solr/client/solrj/SolrClient.java | 56 +++++++++ .../apache/solr/client/solrj/GetByIdTest.java | 117 ++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 solr/solrj/src/test/org/apache/solr/client/solrj/GetByIdTest.java diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 48e97489bbc..f1e8c99cd49 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -82,6 +82,9 @@ New Features * SOLR-6845: Add a “buildOnStartup” option for suggesters. (Tomás Fernández Löbbe) +* SOLR-6449: Add first class support for Real Time Get in Solrj. + (Anurag Sharma, Steve Davids via shalin) + Other Changes ---------------------- * SOLR-7014: Collapse identical catch branches in try-catch statements. (shalin) diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java index 0dd035bd6e5..2ec00cd5019 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java @@ -26,13 +26,19 @@ import org.apache.solr.client.solrj.request.UpdateRequest; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.response.SolrPingResponse; import org.apache.solr.client.solrj.response.UpdateResponse; +import org.apache.solr.common.SolrDocument; +import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; +import org.apache.solr.common.StringUtils; +import org.apache.solr.common.params.CommonParams; +import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.NamedList; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -331,6 +337,56 @@ public abstract class SolrClient implements Serializable { return req.process(this); } + /** + * Retrieves the SolrDocument associated with the given identifier. + * + * @return retrieved SolrDocument, null if no document is found. + */ + public SolrDocument getById(String id) throws SolrServerException { + return getById(id, null); + } + + /** + * Retrieves the SolrDocument associated with the given identifier and uses + * the SolrParams to execute the request. + * + * @return retrieved SolrDocument, null if no document is found. + */ + public SolrDocument getById(String id, SolrParams params) throws SolrServerException { + SolrDocumentList docs = getById(Arrays.asList(id), params); + if (!docs.isEmpty()) { + return docs.get(0); + } + return null; + } + + /** + * Retrieves the SolrDocuments associated with the given identifiers. + * If a document was not found, it will not be added to the SolrDocumentList. + */ + public SolrDocumentList getById(Collection ids) throws SolrServerException { + return getById(ids, null); + } + + /** + * Retrieves the SolrDocuments associated with the given identifiers and uses + * the SolrParams to execute the request. + * If a document was not found, it will not be added to the SolrDocumentList. + */ + public SolrDocumentList getById(Collection ids, SolrParams params) throws SolrServerException { + if (ids == null || ids.isEmpty()) { + throw new IllegalArgumentException("Must provide an identifier of a document to retrieve."); + } + + ModifiableSolrParams reqParams = new ModifiableSolrParams(params); + if (StringUtils.isEmpty(reqParams.get(CommonParams.QT))) { + reqParams.set(CommonParams.QT, "/get"); + } + reqParams.set("ids", (String[]) ids.toArray()); + + return query(reqParams).getResults(); + } + /** * SolrServer implementations need to implement how a request is actually processed */ diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/GetByIdTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/GetByIdTest.java new file mode 100644 index 00000000000..f32e7ff33ad --- /dev/null +++ b/solr/solrj/src/test/org/apache/solr/client/solrj/GetByIdTest.java @@ -0,0 +1,117 @@ +package org.apache.solr.client.solrj; + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.File; +import java.util.Arrays; + +import org.apache.commons.io.FileUtils; +import org.apache.solr.SolrJettyTestBase; +import org.apache.solr.common.SolrDocument; +import org.apache.solr.common.SolrDocumentList; +import org.apache.solr.common.params.CommonParams; +import org.apache.solr.common.params.SolrParams; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class GetByIdTest extends SolrJettyTestBase { + + @BeforeClass + public static void beforeClass() throws Exception { + initCore(); + } + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + getSolrClient().deleteByQuery("*:*"); + getSolrClient().add(Arrays.asList( + sdoc("id", "1", "term_s", "Microsoft", "term2_s", "MSFT"), + sdoc("id", "2", "term_s", "Apple", "term2_s", "AAPL"), + sdoc("id", "3", "term_s", "Yahoo", "term2_s", "YHOO"))); + + getSolrClient().commit(true, true); + } + + @Test + public void testGetId() throws Exception { + SolrDocument rsp = getSolrClient().getById("0"); + assertNull(rsp); + + rsp = getSolrClient().getById("1"); + assertEquals("1", rsp.get("id")); + assertEquals("Microsoft", rsp.get("term_s")); + assertEquals("MSFT", rsp.get("term2_s")); + + rsp = getSolrClient().getById("2"); + assertEquals("2", rsp.get("id")); + assertEquals("Apple", rsp.get("term_s")); + assertEquals("AAPL", rsp.get("term2_s")); + } + + @Test + public void testGetIdWithParams() throws Exception { + final SolrParams ID_FL_ONLY = params(CommonParams.FL, "id"); + + SolrDocument rsp = getSolrClient().getById("0", ID_FL_ONLY); + assertNull(rsp); + + rsp = getSolrClient().getById("1", ID_FL_ONLY); + assertEquals("1", rsp.get("id")); + assertNull("This field should have been removed from the response.", rsp.get("term_s")); + assertNull("This field should have been removed from the response.", rsp.get("term2_s")); + + rsp = getSolrClient().getById("2", ID_FL_ONLY); + assertEquals("2", rsp.get("id")); + assertNull("This field should have been removed from the response.", rsp.get("term_s")); + assertNull("This field should have been removed from the response.", rsp.get("term2_s")); + } + + @Test + public void testGetIds() throws Exception { + SolrDocumentList rsp = getSolrClient().getById(Arrays.asList("0", "1", "2", "3", "4")); + assertEquals(3, rsp.getNumFound()); + assertEquals("1", rsp.get(0).get("id")); + assertEquals("Microsoft", rsp.get(0).get("term_s")); + assertEquals("MSFT", rsp.get(0).get("term2_s")); + + assertEquals("2", rsp.get(1).get("id")); + assertEquals("Apple", rsp.get(1).get("term_s")); + assertEquals("AAPL", rsp.get(1).get("term2_s")); + + assertEquals("3", rsp.get(2).get("id")); + assertEquals("Yahoo", rsp.get(2).get("term_s")); + assertEquals("YHOO", rsp.get(2).get("term2_s")); + } + + @Test + public void testGetIdsWithParams() throws Exception { + SolrDocumentList rsp = getSolrClient().getById(Arrays.asList("0", "1", "2"), params(CommonParams.FL, "id")); + assertEquals(2, rsp.getNumFound()); + + assertEquals("1", rsp.get(0).get("id")); + assertNull("This field should have been removed from the response.", rsp.get(0).get("term_s")); + assertNull("This field should have been removed from the response.", rsp.get(0).get("term2_s")); + + assertEquals("2", rsp.get(1).get("id")); + assertNull("This field should have been removed from the response.", rsp.get(1).get("term_s")); + assertNull("This field should have been removed from the response.", rsp.get(1).get("term2_s")); + } +}