mirror of https://github.com/apache/lucene.git
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:
parent
d7491ea757
commit
5c1f81c1a0
|
@ -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
|
||||
----------------------
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue