The BinaryResponseWriter has a nice abstraction of converting DocList to SolrDocumentList . The code is minimal Probably you can copy the methods or refactor the class to be reused elsewhere
On Tue, Jul 22, 2008 at 10:02 AM, Ryan McKinley <[EMAIL PROTECTED]> wrote: > 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 > > -- --Noble Paul
