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

jlli pushed a commit to branch override-methods-in-object-array
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git

commit 77c3158e5d511737105c8bb124201a95ae7db7df
Author: Jack Li(Analytics Engineering) <j...@jlli-mn1.linkedin.biz>
AuthorDate: Fri Jul 24 22:50:45 2020 -0700

    Transform and extract map values to array
---
 .../core/data/recordtransformer/PinotDataType.java | 127 ++++++++++++++++++++-
 .../data/recordtransformer/PinotDataTypeTest.java  |  16 +++
 2 files changed, 142 insertions(+), 1 deletion(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/data/recordtransformer/PinotDataType.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/data/recordtransformer/PinotDataType.java
index d1296b7..5227366 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/data/recordtransformer/PinotDataType.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/data/recordtransformer/PinotDataType.java
@@ -18,6 +18,8 @@
  */
 package org.apache.pinot.core.data.recordtransformer;
 
+import java.util.Iterator;
+import java.util.Map;
 import org.apache.pinot.spi.data.FieldSpec;
 import org.apache.pinot.spi.utils.BytesUtils;
 
@@ -470,7 +472,112 @@ public enum PinotDataType {
     }
   },
 
-  OBJECT_ARRAY;
+  OBJECT_ARRAY {
+    @Override
+    public Integer[] toIntegerArray(Object value) {
+      Object[] valueArray = (Object[]) value;
+      int length = valueArray.length;
+      Integer[] integerArray = new Integer[length];
+      if (valueArray[0] instanceof Map) {
+        PinotDataType singleValueType  = getPrimitiveDataTypeFromMap((Map) 
valueArray[0]);
+        for (int i = 0; i < length; i++) {
+          for (Object obj : ((Map<Object, Object>) valueArray[i]).values()) {
+            integerArray[i] = singleValueType.toInteger(obj);
+          }
+        }
+      } else {
+        PinotDataType singleValueType = getSingleValueType();
+        for (int i = 0; i < length; i++) {
+          integerArray[i] = singleValueType.toInteger(valueArray[i]);
+        }
+      }
+      return integerArray;
+    }
+
+    @Override
+    public Long[] toLongArray(Object value) {
+      Object[] valueArray = (Object[]) value;
+      int length = valueArray.length;
+      Long[] longArray = new Long[length];
+      if (valueArray[0] instanceof Map) {
+        PinotDataType singleValueType  = getPrimitiveDataTypeFromMap((Map) 
valueArray[0]);
+        for (int i = 0; i < length; i++) {
+          for (Object obj : ((Map<Object, Object>) valueArray[i]).values()) {
+            longArray[i] = singleValueType.toLong(obj);
+          }
+        }
+      } else {
+        PinotDataType singleValueType = getSingleValueType();
+        for (int i = 0; i < length; i++) {
+          longArray[i] = singleValueType.toLong(valueArray[i]);
+        }
+      }
+      return longArray;
+    }
+
+    @Override
+    public Float[] toFloatArray(Object value) {
+      Object[] valueArray = (Object[]) value;
+      int length = valueArray.length;
+      Float[] floatArray = new Float[length];
+      if (valueArray[0] instanceof Map) {
+        PinotDataType singleValueType  = getPrimitiveDataTypeFromMap((Map) 
valueArray[0]);
+        for (int i = 0; i < length; i++) {
+          for (Object obj : ((Map<Object, Object>) valueArray[i]).values()) {
+            floatArray[i] = singleValueType.toFloat(obj);
+          }
+        }
+      } else {
+        PinotDataType singleValueType = getSingleValueType();
+        for (int i = 0; i < length; i++) {
+          floatArray[i] = singleValueType.toFloat(valueArray[i]);
+        }
+      }
+      return floatArray;
+    }
+
+    @Override
+    public Double[] toDoubleArray(Object value) {
+      Object[] valueArray = (Object[]) value;
+      int length = valueArray.length;
+      Double[] doubleArray = new Double[length];
+      if (valueArray[0] instanceof Map) {
+        PinotDataType singleValueType  = getPrimitiveDataTypeFromMap((Map) 
valueArray[0]);
+        for (int i = 0; i < length; i++) {
+          for (Object obj : ((Map<Object, Object>) valueArray[i]).values()) {
+            doubleArray[i] = singleValueType.toDouble(obj);
+          }
+        }
+      } else {
+        PinotDataType singleValueType = getSingleValueType();
+        for (int i = 0; i < length; i++) {
+          doubleArray[i] = singleValueType.toDouble(valueArray[i]);
+        }
+      }
+      return doubleArray;
+    }
+
+    @Override
+    public String[] toStringArray(Object value) {
+      Object[] valueArray = (Object[]) value;
+      int length = valueArray.length;
+      String[] stringArray = new String[length];
+      if (valueArray[0] instanceof Map) {
+        PinotDataType singleValueType  = getPrimitiveDataTypeFromMap((Map) 
valueArray[0]);
+        for (int i = 0; i < length; i++) {
+          for (Object obj : ((Map<Object, Object>) valueArray[i]).values()) {
+            stringArray[i] = singleValueType.toString(obj);
+          }
+        }
+      } else {
+        PinotDataType singleValueType = getSingleValueType();
+        for (int i = 0; i < length; i++) {
+          stringArray[i] = singleValueType.toString(valueArray[i]);
+        }
+      }
+      return stringArray;
+    }
+  };
 
   /**
    * NOTE: override toInteger(), toLong(), toFloat(), toDouble(), toString() 
and toBytes() for single-value types.
@@ -632,4 +739,22 @@ public enum PinotDataType {
             "Unsupported data type: " + dataType + " in field: " + 
fieldSpec.getName());
     }
   }
+
+  public static PinotDataType getPrimitiveDataTypeFromMap(Map<Object, Object> 
map) {
+    Iterator<Object> iterator = map.values().iterator();
+    Object obj = iterator.next();
+    if (obj instanceof Integer) {
+      return PinotDataType.INTEGER;
+    } else if (obj instanceof Long) {
+      return PinotDataType.LONG;
+    } else if (obj instanceof Float) {
+      return PinotDataType.FLOAT;
+    } else if (obj instanceof Double) {
+      return PinotDataType.DOUBLE;
+    } else if (obj instanceof String) {
+      return PinotDataType.STRING;
+    } else {
+      throw new IllegalStateException(String.format("'%s' isn't supported in 
the map.", obj.getClass()));
+    }
+  }
 }
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/data/recordtransformer/PinotDataTypeTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/data/recordtransformer/PinotDataTypeTest.java
index 674bfbd..b1a9b38 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/data/recordtransformer/PinotDataTypeTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/data/recordtransformer/PinotDataTypeTest.java
@@ -18,6 +18,8 @@
  */
 package org.apache.pinot.core.data.recordtransformer;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.testng.annotations.Test;
 
 import static org.apache.pinot.core.data.recordtransformer.PinotDataType.*;
@@ -104,6 +106,20 @@ public class PinotDataTypeTest {
   }
 
   @Test
+  public void testMap() {
+    Map<String, String> map1 = new HashMap<>();
+    map1.put("item", "10");
+    Map<String, String> map2 = new HashMap<>();
+    map2.put("item", "20");
+    Object[] objectArray = new Object[] {map1, map2};
+    assertEquals(STRING_ARRAY.convert(objectArray, OBJECT_ARRAY), new String[] 
{"10", "20"});
+    assertEquals(INTEGER_ARRAY.convert(objectArray, OBJECT_ARRAY), new 
Integer[]{10, 20});
+    assertEquals(LONG_ARRAY.convert(objectArray, OBJECT_ARRAY), new 
Long[]{10L, 20L});
+    assertEquals(FLOAT_ARRAY.convert(objectArray, OBJECT_ARRAY), new 
Float[]{10.0f, 20f});
+    assertEquals(DOUBLE_ARRAY.convert(objectArray, OBJECT_ARRAY), new 
Double[]{10.0d, 20d});
+  }
+
+  @Test
   public void testInvalidConversion() {
     for (PinotDataType sourceType : values()) {
       if (sourceType.isSingleValue() && sourceType != STRING && sourceType != 
BYTES) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to