This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit bba56a5da434a77b63e856a353ea7e7a4455ef7d Author: Ali Alsuliman <[email protected]> AuthorDate: Thu Jun 3 20:50:08 2021 +0300 [ASTERIXDB-2732][FUN] Support missing and union type in get_object_field_value - user model changes: no - storage format changes: no - interface changes: no Change-Id: I84355e0ae91afd0328e636aa4f3bed6eeb44e055 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/11764 Tested-by: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> Reviewed-by: Dmitry Lychagin <[email protected]> --- ...cess.1.query.sqlpp => field-access.1.ddl.sqlpp} | 19 ++++++++--- ...s.1.query.sqlpp => field-access.2.update.sqlpp} | 8 ++--- ...ss.1.query.sqlpp => field-access.3.query.sqlpp} | 10 +++--- ...ss.1.query.sqlpp => field-access.4.query.sqlpp} | 9 ++--- .../null-missing/field-access/field-access.1.adm | 4 ++- .../null-missing/field-access/field-access.2.adm | 3 ++ .../records/GetRecordFieldValueEvalFactory.java | 39 ++++++++++++++-------- 7 files changed, 61 insertions(+), 31 deletions(-) diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.ddl.sqlpp similarity index 73% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.ddl.sqlpp index 7be4593..0d6ab35 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.ddl.sqlpp @@ -17,7 +17,18 @@ * under the License. */ -{ - 'null': {'a': null}.a, - 'missing': {'b': missing}.b -}; \ No newline at end of file +drop dataverse test if exists; +create dataverse test; +use test; + +drop dataset samptable if exists; +drop type samptabletype if exists; + +create type samptabletype as closed { + id: tinyint, + mf: tinyint?, + rf: { pid:tinyint}? +}; + + +create dataset samptable(samptabletype) primary key id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.2.update.sqlpp similarity index 80% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.2.update.sqlpp index 7be4593..8a7e88b 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.2.update.sqlpp @@ -17,7 +17,7 @@ * under the License. */ -{ - 'null': {'a': null}.a, - 'missing': {'b': missing}.b -}; \ No newline at end of file +use test; +insert into samptable ({'id' : 0, 'mf':missing, 'rf':{'pid':4}}); +insert into samptable ({'id' : 1, 'mf':null, 'rf':missing}); +insert into samptable ({'id' : 2, 'mf':5, 'rf':null}); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.3.query.sqlpp similarity index 82% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.3.query.sqlpp index 7be4593..bed3710 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.3.query.sqlpp @@ -17,7 +17,9 @@ * under the License. */ -{ - 'null': {'a': null}.a, - 'missing': {'b': missing}.b -}; \ No newline at end of file +use test; + +from samptable d +select id, get_object_field_value(d, 'rf') as field_value, + get_object_field_value(d, 'rf') is missing as is_missing +order by id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.4.query.sqlpp similarity index 82% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.4.query.sqlpp index 7be4593..553dc55 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/field-access/field-access.4.query.sqlpp @@ -16,8 +16,9 @@ * specific language governing permissions and limitations * under the License. */ +use test; -{ - 'null': {'a': null}.a, - 'missing': {'b': missing}.b -}; \ No newline at end of file +from samptable d +select id, get_object_field_value(d, 'mf') as field_value, + get_object_field_value(d, 'mf') is missing as is_missing +order by id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/field-access/field-access.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/field-access/field-access.1.adm index d7a20ef..f157d67 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/field-access/field-access.1.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/field-access/field-access.1.adm @@ -1 +1,3 @@ -{ "null": null } +{ "id": 0, "field_value": { "pid": 4 }, "is_missing": false } +{ "id": 1, "is_missing": true } +{ "id": 2, "field_value": null, "is_missing": false } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/field-access/field-access.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/field-access/field-access.2.adm new file mode 100644 index 0000000..767c19b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/field-access/field-access.2.adm @@ -0,0 +1,3 @@ +{ "id": 0, "is_missing": true } +{ "id": 1, "field_value": null, "is_missing": false } +{ "id": 2, "field_value": 5, "is_missing": false } \ No newline at end of file diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java index 103a164..d6c0e21 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldValueEvalFactory.java @@ -27,7 +27,9 @@ import org.apache.asterix.formats.nontagged.BinaryHashFunctionFactoryProvider; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.types.ARecordType; import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.AUnionType; import org.apache.asterix.om.types.EnumDeserializer; +import org.apache.asterix.om.types.IAType; import org.apache.asterix.om.types.runtime.RuntimeRecordTypeInfo; import org.apache.asterix.om.utils.NonTaggedFormatUtil; import org.apache.asterix.om.utils.RecordUtil; @@ -93,7 +95,6 @@ public class GetRecordFieldValueEvalFactory implements IScalarEvaluatorFactory { if (PointableHelper.checkAndSetMissingOrNull(result, inputArg0, inputArg1)) { return; } - byte[] serFldName = inputArg1.getByteArray(); int serFldNameOffset = inputArg1.getStartOffset(); int serFldNameLen = inputArg1.getLength(); @@ -114,22 +115,32 @@ public class GetRecordFieldValueEvalFactory implements IScalarEvaluatorFactory { int subFieldIndex = recTypeInfo.getFieldIndex(serFldName, serFldNameOffset + 1, serFldNameLen - 1); if (subFieldIndex >= 0) { int nullBitmapSize = RecordUtil.computeNullBitmapSize(recordType); + subFieldOffset = ARecordSerializerDeserializer.getFieldOffsetById(serRecord, serRecordOffset, subFieldIndex, nullBitmapSize, recordType.isOpen()); - if (subFieldOffset == 0) { - // the field is null, we checked the null bit map - out.writeByte(ATypeTag.SERIALIZED_NULL_TYPE_TAG); - result.set(resultStorage); - return; + switch (subFieldOffset) { + case -1: + out.writeByte(ATypeTag.SERIALIZED_MISSING_TYPE_TAG); + result.set(resultStorage); + return; + case 0: + out.writeByte(ATypeTag.SERIALIZED_NULL_TYPE_TAG); + result.set(resultStorage); + return; + default: + IAType fieldType = recordType.getFieldTypes()[subFieldIndex]; + if (fieldType.getTypeTag() == ATypeTag.UNION) { + fieldType = ((AUnionType) fieldType).getActualType(); + } + ATypeTag fieldTypeTag = fieldType.getTypeTag(); + subFieldLength = NonTaggedFormatUtil.getFieldValueLength(serRecord, subFieldOffset, + fieldTypeTag, false); + // write result. + out.writeByte(fieldTypeTag.serialize()); + out.write(serRecord, subFieldOffset, subFieldLength); + result.set(resultStorage); + return; } - ATypeTag fieldTypeTag = recordType.getFieldTypes()[subFieldIndex].getTypeTag(); - subFieldLength = - NonTaggedFormatUtil.getFieldValueLength(serRecord, subFieldOffset, fieldTypeTag, false); - // write result. - out.writeByte(fieldTypeTag.serialize()); - out.write(serRecord, subFieldOffset, subFieldLength); - result.set(resultStorage); - return; } // Look at open fields.
