You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by no...@apache.org on 2022/11/11 05:51:42 UTC

[solr] branch jira/parallelstream-fix updated: fixed noggit bug

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

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


The following commit(s) were added to refs/heads/jira/parallelstream-fix by this push:
     new 140a13bcd68 fixed noggit bug
140a13bcd68 is described below

commit 140a13bcd687efec47f280350c16a5ed2e1b9308
Author: Noble Paul <no...@gmail.com>
AuthorDate: Fri Nov 11 16:51:29 2022 +1100

    fixed noggit bug
---
 .../apache/solr/common/util/NoggitJSONWriter.java  | 88 ++++++++++------------
 1 file changed, 40 insertions(+), 48 deletions(-)

diff --git a/solr/solrj/src/java/org/apache/solr/common/util/NoggitJSONWriter.java b/solr/solrj/src/java/org/apache/solr/common/util/NoggitJSONWriter.java
index 7dc474faa6b..139c3c32c60 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/NoggitJSONWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/NoggitJSONWriter.java
@@ -18,6 +18,7 @@
 package org.apache.solr.common.util;
 
 import java.io.IOException;
+import java.util.function.BiConsumer;
 import org.apache.solr.common.IteratorWriter;
 import org.apache.solr.common.MapWriter;
 import org.noggit.CharArr;
@@ -31,67 +32,58 @@ public class NoggitJSONWriter extends JSONWriter {
   }
 
   @Override
-  public void write(Object o) {
+  @SuppressWarnings("rawtypes")
+  public void handleUnknownClass(Object o) {
+    // avoid materializing MapWriter / IteratorWriter to Map / List
+    // instead serialize them directly
     if (o instanceof MapWriter) {
       MapWriter mapWriter = (MapWriter) o;
       startObject();
-      try {
-        mapWriter.writeMap(entryWriter());
-      } catch (IOException e) {
-        throw new RuntimeException(e);
-      }
+
+      mapWriter._forEachEntry(
+          new BiConsumer() {
+            boolean first = true;
+
+            @Override
+            public void accept(Object k, Object v) {
+              if (first) {
+                first = false;
+              } else {
+                writeValueSeparator();
+              }
+              indent();
+              writeString(k.toString());
+              writeNameSeparator();
+              write(v);
+            }
+          });
       endObject();
     } else if (o instanceof IteratorWriter) {
       IteratorWriter iteratorWriter = (IteratorWriter) o;
       startArray();
       try {
-        iteratorWriter.writeIter(itemWriter());
+        iteratorWriter.writeIter(
+            new IteratorWriter.ItemWriter() {
+              boolean first = true;
+
+              @Override
+              public IteratorWriter.ItemWriter add(Object o) {
+                if (first) {
+                  first = false;
+                } else {
+                  writeValueSeparator();
+                }
+                indent();
+                write(o);
+                return this;
+              }
+            });
       } catch (IOException e) {
         throw new RuntimeException("this should never happen", e);
       }
       endArray();
-    } else if (o instanceof MapWriter.StringValue) {
-      super.write(o.toString());
     } else {
-      super.write(o);
+      super.handleUnknownClass(o);
     }
   }
-
-  private IteratorWriter.ItemWriter itemWriter() {
-    return new IteratorWriter.ItemWriter() {
-      private boolean first = true;
-
-      @Override
-      public IteratorWriter.ItemWriter add(Object o) {
-        if (first) {
-          first = false;
-        } else {
-          writeValueSeparator();
-        }
-        indent();
-        write(o);
-        return this;
-      }
-    };
-  }
-
-  private MapWriter.EntryWriter entryWriter() {
-    return new MapWriter.EntryWriter() {
-      private boolean first = true;
-
-      @Override
-      public MapWriter.EntryWriter put(CharSequence k, Object v) {
-        if (first) {
-          first = false;
-        } else {
-          writeValueSeparator();
-        }
-        indent();
-        writeString(k.toString());
-        writeNameSeparator();
-        write(v);
-        return this;
-      }
-    };
-  }
 }