浏览代码

[Ingest] allow docs to write native `double[]` and `double[][]` (#78646)

* [Ingest] allow docs to write native `double[]` and `double[][]`

* Adding test for new native double array support

* fixing test

Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
Benjamin Trent 4 年之前
父节点
当前提交
87592d7e6c

+ 10 - 0
server/src/main/java/org/elasticsearch/ingest/IngestDocument.java

@@ -741,6 +741,16 @@ public final class IngestDocument {
         } else if (value instanceof byte[]) {
             byte[] bytes = (byte[]) value;
             return Arrays.copyOf(bytes, bytes.length);
+        } else if (value instanceof double[][]) {
+            double[][] doubles = (double[][]) value;
+            double[][] result = new double[doubles.length][];
+            for (int i = 0; i < doubles.length; i++) {
+                result[i] = Arrays.copyOf(doubles[i], doubles[i].length);
+            }
+            return result;
+        } else if (value instanceof double[]) {
+            double[] doubles = (double[]) value;
+            return Arrays.copyOf(doubles, doubles.length);
         } else if (value == null || value instanceof String || value instanceof Integer ||
             value instanceof Long || value instanceof Float ||
             value instanceof Double || value instanceof Boolean ||

+ 37 - 10
server/src/test/java/org/elasticsearch/ingest/IngestDocumentTests.java

@@ -21,6 +21,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.DoubleStream;
 
 import static org.elasticsearch.ingest.IngestDocumentMatcher.assertIngestDocument;
 import static org.hamcrest.Matchers.both;
@@ -38,6 +39,8 @@ public class IngestDocumentTests extends ESTestCase {
 
     private static final ZonedDateTime BOGUS_TIMESTAMP = ZonedDateTime.of(2016, 10, 23, 0, 0, 0, 0, ZoneOffset.UTC);
     private IngestDocument ingestDocument;
+    private static final String DOUBLE_ARRAY_FIELD = "double_array_field";
+    private static final String DOUBLE_DOUBLE_ARRAY_FIELD = "double_double_array";
 
     @Before
     public void setTestIngestDocument() {
@@ -69,6 +72,14 @@ public class IngestDocumentTests extends ESTestCase {
         list2.add("bar");
         list2.add("baz");
         document.put("list2", list2);
+        document.put(DOUBLE_ARRAY_FIELD, DoubleStream.generate(ESTestCase::randomDouble).limit(randomInt(1000)).toArray());
+        document.put(
+            DOUBLE_DOUBLE_ARRAY_FIELD,
+            new double[][] {
+                DoubleStream.generate(ESTestCase::randomDouble).limit(randomInt(1000)).toArray(),
+                DoubleStream.generate(ESTestCase::randomDouble).limit(randomInt(1000)).toArray(),
+                DoubleStream.generate(ESTestCase::randomDouble).limit(randomInt(1000)).toArray() }
+        );
 
         ingestDocument = new IngestDocument("index", "id", null, null, null, document);
     }
@@ -779,23 +790,23 @@ public class IngestDocumentTests extends ESTestCase {
 
     public void testRemoveField() {
         ingestDocument.removeField("foo");
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(7));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(9));
         assertThat(ingestDocument.getSourceAndMetadata().containsKey("foo"), equalTo(false));
         ingestDocument.removeField("_index");
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(6));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(8));
         assertThat(ingestDocument.getSourceAndMetadata().containsKey("_index"), equalTo(false));
         ingestDocument.removeField("_source.fizz");
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(5));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(7));
         assertThat(ingestDocument.getSourceAndMetadata().containsKey("fizz"), equalTo(false));
         assertThat(ingestDocument.getIngestMetadata().size(), equalTo(1));
         ingestDocument.removeField("_ingest.timestamp");
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(5));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(7));
         assertThat(ingestDocument.getIngestMetadata().size(), equalTo(0));
     }
 
     public void testRemoveInnerField() {
         ingestDocument.removeField("fizz.buzz");
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(8));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(10));
         assertThat(ingestDocument.getSourceAndMetadata().get("fizz"), instanceOf(Map.class));
         @SuppressWarnings("unchecked")
         Map<String, Object> map = (Map<String, Object>) ingestDocument.getSourceAndMetadata().get("fizz");
@@ -804,17 +815,17 @@ public class IngestDocumentTests extends ESTestCase {
 
         ingestDocument.removeField("fizz.foo_null");
         assertThat(map.size(), equalTo(2));
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(8));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(10));
         assertThat(ingestDocument.getSourceAndMetadata().containsKey("fizz"), equalTo(true));
 
         ingestDocument.removeField("fizz.1");
         assertThat(map.size(), equalTo(1));
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(8));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(10));
         assertThat(ingestDocument.getSourceAndMetadata().containsKey("fizz"), equalTo(true));
 
         ingestDocument.removeField("fizz.list");
         assertThat(map.size(), equalTo(0));
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(8));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(10));
         assertThat(ingestDocument.getSourceAndMetadata().containsKey("fizz"), equalTo(true));
     }
 
@@ -848,7 +859,7 @@ public class IngestDocumentTests extends ESTestCase {
 
     public void testRemoveIngestObject() {
         ingestDocument.removeField("_ingest");
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(7));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(9));
         assertThat(ingestDocument.getSourceAndMetadata().containsKey("_ingest"), equalTo(false));
     }
 
@@ -870,7 +881,7 @@ public class IngestDocumentTests extends ESTestCase {
 
     public void testListRemoveField() {
         ingestDocument.removeField("list.0.field");
-        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(8));
+        assertThat(ingestDocument.getSourceAndMetadata().size(), equalTo(10));
         assertThat(ingestDocument.getSourceAndMetadata().containsKey("list"), equalTo(true));
         Object object = ingestDocument.getSourceAndMetadata().get("list");
         assertThat(object, instanceOf(List.class));
@@ -1046,4 +1057,20 @@ public class IngestDocumentTests extends ESTestCase {
         }
     }
 
+    public void testDeepCopy() {
+        IngestDocument copiedDoc = new IngestDocument(
+            IngestDocument.deepCopyMap(ingestDocument.getSourceAndMetadata()),
+            IngestDocument.deepCopyMap(ingestDocument.getIngestMetadata())
+        );
+        assertArrayEquals(
+            copiedDoc.getFieldValue(DOUBLE_ARRAY_FIELD, double[].class),
+            ingestDocument.getFieldValue(DOUBLE_ARRAY_FIELD, double[].class),
+            1e-10
+        );
+        assertArrayEquals(
+            copiedDoc.getFieldValue(DOUBLE_DOUBLE_ARRAY_FIELD, double[][].class),
+            ingestDocument.getFieldValue(DOUBLE_DOUBLE_ARRAY_FIELD, double[][].class)
+        );
+    }
+
 }