Xikui Wang has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/3264

Change subject: [NO ISSUE][FUN] Fix type inference in JListAccessor
......................................................................

[NO ISSUE][FUN] Fix type inference in JListAccessor

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

Details:
As the list element type is available, there is no need to deserialize
element types from the data. Doing so, for example, will cause the
object type to be fully open type and closed fields to be recognized as
open fields. This will further cause NPE in UDFs. Modified the upperCase
test case to check this issue.

Change-Id: I4f437857779e5c0af175c695938fbd7208da244d
---
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.1.ddl.sqlpp
M 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.3.query.sqlpp
M 
asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/upperCase/upperCase.1.adm
M 
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
M 
asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/UpperCaseFunction.java
5 files changed, 32 insertions(+), 22 deletions(-)


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

diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.1.ddl.sqlpp
index 8130de2..292e4e1 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.1.ddl.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/upperCase/upperCase.1.ddl.sqlpp
@@ -20,7 +20,11 @@
 CREATE DATAVERSE  externallibtest;
 USE externallibtest;
 
+create type list_element as open{
+    text: string
+};
+
 create type TextType if not exists as open {
     id: int32,
-    text: string
+    text_list: [list_element]
 };
\ No newline at end of file
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 f361232..743d39a 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,11 +18,11 @@
  */
 use externallibtest;
 
-let i={"id":1, "text":"lower text"}
+let i={"id":1, "text_list": [{"text":"lower text1"}, {"text":"lower text2"}]}
 select value `testlib#toUpper`(i);
 
-let i=`testlib#toUpper`({"id":1, "text":"lower text"})
+let i=`testlib#toUpper`({"id":1, "text_list":[{"text":"lower text"}]})
 select value i;
 
-let i= {"field1" : `testlib#toUpper`({"id":1, "text":"lower text"}), "field2": 
123}
+let i= {"field1" : `testlib#toUpper`({"id":1, "text_list":[{"text":"lower 
text"}]}), "field2": 123}
 select value i;
\ No newline at end of file
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/upperCase/upperCase.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/upperCase/upperCase.1.adm
index e4af2be..2efaa4f 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/upperCase/upperCase.1.adm
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/upperCase/upperCase.1.adm
@@ -1,3 +1,3 @@
-{ "id": -1, "text": "LOWER TEXT" }
-{ "id": -1, "text": "LOWER TEXT" }
-{ "field1": { "id": -1, "text": "LOWER TEXT" }, "field2": 123 }
+{ "id": -1, "text_list": [ { "text": "lower text1" }, { "text": "lower text2" 
} ], "element_n": 2, "capitalized_list": [ "LOWER TEXT1", "LOWER TEXT2" ] }
+{ "id": -1, "text_list": [ { "text": "lower text" } ], "element_n": 1, 
"capitalized_list": [ "LOWER TEXT" ] }
+{ "field1": { "id": -1, "text_list": [ { "text": "lower text" } ], 
"element_n": 1, "capitalized_list": [ "LOWER TEXT" ] }, "field2": 123 }
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 2678a8d..1a6553c 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
@@ -82,8 +82,10 @@
 import org.apache.asterix.om.pointables.AListVisitablePointable;
 import org.apache.asterix.om.pointables.ARecordVisitablePointable;
 import org.apache.asterix.om.pointables.base.IVisitablePointable;
+import org.apache.asterix.om.types.AOrderedListType;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.AbstractCollectionType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.EnumDeserializer;
 import org.apache.asterix.om.types.IAType;
@@ -582,17 +584,12 @@
         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;
-            int index = 0;
             for (IVisitablePointable itemPointable : items) {
-                IVisitablePointable itemTagPointable = itemTags.get(index);
-                ATypeTag itemTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                        
.deserialize(itemTagPointable.getByteArray()[itemTagPointable.getStartOffset()]);
-                final IAType fieldType = 
TypeTagUtil.getBuiltinTypeByTag(itemTypeTag);
-                typeInfo.reset(fieldType, itemTypeTag);
-                switch (itemTypeTag) {
+                final IAType fieldType = ((AbstractCollectionType) 
listType).getItemType();
+                typeInfo.reset(fieldType, fieldType.getTypeTag());
+                switch (typeInfo.getTypeTag()) {
                     case OBJECT:
                         listItem = 
pointableVisitor.visit((ARecordVisitablePointable) itemPointable, typeInfo);
                         break;
diff --git 
a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/UpperCaseFunction.java
 
b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/UpperCaseFunction.java
index 82f77ac..398504a 100644
--- 
a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/UpperCaseFunction.java
+++ 
b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/UpperCaseFunction.java
@@ -21,8 +21,10 @@
 import org.apache.asterix.external.api.IExternalScalarFunction;
 import org.apache.asterix.external.api.IFunctionHelper;
 import org.apache.asterix.external.library.java.base.JInt;
+import org.apache.asterix.external.library.java.base.JOrderedList;
 import org.apache.asterix.external.library.java.base.JRecord;
 import org.apache.asterix.external.library.java.base.JString;
+import org.apache.asterix.om.types.BuiltinType;
 
 /**
  * Accepts an input record of type Open{ id: int32, text: string }
@@ -43,16 +45,23 @@
     @Override
     public void evaluate(IFunctionHelper functionHelper) throws Exception {
         JRecord inputRecord = (JRecord) functionHelper.getArgument(0);
+        JOrderedList textList = (JOrderedList) 
inputRecord.getValueByName("text_list");
+        JOrderedList capList = new JOrderedList(BuiltinType.ASTRING);
         JInt id = (JInt) inputRecord.getValueByName("id");
-        id.setValue(id.getValue() * -1); // for maintaining uniqueness
-                                         // constraint in the case when
-                                         // output is re-inserted into source
-                                         // dataset
-        JString text = (JString) inputRecord.getValueByName("text");
-        text.setValue(text.getValue().toUpperCase());
+        id.setValue(id.getValue() * -1);
+
+        for (int iter1 = 0; iter1 < textList.getValue().size(); iter1++) {
+            JRecord originalElement = (JRecord) textList.getValue().get(iter1);
+            JString originalText = (JString) 
originalElement.getValueByName("text");
+            JString capText = new 
JString(originalText.getValue().toUpperCase());
+            capList.getValue().add(capText);
+        }
+        JInt element_n = new JInt(textList.size());
         JRecord result = (JRecord) functionHelper.getResultObject();
         result.setField("id", id);
-        result.setField("text", text);
+        result.setField("text_list", textList);
+        result.setField("element_n", element_n);
+        result.setField("capitalized_list", capList);
         functionHelper.setResult(result);
     }
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4f437857779e5c0af175c695938fbd7208da244d
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Xikui Wang <xkk...@gmail.com>

Reply via email to