You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2021/06/30 00:11:23 UTC

[asterixdb] 03/23: [ASTERIXDB-2732][FUN] Support missing and union type in get_object_field_value

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 <al...@gmail.com>
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 <je...@fulliautomatix.ics.uci.edu>
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
    Reviewed-by: Dmitry Lychagin <dm...@couchbase.com>
---
 ...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.