You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2011/01/18 22:30:33 UTC

svn commit: r1060585 - in /lucene/dev/trunk/solr: CHANGES.txt src/java/org/apache/solr/response/PHPSerializedResponseWriter.java src/test/org/apache/solr/request/JSONWriterTest.java src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java

Author: hossman
Date: Tue Jan 18 21:30:33 2011
New Revision: 1060585

URL: http://svn.apache.org/viewvc?rev=1060585&view=rev
Log:
SOLR-2307: fix bug in PHPSerializedResponseWriter (wt=phps) when dealing with SolrDocumentList objects -- ie: sharded queries

Added:
    lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java   (with props)
Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/src/java/org/apache/solr/response/PHPSerializedResponseWriter.java
    lucene/dev/trunk/solr/src/test/org/apache/solr/request/JSONWriterTest.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1060585&r1=1060584&r2=1060585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Jan 18 21:30:33 2011
@@ -152,6 +152,11 @@ Bug Fixes
 * SOLR-2275: fix DisMax 'mm' parsing to be tolerant of whitespace
   (Erick Erickson via hossman)
 
+* SOLR-2307: fix bug in PHPSerializedResponseWriter (wt=phps) when
+  dealing with SolrDocumentList objects -- ie: sharded queries.
+  (Antonio Verni via hossman)
+  
+
 Other Changes
 ----------------------
 

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/response/PHPSerializedResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/response/PHPSerializedResponseWriter.java?rev=1060585&r1=1060584&r2=1060585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/response/PHPSerializedResponseWriter.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/response/PHPSerializedResponseWriter.java Tue Jan 18 21:30:33 2011
@@ -32,7 +32,8 @@ import org.apache.solr.schema.SchemaFiel
 import org.apache.solr.search.DocIterator;
 import org.apache.solr.search.DocList;
 import org.apache.solr.search.SolrIndexSearcher;
