You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2019/09/02 03:47:54 UTC

[lucene-solr] 01/01: initial commit

This is an automated email from the ASF dual-hosted git repository.

noble pushed a commit to branch jira/SOLR-13731
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 185894b029a550bcbdf5f643c27c4eda07260d9c
Author: noble <no...@apache.org>
AuthorDate: Mon Sep 2 13:47:28 2019 +1000

    initial commit
---
 .../solrj/request/JavaBinUpdateRequestCodec.java   |  65 +++++++++--
 .../solr/common/ConditionalKeyMapWriter.java       |  88 ++++++++++++++
 .../org/apache/solr/common/SolrInputDocument.java  |   5 +
 .../apache/solr/common/params/CommonParams.java    |   4 +-
 .../org/apache/solr/common/util/JavaBinCodec.java  |   6 +-
 .../org/apache/solr/common/util/NamedList.java     |   6 +
 .../solrj/request/TestUpdateRequestCodec.java      | 129 +++++++++++++--------
 7 files changed, 239 insertions(+), 64 deletions(-)

diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
index 05d955e..961cbe0 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
@@ -40,13 +40,13 @@ import org.apache.solr.common.util.NamedList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.solr.common.params.CommonParams.CHILDDOC;
 import static org.apache.solr.common.util.ByteArrayUtf8CharSequence.convertCharSeq;
 
 /**
  * Provides methods for marshalling an UpdateRequest to a NamedList which can be serialized in the javabin format and
  * vice versa.
  *
- *
  * @see org.apache.solr.common.util.JavaBinCodec
  * @since solr 1.4
  */
