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/09 13:03:03 UTC
[solr] branch main updated: SOLR-16530 : Performance degradation in NoggitJSONWriter (#1169)
This is an automated email from the ASF dual-hosted git repository.
noble pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new 640221a6ada SOLR-16530 : Performance degradation in NoggitJSONWriter (#1169)
640221a6ada is described below
commit 640221a6ada310eae22af28e10a9c6342420898c
Author: Noble Paul <no...@users.noreply.github.com>
AuthorDate: Thu Nov 10 00:02:56 2022 +1100
SOLR-16530 : Performance degradation in NoggitJSONWriter (#1169)
---
.../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;
- }
- };
- }
}