-
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
 /**
  * A description of the PHP serialization format can be found here:
  * http://www.hurring.com/scott/code/perl/serialize/
@@ -201,6 +202,96 @@ class PHPSerializedWriter extends JSONWr
   }
   
   @Override
+  public void writeSolrDocument(String name, SolrDocument doc, Set<String> returnFields, Map pseudoFields) throws IOException {
+    HashMap <String,Object> single = new HashMap<String, Object>();
+    HashMap <String,Object> multi = new HashMap<String, Object>();
+    int pseudoSize = pseudoFields != null ? pseudoFields.size() : 0;
+
+    for (String fname : doc.getFieldNames()) {
+      if(returnFields != null && !returnFields.contains(fname)){
+        continue;
+      }
+
+      Object val = doc.getFieldValue(fname);
+      SchemaField sf = schema.getFieldOrNull(fname);
+      if (sf != null && sf.multiValued()) {
+        multi.put(fname, val);
+      }else{
+        single.put(fname, val);
+      }
+    }
+
+    writeMapOpener(single.size() + multi.size() + pseudoSize);
+    for(String fname: single.keySet()){
+      Object val = single.get(fname);
+      writeKey(fname, true);
+      writeVal(fname, val);
+    }
+    
+    for(String fname: multi.keySet()){
+      writeKey(fname, true);
+
+      Object val = multi.get(fname);
+      if (!(val instanceof Collection)) {
+        // should never be reached if multivalued fields are stored as a Collection
+        // so I'm assuming a size of 1 just to wrap the single value
+        writeArrayOpener(1);
+        writeVal(fname, val);
+        writeArrayCloser();
+      }else{
+        writeVal(fname, val);
+      }
+    }
+
+    if (pseudoSize > 0) {
+      writeMap(null,pseudoFields,true, false);
+    }
+    writeMapCloser();
+  }
+
+
+  @Override
+  public void writeSolrDocumentList(String name, SolrDocumentList docs, Set<String> fields, Map otherFields) throws IOException {
+    boolean includeScore=false;
+    if (fields!=null) {
+      includeScore = fields.contains("score");
+      if (fields.size()==0 || (fields.size()==1 && includeScore) || fields.contains("*")) {
+        fields=null;  // null means return all stored fields
+      }
+    }
+
+    int sz = docs.size();
+
+    writeMapOpener(includeScore ? 4 : 3);
+
+    writeKey("numFound",false);
+    writeLong(null,docs.getNumFound());
+
+    writeKey("start",false);
+    writeLong(null,docs.getStart());
+
+    if (includeScore && docs.getMaxScore() != null) {
+      writeKey("maxScore",false);
+      writeFloat(null,docs.getMaxScore());
+    }
+
+    writeKey("docs",false);
+
+    writeArrayOpener(sz);
+    for (int i=0; i<sz; i++) {
+      writeKey(i, false);
+      writeSolrDocument(null, docs.get(i), fields, otherFields);
+    }
+    writeArrayCloser();
+
+    if (otherFields !=null) {
+      writeMap(null, otherFields, true, false);
+    }
+    writeMapCloser();
+  }
+
+  
+  @Override
   public void writeArray(String name, Object[] val) throws IOException {
     writeMapOpener(val.length);
     for(int i=0; i < val.length; i++) {

Modified: lucene/dev/trunk/solr/src/test/org/apache/solr/request/JSONWriterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/request/JSONWriterTest.java?rev=1060585&r1=1060584&r2=1060585&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/request/JSONWriterTest.java (original)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/request/JSONWriterTest.java Tue Jan 18 21:30:33 2011
@@ -66,21 +66,6 @@ public class JSONWriterTest extends Solr
   }
 
   @Test
-  public void testPHPS() throws IOException {
-    SolrQueryRequest req = req("dummy");
-    SolrQueryResponse rsp = new SolrQueryResponse();
-    QueryResponseWriter w = new PHPSerializedResponseWriter();
-
-    StringWriter buf = new StringWriter();
-    rsp.add("data1", "hello");
-    rsp.add("data2", 42);
-    rsp.add("data3", true);
-    w.write(buf, req, rsp);
-    assertEquals(buf.toString(), "a:3:{s:5:\"data1\";s:5:\"hello\";s:5:\"data2\";i:42;s:5:\"data3\";b:1;}");
-    req.close();
-  }
-
-  @Test
   public void testJSON() throws IOException {
     SolrQueryRequest req = req("wt","json","json.nl","arrarr");
     SolrQueryResponse rsp = new SolrQueryResponse();

Added: lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java?rev=1060585&view=auto
==============================================================================
--- lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java (added)
+++ lucene/dev/trunk/solr/src/test/org/apache/solr/response/TestPHPSerializedResponseWriter.java Tue Jan 18 21:30:33 2011
@@ -0,0 +1,101 @@
+/**
+ * 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;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.HashMap;
+
+import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.response.PHPSerializedResponseWriter;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.QueryResponseWriter;
+import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/** 
+ * Basic PHPS tests based on JSONWriterTest
+ *
+ */
+public class TestPHPSerializedResponseWriter extends SolrTestCaseJ4 {
+  @BeforeClass
+  public static void beforeClass() throws Exception {
+    initCore("solrconfig.xml","schema.xml");
+  }
+
+  @Test
+  public void testSimple() throws IOException {
+    SolrQueryRequest req = req("dummy");
+    SolrQueryResponse rsp = new SolrQueryResponse();
+    QueryResponseWriter w = new PHPSerializedResponseWriter();
+
+    StringWriter buf = new StringWriter();
+    rsp.add("data1", "hello");
+    rsp.add("data2", 42);
+    rsp.add("data3", true);
+    w.write(buf, req, rsp);
+    assertEquals(buf.toString(), "a:3:{s:5:\"data1\";s:5:\"hello\";s:5:\"data2\";i:42;s:5:\"data3\";b:1;}");
+    req.close();
+  }
+
+  
+  @Test
+  public void testSolrDocuments() throws IOException {
+    SolrQueryRequest req = req("q","*:*");
+    SolrQueryResponse rsp = new SolrQueryResponse();
+    QueryResponseWriter w = new PHPSerializedResponseWriter();
+    StringWriter buf = new StringWriter();
+
+    SolrDocument d = new SolrDocument();
+
+    SolrDocument d1 = d;
+    d.addField("id","1");
+    d.addField("data1","hello");
+    d.addField("data2",42);
+    d.addField("data3",true);
+
+    // multivalued fields: 
+    // map value
+    HashMap<String,String> nl = new HashMap<String,String>();
+    nl.put("data4.1", "hello");
+    nl.put("data4.2", "hashmap");
+    d.addField("data4",nl);
+    // array value 
+    d.addField("data5",Arrays.asList("data5.1", "data5.2", "data5.3"));
+
+    // adding one more document to test array indexes
+    d = new SolrDocument();
+    SolrDocument d2 = d;
+    d.addField("id","2");
+
+    SolrDocumentList sdl = new SolrDocumentList();
+    sdl.add(d1);
+    sdl.add(d2);
+    rsp.add("response", sdl); 
+    
+    w.write(buf, req, rsp);
+    assertEquals(buf.toString(), "a:1:{s:8:\"response\";a:3:{s:8:\"numFound\";i:0;s:5:\"start\";i:0;s:4:\"docs\";a:2:{i:0;a:6:{s:2:\"id\";s:1:\"1\";s:5:\"data1\";s:5:\"hello\";s:5:\"data4\";a:2:{s:7:\"data4.2\";s:7:\"hashmap\";s:7:\"data4.1\";s:5:\"hello\";}s:5:\"data5\";a:3:{i:0;s:7:\"data5.1\";i:1;s:7:\"data5.2\";i:2;s:7:\"data5.3\";}s:5:\"data2\";i:42;s:5:\"data3\";b:1;}i:1;a:1:{s:2:\"id\";s:1:\"2\";}}}}");
+    req.close();
+  }
+
+}