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 c390847810a..7373632da28 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 @@ -441,24 +441,28 @@ public boolean writeKnownType(Object val) throws IOException { writeBoolean(((AtomicBoolean) val).get()); return true; } - if (val instanceof float[]) { - writeFloatArr((float[]) val); + if (val instanceof float[] ff) { + writeFloatArr(ff); return true; } - if (val instanceof int[]) { - writeIntArr((int[]) val); + if (val instanceof int[] ii) { + writeIntArr(ii); return true; } - if (val instanceof long[]) { - writeLongArr((long[]) val); + if (val instanceof long[] ll) { + writeLongArr(ll); return true; } - if (val instanceof double[]) { - writeDoubleArr((double[]) val); + if (val instanceof double[] dd) { + writeDoubleArr(dd); return true; } - if (val instanceof short[]) { - writeShortArr((short[]) val); + if (val instanceof short[] ss) { + writeShortArr(ss); + return true; + } + if (val instanceof boolean[] bb) { + writeBoolArr(bb); return true; } return false; @@ -509,6 +513,16 @@ public Object readPrimitiveArray(DataInputInputStream dis) throws IOException { } return v; } + case BOOL_TRUE: + case BOOL_FALSE: + { + boolean[] v = new boolean[len]; + for (int i = 0; i < len; i++) { + byte b = dis.readByte(); + v[i] = b == BOOL_FALSE ? false : true; + } + return v; + } case BYTE: { // it should be possible to serialize byte[] in the new format as well @@ -557,6 +571,13 @@ public void writeLongArr(long[] vals) throws IOException { } } + public void writeBoolArr(boolean[] vals) throws IOException { + writePrimitiveArrHeader(BOOL_TRUE, vals.length); + for (boolean b : vals) { + writeBoolean(b); + } + } + public void writeShortArr(short[] vals) throws IOException { writePrimitiveArrHeader(SHORT, vals.length); for (short l : vals) { diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java index 6d02cf82185..3a85f4e0f04 100644 --- a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java +++ b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java @@ -108,6 +108,20 @@ public static SolrDocument generateSolrDocumentWithChildDocs() { return parentDocument; } + @Test + public void testPrimitiveArrays() throws Exception { + List types = new ArrayList<>(); + + types.add(new float[] {1.0678f, 4.094565f, 0.000456f}); + types.add(new double[] {1.0678d, 4.094565d, 0.000456d}); + types.add(new int[] {145543, 4546354, 9789857}); + types.add(new long[] {145543L, 4546354L, 9789857L}); + types.add(new short[] {43, 454, 857}); + types.add(new boolean[] {true, true, false}); + + compareObjects((List) getObject(getBytes(types)), types); + } + private List generateAllDataTypes() { List types = new ArrayList<>(); @@ -223,6 +237,23 @@ private void compareObjects(List unmarshalledObj, List matchObj) { } else if (unmarshalledObj.get(i) instanceof SolrInputField && matchObj.get(i) instanceof SolrInputField) { assertTrue(assertSolrInputFieldEquals(unmarshalledObj.get(i), matchObj.get(i))); + } else if (unmarshalledObj.get(i) instanceof float[] a + && matchObj.get(i) instanceof float[] e) { + assertArrayEquals(e, a, 0.000000f); + } else if (unmarshalledObj.get(i) instanceof double[] a + && matchObj.get(i) instanceof double[] e) { + assertArrayEquals(e, a, 0.000000d); + } else if (unmarshalledObj.get(i) instanceof long[] a + && matchObj.get(i) instanceof long[] e) { + assertArrayEquals(e, a); + } else if (unmarshalledObj.get(i) instanceof int[] a && matchObj.get(i) instanceof int[] e) { + assertArrayEquals(e, a); + } else if (unmarshalledObj.get(i) instanceof short[] a + && matchObj.get(i) instanceof short[] e) { + assertArrayEquals(e, a); + } else if (unmarshalledObj.get(i) instanceof boolean[] a + && matchObj.get(i) instanceof boolean[] e) { + assertArrayEquals(e, a); } else { assertEquals(unmarshalledObj.get(i), matchObj.get(i)); }