Hi, JSONLoader imports java.lang.reflect.Field, but it is unused in the code. I was afraid that this one uses reflection, so I stumbled on it. Could you remove the bogus import?
Uwe ----- Uwe Schindler H.-H.-Meier-Allee 63, D-28213 Bremen http://www.thetaphi.de eMail: [email protected] > -----Original Message----- > From: [email protected] [mailto:[email protected]] > Sent: Tuesday, October 21, 2014 4:53 PM > To: [email protected] > Subject: svn commit: r1633390 - in /lucene/dev/trunk/solr: > core/src/java/org/apache/solr/handler/loader/ > core/src/java/org/apache/solr/util/xslt/ > core/src/test/org/apache/solr/handler/ example/solr/collection1/conf/ > solrj/src/test/org/apache/solr/client/solrj/e... > > Author: noble > Date: Tue Oct 21 14:53:04 2014 > New Revision: 1633390 > > URL: http://svn.apache.org/r1633390 > Log: > SOLR-6633 > > Added: > > lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/xslt/RecordingJSO > NParser.java (with props) > Modified: > > lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/JsonL > oader.java > > lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTe > st.java > lucene/dev/trunk/solr/example/solr/collection1/conf/schema.xml > lucene/dev/trunk/solr/example/solr/collection1/conf/solrconfig.xml > > lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedde > d/SolrExampleJettyTest.java > > Modified: > lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/JsonL > oader.java > URL: > http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apa > che/solr/handler/loader/JsonLoader.java?rev=1633390&r1=1633389&r2=163 > 3390&view=diff > ========================================================== > ==================== > --- > lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/JsonL > oader.java (original) > +++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/J > +++ sonLoader.java Tue Oct 21 14:53:04 2014 > @@ -16,21 +16,34 @@ package org.apache.solr.handler.loader; > * limitations under the License. > */ > > +import java.io.FilterReader; > import java.io.IOException; > import java.io.Reader; > import java.io.StringReader; > +import java.lang.reflect.Field; > +import java.nio.CharBuffer; > import java.util.ArrayList; > import java.util.Arrays; > import java.util.HashMap; > import java.util.Iterator; > +import java.util.LinkedHashMap; > import java.util.List; > +import java.util.Locale; > import java.util.Map; > +import java.util.UUID; > import java.util.concurrent.atomic.AtomicBoolean; > +import java.util.concurrent.atomic.AtomicReference; > > +import com.ctc.wstx.stax.FilteredStreamReader; > import org.apache.commons.io.IOUtils; > +import org.apache.commons.io.input.TeeInputStream; > +import org.apache.solr.common.params.CommonParams; > import org.apache.solr.common.params.SolrParams; > import org.apache.solr.common.params.UpdateParams; > import org.apache.solr.common.util.JsonRecordReader; > +import org.apache.solr.schema.SchemaField; > +import org.apache.solr.util.xslt.RecordingJSONParser; > +import org.noggit.CharArr; > import org.noggit.JSONParser; > import org.noggit.ObjectBuilder; > import org.apache.solr.common.SolrException; > @@ -50,50 +63,49 @@ import org.slf4j.Logger; import > org.slf4j.LoggerFactory; > > > - > /** > * @since solr 4.0 > */ > public class JsonLoader extends ContentStreamLoader { > - final static Logger log = LoggerFactory.getLogger( JsonLoader.class ); > + final static Logger log = LoggerFactory.getLogger(JsonLoader.class); > private static final String CHILD_DOC_KEY = "_childDocuments_"; > > @Override > public String getDefaultWT() { > return "json"; > } > - > + > @Override > public void load(SolrQueryRequest req, SolrQueryResponse rsp, > - ContentStream stream, UpdateRequestProcessor processor) throws > Exception { > - new SingleThreadedJsonLoader(req,rsp,processor).load(req, rsp, stream, > processor); > + ContentStream stream, UpdateRequestProcessor processor) > throws Exception { > + new SingleThreadedJsonLoader(req, rsp, processor).load(req, rsp, > + stream, processor); > } > > - > + > static class SingleThreadedJsonLoader extends ContentStreamLoader { > - > + > protected final UpdateRequestProcessor processor; > protected final SolrQueryRequest req; > protected SolrQueryResponse rsp; > protected JSONParser parser; > protected final int commitWithin; > protected final boolean overwrite; > - > + > public SingleThreadedJsonLoader(SolrQueryRequest req, > SolrQueryResponse rsp, UpdateRequestProcessor processor) { > this.processor = processor; > this.req = req; > this.rsp = rsp; > > commitWithin = > req.getParams().getInt(UpdateParams.COMMIT_WITHIN, -1); > - overwrite = req.getParams().getBool(UpdateParams.OVERWRITE, true); > + overwrite = req.getParams().getBool(UpdateParams.OVERWRITE, > + true); > } > - > + > @Override > - public void load(SolrQueryRequest req, > - SolrQueryResponse rsp, > - ContentStream stream, > + public void load(SolrQueryRequest req, > + SolrQueryResponse rsp, > + ContentStream stream, > UpdateRequestProcessor processor) throws Exception { > - > + > Reader reader = null; > try { > reader = stream.getReader(); > @@ -102,34 +114,32 @@ public class JsonLoader extends ContentS > log.trace("body", body); > reader = new StringReader(body); > } > - > - parser = new JSONParser(reader); > - this.processUpdate(); > - } > - finally { > + > + this.processUpdate(reader); > + } finally { > IOUtils.closeQuietly(reader); > } > } > - > + > @SuppressWarnings("fallthrough") > - void processUpdate() throws IOException > - { > + void processUpdate(Reader reader) throws IOException { > String path = (String) req.getContext().get("path"); > if(UpdateRequestHandler.DOC_PATH.equals(path) || "false".equals( > req.getParams().get("json.command"))){ > String split = req.getParams().get("split"); > String[] f = req.getParams().getParams("f"); > - handleSplitMode(split,f); > + handleSplitMode(split, f, reader); > return; > } > + parser = new JSONParser(reader); > int ev = parser.nextEvent(); > while( ev != JSONParser.EOF ) { > - > + > switch( ev ) > { > case JSONParser.ARRAY_START: > handleAdds(); > break; > - > + > case JSONParser.STRING: > if( parser.wasKey() ) { > String v = parser.getString(); @@ -167,7 +177,7 @@ public class > JsonLoader extends ContentS > break; > } > // fall through > - > + > case JSONParser.LONG: > case JSONParser.NUMBER: > case JSONParser.BIGNUMBER: > @@ -175,12 +185,12 @@ public class JsonLoader extends ContentS > case JSONParser.NULL: > log.info( "can't have a value here! " > +JSONParser.getEventString(ev)+" "+parser.getPosition() ); > - > + > case JSONParser.OBJECT_START: > case JSONParser.OBJECT_END: > case JSONParser.ARRAY_END: > break; > - > + > default: > log.info("Noggit UNKNOWN_EVENT_ID:"+ev); > break; > @@ -190,27 +200,41 @@ public class JsonLoader extends ContentS > } > } > > - private void handleSplitMode(String split, String[] fields) throws > IOException { > - if(split == null) split = "/"; > - if(fields == null || fields.length ==0) fields = new > String[]{"$FQN:/**"}; > - final boolean echo = "true".equals( req.getParams().get("echo")); > + private void handleSplitMode(String split, String[] fields, final Reader > reader) throws IOException { > + if (split == null) split = "/"; > + if (fields == null || fields.length == 0) fields = new > String[]{"$FQN:/**"}; > + final boolean echo = "true".equals(req.getParams().get("echo")); > + final String srcField = req.getParams().get("srcField"); > + final boolean mapUniqueKeyOnly = > req.getParams().getBool("mapUniqueKeyOnly",false); > + if (srcField != null) { > + if (!"/".equals(split)) > + throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, > "Raw data can be stored only if split=/"); > + parser = new RecordingJSONParser(reader); > + } else { > + parser = new JSONParser(reader); > + > + } > + > JsonRecordReader jsonRecordReader = JsonRecordReader.getInst(split, > Arrays.asList(fields)); > - jsonRecordReader.streamRecords(parser,new > JsonRecordReader.Handler() { > - ArrayList docs =null; > + jsonRecordReader.streamRecords(parser, new > JsonRecordReader.Handler() { > + ArrayList docs = null; > + > @Override > public void handle(Map<String, Object> record, String path) { > - if(echo){ > - if(docs ==null) { > + Map<String, Object> copy = getDocMap(record, parser, > + srcField, mapUniqueKeyOnly); > + > + if (echo) { > + if (docs == null) { > docs = new ArrayList(); > - rsp.add("docs",docs); > + rsp.add("docs", docs); > } > - docs.add(record); > + docs.add(copy); > } else { > AddUpdateCommand cmd = new AddUpdateCommand(req); > cmd.commitWithin = commitWithin; > cmd.overwrite = overwrite; > - cmd.solrDoc = new SolrInputDocument(); > - for (Map.Entry<String, Object> entry : record.entrySet()) { > + cmd.solrDoc = new SolrInputDocument(); > + for (Map.Entry<String, Object> entry : copy.entrySet()) { > cmd.solrDoc.setField(entry.getKey(),entry.getValue()); > } > try { > @@ -223,6 +247,37 @@ public class JsonLoader extends ContentS > }); > } > > + private Map<String, Object> getDocMap(Map<String, Object> record, > JSONParser parser, String srcField, boolean mapUniqueKeyOnly) { > + Map result = record; > + if(srcField != null && parser instanceof RecordingJSONParser){ > + //if srcFIeld specified extract it out first > + result = new LinkedHashMap(record); > + RecordingJSONParser rjp = (RecordingJSONParser) parser; > + result.put(srcField, rjp.getBuf()); > + rjp.resetBuf(); > + } > + if(mapUniqueKeyOnly){ > + SchemaField sf = req.getSchema().getUniqueKeyField(); > + if(sf == null) throw new > SolrException(SolrException.ErrorCode.BAD_REQUEST, "No uniqueKey > specified in schema"); > + String df = req.getParams().get(CommonParams.DF); > + if(df == null)throw new > SolrException(SolrException.ErrorCode.BAD_REQUEST, "No 'df' specified in > request"); > + Map copy = new LinkedHashMap(); > + String uniqueField = (String) record.get(sf.getName()); > + if(uniqueField == null) uniqueField = > UUID.randomUUID().toString().toLowerCase(Locale.ROOT); > + copy.put(sf.getName(),uniqueField); > + if(srcField != null && result.containsKey(srcField)){ > + copy.put(srcField, result.remove(srcField)); > + } > + copy.put(df, result.values()); > + result = copy; > + } > + > + > + return result; > + } > + > + > + > /*private void handleStreamingSingleDocs() throws IOException > { > while( true ) { > @@ -352,18 +407,18 @@ public class JsonLoader extends ContentS > > > > - > + > RollbackUpdateCommand parseRollback() throws IOException { > assertNextEvent( JSONParser.OBJECT_START ); > assertNextEvent( JSONParser.OBJECT_END ); > return new RollbackUpdateCommand(req); > } > - > + > void parseCommitOptions(CommitUpdateCommand cmd ) throws > IOException > { > assertNextEvent( JSONParser.OBJECT_START ); > final Map<String,Object> map = (Map)ObjectBuilder.getVal(parser); > - > + > // SolrParams currently expects string values... > SolrParams p = new SolrParams() { > @Override > @@ -371,31 +426,31 @@ public class JsonLoader extends ContentS > Object o = map.get(param); > return o == null ? null : o.toString(); > } > - > + > @Override > public String[] getParams(String param) { > return new String[]{get(param)}; > } > - > + > @Override > public Iterator<String> getParameterNamesIterator() { > return map.keySet().iterator(); > } > }; > - > + > RequestHandlerUtils.validateCommitParams(p); > p = SolrParams.wrapDefaults(p, req.getParams()); // default to the > normal request params for commit options > RequestHandlerUtils.updateCommit(cmd, p); > } > - > + > AddUpdateCommand parseAdd() throws IOException > { > AddUpdateCommand cmd = new AddUpdateCommand(req); > cmd.commitWithin = commitWithin; > cmd.overwrite = overwrite; > - > + > float boost = 1.0f; > - > + > while( true ) { > int ev = parser.nextEvent(); > if( ev == JSONParser.STRING ) { @@ -431,7 +486,7 @@ public class > JsonLoader extends ContentS > if( cmd.solrDoc == null ) { > throw new > SolrException(SolrException.ErrorCode.BAD_REQUEST,"missing solr > document. "+parser.getPosition() ); > } > - cmd.solrDoc.setDocumentBoost( boost ); > + cmd.solrDoc.setDocumentBoost( boost ); > return cmd; > } > else { > @@ -441,8 +496,8 @@ public class JsonLoader extends ContentS > } > } > } > - > - > + > + > void handleAdds() throws IOException > { > while( true ) { > @@ -458,15 +513,15 @@ public class JsonLoader extends ContentS > processor.processAdd(cmd); > } > } > - > - > + > + > int assertNextEvent(int expected ) throws IOException > { > int got = parser.nextEvent(); > assertEvent(got, expected); > return got; > } > - > + > void assertEvent(int ev, int expected) { > if( ev != expected ) { > throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, > @@ -518,14 +573,14 @@ public class JsonLoader extends ContentS > sif.setValue(val, 1.0f); > } > } > - > + > private void parseExtendedFieldValue(SolrInputField sif, int ev) throws > IOException { > assert ev == JSONParser.OBJECT_START; > - > + > float boost = 1.0f; > Object normalFieldValue = null; > Map<String, Object> extendedInfo = null; > - > + > for (;;) { > ev = parser.nextEvent(); > switch (ev) { > @@ -538,7 +593,7 @@ public class JsonLoader extends ContentS > ev != JSONParser.BIGNUMBER ) { > throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, > "boost should have number! "+JSONParser.getEventString(ev) ); > } > - > + > boost = (float)parser.getDouble(); > } else if ("value".equals(label)) { > normalFieldValue = parseNormalFieldValue(parser.nextEvent()); > @@ -553,7 +608,7 @@ public class JsonLoader extends ContentS > extendedInfo.put(label, val); > } > break; > - > + > case JSONParser.OBJECT_END: > if (extendedInfo != null) { > if (normalFieldValue != null) { > @@ -564,14 +619,14 @@ public class JsonLoader extends ContentS > sif.setValue(normalFieldValue, boost); > } > return; > - > + > default: > throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, > "Error parsing JSON extended field value. Unexpected > "+JSONParser.getEventString(ev) ); > } > } > } > - > - > + > + > private Object parseNormalFieldValue(int ev) throws IOException { > if (ev == JSONParser.ARRAY_START) { > List<Object> val = parseArrayFieldValue(ev); > @@ -581,8 +636,8 @@ public class JsonLoader extends ContentS > return val; > } > } > - > - > + > + > private Object parseSingleFieldValue(int ev) throws IOException { > switch (ev) { > case JSONParser.STRING: > @@ -604,11 +659,11 @@ public class JsonLoader extends ContentS > throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, > "Error parsing JSON field value. Unexpected > "+JSONParser.getEventString(ev) ); > } > } > - > - > + > + > private List<Object> parseArrayFieldValue(int ev) throws IOException { > assert ev == JSONParser.ARRAY_START; > - > + > ArrayList lst = new ArrayList(2); > for (;;) { > ev = parser.nextEvent(); > > Added: > lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/xslt/RecordingJSO > NParser.java > URL: > http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apa > che/solr/util/xslt/RecordingJSONParser.java?rev=1633390&view=auto > ========================================================== > ==================== > --- > lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/xslt/RecordingJSO > NParser.java (added) > +++ > lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/xslt/RecordingJSO > NParser.java Tue Oct 21 14:53:04 2014 > @@ -0,0 +1,79 @@ > +package org.apache.solr.util.xslt; > + > +/* > + * 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. > + */ > + > + > +import java.io.IOException; > +import java.io.Reader; > + > +import org.noggit.CharArr; > +import org.noggit.JSONParser; > + > +public class RecordingJSONParser extends JSONParser{ > + public RecordingJSONParser(Reader in) { super(in); } > + > + private StringBuilder sb = new StringBuilder() ; > + private long position; > + private boolean objectStarted =false; > + > + > + > + @Override > + protected int getChar() throws IOException { > + int aChar = super.getChar(); > + if(aChar == '{') objectStarted =true; > + if(getPosition() >position) recordChar((char) aChar); // check before > adding if a pushback happened ignore > + position= getPosition(); > + return aChar; > + } > + > + private void recordChar(int aChar) { > + if(objectStarted) > + sb.append((char) aChar); > + } > + private void recordStr(String s) { > + if(objectStarted) sb.append(s); > + } > + > + @Override > + public CharArr getStringChars() throws IOException { > + CharArr chars = super.getStringChars(); > + recordStr(chars.toString()); > + position = getPosition(); > + // if reading a String , the getStringChars do not return the closing > single > quote or double quote > + //so, try to capture that > + if(chars.getArray().length >=chars.getStart()+chars.size()) { > + char next = chars.getArray()[chars.getStart() + chars.size()]; > + if(next =='"' || next == '\'') { > + recordChar(next); > + } > + } > + return chars; > + } > + > + public void resetBuf(){ > + sb = new StringBuilder(); > + objectStarted=false; > + } > + > + > + public String getBuf() { > + if(sb != null) return sb.toString(); > + return null; > + } > +} > > Modified: > lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTe > st.java > URL: > http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apa > che/solr/handler/JsonLoaderTest.java?rev=1633390&r1=1633389&r2=163339 > 0&view=diff > ========================================================== > ==================== > --- > lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTe > st.java (original) > +++ > lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTe > st.java Tue Oct 21 14:53:04 2014 > @@ -31,6 +31,7 @@ import org.apache.solr.update.DeleteUpda > import org.apache.solr.update.processor.BufferingRequestProcessor; > import org.junit.BeforeClass; > import org.junit.Test; > +import org.noggit.ObjectBuilder; > import org.xml.sax.SAXException; > > import java.math.BigDecimal; > @@ -276,7 +277,8 @@ public class JsonLoaderTest extends Solr > " \"f1\": \"v2\",\n" + > " \"f2\": null\n" + > " }\n"; > - SolrQueryRequest req = req("json.command","false"); > + SolrQueryRequest req = req("srcField","_src"); > + req.getContext().put("path","/update/json/docs"); > SolrQueryResponse rsp = new SolrQueryResponse(); > BufferingRequestProcessor p = new BufferingRequestProcessor(null); > JsonLoader loader = new JsonLoader(); > @@ -284,25 +286,26 @@ public class JsonLoaderTest extends Solr > assertEquals( 2, p.addCommands.size() ); > doc = "\n" + > "\n" + > - "{bool: true,\n" + > - " f0: \"v0\",\n" + > - " f2: {\n" + > + "{\"bool\": true,\n" + > + " \"f0\": \"v0\",\n" + > + " \"f2\": {\n" + > " \t \"boost\": 2.3,\n" + > " \t \"value\": \"test\"\n" + > " \t },\n" + > - "array: [ \"aaa\", \"bbb\" ],\n" + > - "boosted: {\n" + > + "\"array\": [ \"aaa\", \"bbb\" ],\n" + > + "\"boosted\": {\n" + > " \t \"boost\": 6.7,\n" + > " \t \"value\": [ \"aaa\", \"bbb\" ]\n" + > " \t }\n" + > " }\n" + > "\n" + > "\n" + > - " {f1: \"v1\",\n" + > - " f1: \"v2\",\n" + > - " f2: null\n" + > + " {\"f1\": \"v1\",\n" + > + " \"f2\": \"v2\",\n" + > + " \"f3\": null\n" + > " }\n"; > - req = req("json.command","false"); > + req = req("srcField","_src"); > + req.getContext().put("path","/update/json/docs"); > rsp = new SolrQueryResponse(); > p = new BufferingRequestProcessor(null); > loader = new JsonLoader(); > @@ -310,15 +313,40 @@ public class JsonLoaderTest extends Solr > > assertEquals( 2, p.addCommands.size() ); > > + String content = (String) > p.addCommands.get(0).solrDoc.getFieldValue("_src"); > + assertNotNull(content); > + Map obj = (Map) ObjectBuilder.fromJSON(content); > + assertEquals(Boolean.TRUE, obj.get("bool")); > + assertEquals("v0", obj.get("f0")); > + assertNotNull(obj.get("f0")); > + assertNotNull(obj.get("array")); > + assertNotNull(obj.get("boosted")); > + > + content = (String) p.addCommands.get(1).solrDoc.getFieldValue("_src"); > + assertNotNull(content); > + obj = (Map) ObjectBuilder.fromJSON(content); > + assertEquals("v1", obj.get("f1")); > + assertEquals("v2", obj.get("f2")); > + assertTrue(obj.containsKey("f3")); > > doc = "[{'id':'1'},{'id':'2'}]".replace('\'', '"'); > - req = req("json.command","false"); > + req = req("srcField","_src"); > + req.getContext().put("path","/update/json/docs"); > rsp = new SolrQueryResponse(); > p = new BufferingRequestProcessor(null); > loader = new JsonLoader(); > loader.load(req, rsp, new ContentStreamBase.StringStream(doc), p); > assertEquals( 2, p.addCommands.size() ); > > + content = (String) p.addCommands.get(0).solrDoc.getFieldValue("_src"); > + assertNotNull(content); > + obj = (Map) ObjectBuilder.fromJSON(content); > + assertEquals("1", obj.get("id")); > + content = (String) p.addCommands.get(1).solrDoc.getFieldValue("_src"); > + assertNotNull(content); > + obj = (Map) ObjectBuilder.fromJSON(content); > + assertEquals("2", obj.get("id")); > + > > } > > > Modified: lucene/dev/trunk/solr/example/solr/collection1/conf/schema.xml > URL: > http://svn.apache.org/viewvc/lucene/dev/trunk/solr/example/solr/collectio > n1/conf/schema.xml?rev=1633390&r1=1633389&r2=1633390&view=diff > ========================================================== > ==================== > --- lucene/dev/trunk/solr/example/solr/collection1/conf/schema.xml > (original) > +++ lucene/dev/trunk/solr/example/solr/collection1/conf/schema.xml Tue > Oct 21 14:53:04 2014 > @@ -156,6 +156,7 @@ > <field name="content_type" type="string" indexed="true" stored="true" > multiValued="true"/> > <field name="last_modified" type="date" indexed="true" stored="true"/> > <field name="links" type="string" indexed="true" stored="true" > multiValued="true"/> > + <field name="_src" type="string" indexed="false" stored="true"/> > > <!-- Main body of document extracted by SolrCell. > NOTE: This field is not indexed by default, since it is also copied > to "text" > > Modified: > lucene/dev/trunk/solr/example/solr/collection1/conf/solrconfig.xml > URL: > http://svn.apache.org/viewvc/lucene/dev/trunk/solr/example/solr/collectio > n1/conf/solrconfig.xml?rev=1633390&r1=1633389&r2=1633390&view=diff > ========================================================== > ==================== > --- lucene/dev/trunk/solr/example/solr/collection1/conf/solrconfig.xml > (original) > +++ lucene/dev/trunk/solr/example/solr/collection1/conf/solrconfig.xml > Tue Oct 21 14:53:04 2014 > @@ -1057,6 +1057,19 @@ > <str name="df">text</str> > </lst> > </initParams> > + > + <initParams path="/update/json/docs"> > + <lst name="defaults"> > + <!--this ensures that the entire json doc will be stored verbatim into > one > field--> > + <str name="srcField">_src</str> > + <!--This means a the uniqueKeyField will be extracted from the fields > and > + all fields go into the 'df' field. In this config df is already > configured to be > 'text' > + --> > + <str name="mapUniqueKeyOnly">true</str> > + </lst> > + > + </initParams> > + > <!-- The following are implicitly added > <requestHandler name="/update/json" > class="solr.UpdateRequestHandler"> > <lst name="defaults"> > > Modified: > lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedde > d/SolrExampleJettyTest.java > URL: > http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apa > che/solr/client/solrj/embedded/SolrExampleJettyTest.java?rev=1633390&r1 > =1633389&r2=1633390&view=diff > ========================================================== > ==================== > --- > lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedde > d/SolrExampleJettyTest.java (original) > +++ > lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/embedde > d/SolrExampleJettyTest.java Tue Oct 21 14:53:04 2014 > @@ -17,13 +17,24 @@ > > package org.apache.solr.client.solrj.embedded; > > +import java.io.ByteArrayInputStream; > +import java.util.Map; > + > +import org.apache.http.HttpResponse; > +import org.apache.http.client.HttpClient; > +import org.apache.http.client.methods.HttpPost; > +import org.apache.http.entity.InputStreamEntity; > import org.apache.solr.SolrTestCaseJ4.SuppressSSL; > import org.apache.solr.client.solrj.SolrExampleTests; > +import org.apache.solr.client.solrj.SolrQuery; > import org.apache.solr.client.solrj.impl.HttpSolrServer; > +import org.apache.solr.client.solrj.response.QueryResponse; > +import org.apache.solr.common.SolrDocument; > import org.apache.solr.util.ExternalPaths; > import org.junit.Assert; > import org.junit.BeforeClass; > import org.junit.Test; > +import org.noggit.ObjectBuilder; > > /** > * TODO? perhaps use: > @@ -52,4 +63,36 @@ public class SolrExampleJettyTest extend > // expected > } > } > + > + @Test > + public void testArbitraryJsonIndexing() throws Exception { > + HttpSolrServer server = (HttpSolrServer) getSolrServer(); > + server.deleteByQuery("*:*"); > + server.commit(); > + assertNumFound("*:*", 0); // make sure it got in > + > + // two docs, one with uniqueKey, another without it > + String json = "{\"id\":\"abc1\", \"name\": \"name1\"} {\"name\" : > \"name2\"}"; > + HttpClient httpClient = server.getHttpClient(); > + HttpPost post = new HttpPost(server.getBaseURL() + > "/update/json/docs"); > + post.setHeader("Content-Type", "application/json"); > + post.setEntity(new InputStreamEntity(new > ByteArrayInputStream(json.getBytes("UTF-8")), -1)); > + HttpResponse response = httpClient.execute(post); > + assertEquals(200, response.getStatusLine().getStatusCode()); > + server.commit(); > + QueryResponse rsp = getSolrServer().query(new SolrQuery("*:*")); > + assertEquals(2,rsp.getResults().getNumFound()); > + > + SolrDocument doc = rsp.getResults().get(0); > + String src = (String) doc.getFieldValue("_src"); > + Map m = (Map) ObjectBuilder.fromJSON(src); > + assertEquals("abc1",m.get("id")); > + assertEquals("name1",m.get("name")); > + > + doc = rsp.getResults().get(1); > + src = (String) doc.getFieldValue("_src"); > + m = (Map) ObjectBuilder.fromJSON(src); > + assertEquals("name2",m.get("name")); > + > + } > } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
