From c256eb180d42d5b9ac56405726c8ae2126aafc6b Mon Sep 17 00:00:00 2001 From: Ivan Saric Date: Mon, 25 May 2026 15:16:14 +0200 Subject: [PATCH 1/2] SOLR-17600 (Part 3/4): Migrate SolrJ and Utilities from MapSerializable --- .../TikaServerExtractionBackend.java | 3 +- .../solrj/io/stream/expr/Explanation.java | 44 +++++-------------- .../io/stream/expr/StreamExplanation.java | 16 +++---- .../apache/solr/common/IteratorWriter.java | 4 +- .../org/apache/solr/common/MapWriter.java | 9 +--- .../org/apache/solr/common/MapWriterMap.java | 5 --- .../apache/solr/common/cloud/ZkNodeProps.java | 3 +- .../apache/solr/common/util/JavaBinCodec.java | 6 --- .../apache/solr/common/util/TextWriter.java | 5 --- .../org/apache/solr/common/util/Utils.java | 12 ++--- .../client/solrj/SolrExampleCborTest.java | 4 +- .../solr/common/cloud/ClusterStateUtil.java | 3 +- 12 files changed, 35 insertions(+), 79 deletions(-) diff --git a/solr/modules/extraction/src/java/org/apache/solr/handler/extraction/TikaServerExtractionBackend.java b/solr/modules/extraction/src/java/org/apache/solr/handler/extraction/TikaServerExtractionBackend.java index 283d186fe714..0d1e464921b7 100644 --- a/solr/modules/extraction/src/java/org/apache/solr/handler/extraction/TikaServerExtractionBackend.java +++ b/solr/modules/extraction/src/java/org/apache/solr/handler/extraction/TikaServerExtractionBackend.java @@ -36,6 +36,7 @@ import org.apache.solr.common.SolrException; import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.common.util.SolrNamedThreadFactory; import org.apache.solr.util.RefCounted; import org.apache.tika.sax.BodyContentHandler; @@ -99,7 +100,7 @@ public TikaServerExtractionBackend( this.maxCharsLimit = maxCharsLimit; if (initArgs != null) { - initArgs.toMap(this.initArgsMap); + initArgsMap.putAll(new SimpleOrderedMap<>(initArgs)); } Object metaCompatObh = this.initArgsMap.get(ExtractingParams.TIKASERVER_METADATA_COMPATIBILITY); if (metaCompatObh != null) { diff --git a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/Explanation.java b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/Explanation.java index 259c02ab5e50..bee23cc4acfe 100644 --- a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/Explanation.java +++ b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/Explanation.java @@ -16,14 +16,13 @@ */ package org.apache.solr.client.solrj.io.stream.expr; +import java.io.IOException; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; -import org.apache.solr.common.MapSerializable; +import org.apache.solr.common.MapWriter; /** Explanation containing details about a expression */ -public class Explanation implements MapSerializable { +public class Explanation implements MapWriter { private String expressionNodeId; private String expressionType; @@ -139,35 +138,14 @@ public void addHelper(Explanation helper) { } @Override - public Map toMap(Map map) { - if (null != expressionNodeId) { - map.put("expressionNodeId", expressionNodeId); - } - if (null != expressionType) { - map.put("expressionType", expressionType); - } - if (null != functionName) { - map.put("functionName", functionName); - } - if (null != implementingClass) { - map.put("implementingClass", implementingClass); - } - if (null != expression) { - map.put("expression", expression); - } - if (null != note) { - map.put("note", note); - } - - if (null != helpers && 0 != helpers.size()) { - List> helperMaps = new ArrayList<>(); - for (Explanation helper : helpers) { - helperMaps.add(helper.toMap(new LinkedHashMap<>())); - } - map.put("helpers", helperMaps); - } - - return map; + public void writeMap(EntryWriter ew) throws IOException { + ew.putIfNotNull("expressionNodeId", expressionNodeId) + .putIfNotNull("expressionType", expressionType) + .putIfNotNull("functionName", functionName) + .putIfNotNull("implementingClass", implementingClass) + .putIfNotNull("expression", expression) + .putIfNotNull("note", note) + .putIfNotNull("helpers", helpers); } public static interface ExpressionType { diff --git a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java index 027a1b94878c..c76eeece7e68 100644 --- a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java +++ b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java @@ -16,10 +16,9 @@ */ package org.apache.solr.client.solrj.io.stream.expr; +import java.io.IOException; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; /** Explanation containing details about a stream expression */ public class StreamExplanation extends Explanation { @@ -58,17 +57,12 @@ public void addChild(Explanation child) { } @Override - public Map toMap(Map map) { - map = super.toMap(map); - - if (null != children && 0 != children.size()) { - List> childrenMaps = new ArrayList<>(); + public void writeMap(EntryWriter ew) throws IOException { + super.writeMap(ew); + if (children != null) { for (Explanation child : children) { - childrenMaps.add(child.toMap(new LinkedHashMap<>())); + child.writeMap(ew); } - map.put("children", childrenMaps); } - - return map; } } diff --git a/solr/solrj/src/java/org/apache/solr/common/IteratorWriter.java b/solr/solrj/src/java/org/apache/solr/common/IteratorWriter.java index 1c2274b7c0f4..631a2f8677d9 100644 --- a/solr/solrj/src/java/org/apache/solr/common/IteratorWriter.java +++ b/solr/solrj/src/java/org/apache/solr/common/IteratorWriter.java @@ -19,8 +19,8 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; +import org.apache.solr.common.util.SimpleOrderedMap; import org.noggit.JSONWriter; /** Interface to help do push writing to an array */ @@ -76,7 +76,7 @@ default List toList(List l) { new ItemWriter() { @Override public ItemWriter add(Object o) throws IOException { - if (o instanceof MapWriter) o = ((MapWriter) o).toMap(new LinkedHashMap<>()); + if (o instanceof MapWriter) o = new SimpleOrderedMap<>((MapWriter) o); if (o instanceof IteratorWriter) o = ((IteratorWriter) o).toList(new ArrayList<>()); l.add(o); return this; diff --git a/solr/solrj/src/java/org/apache/solr/common/MapWriter.java b/solr/solrj/src/java/org/apache/solr/common/MapWriter.java index 3f1f61e24ba5..d98d66f3bde9 100644 --- a/solr/solrj/src/java/org/apache/solr/common/MapWriter.java +++ b/solr/solrj/src/java/org/apache/solr/common/MapWriter.java @@ -30,7 +30,7 @@ * and is supposed to be memory efficient. If the entries are primitives, unnecessary boxing is also * avoided. */ -public interface MapWriter extends MapSerializable, NavigableObject, JSONWriter.Writable { +public interface MapWriter extends NavigableObject, JSONWriter.Writable { /** Writes this object's entries out to {@code ew}. */ void writeMap(EntryWriter ew) throws IOException; @@ -39,11 +39,6 @@ default String jsonStr() { return Utils.toJSONString(this); } - @Override - default Map toMap(Map map) { - return Utils.convertToMap(this, map); - } - /** For implementing Noggit {@link org.noggit.JSONWriter.Writable}. */ @Override default void write(JSONWriter writer) { @@ -147,7 +142,7 @@ default EntryWriter put(CharSequence k, CharSequence v) throws IOException { } default BiConsumer getBiConsumer() { - return (k, v) -> putNoEx(k, v); + return this::putNoEx; } } diff --git a/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java b/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java index 44385d849f53..454898afc112 100644 --- a/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java +++ b/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java @@ -50,9 +50,4 @@ public Object _get(List path, Object def) { public int _size() { return delegate.size(); } - - @Override - public Map toMap(Map map) { - return delegate; - } } diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java index 72ba3949b0e4..dc5499c25ce5 100644 --- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java +++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java @@ -26,6 +26,7 @@ import java.util.Set; import org.apache.solr.common.MapWriter; import org.apache.solr.common.util.JavaBinCodec; +import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.common.util.Utils; /** ZkNodeProps contains generic immutable properties. */ @@ -42,7 +43,7 @@ public ZkNodeProps(Map propMap) { } public ZkNodeProps(MapWriter mw) { - propMap = mw.toMap(new HashMap<>()); + propMap = new SimpleOrderedMap<>(mw); } public ZkNodeProps plus(String key, Object val) { 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 dc47f5aa67d4..63e6613ae255 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 @@ -47,7 +47,6 @@ import org.apache.solr.common.EnumFieldValue; import org.apache.solr.common.IteratorWriter; import org.apache.solr.common.IteratorWriter.ItemWriter; -import org.apache.solr.common.MapSerializable; import org.apache.solr.common.MapWriter; import org.apache.solr.common.PushWriter; import org.apache.solr.common.SolrDocument; @@ -428,11 +427,6 @@ public boolean writeKnownType(Object val) throws IOException { writeMapEntry((Map.Entry) val); return true; } - if (val instanceof MapSerializable) { - // todo find a better way to reuse the map more efficiently - writeMap(((MapSerializable) val).toMap(new NamedList().asShallowMap())); - return true; - } if (val instanceof AtomicInteger) { writeInt(((AtomicInteger) val).get()); return true; diff --git a/solr/solrj/src/java/org/apache/solr/common/util/TextWriter.java b/solr/solrj/src/java/org/apache/solr/common/util/TextWriter.java index 6901b2db5ed8..ea50ab8bbbc7 100644 --- a/solr/solrj/src/java/org/apache/solr/common/util/TextWriter.java +++ b/solr/solrj/src/java/org/apache/solr/common/util/TextWriter.java @@ -27,7 +27,6 @@ import java.util.Collection; import java.util.Date; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; @@ -38,7 +37,6 @@ import org.apache.solr.client.api.util.ReflectWritable; import org.apache.solr.common.EnumFieldValue; import org.apache.solr.common.IteratorWriter; -import org.apache.solr.common.MapSerializable; import org.apache.solr.common.MapWriter; import org.apache.solr.common.PushWriter; @@ -89,9 +87,6 @@ default void writeVal(String name, Object val, boolean raw) throws IOException { writeMap(name, (MapWriter) val); } else if (val instanceof ReflectWritable) { writeVal(name, Utils.getReflectWriter(val)); - } else if (val instanceof MapSerializable) { - // todo find a better way to reuse the map more efficiently - writeMap(name, ((MapSerializable) val).toMap(new LinkedHashMap<>()), false, true); } else if (val instanceof Map) { writeMap(name, (Map) val, false, true); } else if (val instanceof Collection cval) { // very generic; keep towards the end diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java index 8db2d1c0ae16..1f2ed99990f1 100644 --- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java +++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java @@ -178,7 +178,7 @@ public MapWriter.EntryWriter put(CharSequence k, Object v) { private static Object makeDeepCopy(Object v, int maxDepth, boolean mutable, boolean sorted) { if (v instanceof MapWriter && maxDepth > 1) { - v = ((MapWriter) v).toMap(new LinkedHashMap<>()); + v = new SimpleOrderedMap<>((MapWriter) v); } else if (v instanceof IteratorWriter && maxDepth > 1) { List l = ((IteratorWriter) v).toList(new ArrayList<>()); if (sorted) { @@ -1035,7 +1035,7 @@ private static void addCatchAllFieldWriter( *

The provided object is not required to be a {@link MapWriter}. */ public static Map reflectToMap(Object toReflect) { - return ((Utils.DelegateReflectWriter) Utils.getReflectWriter(toReflect)).toMap(new HashMap<>()); + return convertToMap((MapWriter) Utils.getReflectWriter(toReflect), new HashMap<>()); } @SuppressWarnings({"unchecked", "rawtypes"}) @@ -1049,12 +1049,13 @@ public MapWriter.EntryWriter put(CharSequence k, Object v) { } private MapWriter.EntryWriter writeEntry(CharSequence k, Object v) { - if (v instanceof MapWriter) v = ((MapWriter) v).toMap(new LinkedHashMap<>()); + if (v instanceof MapWriter) v = convertToMap((MapWriter) v, new LinkedHashMap<>()); if (v instanceof IteratorWriter) v = ((IteratorWriter) v).toList(new ArrayList<>()); if (v instanceof Iterable) { List lst = new ArrayList(); for (Object vv : (Iterable) v) { - if (vv instanceof MapWriter) vv = ((MapWriter) vv).toMap(new LinkedHashMap<>()); + if (vv instanceof MapWriter) + vv = convertToMap((MapWriter) vv, new LinkedHashMap<>()); if (vv instanceof IteratorWriter) vv = ((IteratorWriter) vv).toList(new ArrayList<>()); lst.add(vv); @@ -1065,7 +1066,8 @@ private MapWriter.EntryWriter writeEntry(CharSequence k, Object v) { Map map = new LinkedHashMap(); for (Map.Entry entry : ((Map) v).entrySet()) { Object vv = entry.getValue(); - if (vv instanceof MapWriter) vv = ((MapWriter) vv).toMap(new LinkedHashMap<>()); + if (vv instanceof MapWriter) + vv = convertToMap((MapWriter) vv, new LinkedHashMap<>()); if (vv instanceof IteratorWriter) vv = ((IteratorWriter) vv).toList(new ArrayList<>()); map.put(entry.getKey(), vv); diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleCborTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleCborTest.java index 6456aa5824ca..dda3a57426d4 100644 --- a/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleCborTest.java +++ b/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleCborTest.java @@ -23,7 +23,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -35,6 +34,7 @@ import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.SimpleOrderedMap; import org.junit.Ignore; /** @@ -247,7 +247,7 @@ public void write(OutputStream os) throws IOException { List mapDocs = new ArrayList<>(); for (SolrInputDocument doc : docs) { - mapDocs.add(doc.toMap(new LinkedHashMap<>())); + mapDocs.add(new SimpleOrderedMap(doc)); } ObjectMapper cborMapper = diff --git a/solr/test-framework/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java b/solr/test-framework/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java index 9ecfe57379dc..fe5e724db2d1 100644 --- a/solr/test-framework/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java +++ b/solr/test-framework/src/java/org/apache/solr/common/cloud/ClusterStateUtil.java @@ -25,6 +25,7 @@ import java.util.stream.Stream; import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException.ErrorCode; +import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.common.util.Utils; public class ClusterStateUtil { @@ -178,7 +179,7 @@ public static String toDebugAllStatesString(ClusterState clusterState) { .collectionStream() .collect( LinkedHashMap::new, - (map, state) -> map.put(state.getName(), state.toMap(new LinkedHashMap<>())), + (map, state) -> map.put(state.getName(), new SimpleOrderedMap<>(state)), Map::putAll); // toJSON requires standard types like Map; doesn't know about DocCollection etc. return Utils.toJSONString(stateMap); From 4aae25c4a56631443aa0e37d8b72844af3155171 Mon Sep 17 00:00:00 2001 From: Ivan Saric Date: Fri, 12 Jun 2026 22:17:04 +0200 Subject: [PATCH 2/2] SOLR-17600: Address review feedback on Part 3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Drop unnecessary SimpleOrderedMap copies in TikaServerExtractionBackend, ZkNodeProps, and Utils#makeDeepCopy per @dsmiley's "SOM only on request writing path" guidance - StreamExplanation.writeMap: use putIfNotNull("children", ...) matching the pattern in Explanation, instead of flattening each child into the parent EntryWriter - Revert the MapSerializable-handling removals in JavaBinCodec and TextWriter — those branches still need to handle classes that implement only MapSerializable, and removal belongs in Part 4 --- .../handler/extraction/TikaServerExtractionBackend.java | 3 +-- .../solr/client/solrj/io/stream/expr/StreamExplanation.java | 6 +----- .../src/java/org/apache/solr/common/cloud/ZkNodeProps.java | 3 +-- .../src/java/org/apache/solr/common/util/JavaBinCodec.java | 6 ++++++ .../src/java/org/apache/solr/common/util/TextWriter.java | 5 +++++ solr/solrj/src/java/org/apache/solr/common/util/Utils.java | 2 +- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/solr/modules/extraction/src/java/org/apache/solr/handler/extraction/TikaServerExtractionBackend.java b/solr/modules/extraction/src/java/org/apache/solr/handler/extraction/TikaServerExtractionBackend.java index 0d1e464921b7..a6d08bb11f77 100644 --- a/solr/modules/extraction/src/java/org/apache/solr/handler/extraction/TikaServerExtractionBackend.java +++ b/solr/modules/extraction/src/java/org/apache/solr/handler/extraction/TikaServerExtractionBackend.java @@ -36,7 +36,6 @@ import org.apache.solr.common.SolrException; import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.NamedList; -import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.common.util.SolrNamedThreadFactory; import org.apache.solr.util.RefCounted; import org.apache.tika.sax.BodyContentHandler; @@ -100,7 +99,7 @@ public TikaServerExtractionBackend( this.maxCharsLimit = maxCharsLimit; if (initArgs != null) { - initArgsMap.putAll(new SimpleOrderedMap<>(initArgs)); + initArgs.forEach(initArgsMap::put); } Object metaCompatObh = this.initArgsMap.get(ExtractingParams.TIKASERVER_METADATA_COMPATIBILITY); if (metaCompatObh != null) { diff --git a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java index c76eeece7e68..186eeebdfe49 100644 --- a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java +++ b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java @@ -59,10 +59,6 @@ public void addChild(Explanation child) { @Override public void writeMap(EntryWriter ew) throws IOException { super.writeMap(ew); - if (children != null) { - for (Explanation child : children) { - child.writeMap(ew); - } - } + ew.putIfNotNull("children", children); } } diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java index dc5499c25ce5..4860a0debea0 100644 --- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java +++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java @@ -26,7 +26,6 @@ import java.util.Set; import org.apache.solr.common.MapWriter; import org.apache.solr.common.util.JavaBinCodec; -import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.common.util.Utils; /** ZkNodeProps contains generic immutable properties. */ @@ -43,7 +42,7 @@ public ZkNodeProps(Map propMap) { } public ZkNodeProps(MapWriter mw) { - propMap = new SimpleOrderedMap<>(mw); + propMap = Utils.convertToMap(mw, new HashMap<>()); } public ZkNodeProps plus(String key, Object val) { 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 63e6613ae255..dc47f5aa67d4 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 @@ -47,6 +47,7 @@ import org.apache.solr.common.EnumFieldValue; import org.apache.solr.common.IteratorWriter; import org.apache.solr.common.IteratorWriter.ItemWriter; +import org.apache.solr.common.MapSerializable; import org.apache.solr.common.MapWriter; import org.apache.solr.common.PushWriter; import org.apache.solr.common.SolrDocument; @@ -427,6 +428,11 @@ public boolean writeKnownType(Object val) throws IOException { writeMapEntry((Map.Entry) val); return true; } + if (val instanceof MapSerializable) { + // todo find a better way to reuse the map more efficiently + writeMap(((MapSerializable) val).toMap(new NamedList().asShallowMap())); + return true; + } if (val instanceof AtomicInteger) { writeInt(((AtomicInteger) val).get()); return true; diff --git a/solr/solrj/src/java/org/apache/solr/common/util/TextWriter.java b/solr/solrj/src/java/org/apache/solr/common/util/TextWriter.java index ea50ab8bbbc7..6901b2db5ed8 100644 --- a/solr/solrj/src/java/org/apache/solr/common/util/TextWriter.java +++ b/solr/solrj/src/java/org/apache/solr/common/util/TextWriter.java @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.Date; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; @@ -37,6 +38,7 @@ import org.apache.solr.client.api.util.ReflectWritable; import org.apache.solr.common.EnumFieldValue; import org.apache.solr.common.IteratorWriter; +import org.apache.solr.common.MapSerializable; import org.apache.solr.common.MapWriter; import org.apache.solr.common.PushWriter; @@ -87,6 +89,9 @@ default void writeVal(String name, Object val, boolean raw) throws IOException { writeMap(name, (MapWriter) val); } else if (val instanceof ReflectWritable) { writeVal(name, Utils.getReflectWriter(val)); + } else if (val instanceof MapSerializable) { + // todo find a better way to reuse the map more efficiently + writeMap(name, ((MapSerializable) val).toMap(new LinkedHashMap<>()), false, true); } else if (val instanceof Map) { writeMap(name, (Map) val, false, true); } else if (val instanceof Collection cval) { // very generic; keep towards the end diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java index 1f2ed99990f1..82acf966bfb9 100644 --- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java +++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java @@ -178,7 +178,7 @@ public MapWriter.EntryWriter put(CharSequence k, Object v) { private static Object makeDeepCopy(Object v, int maxDepth, boolean mutable, boolean sorted) { if (v instanceof MapWriter && maxDepth > 1) { - v = new SimpleOrderedMap<>((MapWriter) v); + v = convertToMap((MapWriter) v, new LinkedHashMap<>()); } else if (v instanceof IteratorWriter && maxDepth > 1) { List l = ((IteratorWriter) v).toList(new ArrayList<>()); if (sorted) {