You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ry...@apache.org on 2011/03/25 17:24:22 UTC

svn commit: r1085450 [2/2] - in /lucene/dev/trunk/solr: ./ src/common/org/apache/solr/common/ src/common/org/apache/solr/common/util/ src/java/org/apache/solr/handler/ src/java/org/apache/solr/handler/component/ src/java/org/apache/solr/response/ src/j...

Added: lucene/dev/trunk/solr/src/java/org/apache/solr/response/transform/ValueAugmenter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/response/transform/ValueAugmenter.java?rev=1085450&view=auto
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/response/transform/ValueAugmenter.java (added)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/response/transform/ValueAugmenter.java Fri Mar 25 16:24:21 2011
@@ -0,0 +1,40 @@
+/**
+ * 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.
+ */
+package org.apache.solr.response.transform;
+
+import org.apache.solr.common.SolrDocument;
+
+/**
+ * @version $Id: JSONResponseWriter.java 1065304 2011-01-30 15:10:15Z rmuir $
+ * @since solr 4.0
+ */
+public class ValueAugmenter extends DocTransformer
+{
+  final String name;
+  final Object value;
+
+  public ValueAugmenter( String name, Object value )
+  {
+    this.name = name;
+    this.value = value;
+  }
+
+  @Override
+  public void transform(SolrDocument doc, int docid) {
+    doc.setField( name, value );
+  }
+}

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/util/SolrPluginUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/util/SolrPluginUtils.java?rev=1085450&r1=1085449&r2=1085450&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/util/SolrPluginUtils.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/util/SolrPluginUtils.java Fri Mar 25 16:24:21 2011
@@ -37,6 +37,7 @@ import org.apache.solr.handler.component
 import org.apache.solr.handler.component.ResponseBuilder;
 import org.apache.solr.highlight.SolrHighlighter;
 import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.ReturnFields;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
@@ -115,41 +116,6 @@ public class SolrPluginUtils {
      return splitList.split(value.trim(), 0);
   }
 
