Xikui Wang has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/3405


Change subject: [NO ISSUE] Fix type inference for ANY in UDFs
......................................................................

[NO ISSUE] Fix type inference for ANY in UDFs

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
When data type is available, we should use defined data type. If not, we
should try to parse the data type from the data.

Change-Id: I6a03749fe041ec6f43de230d3e784122f7664545
---
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.3.query.sqlpp
M 
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/CharArrayRecord.java
M 
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
3 files changed, 14 insertions(+), 4 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/05/3405/1

diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.3.query.sqlpp
index 743d39a..62c2b87 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.3.query.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.3.query.sqlpp
@@ -18,7 +18,7 @@
  */
 use externallibtest;

-let i={"id":1, "text_list": [{"text":"lower text1"}, {"text":"lower text2"}]}
+let i={"id":1, "text_list": [{"text":"lower text1"}, {"text":"lower text2"}], 
"another_list" : ["string_1", "string_2"]}
 select value `testlib#toUpper`(i);

 let i=`testlib#toUpper`({"id":1, "text_list":[{"text":"lower text"}]})
diff --git 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/CharArrayRecord.java
 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/CharArrayRecord.java
index 65ecd8d..678b3d7 100644
--- 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/CharArrayRecord.java
+++ 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/CharArrayRecord.java
@@ -90,7 +90,7 @@

     @Override
     public String toString() {
-        return String.valueOf(value, 0, size == 0 ? 0 : size - 1);
+        return String.valueOf(value, 0, size == 0 ? 0 : size);
     }

     public void endRecord() throws IOException {
diff --git 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
index ee8308f..3af08fa 100644
--- 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
+++ 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
@@ -583,10 +583,20 @@
         public IJObject access(AListVisitablePointable pointable, 
IObjectPool<IJObject, IAType> objectPool,
                 IAType listType, JObjectPointableVisitor pointableVisitor) 
throws HyracksDataException {
             List<IVisitablePointable> items = pointable.getItems();
+            List<IVisitablePointable> itemTags = pointable.getItemTags();
             JList list = pointable.ordered() ? new JOrderedList(listType) : 
new JUnorderedList(listType);
             IJObject listItem;
-            for (IVisitablePointable itemPointable : items) {
-                final IAType fieldType = ((AbstractCollectionType) 
listType).getItemType();
+            for (int iter1 = 0; iter1 < items.size(); iter1++) {
+                IVisitablePointable itemPointable = items.get(iter1);
+                // First, try to get defined type.
+                IAType fieldType = ((AbstractCollectionType) 
listType).getItemType();
+                if (fieldType.getTypeTag() == ATypeTag.ANY) {
+                    // Second, if defined type is not available, try to infer 
it from data
+                    IVisitablePointable itemTagPointable = itemTags.get(iter1);
+                    ATypeTag itemTypeTag = 
EnumDeserializer.ATYPETAGDESERIALIZER
+                            
.deserialize(itemTagPointable.getByteArray()[itemTagPointable.getStartOffset()]);
+                    fieldType = TypeTagUtil.getBuiltinTypeByTag(itemTypeTag);
+                }
                 typeInfo.reset(fieldType, fieldType.getTypeTag());
                 switch (typeInfo.getTypeTag()) {
                     case OBJECT:

--
To view, visit https://asterix-gerrit.ics.uci.edu/3405
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a03749fe041ec6f43de230d3e784122f7664545
Gerrit-Change-Number: 3405
Gerrit-PatchSet: 1
Gerrit-Owner: Xikui Wang <[email protected]>

Reply via email to