@@ -67,7 +67,6 @@ public class JavaBinUpdateRequestCodec {
    *
    * @param updateRequest the UpdateRequest to be written out
    * @param os            the OutputStream to which the request is to be written
-   *
    * @throws IOException in case of an exception during marshalling or writing to the stream
    */
   public void marshal(UpdateRequest updateRequest, OutputStream os) throws IOException {
@@ -78,11 +77,11 @@ public class JavaBinUpdateRequestCodec {
     }
     Iterator<SolrInputDocument> docIter = null;
 
-    if(updateRequest.getDocIterator() != null){
+    if (updateRequest.getDocIterator() != null) {
       docIter = updateRequest.getDocIterator();
     }
-    
-    Map<SolrInputDocument,Map<String,Object>> docMap = updateRequest.getDocumentsMap();
+
+    Map<SolrInputDocument, Map<String, Object>> docMap = updateRequest.getDocumentsMap();
 
     nl.add("params", params);// 0: params
     if (updateRequest.getDeleteByIdMap() != null) {
@@ -125,7 +124,7 @@ public class JavaBinUpdateRequestCodec {
     try (JavaBinCodec codec = new StreamingCodec(namedList, updateRequest, handler)) {
       codec.unmarshal(is);
     }
-    
+
     // NOTE: if the update request contains only delete commands the params
     // must be loaded now
     if(updateRequest.getParams()==null) {
@@ -145,11 +144,11 @@ public class JavaBinUpdateRequestCodec {
     } else {
       docMap = (List<Entry<SolrInputDocument, Map<Object, Object>>>) docsMapObj;
     }
-    
+
 
     // we don't add any docs, because they were already processed
     // deletes are handled later, and must be passed back on the UpdateRequest
-    
+
     if (delById != null) {
       for (String s : delById) {
         updateRequest.deleteById(s);
@@ -167,7 +166,7 @@ public class JavaBinUpdateRequestCodec {
         } else {
           updateRequest.deleteById(entry.getKey());
         }
-  
+
       }
     }
     if (delByQ != null) {
@@ -175,7 +174,7 @@ public class JavaBinUpdateRequestCodec {
         updateRequest.deleteByQuery(s);
       }
     }
-    
+
     return updateRequest;
   }
 
@@ -219,8 +218,17 @@ public class JavaBinUpdateRequestCodec {
     }
 
     @Override
+    public Object unmarshal(InputStream is) throws IOException {
+      try {
+        return super.unmarshal(is);
+      } finally {
+        if (namedList[0] == null) namedList[0] = new NamedList();
+      }
+    }
+
+    @Override
     protected SolrInputDocument createSolrInputDocument(int sz) {
-      return new MaskCharSequenceSolrInputDoc(new LinkedHashMap(sz));
+      return new MaskCharSequenceSolrInputDoc(sz == -1 ? new LinkedHashMap<>() : new LinkedHashMap(sz));
     }
 
     @Override
@@ -282,7 +290,12 @@ public class JavaBinUpdateRequestCodec {
 
 
     private List readOuterMostDocIterator(DataInputInputStream fis) throws IOException {
-      NamedList params = (NamedList) namedList[0].get("params");
+      NamedList namedList = this.namedList[0];
+      NamedList params = null;
+      if(namedList != null) {
+        params = (NamedList) namedList.get("params");
+      }
+      if(params == null) params = new NamedList();
       updateRequest.setParams(new ModifiableSolrParams(params.toSolrParams()));
       if (handler == null) return super.readIterator(fis);
       Integer commitWithin = null;
@@ -313,6 +326,8 @@ public class JavaBinUpdateRequestCodec {
               commitWithin = (Integer) p.get(UpdateRequest.COMMIT_WITHIN);
               overwrite = (Boolean) p.get(UpdateRequest.OVERWRITE);
             }
+          } else if (o instanceof Map) {
+            sdoc = convertMapToSolrInputDoc((Map) o);
           } else {
             sdoc = (SolrInputDocument) o;
           }
@@ -333,5 +348,31 @@ public class JavaBinUpdateRequestCodec {
       }
     }
 
+    @Override
+    protected Map newMap(int size) {
+      return new NamedList<>().asShallowMap(true);
+    }
+
+    private SolrInputDocument convertMapToSolrInputDoc(Map m) {
+      SolrInputDocument result = createSolrInputDocument(m.size());
+      m.forEach((k, v) -> {
+        if(CHILDDOC.equals(k.toString())){
+          if (v instanceof List) {
+            List list = (List) v;
+            for (Object o : list) {
+              if (o instanceof Map) {
+                result.addChildDocument(convertMapToSolrInputDoc((Map) o));
+              }
+            }
+          } else if(v instanceof Map){
+            result.addChildDocument(convertMapToSolrInputDoc((Map) v));
+          }
+        } else {
+          result.addField(k.toString(), v);
+        }
+      });
+      return result;
+    }
+
   }
 }
diff --git a/solr/solrj/src/java/org/apache/solr/common/ConditionalKeyMapWriter.java b/solr/solrj/src/java/org/apache/solr/common/ConditionalKeyMapWriter.java
new file mode 100644
index 0000000..fa6c1c9
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/common/ConditionalKeyMapWriter.java
@@ -0,0 +1,88 @@
+/*
+ * 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.common;
+
+import java.io.IOException;
+import java.util.Set;
+import java.util.function.Predicate;
+
+public class ConditionalKeyMapWriter implements MapWriter {
+  private final MapWriter delegate;
+  private final Predicate<CharSequence> predicate;
+
+  public ConditionalKeyMapWriter(MapWriter delegate, Predicate<CharSequence> predicate) {
+    this.delegate = delegate;
+    this.predicate = predicate;
+  }
+
+  public static class EntryWriterWrapper implements EntryWriter {
+    private final EntryWriter delegate;
+    private final Predicate<CharSequence> predicate;
+
+    public EntryWriterWrapper(EntryWriter delegate, Predicate<CharSequence> predicate) {
+      this.delegate = delegate;
+      this.predicate = predicate;
+    }
+
+    @Override
+    public EntryWriter put(CharSequence k, Object v) throws IOException {
+      if (predicate.test(k)) delegate.put(k, v);
+      return this;
+    }
+
+    @Override
+    public EntryWriter put(CharSequence k, int v) throws IOException {
+      if (predicate.test(k)) delegate.put(k, v);
+      return this;
+    }
+
+    @Override
+    public EntryWriter put(CharSequence k, long v) throws IOException {
+      if (predicate.test(k)) delegate.put(k, v);
+      return this;
+    }
+
+    @Override
+    public EntryWriter put(CharSequence k, float v) throws IOException {
+      if (predicate.test(k)) delegate.put(k, v);
+      return this;
+    }
+
+    @Override
+    public EntryWriter put(CharSequence k, double v) throws IOException {
+      if (predicate.test(k)) delegate.put(k, v);
+      return this;
+    }
+
+    @Override
+    public EntryWriter put(CharSequence k, boolean v) throws IOException {
+      if (predicate.test(k)) delegate.put(k, v);
+      return this;
+    }
+  }
+
+  @Override
+  public void writeMap(EntryWriter ew) throws IOException {
+    if (delegate != null) delegate.writeMap(new EntryWriterWrapper(ew, predicate));
+  }
+
+  public static Predicate<CharSequence> dedupeKeyPredicate(Set<CharSequence> keys) {
+    return (k) -> keys.add(k);
+  }
+
+}
diff --git a/solr/solrj/src/java/org/apache/solr/common/SolrInputDocument.java b/solr/solrj/src/java/org/apache/solr/common/SolrInputDocument.java
index 0c86817..d232c1b 100644
--- a/solr/solrj/src/java/org/apache/solr/common/SolrInputDocument.java
+++ b/solr/solrj/src/java/org/apache/solr/common/SolrInputDocument.java
@@ -26,6 +26,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.BiConsumer;
 
+import org.apache.solr.common.params.CommonParams;
+
 /**
  * Represent the field-value information needed to construct and index
  * a Lucene Document.  Like the SolrDocument, the field values should
@@ -57,6 +59,9 @@ public class SolrInputDocument extends SolrDocumentBase<SolrInputField, SolrInpu
       bc.accept(k, o);
     };
     _fields.forEach(wrapper);
+    if(_childDocuments!= null){
+      ew.put(CommonParams.CHILDDOC , _childDocuments);
+    }
   }
 
   public SolrInputDocument(Map<String,SolrInputField> fields) {
diff --git a/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java b/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java
index d0c85a8..60b685f 100644
--- a/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java
+++ b/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java
@@ -231,7 +231,7 @@ public interface CommonParams {
       }
       return null;
     }
-  };
+  }
 
   /** which parameters to log (if not supplied all parameters will be logged) **/
   String LOG_PARAMS_LIST = "logParamsList";
@@ -295,5 +295,7 @@ public interface CommonParams {
 
   String PACKAGE = "package";
 
+  String CHILDDOC = "_childDocuments_";
+
 }
 
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
index 7d6f2e4..261e42d 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
@@ -38,7 +38,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.BiConsumer;
 import java.util.function.Function;
 
-import org.apache.solr.common.ConditionalMapWriter;
+import org.apache.solr.common.ConditionalKeyMapWriter;
 import org.apache.solr.common.EnumFieldValue;
 import org.apache.solr.common.IteratorWriter;
 import org.apache.solr.common.IteratorWriter.ItemWriter;
@@ -531,7 +531,7 @@ public class JavaBinCodec implements PushWriter {
   //use this to ignore the writable interface because , child docs will ignore the fl flag
   // is it a good design?
   private boolean ignoreWritable =false;
-  private ConditionalMapWriter.EntryWriterWrapper cew;
+  private MapWriter.EntryWriter cew;
 
   public void writeSolrDocument(SolrDocument doc) throws IOException {
     List<SolrDocument> children = doc.getChildDocuments();
@@ -546,7 +546,7 @@ public class JavaBinCodec implements PushWriter {
     int sz = fieldsCount + (children==null ? 0 : children.size());
     writeTag(SOLRDOC);
     writeTag(ORDERED_MAP, sz);
-    if (cew == null) cew = new ConditionalMapWriter.EntryWriterWrapper(ew, (k, o) -> toWrite(k.toString()));
+    if (cew == null) cew = new ConditionalKeyMapWriter.EntryWriterWrapper(ew, (k) -> toWrite(k.toString()));
     doc.writeMap(cew);
     if (children != null) {
       try {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java b/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
index ec40f97..a853c43 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
@@ -417,6 +417,9 @@ public class NamedList<T> implements Cloneable, Serializable, Iterable<Map.Entry
   }
 
   public Map<String,T> asShallowMap() {
+    return asShallowMap(false);
+  }
+  public Map<String,T> asShallowMap(boolean allowDps) {
     return new Map<String, T>() {
       @Override
       public int size() {
@@ -444,6 +447,9 @@ public class NamedList<T> implements Cloneable, Serializable, Iterable<Map.Entry
 
       @Override
       public T put(String  key, T value) {
+        if(allowDps){
+          NamedList.this.add(key, value);
+        }
         int idx = NamedList.this.indexOf(key, 0);
         if (idx == -1) {
           NamedList.this.add(key, value);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestUpdateRequestCodec.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestUpdateRequestCodec.java
index 71466d6..b44c1ef 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestUpdateRequestCodec.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestUpdateRequestCodec.java
@@ -18,28 +18,33 @@ package org.apache.solr.client.solrj.request;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import junit.framework.Assert;
-
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.common.IteratorWriter;
+import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
+import org.apache.solr.common.util.JavaBinCodec;
+import org.apache.solr.common.util.Utils;
 import org.junit.Test;
 
+import static org.apache.solr.common.params.CommonParams.CHILDDOC;
+
 /**
  * Test for UpdateRequestCodec
  *
- * @since solr 1.4
- *
  * @see org.apache.solr.client.solrj.request.UpdateRequest
+ * @since solr 1.4
  */
 public class TestUpdateRequestCodec extends SolrTestCase {
 
@@ -74,7 +79,7 @@ public class TestUpdateRequestCodec extends SolrTestCase {
     Collection<String> foobar = new HashSet<>();
     foobar.add("baz1");
     foobar.add("baz2");
-    doc.addField("foobar",foobar);
+    doc.addField("foobar", foobar);
     updateRequest.add(doc);
 
 //    updateRequest.setWaitFlush(true);
@@ -84,15 +89,12 @@ public class TestUpdateRequestCodec extends SolrTestCase {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     codec.marshal(updateRequest, baos);
     final List<SolrInputDocument> docs = new ArrayList<>();
-    JavaBinUpdateRequestCodec.StreamingUpdateHandler handler = new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
-      @Override
-      public void update(SolrInputDocument document, UpdateRequest req, Integer commitWithin, Boolean overwrite) {
-        Assert.assertNotNull(req.getParams());
-        docs.add(document);
-      }
+    JavaBinUpdateRequestCodec.StreamingUpdateHandler handler = (document, req, commitWithin, overwrite) -> {
+      Assert.assertNotNull(req.getParams());
+      docs.add(document);
     };
 
-    UpdateRequest updateUnmarshalled = codec.unmarshal(new ByteArrayInputStream(baos.toByteArray()) ,handler);
+    UpdateRequest updateUnmarshalled = codec.unmarshal(new ByteArrayInputStream(baos.toByteArray()), handler);
 
     for (SolrInputDocument document : docs) {
       updateUnmarshalled.add(document);
@@ -100,12 +102,12 @@ public class TestUpdateRequestCodec extends SolrTestCase {
     for (int i = 0; i < updateRequest.getDocuments().size(); i++) {
       SolrInputDocument inDoc = updateRequest.getDocuments().get(i);
       SolrInputDocument outDoc = updateUnmarshalled.getDocuments().get(i);
-      compareDocs("doc#"+i, inDoc, outDoc);
+      compareDocs("doc#" + i, inDoc, outDoc);
     }
-    Assert.assertEquals(updateUnmarshalled.getDeleteById().get(0) , 
-                        updateRequest.getDeleteById().get(0));
-    Assert.assertEquals(updateUnmarshalled.getDeleteQuery().get(0) , 
-                        updateRequest.getDeleteQuery().get(0));
+    Assert.assertEquals(updateUnmarshalled.getDeleteById().get(0),
+        updateRequest.getDeleteById().get(0));
+    Assert.assertEquals(updateUnmarshalled.getDeleteQuery().get(0),
+        updateRequest.getDeleteQuery().get(0));
 
     assertEquals("b", updateUnmarshalled.getParams().get("a"));
   }
@@ -125,10 +127,7 @@ public class TestUpdateRequestCodec extends SolrTestCase {
     doc.addField("desc", "one");
     // imagine someone adding a custom Bean that implements Iterable 
     // but is not a Collection
-    doc.addField("iter", new Iterable<String>() { 
-        @Override
-        public Iterator<String> iterator() { return values.iterator(); } 
-      });
+    doc.addField("iter", (Iterable<String>) values::iterator);
     doc.addField("desc", "1");
     updateRequest.add(doc);
 
@@ -136,16 +135,13 @@ public class TestUpdateRequestCodec extends SolrTestCase {
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     codec.marshal(updateRequest, baos);
     final List<SolrInputDocument> docs = new ArrayList<>();
-    JavaBinUpdateRequestCodec.StreamingUpdateHandler handler = new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
-      @Override
-      public void update(SolrInputDocument document, UpdateRequest req, Integer commitWithin, Boolean overwrite) {
-        Assert.assertNotNull(req.getParams());
-        docs.add(document);
-      }
+    JavaBinUpdateRequestCodec.StreamingUpdateHandler handler = (document, req, commitWithin, overwrite) -> {
+      Assert.assertNotNull(req.getParams());
+      docs.add(document);
     };
 
-    UpdateRequest updateUnmarshalled = codec.unmarshal(new ByteArrayInputStream(baos.toByteArray()) ,handler);
- 
+    UpdateRequest updateUnmarshalled = codec.unmarshal(new ByteArrayInputStream(baos.toByteArray()), handler);
+
     for (SolrInputDocument document : docs) {
       updateUnmarshalled.add(document);
     }
@@ -154,12 +150,54 @@ public class TestUpdateRequestCodec extends SolrTestCase {
     SolrInputField iter = outDoc.getField("iter");
     Assert.assertNotNull("iter field is null", iter);
     Object iterVal = iter.getValue();
-    Assert.assertTrue("iterVal is not a Collection", 
-                      iterVal instanceof Collection);
+    Assert.assertTrue("iterVal is not a Collection",
+        iterVal instanceof Collection);
     Assert.assertEquals("iterVal contents", values, iterVal);
 
   }
 
+  public void testStreamableInputDocFormat() throws IOException {
+    Map m = Utils.makeMap("id","1","desc" ,"The desc 1");
+    m.put(CHILDDOC, (MapWriter) ew -> {
+      ew.put("id","1.1");
+      ew.put("desc" ,"The desc 1.1");
+      ew.put(CHILDDOC, (IteratorWriter) iw -> {
+        iw.add(Utils.makeMap("id", "1.1.1","desc","The desc 1.1.1"));
+        iw.add((MapWriter) ew1 -> {
+          ew1.put("id", "1.1.2");
+          ew1.put("desc", "The desc 1.1.2");
+        });
+      });
+    });
+    MapWriter m2 = ew -> {
+      ew.put("id", "2");
+      ew.put("des", "The desc 2");
+    };
+
+    List l = new ArrayList();
+    l.add(m);
+    l.add(m2);
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    new JavaBinCodec().marshal(l.iterator(), baos);
+
+    List<SolrInputDocument>  l2 = new ArrayList();
+
+    new JavaBinUpdateRequestCodec().unmarshal(new ByteArrayInputStream(baos.toByteArray()), new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
+      @Override
+      public void update(SolrInputDocument document, UpdateRequest req, Integer commitWithin, Boolean override) {
+        l2.add(document);
+      }
+    });
+
+   assertEquals(l2.get(0).getChildDocuments().size(), 1);
+
+   Object o = Utils.fromJSONString(Utils.writeJson(l.get(0), new StringWriter(), true).toString());
+   Object cdoc = Utils.getObjectByPath(o, false, CHILDDOC);
+   assertEquals(Utils.writeJson(cdoc, new StringWriter(), true).toString(),
+       Utils.writeJson(l2.get(0).getChildDocuments().get(0) ,new StringWriter(), true).toString());
+
+  }
+
 
   @Test
   // commented out on: 24-Dec-2018   @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // added 20-Sep-2018
@@ -193,24 +231,20 @@ public class TestUpdateRequestCodec extends SolrTestCase {
     Collection<String> foobar = new HashSet<>();
     foobar.add("baz1");
     foobar.add("baz2");
-    doc.addField("foobar",foobar);
+    doc.addField("foobar", foobar);
     updateRequest.add(doc);
 
     updateRequest.deleteById("2");
     updateRequest.deleteByQuery("id:3");
 
 
-
     InputStream is = getClass().getResourceAsStream("/solrj/updateReq_4_5.bin");
     assertNotNull("updateReq_4_5.bin was not found", is);
-    UpdateRequest updateUnmarshalled = new JavaBinUpdateRequestCodec().unmarshal(is, new JavaBinUpdateRequestCodec.StreamingUpdateHandler() {
-      @Override
-      public void update(SolrInputDocument document, UpdateRequest req, Integer commitWithin, Boolean override) {
-        if(commitWithin == null ){
-                    req.add(document);
-        }
-        System.err.println("Doc" + document + " ,commitWithin:"+commitWithin+ " , override:"+ override);
+    UpdateRequest updateUnmarshalled = new JavaBinUpdateRequestCodec().unmarshal(is, (document, req, commitWithin, override) -> {
+      if (commitWithin == null) {
+        req.add(document);
       }
+      System.err.println("Doc" + document + " ,commitWithin:" + commitWithin + " , override:" + override);
     });
 
     System.err.println(updateUnmarshalled.getDocumentsMap());
@@ -219,11 +253,11 @@ public class TestUpdateRequestCodec extends SolrTestCase {
     for (int i = 0; i < updateRequest.getDocuments().size(); i++) {
       SolrInputDocument inDoc = updateRequest.getDocuments().get(i);
       SolrInputDocument outDoc = updateUnmarshalled.getDocuments().get(i);
-      compareDocs("doc#"+i, inDoc, outDoc);
+      compareDocs("doc#" + i, inDoc, outDoc);
     }
-    Assert.assertEquals(updateUnmarshalled.getDeleteById().get(0) ,
+    Assert.assertEquals(updateUnmarshalled.getDeleteById().get(0),
         updateRequest.getDeleteById().get(0));
-    Assert.assertEquals(updateUnmarshalled.getDeleteQuery().get(0) ,
+    Assert.assertEquals(updateUnmarshalled.getDeleteQuery().get(0),
         updateRequest.getDeleteQuery().get(0));
 
     assertEquals("b", updateUnmarshalled.getParams().get("a"));
@@ -231,9 +265,8 @@ public class TestUpdateRequestCodec extends SolrTestCase {
   }
 
 
-
-  private void compareDocs(String m, 
-                           SolrInputDocument expectedDoc, 
+  private void compareDocs(String m,
+                           SolrInputDocument expectedDoc,
                            SolrInputDocument actualDoc) {
 
     for (String s : expectedDoc.getFieldNames()) {
@@ -252,7 +285,7 @@ public class TestUpdateRequestCodec extends SolrTestCase {
       }
 
       Assert.assertEquals(m + " diff values for field: " + s,
-                          expectedVal, actualVal);
+          expectedVal, actualVal);
     }
   }