SOLR-2307: fix bug in PHPSerializedResponseWriter (wt=phps) when dealing with SolrDocumentList objects -- ie: sharded queries

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1060585 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Chris M. Hostetter 2011-01-18 21:30:33 +00:00
parent d7491ea757
commit 5c1f81c1a0
4 changed files with 198 additions and 16 deletions

View File

@ -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
----------------------

View File

@ -32,7 +32,8 @@ import org.apache.solr.schema.SchemaField;
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/
@ -200,6 +201,96 @@ class PHPSerializedWriter extends JSONWriter {
writeMapCloser();
}
@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);

View File

@ -65,21 +65,6 @@ public class JSONWriterTest extends SolrTestCaseJ4 {
req.close();
}
@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");

View File

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