-  /**
-   * Assumes the standard query param of "fl" to specify the return fields
-   * @see #setReturnFields(String,SolrQueryResponse)
-   */
-  public static int setReturnFields(SolrQueryRequest req,
-                                    SolrQueryResponse res) {
-
-    return setReturnFields(req.getParams().get(CommonParams.FL), res);
-  }
-
-  /**
-   * Given a space seperated list of field names, sets the field list on the
-   * SolrQueryResponse.
-   *
-   * @return bitfield of SolrIndexSearcher flags that need to be set
-   */
-  public static int setReturnFields(String fl,
-                                    SolrQueryResponse res) {
-    int flags = 0;
-    if (fl != null) {
-      // TODO - this could become more efficient if widely used.
-      // TODO - should field order be maintained?
-      String[] flst = split(fl);
-      if (flst.length > 0 && !(flst.length==1 && flst[0].length()==0)) {
-        Set<String> set = new LinkedHashSet<String>();
-        for (String fname : flst) {
-          if("score".equalsIgnoreCase(fname))
-            flags |= SolrIndexSearcher.GET_SCORES;
-          set.add(fname);
-        }
-        res.setReturnFields(set);
-      }
-    }
-    return flags;
-  }
 
   /**
    * Pre-fetch documents into the index searcher's document cache.
@@ -180,14 +146,13 @@ public class SolrPluginUtils {
       return;
     }
 
-    Set<String> returnFields = res.getReturnFields();
-    Set<String> fieldFilter = returnFields;
-
-    if(returnFields != null) {
+    ReturnFields returnFields = res.getReturnFields();
+    if(returnFields.getFieldNames() != null) {
+      Set<String> fieldFilter = returnFields.getFieldNames();
 
       if (rb.doHighlights) {
         // copy return fields list
-        fieldFilter = new HashSet<String>(returnFields);
+        fieldFilter = new HashSet<String>(fieldFilter);
         // add highlight fields
 
         SolrHighlighter highlighter = HighlightComponent.getHighlighter(req.getCore());

Modified: lucene/dev/trunk/solr/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=1085450&r1=1085449&r2=1085450&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/BasicFunctionalityTest.java Fri Mar 25 16:24:21 2011
@@ -42,6 +42,7 @@ import org.apache.solr.handler.RequestHa
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
+import org.apache.solr.response.ResultContext;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.response.XMLWriter;
 import org.apache.solr.schema.IndexSchema;
@@ -558,7 +559,7 @@ public class BasicFunctionalityTest exte
     SolrQueryResponse rsp = new SolrQueryResponse();
     core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
 
-    DocList dl = (DocList) rsp.getValues().get("response");
+    DocList dl = ((ResultContext) rsp.getValues().get("response")).docs;
     org.apache.lucene.document.Document d = req.getSearcher().doc(dl.iterator().nextDoc());
     // ensure field is not lazy
     assertTrue( d.getFieldable("test_hlt") instanceof Field );
@@ -580,7 +581,7 @@ public class BasicFunctionalityTest exte
     SolrQueryResponse rsp = new SolrQueryResponse();
     core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
 
-    DocList dl = (DocList) rsp.getValues().get("response");
+    DocList dl = ((ResultContext) rsp.getValues().get("response")).docs;
     DocIterator di = dl.iterator();    
     org.apache.lucene.document.Document d = req.getSearcher().doc(di.nextDoc());
     // ensure field is lazy

Modified: lucene/dev/trunk/solr/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/client/solrj/SolrExampleTests.java?rev=1085450&r1=1085449&r2=1085450&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/client/solrj/SolrExampleTests.java (original)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/client/solrj/SolrExampleTests.java Fri Mar 25 16:24:21 2011
@@ -46,9 +46,11 @@ import org.apache.solr.client.solrj.resp
 import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.client.solrj.util.ClientUtils;
 import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.util.XML;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.FacetParams;
 import org.junit.Test;
 
@@ -218,6 +220,39 @@ abstract public class SolrExampleTests e
     assertEquals( 1, rsp.getResults().getNumFound() );
 
   }
+ 
+
+ /**
+  * Get empty results
+  */
+  @Test
+  public void testGetEmptyResults() throws Exception
+  {    
+    SolrServer server = getSolrServer();
+     
+    // Empty the database...
+    server.deleteByQuery( "*:*" );// delete everything!
+    server.commit();
+     
+    // Add two docs
+    SolrInputDocument doc = new SolrInputDocument();
+    doc.addField( "id", "id1", 1.0f );
+    doc.addField( "name", "doc1", 1.0f );
+    doc.addField( "price", 10 );
+    server.add( doc );
+    
+    doc = new SolrInputDocument();
+    doc.addField( "id", "id2", 1.0f );
+    server.add( doc );
+    server.commit();
+    
+    // Make sure we get empty docs for unknown field
+    SolrDocumentList out = server.query( new SolrQuery( "*:*" ).set("fl", "foofoofoo" ) ).getResults();
+    assertEquals( 2, out.getNumFound() );
+    assertEquals( 0, out.get(0).size() );
+    assertEquals( 0, out.get(1).size() );
+
+  }
   
   private String randomTestString(int maxLength) {
     // we can't just use _TestUtil.randomUnicodeString() or we might get 0xfffe etc
@@ -345,6 +380,55 @@ abstract public class SolrExampleTests e
   }
 
 
