You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2015/03/05 12:29:25 UTC

svn commit: r1664310 - in /lucene/dev/trunk/solr: ./ core/src/java/org/apache/solr/client/solrj/embedded/ core/src/test/org/apache/solr/update/ solrj/src/java/org/apache/solr/client/solrj/ solrj/src/java/org/apache/solr/client/solrj/impl/ solrj/src/tes...

Author: romseygeek
Date: Thu Mar  5 11:29:24 2015
New Revision: 1664310

URL: http://svn.apache.org/r1664310
Log:
SOLR-7155: Add optional collection parameter to all SolrClient methods

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/MockStreamingSolrClients.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
    lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Thu Mar  5 11:29:24 2015
@@ -133,6 +133,9 @@ New Features
   
 * SOLR-7164: BBoxField defaults sub fields to not-stored (ryan)
 
+* SOLR-7155: All SolrClient methods now take an optional 'collection' argument
+  (Alan Woodward)
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java Thu Mar  5 11:29:24 2015
@@ -86,13 +86,16 @@ public class EmbeddedSolrServer extends
   }
   
   @Override
-  public NamedList<Object> request(SolrRequest request) throws SolrServerException, IOException 
+  public NamedList<Object> request(SolrRequest request, String coreName) throws SolrServerException, IOException
   {
     String path = request.getPath();
     if( path == null || !path.startsWith( "/" ) ) {
       path = "/select";
     }
 
+    if (coreName == null)
+      coreName = this.coreName;
+
     // Check for cores action
     SolrCore core =  coreContainer.getCore( coreName );
     if( core == null ) {

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/MockStreamingSolrClients.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/MockStreamingSolrClients.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/MockStreamingSolrClients.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/MockStreamingSolrClients.java Thu Mar  5 11:29:24 2015
@@ -72,7 +72,7 @@ public class MockStreamingSolrClients ex
     }
     
     @Override
-    public NamedList<Object> request(SolrRequest request)
+    public NamedList<Object> request(SolrRequest request, String collection)
         throws SolrServerException, IOException {
       if (exp != null) {
         if (LuceneTestCase.random().nextBoolean()) {

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java Thu Mar  5 11:29:24 2015
@@ -41,6 +41,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -51,271 +52,943 @@ import java.util.List;
 public abstract class SolrClient implements Serializable, Closeable {
 
   private static final long serialVersionUID = 1L;
+
   private DocumentObjectBinder binder;
 
   /**
    * Adds a collection of documents
+   *
+   * @param collection the Solr collection to add documents to
    * @param docs  the collection of documents
-   * @throws IOException If there is a low-level I/O error.
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since Solr 5.1
+   */
+  public UpdateResponse add(String collection, Collection<SolrInputDocument> docs) throws SolrServerException, IOException {
+    return add(collection, docs, -1);
+  }
+
+  /**
+   * Adds a collection of documents
+   *
+   * @param docs  the collection of documents
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse add(Collection<SolrInputDocument> docs) throws SolrServerException, IOException {
-    return add(docs, -1);
+    return add(null, docs);
   }
 
   /**
    * Adds a collection of documents, specifying max time before they become committed
+   *
+   * @param collection the Solr collection to add documents to
    * @param docs  the collection of documents
-   * @param commitWithinMs  max time (in ms) before a commit will happen 
-   * @throws IOException If there is a low-level I/O error.
-   * @since solr 3.5
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since Solr 5.1
    */
-  public UpdateResponse add(Collection<SolrInputDocument> docs, int commitWithinMs) throws SolrServerException, IOException {
+  public UpdateResponse add(String collection, Collection<SolrInputDocument> docs, int commitWithinMs) throws SolrServerException, IOException {
     UpdateRequest req = new UpdateRequest();
     req.add(docs);
     req.setCommitWithin(commitWithinMs);
-    return req.process(this);
+    return req.process(this, collection);
   }
 
   /**
-   * Adds a collection of beans
-   * @param beans  the collection of beans
-   * @throws IOException If there is a low-level I/O error.
+   * Adds a collection of documents, specifying max time before they become committed
+   *
+   * @param docs  the collection of documents
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since Solr 3.5
    */
-  public UpdateResponse addBeans(Collection<?> beans) throws SolrServerException, IOException {
-    return addBeans(beans, -1);
+  public UpdateResponse add(Collection<SolrInputDocument> docs, int commitWithinMs) throws SolrServerException, IOException {
+    return add(null, docs, commitWithinMs);
   }
 
   /**
-   * Adds a collection of beans specifying max time before they become committed
-   * @param beans  the collection of beans
-   * @param commitWithinMs  max time (in ms) before a commit will happen 
-   * @throws IOException If there is a low-level I/O error.
-   * @since solr 3.5
+   * Adds a single document
+   *
+   * @param collection the Solr collection to add the document to
+   * @param doc  the input document
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
    */
-  public UpdateResponse addBeans(Collection<?> beans, int commitWithinMs) throws SolrServerException, IOException {
-    DocumentObjectBinder binder = this.getBinder();
-    ArrayList<SolrInputDocument> docs =  new ArrayList<>(beans.size());
-    for (Object bean : beans) {
-      docs.add(binder.toSolrInputDocument(bean));
-    }
-    return add(docs, commitWithinMs);
+  public UpdateResponse add(String collection, SolrInputDocument doc) throws SolrServerException, IOException {
+    return add(collection, doc, -1);
   }
 
   /**
    * Adds a single document
+   *
    * @param doc  the input document
-   * @throws IOException If there is a low-level I/O error.
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse add(SolrInputDocument doc) throws SolrServerException, IOException {
-    return add(doc, -1);
+    return add(null, doc);
   }
 
   /**
    * Adds a single document specifying max time before it becomes committed
+   *
+   * @param collection the Solr collection to add the document to
    * @param doc  the input document
-   * @param commitWithinMs  max time (in ms) before a commit will happen 
-   * @throws IOException If there is a low-level I/O error.
-   * @since solr 3.5
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since solr 5.1
    */
-  public UpdateResponse add(SolrInputDocument doc, int commitWithinMs) throws SolrServerException, IOException {
+  public UpdateResponse add(String collection, SolrInputDocument doc, int commitWithinMs) throws SolrServerException, IOException {
     UpdateRequest req = new UpdateRequest();
     req.add(doc);
     req.setCommitWithin(commitWithinMs);
-    return req.process(this);
+    return req.process(this, collection);
+  }
+
+  /**
+   * Adds a single document specifying max time before it becomes committed
+   *
+   * @param doc  the input document
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since solr 3.5
+   */
+  public UpdateResponse add(SolrInputDocument doc, int commitWithinMs) throws SolrServerException, IOException {
+    return add(null, doc, commitWithinMs);
+  }
+
+  /**
+   * Adds the documents supplied by the given iterator.
+   *
+   * @param collection the Solr collection to add the documents to
+   * @param docIterator
+   *          the iterator which returns SolrInputDocument instances
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse add(String collection, Iterator<SolrInputDocument> docIterator)
+      throws SolrServerException, IOException {
+    UpdateRequest req = new UpdateRequest();
+    req.setDocIterator(docIterator);
+    return req.process(this, collection);
+  }
+
+  /**
+   * Adds the documents supplied by the given iterator.
+   *
+   * @param docIterator
+   *          the iterator which returns SolrInputDocument instances
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse add(Iterator<SolrInputDocument> docIterator) throws SolrServerException, IOException {
+    return add(null, docIterator);
   }
 
   /**
    * Adds a single bean
+   *
+   * The bean is converted to a {@link SolrInputDocument} by the client's
+   * {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder}
+   *
+   * @param collection to Solr collection to add documents to
    * @param obj  the input bean
-   * @throws IOException If there is a low-level I/O error.
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse addBean(String collection, Object obj) throws IOException, SolrServerException {
+    return addBean(collection, obj, -1);
+  }
+
+  /**
+   * Adds a single bean
+   *
+   * The bean is converted to a {@link SolrInputDocument} by the client's
+   * {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder}
+   *
+   * @param obj  the input bean
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse addBean(Object obj) throws IOException, SolrServerException {
-    return addBean(obj, -1);
+    return addBean(null, obj, -1);
+  }
+
+  /**
+   * Adds a single bean specifying max time before it becomes committed
+   *
+   * The bean is converted to a {@link SolrInputDocument} by the client's
+   * {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder}
+   *
+   * @param collection to Solr collection to add documents to
+   * @param obj  the input bean
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse addBean(String collection, Object obj, int commitWithinMs) throws IOException, SolrServerException {
+    return add(collection, getBinder().toSolrInputDocument(obj), commitWithinMs);
   }
 
   /**
    * Adds a single bean specifying max time before it becomes committed
+   *
+   * The bean is converted to a {@link SolrInputDocument} by the client's
+   * {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder}
+   *
    * @param obj  the input bean
-   * @param commitWithinMs  max time (in ms) before a commit will happen 
-   * @throws IOException If there is a low-level I/O error.
-   * @since solr 3.5
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse addBean(Object obj, int commitWithinMs) throws IOException, SolrServerException {
-    return add(getBinder().toSolrInputDocument(obj),commitWithinMs);
+    return add(null, getBinder().toSolrInputDocument(obj), commitWithinMs);
+  }
+
+  /**
+   * Adds a collection of beans
+   *
+   * The beans are converted to {@link SolrInputDocument}s by the client's
+   * {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder}
+   *
+   * @param collection the Solr collection to add documents to
+   * @param beans  the collection of beans
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse addBeans(String collection, Collection<?> beans) throws SolrServerException, IOException {
+    return addBeans(collection, beans, -1);
+  }
+
+  /**
+   * Adds a collection of beans
+   *
+   * The beans are converted to {@link SolrInputDocument}s by the client's
+   * {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder}
+   *
+   * @param beans  the collection of beans
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse addBeans(Collection<?> beans) throws SolrServerException, IOException {
+    return addBeans(null, beans, -1);
+  }
+
+  /**
+   * Adds a collection of beans specifying max time before they become committed
+   *
+   * The beans are converted to {@link SolrInputDocument}s by the client's
+   * {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder}
+   *
+   * @param collection the Solr collection to add documents to
+   * @param beans  the collection of beans
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @see SolrClient#getBinder()
+   *
+   * @since solr 5.1
+   */
+  public UpdateResponse addBeans(String collection, Collection<?> beans, int commitWithinMs) throws SolrServerException, IOException {
+    DocumentObjectBinder binder = this.getBinder();
+    ArrayList<SolrInputDocument> docs =  new ArrayList<>(beans.size());
+    for (Object bean : beans) {
+      docs.add(binder.toSolrInputDocument(bean));
+    }
+    return add(collection, docs, commitWithinMs);
+  }
+
+  /**
+   * Adds a collection of beans specifying max time before they become committed
+   *
+   * The beans are converted to {@link SolrInputDocument}s by the client's
+   * {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder}
+   *
+   * @param beans  the collection of beans
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @see SolrClient#getBinder()
+   *
+   * @since solr 3.5
+   */
+  public UpdateResponse addBeans(Collection<?> beans, int commitWithinMs) throws SolrServerException, IOException {
+    return addBeans(null, beans, commitWithinMs);
+  }
+
+  /**
+   * Adds the beans supplied by the given iterator.
+   *
+   * @param collection the Solr collection to add the documents to
+   * @param beanIterator
+   *          the iterator which returns Beans
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse addBeans(String collection, final Iterator<?> beanIterator)
+      throws SolrServerException, IOException {
+    UpdateRequest req = new UpdateRequest();
+    req.setDocIterator(new Iterator<SolrInputDocument>() {
+
+      @Override
+      public boolean hasNext() {
+        return beanIterator.hasNext();
+      }
+
+      @Override
+      public SolrInputDocument next() {
+        Object o = beanIterator.next();
+        if (o == null) return null;
+        return getBinder().toSolrInputDocument(o);
+      }
+
+      @Override
+      public void remove() {
+        beanIterator.remove();
+      }
+    });
+    return req.process(this, collection);
+  }
+
+  /**
+   * Adds the beans supplied by the given iterator.
+   *
+   * @param beanIterator
+   *          the iterator which returns Beans
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} from the server
+   *
+   * @throws IOException         if there is a communication error with the server
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse addBeans(final Iterator<?> beanIterator) throws SolrServerException, IOException {
+    return addBeans(null, beanIterator);
   }
 
   /**
    * Performs an explicit commit, causing pending documents to be committed for indexing
-   * <p>
+   *
+   * waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
+   *
+   * @param collection the Solr collection to send the commit to
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse commit(String collection) throws SolrServerException, IOException {
+    return commit(collection, true, true);
+  }
+
+  /**
+   * Performs an explicit commit, causing pending documents to be committed for indexing
+   *
    * waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse commit() throws SolrServerException, IOException {
-    return commit(true, true);
+    return commit(null, true, true);
+  }
+
+  /**
+   * Performs an explicit commit, causing pending documents to be committed for indexing
+   *
+   * @param collection the Solr collection to send the commit to
+   * @param waitFlush  block until index changes are flushed to disk
+   * @param waitSearcher  block until a new searcher is opened and registered as the
+   *                      main query searcher, making the changes visible
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse commit(String collection, boolean waitFlush, boolean waitSearcher)
+      throws SolrServerException, IOException {
+    return new UpdateRequest()
+        .setAction(UpdateRequest.ACTION.COMMIT, waitFlush, waitSearcher)
+        .process(this, collection);
+  }
+
+  /**
+   * Performs an explicit commit, causing pending documents to be committed for indexing
+   *
+   * @param waitFlush  block until index changes are flushed to disk
+   * @param waitSearcher  block until a new searcher is opened and registered as the
+   *                      main query searcher, making the changes visible
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse commit(boolean waitFlush, boolean waitSearcher) throws SolrServerException, IOException {
+    return commit(null, waitFlush, waitSearcher);
+  }
+
+  /**
+   * Performs an explicit commit, causing pending documents to be committed for indexing
+   *
+   * @param collection the Solr collection to send the commit to
+   * @param waitFlush  block until index changes are flushed to disk
+   * @param waitSearcher  block until a new searcher is opened and registered as the
+   *                      main query searcher, making the changes visible
+   * @param softCommit makes index changes visible while neither fsync-ing index files
+   *                   nor writing a new index descriptor
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse commit(String collection, boolean waitFlush, boolean waitSearcher, boolean softCommit)
+      throws SolrServerException, IOException {
+    return new UpdateRequest()
+        .setAction(UpdateRequest.ACTION.COMMIT, waitFlush, waitSearcher, softCommit)
+        .process(this, collection);
+  }
+
+  /**
+   * Performs an explicit commit, causing pending documents to be committed for indexing
+   *
+   * @param waitFlush  block until index changes are flushed to disk
+   * @param waitSearcher  block until a new searcher is opened and registered as the
+   *                      main query searcher, making the changes visible
+   * @param softCommit makes index changes visible while neither fsync-ing index files
+   *                   nor writing a new index descriptor
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse commit(boolean waitFlush, boolean waitSearcher, boolean softCommit)
+      throws SolrServerException, IOException {
+    return commit(null, waitFlush, waitSearcher, softCommit);
   }
 
   /**
    * Performs an explicit optimize, causing a merge of all segments to one.
-   * <p>
+   *
    * waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
-   * <p>
+   *
+   * Note: In most cases it is not required to do explicit optimize
+   *
+   * @param collection the Solr collection to send the optimize to
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse optimize(String collection) throws SolrServerException, IOException {
+    return optimize(collection, true, true, 1);
+  }
+
+  /**
+   * Performs an explicit optimize, causing a merge of all segments to one.
+   *
+   * waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
+   *
    * Note: In most cases it is not required to do explicit optimize
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse optimize() throws SolrServerException, IOException {
-    return optimize(true, true, 1);
+    return optimize(null, true, true, 1);
   }
 
   /**
-   * Performs an explicit commit, causing pending documents to be committed for indexing
+   * Performs an explicit optimize, causing a merge of all segments to one.
+   * <p>
+   * Note: In most cases it is not required to do explicit optimize
+   *
+   * @param collection the Solr collection to send the optimize to
    * @param waitFlush  block until index changes are flushed to disk
-   * @param waitSearcher  block until a new searcher is opened and registered as the main query searcher, making the changes visible 
+   * @param waitSearcher  block until a new searcher is opened and registered as
+   *                      the main query searcher, making the changes visible
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
-  public UpdateResponse commit(boolean waitFlush, boolean waitSearcher) throws SolrServerException, IOException {
-    return new UpdateRequest().setAction(UpdateRequest.ACTION.COMMIT, waitFlush, waitSearcher).process( this );
+  public UpdateResponse optimize(String collection, boolean waitFlush, boolean waitSearcher) throws SolrServerException, IOException {
+    return optimize(collection, waitFlush, waitSearcher, 1);
   }
 
   /**
-   * Performs an explicit commit, causing pending documents to be committed for indexing
+   * Performs an explicit optimize, causing a merge of all segments to one.
+   * <p>
+   * Note: In most cases it is not required to do explicit optimize
+   *
    * @param waitFlush  block until index changes are flushed to disk
-   * @param waitSearcher  block until a new searcher is opened and registered as the main query searcher, making the changes visible
-   * @param softCommit makes index changes visible while neither fsync-ing index files nor writing a new index descriptor
+   * @param waitSearcher  block until a new searcher is opened and registered as
+   *                      the main query searcher, making the changes visible
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
-  public UpdateResponse commit(boolean waitFlush, boolean waitSearcher, boolean softCommit) throws SolrServerException, IOException {
-    return new UpdateRequest().setAction(UpdateRequest.ACTION.COMMIT, waitFlush, waitSearcher, softCommit).process( this );
+  public UpdateResponse optimize(boolean waitFlush, boolean waitSearcher) throws SolrServerException, IOException {
+    return optimize(null, waitFlush, waitSearcher);
   }
 
   /**
    * Performs an explicit optimize, causing a merge of all segments to one.
-   * <p>
+   *
    * Note: In most cases it is not required to do explicit optimize
+   *
+   * @param collection the Solr collection to send the optimize to
    * @param waitFlush  block until index changes are flushed to disk
-   * @param waitSearcher  block until a new searcher is opened and registered as the main query searcher, making the changes visible 
+   * @param waitSearcher  block until a new searcher is opened and registered as
+   *                      the main query searcher, making the changes visible
+   * @param maxSegments  optimizes down to at most this number of segments
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
-  public UpdateResponse optimize(boolean waitFlush, boolean waitSearcher) throws SolrServerException, IOException {
-    return optimize(waitFlush, waitSearcher, 1);
+  public UpdateResponse optimize(String collection, boolean waitFlush, boolean waitSearcher, int maxSegments)
+      throws SolrServerException, IOException {
+    return new UpdateRequest()
+        .setAction(UpdateRequest.ACTION.OPTIMIZE, waitFlush, waitSearcher, maxSegments)
+        .process(this, collection);
   }
 
   /**
    * Performs an explicit optimize, causing a merge of all segments to one.
-   * <p>
+   *
    * Note: In most cases it is not required to do explicit optimize
+   *
    * @param waitFlush  block until index changes are flushed to disk
-   * @param waitSearcher  block until a new searcher is opened and registered as the main query searcher, making the changes visible 
+   * @param waitSearcher  block until a new searcher is opened and registered as
+   *                      the main query searcher, making the changes visible
    * @param maxSegments  optimizes down to at most this number of segments
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
-  public UpdateResponse optimize(boolean waitFlush, boolean waitSearcher, int maxSegments) throws SolrServerException, IOException {
-    return new UpdateRequest().setAction(UpdateRequest.ACTION.OPTIMIZE, waitFlush, waitSearcher, maxSegments).process( this );
+  public UpdateResponse optimize(boolean waitFlush, boolean waitSearcher, int maxSegments)
+      throws SolrServerException, IOException {
+    return optimize(null, waitFlush, waitSearcher, maxSegments);
   }
 
   /**
    * Performs a rollback of all non-committed documents pending.
-   * <p>
+   *
    * Note that this is not a true rollback as in databases. Content you have previously
    * added may have been committed due to autoCommit, buffer full, other client performing
    * a commit etc.
+   *
+   * @param collection the Solr collection to send the rollback to
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse rollback(String collection) throws SolrServerException, IOException {
+    return new UpdateRequest().rollback().process(this, collection);
+  }
+
+  /**
+   * Performs a rollback of all non-committed documents pending.
+   *
+   * Note that this is not a true rollback as in databases. Content you have previously
+   * added may have been committed due to autoCommit, buffer full, other client performing
+   * a commit etc.
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse rollback() throws SolrServerException, IOException {
-    return new UpdateRequest().rollback().process( this );
+    return rollback(null);
+  }
+
+  /**
+   * Deletes a single document by unique ID
+   *
+   * @param collection the Solr collection to delete the document from
+   * @param id  the ID of the document to delete
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse deleteById(String collection, String id) throws SolrServerException, IOException {
+    return deleteById(collection, id, -1);
   }
 
   /**
    * Deletes a single document by unique ID
+   *
    * @param id  the ID of the document to delete
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse deleteById(String id) throws SolrServerException, IOException {
-    return deleteById(id, -1);
+    return deleteById(null, id);
   }
 
   /**
    * Deletes a single document by unique ID, specifying max time before commit
+   *
+   * @param collection the Solr collection to delete the document from
    * @param id  the ID of the document to delete
-   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
-   * @since 3.6
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since 5.1
    */
-  public UpdateResponse deleteById(String id, int commitWithinMs) throws SolrServerException, IOException {
+  public UpdateResponse deleteById(String collection, String id, int commitWithinMs) throws SolrServerException, IOException {
     UpdateRequest req = new UpdateRequest();
     req.deleteById(id);
     req.setCommitWithin(commitWithinMs);
-    return req.process(this);
+    return req.process(this, collection);
+  }
+
+  /**
+   * Deletes a single document by unique ID, specifying max time before commit
+   *
+   * @param id  the ID of the document to delete
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since 3.6
+   */
+  public UpdateResponse deleteById(String id, int commitWithinMs) throws SolrServerException, IOException {
+    return deleteById(null, id, commitWithinMs);
   }
 
   /**
    * Deletes a list of documents by unique ID
-   * @param ids  the list of document IDs to delete 
+   *
+   * @param collection the Solr collection to delete the documents from
+   * @param ids  the list of document IDs to delete
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse deleteById(String collection, List<String> ids) throws SolrServerException, IOException {
+    return deleteById(collection, ids, -1);
+  }
+
+  /**
+   * Deletes a list of documents by unique ID
+   *
+   * @param ids  the list of document IDs to delete
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse deleteById(List<String> ids) throws SolrServerException, IOException {
-    return deleteById(ids, -1);
+    return deleteById(null, ids);
   }
 
   /**
    * Deletes a list of documents by unique ID, specifying max time before commit
+   *
+   * @param collection the Solr collection to delete the documents from
    * @param ids  the list of document IDs to delete 
-   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
-   * @since 3.6
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since 5.1
    */
-  public UpdateResponse deleteById(List<String> ids, int commitWithinMs) throws SolrServerException, IOException {
+  public UpdateResponse deleteById(String collection, List<String> ids, int commitWithinMs) throws SolrServerException, IOException {
     UpdateRequest req = new UpdateRequest();
     req.deleteById(ids);
     req.setCommitWithin(commitWithinMs);
-    return req.process(this);
+    return req.process(this, collection);
+  }
+
+  /**
+   * Deletes a list of documents by unique ID, specifying max time before commit
+   *
+   * @param ids  the list of document IDs to delete
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since 3.6
+   */
+  public UpdateResponse deleteById(List<String> ids, int commitWithinMs) throws SolrServerException, IOException {
+    return deleteById(null, ids, commitWithinMs);
+  }
+
+  /**
+   * Deletes documents from the index based on a query
+   *
+   * @param collection the Solr collection to delete the documents from
+   * @param query  the query expressing what documents to delete
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public UpdateResponse deleteByQuery(String collection, String query) throws SolrServerException, IOException {
+    return deleteByQuery(collection, query, -1);
   }
 
   /**
    * Deletes documents from the index based on a query
+   *
    * @param query  the query expressing what documents to delete
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public UpdateResponse deleteByQuery(String query) throws SolrServerException, IOException {
-    return deleteByQuery(query, -1);
+    return deleteByQuery(null, query);
   }
 
   /**
    * Deletes documents from the index based on a query, specifying max time before commit
+   *
+   * @param collection the Solr collection to delete the documents from
    * @param query  the query expressing what documents to delete
-   * @param commitWithinMs  max time (in ms) before a commit will happen 
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
-   * @since 3.6
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since 5.1
    */
-  public UpdateResponse deleteByQuery(String query, int commitWithinMs) throws SolrServerException, IOException {
+  public UpdateResponse deleteByQuery(String collection, String query, int commitWithinMs) throws SolrServerException, IOException {
     UpdateRequest req = new UpdateRequest();
     req.deleteByQuery(query);
     req.setCommitWithin(commitWithinMs);
-    return req.process(this);
+    return req.process(this, collection);
+  }
+
+  /**
+   * Deletes documents from the index based on a query, specifying max time before commit
+   *
+   * @param query  the query expressing what documents to delete
+   * @param commitWithinMs  max time (in ms) before a commit will happen
+   *
+   * @return an {@link org.apache.solr.client.solrj.response.UpdateResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since 3.6
+   */
+  public UpdateResponse deleteByQuery(String query, int commitWithinMs) throws SolrServerException, IOException {
+    return deleteByQuery(null, query, commitWithinMs);
   }
 
   /**
    * Issues a ping request to check if the server is alive
+   *
+   * @return a {@link org.apache.solr.client.solrj.response.SolrPingResponse} containing the response
+   *         from the server
+   *
    * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public SolrPingResponse ping() throws SolrServerException, IOException {
-    return new SolrPing().process(this);
+    return new SolrPing().process(this, null);
   }
 
   /**
    * Performs a query to the Solr server
+   *
+   * @param collection the Solr collection to query
+   * @param params  an object holding all key/value parameters to send along the request
+   *
+   * @return a {@link org.apache.solr.client.solrj.response.QueryResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public QueryResponse query(String collection, SolrParams params) throws SolrServerException, IOException {
+    return new QueryRequest(params).process(this, collection);
+  }
+
+  /**
+   * Performs a query to the Solr server
+   *
    * @param params  an object holding all key/value parameters to send along the request
+   *
+   * @return a {@link org.apache.solr.client.solrj.response.QueryResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public QueryResponse query(SolrParams params) throws SolrServerException, IOException {
-    return new QueryRequest(params).process(this);
+    return query(null, params);
+  }
+
+  /**
+   * Performs a query to the Solr server
+   *
+   * @param collection the Solr collection to query
+   * @param params  an object holding all key/value parameters to send along the request
+   * @param method  specifies the HTTP method to use for the request, such as GET or POST
+   *
+   * @return a {@link org.apache.solr.client.solrj.response.QueryResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public QueryResponse query(String collection, SolrParams params, METHOD method) throws SolrServerException, IOException {
+    return new QueryRequest(params, method).process(this, collection);
   }
 
   /**
    * Performs a query to the Solr server
+   *
    * @param params  an object holding all key/value parameters to send along the request
    * @param method  specifies the HTTP method to use for the request, such as GET or POST
+   *
+   * @return a {@link org.apache.solr.client.solrj.response.QueryResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public QueryResponse query(SolrParams params, METHOD method) throws SolrServerException, IOException {
-    return new QueryRequest(params, method).process(this);
+    return query(null, params, method);
   }
 
   /**
@@ -327,34 +1000,95 @@ public abstract class SolrClient impleme
    * future version may pass even more info to the callback and may not return 
    * the results in the QueryResponse.
    *
-   * @since solr 4.0
+   * @param collection the Solr collection to query
+   * @param params  an object holding all key/value parameters to send along the request
+   * @param callback the callback to stream results to
+   *
+   * @return a {@link org.apache.solr.client.solrj.response.QueryResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since solr 5.1
    */
-  public QueryResponse queryAndStreamResponse(SolrParams params, StreamingResponseCallback callback) throws SolrServerException, IOException
-  {
+  public QueryResponse queryAndStreamResponse(String collection, SolrParams params, StreamingResponseCallback callback)
+      throws SolrServerException, IOException {
     ResponseParser parser = new StreamingBinaryResponseParser(callback);
     QueryRequest req = new QueryRequest(params);
     req.setStreamingResponseCallback(callback);
     req.setResponseParser(parser);
-    return req.process(this);
+    return req.process(this, collection);
+  }
+
+  /**
+   * Query solr, and stream the results.  Unlike the standard query, this will
+   * send events for each Document rather then add them to the QueryResponse.
+   *
+   * Although this function returns a 'QueryResponse' it should be used with care
+   * since it excludes anything that was passed to callback.  Also note that
+   * future version may pass even more info to the callback and may not return
+   * the results in the QueryResponse.
+   *
+   * @param params  an object holding all key/value parameters to send along the request
+   * @param callback the callback to stream results to
+   *
+   * @return a {@link org.apache.solr.client.solrj.response.QueryResponse} containing the response
+   *         from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   *
+   * @since solr 4.0
+   */
+  public QueryResponse queryAndStreamResponse(SolrParams params, StreamingResponseCallback callback)
+      throws SolrServerException, IOException {
+    return queryAndStreamResponse(null, params, callback);
   }
 
   /**
    * Retrieves the SolrDocument associated with the given identifier.
    *
-   * @return retrieved SolrDocument, null if no document is found.
+   * @param collection the Solr collection to query
+   * @param id the id
+   *
+   * @return retrieved SolrDocument, or null if no document is found.
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public SolrDocument getById(String collection, String id) throws SolrServerException, IOException {
+    return getById(collection, id, null);
+  }
+  /**
+   * Retrieves the SolrDocument associated with the given identifier.
+   *
+   * @param id the id
+   *
+   * @return retrieved SolrDocument, or null if no document is found.
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public SolrDocument getById(String id) throws SolrServerException, IOException {
-    return getById(id, null);
+    return getById(null, 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.
+   * @param collection the Solr collection to query
+   * @param id the id
+   * @param params additional parameters to add to the query
+   *
+   * @return retrieved SolrDocument, or null if no document is found.
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
-  public SolrDocument getById(String id, SolrParams params) throws SolrServerException, IOException {
-    SolrDocumentList docs = getById(Arrays.asList(id), params);
+  public SolrDocument getById(String collection, String id, SolrParams params) throws SolrServerException, IOException {
+    SolrDocumentList docs = getById(collection, Arrays.asList(id), params);
     if (!docs.isEmpty()) {
       return docs.get(0);
     }
@@ -362,19 +1096,71 @@ public abstract class SolrClient impleme
   }
 
   /**
+   * Retrieves the SolrDocument associated with the given identifier and uses
+   * the SolrParams to execute the request.
+   *
+   * @param id the id
+   * @param params additional parameters to add to the query
+   *
+   * @return retrieved SolrDocument, or null if no document is found.
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public SolrDocument getById(String id, SolrParams params) throws SolrServerException, IOException {
+    return getById(null, id, params);
+  }
+
+  /**
+   * Retrieves the SolrDocuments associated with the given identifiers.
+   *
+   * If a document was not found, it will not be added to the SolrDocumentList.
+   *
+   * @param collection the Solr collection to query
+   * @param ids the ids
+   *
+   * @return a SolrDocumentList, or null if no documents were found
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public SolrDocumentList getById(String collection, Collection<String> ids) throws SolrServerException, IOException {
+    return getById(collection, ids, null);
+  }
+
+  /**
    * Retrieves the SolrDocuments associated with the given identifiers.
+   *
    * If a document was not found, it will not be added to the SolrDocumentList.
+   *
+   * @param ids the ids
+   *
+   * @return a SolrDocumentList, or null if no documents were found
+   *
+   *  @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
   public SolrDocumentList getById(Collection<String> ids) throws SolrServerException, IOException {
-    return getById(ids, null);
+    return getById(null, ids);
   }
 
   /**
    * 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.
+   *
+   * @param collection the Solr collection to query
+   * @param ids the ids
+   * @param params additional parameters to add to the query
+   *
+   * @return a SolrDocumentList, or null if no documents were found
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
-  public SolrDocumentList getById(Collection<String> ids, SolrParams params) throws SolrServerException, IOException {
+  public SolrDocumentList getById(String collection, Collection<String> ids, SolrParams params)
+      throws SolrServerException, IOException {
     if (ids == null || ids.isEmpty()) {
       throw new IllegalArgumentException("Must provide an identifier of a document to retrieve.");
     }
@@ -385,14 +1171,63 @@ public abstract class SolrClient impleme
     }
     reqParams.set("ids", (String[]) ids.toArray());
 
-    return query(reqParams).getResults();
+    return query(collection, reqParams).getResults();
+  }
+
+  /**
+   * 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.
+   *
+   * @param ids the ids
+   * @param params additional parameters to add to the query
+   *
+   * @return a SolrDocumentList, or null if no documents were found
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public SolrDocumentList getById(Collection<String> ids, SolrParams params) throws SolrServerException, IOException {
+    return getById(null, ids, params);
   }
-  
+
   /**
-   * SolrServer implementations need to implement how a request is actually processed
+   * Execute a request against a Solr server for a given collection
+   *
+   * @param request the request to execute
+   * @param collection the collection to execute the request against
+   *
+   * @return a {@link NamedList} containing the response from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
+   */
+  public abstract NamedList<Object> request(final SolrRequest request, String collection)
+      throws SolrServerException, IOException;
+
+  /**
+   * Execute a request against a Solr server
+   *
+   * @param request the request to execute
+   *
+   * @return a {@link NamedList} containing the response from the server
+   *
+   * @throws IOException If there is a low-level I/O error.
+   * @throws SolrServerException if there is an error on the server
    */
-  public abstract NamedList<Object> request(final SolrRequest request) throws SolrServerException, IOException;
+  public final NamedList<Object> request(final SolrRequest request) throws SolrServerException, IOException {
+    return request(request, null);
+  }
 
+  /**
+   * Get the {@link org.apache.solr.client.solrj.beans.DocumentObjectBinder} for this client.
+   *
+   * @return a DocumentObjectBinder
+   *
+   * @see SolrClient#addBean
+   * @see SolrClient#addBeans
+   */
   public DocumentObjectBinder getBinder() {
     if(binder == null){
       binder = new DocumentObjectBinder();

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrRequest.java Thu Mar  5 11:29:24 2015
@@ -120,18 +120,36 @@ public abstract class SolrRequest<T exte
 
   /**
    * Send this request to a {@link SolrClient} and return the response
+   *
    * @param client the SolrClient to communicate with
+   * @param collection the collection to execute the request against
+   *
    * @return the response
+   *
    * @throws SolrServerException if there is an error on the Solr server
    * @throws IOException if there is a communication error
    */
-  public final T process(SolrClient client) throws SolrServerException, IOException {
+  public final T process(SolrClient client, String collection) throws SolrServerException, IOException {
     long startTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
     T res = createResponse(client);
-    res.setResponse(client.request(this));
+    res.setResponse(client.request(this, collection));
     long endTime = TimeUnit.MILLISECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
     res.setElapsedTime(endTime - startTime);
     return res;
   }
 
+  /**
+   * Send this request to a {@link SolrClient} and return the response
+   *
+   * @param client the SolrClient to communicate with
+   *
+   * @return the response
+   *
+   * @throws SolrServerException if there is an error on the Solr server
+   * @throws IOException if there is a communication error
+   */
+  public final T process(SolrClient client) throws SolrServerException, IOException {
+    return process(client, null);
+  }
+
 }

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java Thu Mar  5 11:29:24 2015
@@ -501,7 +501,7 @@ public class CloudSolrClient extends Sol
     zkStateReader.getConfigManager().downloadConfigDir(configName, downloadPath);
   }
 
-  private NamedList<Object> directUpdate(AbstractUpdateRequest request, ClusterState clusterState) throws SolrServerException {
+  private NamedList<Object> directUpdate(AbstractUpdateRequest request, String collection, ClusterState clusterState) throws SolrServerException {
     UpdateRequest updateRequest = (UpdateRequest) request;
     ModifiableSolrParams params = (ModifiableSolrParams) request.getParams();
     ModifiableSolrParams routableParams = new ModifiableSolrParams();
@@ -515,7 +515,6 @@ public class CloudSolrClient extends Sol
       }
     }
 
-    String collection = nonRoutableParams.get(UpdateParams.COLLECTION, defaultCollection);
     if (collection == null) {
       throw new SolrServerException("No collection param specified on request and no default collection has been set.");
     }
@@ -747,9 +746,11 @@ public class CloudSolrClient extends Sol
   }
 
   @Override
-  public NamedList<Object> request(SolrRequest request) throws SolrServerException, IOException {
+  public NamedList<Object> request(SolrRequest request, String collection) throws SolrServerException, IOException {
     SolrParams reqParams = request.getParams();
-    String collection = (reqParams != null) ? reqParams.get("collection", getDefaultCollection()) : getDefaultCollection();
+
+    if (collection == null)
+      collection = (reqParams != null) ? reqParams.get("collection", getDefaultCollection()) : getDefaultCollection();
     return requestWithRetryOnStaleState(request, 0, collection);
   }
 
@@ -807,7 +808,7 @@ public class CloudSolrClient extends Sol
 
     NamedList<Object> resp = null;
     try {
-      resp = sendRequest(request);
+      resp = sendRequest(request, collection);
       //to avoid an O(n) operation we always add STATE_VERSION to the last and try to read it from there
       Object o = resp.get(STATE_VERSION, resp.size()-1);
       if(o != null && o instanceof Map) {
@@ -905,7 +906,7 @@ public class CloudSolrClient extends Sol
     return resp;
   }
 
-  protected NamedList<Object> sendRequest(SolrRequest request)
+  protected NamedList<Object> sendRequest(SolrRequest request, String collection)
       throws SolrServerException, IOException {
     connect();
     
@@ -916,8 +917,7 @@ public class CloudSolrClient extends Sol
     
     if (request instanceof IsUpdateRequest) {
       if (request instanceof UpdateRequest) {
-        NamedList<Object> response = directUpdate((AbstractUpdateRequest) request,
-            clusterState);
+        NamedList<Object> response = directUpdate((AbstractUpdateRequest) request, collection, clusterState);
         if (response != null) {
           return response;
         }
@@ -938,7 +938,6 @@ public class CloudSolrClient extends Sol
         theUrlList.add(zkStateReader.getBaseUrlForNodeName(liveNode));
       }
     } else {
-      String collection = reqParams.get(UpdateParams.COLLECTION, defaultCollection);
       
       if (collection == null) {
         throw new SolrServerException(
@@ -983,22 +982,18 @@ public class CloudSolrClient extends Sol
           if (!liveNodes.contains(coreNodeProps.getNodeName())
               || !coreNodeProps.getState().equals(ZkStateReader.ACTIVE)) continue;
           if (nodes.put(node, nodeProps) == null) {
-            if (!sendToLeaders || (sendToLeaders && coreNodeProps.isLeader())) {
+            if (!sendToLeaders || coreNodeProps.isLeader()) {
               String url;
               if (reqParams.get(UpdateParams.COLLECTION) == null) {
-                url = ZkCoreNodeProps.getCoreUrl(
-                    nodeProps.getStr(ZkStateReader.BASE_URL_PROP),
-                    defaultCollection);
+                url = ZkCoreNodeProps.getCoreUrl(nodeProps.getStr(ZkStateReader.BASE_URL_PROP), collection);
               } else {
                 url = coreNodeProps.getCoreUrl();
               }
               urlList2.add(url);
-            } else if (sendToLeaders) {
+            } else {
               String url;
               if (reqParams.get(UpdateParams.COLLECTION) == null) {
-                url = ZkCoreNodeProps.getCoreUrl(
-                    nodeProps.getStr(ZkStateReader.BASE_URL_PROP),
-                    defaultCollection);
+                url = ZkCoreNodeProps.getCoreUrl(nodeProps.getStr(ZkStateReader.BASE_URL_PROP), collection);
               } else {
                 url = coreNodeProps.getCoreUrl();
               }
@@ -1039,7 +1034,7 @@ public class CloudSolrClient extends Sol
       }
       
     }
-    
+
     LBHttpSolrClient.Req req = new LBHttpSolrClient.Req(request, theUrlList);
     LBHttpSolrClient.Rsp rsp = lbClient.request(req);
     return rsp.getResponse();

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java Thu Mar  5 11:29:24 2015
@@ -291,10 +291,10 @@ public class ConcurrentUpdateSolrClient
   }
 
   @Override
-  public NamedList<Object> request(final SolrRequest request)
+  public NamedList<Object> request(final SolrRequest request, String collection)
       throws SolrServerException, IOException {
     if (!(request instanceof UpdateRequest)) {
-      return client.request(request);
+      return client.request(request, collection);
     }
     UpdateRequest req = (UpdateRequest) request;
 
@@ -305,13 +305,13 @@ public class ConcurrentUpdateSolrClient
           && (req.getDeleteByIdMap() == null || req.getDeleteByIdMap().isEmpty())) {
         if (req.getDeleteQuery() == null) {
           blockUntilFinished();
-          return client.request(request);
+          return client.request(request, collection);
         }
       }
     } else {
       if ((req.getDocuments() == null || req.getDocuments().isEmpty())) {
         blockUntilFinished();
-        return client.request(request);
+        return client.request(request, collection);
       }
     }
 
@@ -322,7 +322,7 @@ public class ConcurrentUpdateSolrClient
       if (params.getBool(UpdateParams.WAIT_SEARCHER, false)) {
         log.info("blocking for commit/optimize");
         blockUntilFinished(); // empty the queue
-        return client.request(request);
+        return client.request(request, collection);
       }
     }
 

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java Thu Mar  5 11:29:24 2015
@@ -43,15 +43,12 @@ import org.apache.http.message.BasicHead
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
 import org.apache.solr.client.solrj.ResponseParser;
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.RequestWriter;
-import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
@@ -201,7 +198,7 @@ public class HttpSolrClient extends Solr
    *      org.apache.solr.client.solrj.ResponseParser)
    */
   @Override
-  public NamedList<Object> request(final SolrRequest request)
+  public NamedList<Object> request(final SolrRequest request, String collection)
       throws SolrServerException, IOException {
     ResponseParser responseParser = request.getResponseParser();
     if (responseParser == null) {
@@ -701,54 +698,6 @@ public class HttpSolrClient extends Solr
   }
   
   /**
-   * Adds the documents supplied by the given iterator.
-   * 
-   * @param docIterator
-   *          the iterator which returns SolrInputDocument instances
-   * 
-   * @return the response from the SolrServer
-   */
-  public UpdateResponse add(Iterator<SolrInputDocument> docIterator)
-      throws SolrServerException, IOException {
-    UpdateRequest req = new UpdateRequest();
-    req.setDocIterator(docIterator);
-    return req.process(this);
-  }
-  
-  /**
-   * Adds the beans supplied by the given iterator.
-   * 
-   * @param beanIterator
-   *          the iterator which returns Beans
-   * 
-   * @return the response from the SolrServer
-   */
-  public UpdateResponse addBeans(final Iterator<?> beanIterator)
-      throws SolrServerException, IOException {
-    UpdateRequest req = new UpdateRequest();
-    req.setDocIterator(new Iterator<SolrInputDocument>() {
-      
-      @Override
-      public boolean hasNext() {
-        return beanIterator.hasNext();
-      }
-      
-      @Override
-      public SolrInputDocument next() {
-        Object o = beanIterator.next();
-        if (o == null) return null;
-        return getBinder().toSolrInputDocument(o);
-      }
-      
-      @Override
-      public void remove() {
-        beanIterator.remove();
-      }
-    });
-    return req.process(this);
-  }
-  
-  /**
    * Close the {@link ClientConnectionManager} from the internal client.
    */
   @Override

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java Thu Mar  5 11:29:24 2015
@@ -367,7 +367,7 @@ public class LBHttpSolrClient extends So
       boolean isZombie, String zombieKey) throws SolrServerException, IOException {
     Exception ex = null;
     try {
-      rsp.rsp = client.request(req.getRequest());
+      rsp.rsp = client.request(req.getRequest(), (String) null);
       if (isZombie) {
         zombieServers.remove(zombieKey);
       }
@@ -491,7 +491,7 @@ public class LBHttpSolrClient extends So
    * @throws IOException If there is a low-level I/O error.
    */
   @Override
-  public NamedList<Object> request(final SolrRequest request)
+  public NamedList<Object> request(final SolrRequest request, String collection)
           throws SolrServerException, IOException {
     Exception ex = null;
     ServerWrapper[] serverList = aliveServerList;
@@ -511,7 +511,7 @@ public class LBHttpSolrClient extends So
       wrapper.lastUsed = System.currentTimeMillis();
 
       try {
-        return wrapper.client.request(request);
+        return wrapper.client.request(request, collection);
       } catch (SolrException e) {
         // Server is alive but the request was malformed or invalid
         throw e;
@@ -537,7 +537,7 @@ public class LBHttpSolrClient extends So
       
       if (wrapper.standard==false || justFailed!=null && justFailed.containsKey(wrapper.getKey())) continue;
       try {
-        NamedList<Object> rsp = wrapper.client.request(request);
+        NamedList<Object> rsp = wrapper.client.request(request, collection);
         // remove from zombie list *before* adding to alive to avoid a race that could lose a server
         zombieServers.remove(wrapper.getKey());
         addToAlive(wrapper);

Modified: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java?rev=1664310&r1=1664309&r2=1664310&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java (original)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java Thu Mar  5 11:29:24 2015
@@ -17,12 +17,6 @@ package org.apache.solr.client.solrj.imp
  * limitations under the License.
  */
 
-import static org.apache.solr.cloud.OverseerCollectionProcessor.CREATE_NODE_SET;
-import static org.apache.solr.cloud.OverseerCollectionProcessor.NUM_SLICES;
-import static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
-import static org.apache.solr.common.cloud.ZkStateReader.MAX_SHARDS_PER_NODE;
-import static org.apache.solr.common.cloud.ZkStateReader.REPLICATION_FACTOR;
-
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -72,6 +66,11 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
 
+import static org.apache.solr.cloud.OverseerCollectionProcessor.NUM_SLICES;
+import static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
+import static org.apache.solr.common.cloud.ZkStateReader.MAX_SHARDS_PER_NODE;
+import static org.apache.solr.common.cloud.ZkStateReader.REPLICATION_FACTOR;
+
 
 /**
  * This test would be faster if we simulated the zk state instead.
@@ -122,6 +121,7 @@ public class CloudSolrClientTest extends
 
   @Test
   public void test() throws Exception {
+    checkCollectionParameters();
     allTests();
     stateVersionParamTest();
     customHttpClientTest();
@@ -498,6 +498,44 @@ public class CloudSolrClientTest extends
     indexDoc(doc);
   }
 
+  private void checkCollectionParameters() throws Exception {
+
+    try (CloudSolrClient client = createCloudClient("multicollection1")) {
+
+      createCollection("multicollection1", client, 2, 2);
+      createCollection("multicollection2", client, 2, 2);
+      waitForRecoveriesToFinish("multicollection1", false);
+      waitForRecoveriesToFinish("multicollection2", false);
+
+      List<SolrInputDocument> docs = new ArrayList<>(3);
+      for (int i = 0; i < 3; i++) {
+        SolrInputDocument doc = new SolrInputDocument();
+        doc.addField(id, Integer.toString(i));
+        doc.addField("a_t", "hello");
+        docs.add(doc);
+      }
+
+      client.add(docs);     // default - will add them to multicollection1
+      client.commit();
+
+      ModifiableSolrParams queryParams = new ModifiableSolrParams();
+      queryParams.add("q", "*:*");
+      assertEquals(3, client.query(queryParams).getResults().size());
+      assertEquals(0, client.query("multicollection2", queryParams).getResults().size());
+
+      SolrQuery query = new SolrQuery("*:*");
+      query.set("collection", "multicollection2");
+      assertEquals(0, client.query(query).getResults().size());
+
+      client.add("multicollection2", docs);
+      client.commit("multicollection2");
+
+      assertEquals(3, client.query("multicollection2", queryParams).getResults().size());
+
+    }
+
+  }
+
   private void stateVersionParamTest() throws Exception {
 
     try (CloudSolrClient client = createCloudClient(null)) {