Ideally we don't need to.

However, we do need to convert things like DocList to SolrDocumentList, also the Map/List representation should match what happens *if* it did go via HTTP. That is, if a handler adds a LinkedHashSet to the response, the client does not know that -- it just behaves as a collection.

We need to make sure the behavior of Embedded vs Http is identical.

Writing this conversion has been on my TODO list for a while, but I don't see it happening anytime soon. This patch abstracts things out so there is an easy place to put in this optimization when someone has the need/time.

ryan


On Jul 22, 2008, at 12:21 AM, Noble Paul നോബിള്‍ नोब्ळ् wrote:

why do we need a serialize/deserialize for EmbeddedSolrServer? Why
can't we just return the Namedlist directly?

On Tue, Jul 22, 2008 at 8:47 AM,  <[EMAIL PROTECTED]> wrote:
Author: ryan
Date: Mon Jul 21 20:17:13 2008
New Revision: 678624

URL: http://svn.apache.org/viewvc?rev=678624&view=rev
Log:
SOLR-641 -- use the binary parser for embeded solr server

Modified:
lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/ solrj/embedded/EmbeddedSolrServer.java

Modified: lucene/solr/trunk/client/java/solrj/src/org/apache/solr/ client/solrj/embedded/EmbeddedSolrServer.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java?rev=678624&r1=678623&r2=678624&view=diff
= = = = = = = = = ===================================================================== --- lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/ solrj/embedded/EmbeddedSolrServer.java (original) +++ lucene/solr/trunk/client/java/solrj/src/org/apache/solr/client/ solrj/embedded/EmbeddedSolrServer.java Mon Jul 21 20:17:13 2008
@@ -17,6 +17,8 @@

package org.apache.solr.client.solrj.embedded;

+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
@@ -25,15 +27,16 @@
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.BinaryResponseParser;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.common.params.DefaultSolrParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.core.MultiCore;
import org.apache.solr.core.SolrCore;
+import org.apache.solr.request.BinaryResponseWriter;
import org.apache.solr.request.QueryResponseWriter;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrQueryResponse;
@@ -51,13 +54,12 @@
*/
public class EmbeddedSolrServer extends SolrServer
{
-  protected ModifiableSolrParams _invariantParams;
-  protected ResponseParser _processor;

 protected final MultiCore multicore; // either multicore
 protected final SolrCore core; // or single core
-  protected final SolrRequestParsers parser;
 protected final String coreName;  // use MultiCore registry
+
+  private final SolrRequestParsers _parser;

 public EmbeddedSolrServer( SolrCore core )
 {
@@ -67,7 +69,8 @@
   this.core = core;
   this.multicore = null;
   this.coreName = null;
-    this.parser = init();
+
+    _parser = new SolrRequestParsers( null );
 }

 public EmbeddedSolrServer(  MultiCore multicore, String coreName )
@@ -82,20 +85,10 @@
   if( c == null ) {
     throw new RuntimeException( "Unknown core: "+coreName );
   }
-    this.parser = init();
-  }
-
-  private SolrRequestParsers init()
-  {
-    _processor = new XMLResponseParser();

-    _invariantParams = new ModifiableSolrParams();
- _invariantParams.set( CommonParams.WT, _processor.getWriterType() );
-    _invariantParams.set( CommonParams.VERSION, "2.2" );
-
-    return new SolrRequestParsers( null );
+    _parser = new SolrRequestParsers( null );
 }
-
+
 @Override
public NamedList<Object> request(SolrRequest request) throws SolrServerException, IOException
 {
@@ -118,9 +111,6 @@
   if( params == null ) {
     params = new ModifiableSolrParams();
   }
-    if( _invariantParams != null ) {
-      params = new DefaultSolrParams( _invariantParams, params );
-    }

   // Extract the handler from the path or params
   SolrRequestHandler handler = core.getRequestHandler( path );
@@ -145,7 +135,7 @@
   }

   try {
- SolrQueryRequest req = parser.buildRequestFrom( core, params, request.getContentStreams() ); + SolrQueryRequest req = _parser.buildRequestFrom( core, params, request.getContentStreams() );
     req.getContext().put( "path", path );
     SolrQueryResponse rsp = new SolrQueryResponse();
     core.execute( handler, req, rsp );
@@ -154,13 +144,9 @@
     }

     // Now write it out
- QueryResponseWriter responseWriter = core.getQueryResponseWriter(req);
-      StringWriter out = new StringWriter();
-      responseWriter.write(out, req, rsp);
-      // TODO: writers might be able to output binary someday
-
+      NamedList<Object> normalized = getParsedResponse(req, rsp);
     req.close();
- return _processor.processResponse( new StringReader( out.toString() ) );
+      return normalized;
   }
   catch( IOException iox ) {
     throw iox;
@@ -169,4 +155,27 @@
     throw new SolrServerException( ex );
   }
 }
+
+  /**
+ * TODO -- in the future, this could perhaps transform the NamedList without serializing it
+   * then parsing it from the serialized form.
+   *
+   * @param req
+   * @param rsp
+ * @return a response object equivalent to what you get from the XML/JSON/javabin parser. Documents
+   * become SolrDocuments, DocList becomes SolrDocumentList etc.
+   */
+ public NamedList<Object> getParsedResponse( SolrQueryRequest req, SolrQueryResponse rsp )
+  {
+    try {
+      BinaryResponseWriter writer = new BinaryResponseWriter();
+      ByteArrayOutputStream bos = new ByteArrayOutputStream();
+      writer.write( bos, req, rsp );
+      BinaryResponseParser parser = new BinaryResponseParser();
+ return parser.processResponse( new ByteArrayInputStream( bos.toByteArray() ), "UTF-8" );
+    }
+    catch( Exception ex ) {
+      throw new RuntimeException( ex );
+    }
+  }
}






--
--Noble Paul

Reply via email to