+  @Test
+  public void testAugmentFields() throws Exception
+  {    
+    SolrServer server = getSolrServer();
+    
+    // Empty the database...
+    server.deleteByQuery( "*:*" );// delete everything!
+    
+    // Now add something...
+    SolrInputDocument doc = new SolrInputDocument();
+    doc.addField( "id", "111", 1.0f );
+    doc.addField( "name", "doc1", 1.0f );
+    doc.addField( "price", 11 );
+    server.add( doc );
+    
+    doc = new SolrInputDocument();
+    doc.addField( "id", "222", 1.0f );
+    doc.addField( "name", "doc2", 1.0f );
+    doc.addField( "price", 22 );
+    server.add( doc );
+    
+    // Add the documents
+    server.commit();
+    
+    SolrQuery query = new SolrQuery();
+    query.setQuery( "*:*" );
+    query.set( CommonParams.FL, "id,price,_docid_,_explain_,score" );
+    query.addSortField( "price", SolrQuery.ORDER.asc );
+    QueryResponse rsp = server.query( query );
+    
+    SolrDocumentList out = rsp.getResults();
+    assertEquals( 2, out.getNumFound() );
+    SolrDocument out1 = out.get( 0 ); 
+    SolrDocument out2 = out.get( 1 );
+    assertEquals( "111", out1.getFieldValue( "id" ) );
+    assertEquals( "222", out2.getFieldValue( "id" ) );
+    assertEquals( 1.0f, out1.getFieldValue( "score" ) );
+    assertEquals( 1.0f, out2.getFieldValue( "score" ) );
+    
+    // check that the docid is one bigger
+    int id1 = (Integer)out1.getFieldValue( "_docid_" );
+    int id2 = (Integer)out2.getFieldValue( "_docid_" );
+    assertEquals( "should be one bigger ["+id1+","+id2+"]", id1, id2-1 );
+    
+    // The score from explain should be the same as the score
+    NamedList explain = (NamedList)out1.getFieldValue( "_explain_" );
+    assertEquals( out1.get( "score"), explain.get( "value" ) );
+  }
+
  @Test
  public void testContentStreamRequest() throws Exception {
     SolrServer server = getSolrServer();
@@ -804,6 +888,7 @@ abstract public class SolrExampleTests e
    
     // Make sure it ran OK
     SolrQuery query = new SolrQuery("*:*");
+    query.set( CommonParams.FL, "id,score,_docid_" );
     QueryResponse response = server.query(query);
     assertEquals(0, response.getStatus());
     assertEquals(10, response.getResults().getNumFound());
@@ -820,6 +905,11 @@ abstract public class SolrExampleTests e
       @Override
       public void streamSolrDocument(SolrDocument doc) {
         cnt.incrementAndGet();
+        
+        // Make sure the transformer works for streaming
+        Float score = (Float)doc.get( "score" );
+        Integer docid = (Integer)doc.get( "_docid_" );
+        assertEquals( "should have score", new Float(1.0), score );
       }
      
     });

Modified: lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestCSVResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestCSVResponseWriter.java?rev=1085450&r1=1085449&r2=1085450&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestCSVResponseWriter.java (original)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestCSVResponseWriter.java Fri Mar 25 16:24:21 2011
@@ -22,7 +22,6 @@ import org.apache.solr.common.SolrDocume
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.util.DateUtil;
 import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.util.SolrPluginUtils;
 import org.junit.*;
 
 import java.io.StringWriter;
@@ -129,19 +128,19 @@ public class TestCSVResponseWriter exten
     rsp.add("response", sdl);
     QueryResponseWriter w = new CSVResponseWriter();
     
-    SolrPluginUtils.setReturnFields("id,foo_s", rsp);
+    rsp.setReturnFields( ReturnFields.getReturnFields("id,foo_s", req) );
     StringWriter buf = new StringWriter();
     w.write(buf, req, rsp);
     assertEquals("id,foo_s\n1,hi\n2,\n", buf.toString());
 
     // try scores
-    SolrPluginUtils.setReturnFields("id,score,foo_s", rsp);
+    rsp.setReturnFields( ReturnFields.getReturnFields("id,score,foo_s", req) );
     buf = new StringWriter();
     w.write(buf, req, rsp);
     assertEquals("id,score,foo_s\n1,2.718,hi\n2,89.83,\n", buf.toString());
 
     // get field values from docs... should be ordered and not include score unless requested
