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();
+ }
+
+}