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>