-    SolrPluginUtils.setReturnFields("*", rsp);
+    rsp.setReturnFields( ReturnFields.getReturnFields("*", req) );
     buf = new StringWriter();
     w.write(buf, req, rsp);
     assertEquals("id,foo_i,foo_s,foo_l,foo_b,foo_f,foo_d,foo_dt,v_ss,v2_ss\n" +
@@ -151,7 +150,7 @@ public class TestCSVResponseWriter exten
     
 
     // get field values and scores - just check that the scores are there... we don't guarantee where
-    SolrPluginUtils.setReturnFields("*,score", rsp);
+    rsp.setReturnFields( ReturnFields.getReturnFields("*,score", req) );
     buf = new StringWriter();
     w.write(buf, req, rsp);
     String s = buf.toString();

Modified: lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestRangeQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestRangeQuery.java?rev=1085450&r1=1085449&r2=1085450&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestRangeQuery.java (original)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/search/TestRangeQuery.java Fri Mar 25 16:24:21 2011
@@ -19,6 +19,7 @@ package org.apache.solr.search;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.ResultContext;
 import org.apache.solr.response.SolrQueryResponse;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -263,7 +264,9 @@ public class TestRangeQuery extends Solr
         SolrQueryResponse qr = h.queryAndResponse(handler, req);
         if (last != null) {
           // we only test if the same docs matched since some queries will include factors like idf, etc.
-          sameDocs((DocSet)qr.getValues().get("response"), (DocSet)last.getValues().get("response"));
+          DocList rA = ((ResultContext)qr.getValues().get("response")).docs;
+          DocList rB = ((ResultContext)last.getValues().get("response")).docs;
+          sameDocs( rA, rB );
         }
         req.close();
         last = qr;

Modified: lucene/dev/trunk/solr/src/webapp/src/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/webapp/src/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java?rev=1085450&r1=1085449&r2=1085450&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/webapp/src/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java (original)
+++ lucene/dev/trunk/solr/src/webapp/src/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java Fri Mar 25 16:24:21 2011
@@ -43,7 +43,9 @@ import org.apache.solr.request.SolrQuery
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.response.BinaryResponseWriter;
+import org.apache.solr.response.ResultContext;
 import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.response.transform.DocTransformer;
 import org.apache.solr.search.DocIterator;
 import org.apache.solr.search.DocList;
 import org.apache.solr.servlet.SolrRequestParsers;
@@ -164,28 +166,16 @@ public class EmbeddedSolrServer extends 
             new BinaryResponseWriter.Resolver( req, rsp.getReturnFields()) 
           {
             @Override
-            public void writeDocList(DocList ids, JavaBinCodec codec) throws IOException {
+            public void writeResults(ResultContext ctx, JavaBinCodec codec) throws IOException {
               // write an empty list...
               SolrDocumentList docs = new SolrDocumentList();
-              docs.setNumFound( ids.matches() );
-              docs.setStart( ids.offset() );
-              docs.setMaxScore( ids.maxScore() );
+              docs.setNumFound( ctx.docs.matches() );
+              docs.setStart( ctx.docs.offset() );
+              docs.setMaxScore( ctx.docs.maxScore() );
               codec.writeSolrDocumentList( docs );
               
-              int sz = ids.size();
-              
-              if(searcher == null) searcher = solrQueryRequest.getSearcher();
-              if(schema == null) schema = solrQueryRequest.getSchema(); 
-              DocIterator iterator = ids.iterator();
-              for (int i = 0; i < sz; i++) {
-                int id = iterator.nextDoc();
-                Document doc = searcher.doc(id, returnFields);
-                SolrDocument sdoc = getDoc(doc);
-                if (includeScore && ids.hasScores()) {
-                  sdoc.addField("score", iterator.score());
-                }
-                callback.streamSolrDocument( sdoc );
-              }
+              // This will transform
+              writeResultsBody( ctx, codec );
             }
           };
           
@@ -194,7 +184,7 @@ public class EmbeddedSolrServer extends 
           new JavaBinCodec(resolver) {
 
             @Override
-            public void writeSolrDocument(SolrDocument doc, Set<String> fields) throws IOException {
+            public void writeSolrDocument(SolrDocument doc) throws IOException {
               callback.streamSolrDocument( doc );
               //super.writeSolrDocument( doc, fields );
             }