>From Ian Maxon <[email protected]>:

Ian Maxon has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17748 )


Change subject: [ASTERIXDB-3252][IDX] Fix index-only w/ UNKNOWN entries
......................................................................

[ASTERIXDB-3252][IDX] Fix index-only w/ UNKNOWN entries

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

Details:
Fix incorrect result of  B-tree secondary index search in index-only query when 
index includes UNKNOWNs

Change-Id: I2e2163755e396678eec87771d70978e6134a9232
---
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ArrayIndexUtil.java
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java
M 
asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryArrayIndexBTreeOperationsHelper.java
11 files changed, 45 insertions(+), 22 deletions(-)



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

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
index 9996e1f..0d19d06 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
@@ -559,12 +559,12 @@
         if (type1 == null || type2 == null) {
             return false;
         }
-        if 
(ATypeHierarchy.isSameTypeDomain(Index.getNonNullableType(type1).first.getTypeTag(),
-                Index.getNonNullableType(type2).first.getTypeTag(), 
useListDomain)) {
+        if (ATypeHierarchy.isSameTypeDomain(Index.getNonNullableType(type1, 
null).first.getTypeTag(),
+                Index.getNonNullableType(type2, null).first.getTypeTag(), 
useListDomain)) {
             return true;
         }
-        return 
ATypeHierarchy.canPromote(Index.getNonNullableType(type1).first.getTypeTag(),
-                Index.getNonNullableType(type2).first.getTypeTag());
+        return ATypeHierarchy.canPromote(Index.getNonNullableType(type1, 
null).first.getTypeTag(),
+                Index.getNonNullableType(type2, null).first.getTypeTag());
     }

     private Set<Index> fetchSecondaryIndexPreferences(IAccessMethod 
accessMethod,
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
index ee3fee0..e67d7bf 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
@@ -1088,7 +1088,7 @@
             if (!CAST_NULL_TYPE_CONSTRUCTORS.contains(funId)) {
                 return false;
             }
-            IAType nonNullableType = 
Index.getNonNullableType(indexedFieldType).first;
+            IAType nonNullableType = 
Index.getNonNullableType(indexedFieldType, index.getIndexType()).first;
             Pair<FunctionIdentifier, IAObject> constructorWithFmt =
                     IndexUtil.getTypeConstructorDefaultNull(index, 
nonNullableType, functionExpr.getSourceLocation());
             FunctionIdentifier indexedFieldConstructorFun = 
constructorWithFmt.first;
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
index 963b3ff..7540eaf 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Index.java
@@ -153,7 +153,7 @@
         return indexType == IndexType.BTREE && ((ValueIndexDetails) 
indexDetails).keyFieldNames.isEmpty();
     }

-    public static Pair<IAType, Boolean> getNonNullableType(IAType keyType) {
+    public static Pair<IAType, Boolean> getNonNullableType(IAType keyType, 
IndexType indexType) {
         boolean nullable = false;
         IAType actualKeyType = keyType;
         if (NonTaggedFormatUtil.isOptional(keyType)) {
@@ -166,7 +166,7 @@
     public static Pair<IAType, Boolean> getNonNullableOpenFieldType(Index 
index, IAType fieldType,
             List<String> fieldName, ARecordType recType) throws 
AlgebricksException {
         if (IndexUtil.castDefaultNull(index)) {
-            Pair<IAType, Boolean> nonNullableType = 
getNonNullableType(fieldType);
+            Pair<IAType, Boolean> nonNullableType = 
getNonNullableType(fieldType, index.getIndexType());
             nonNullableType.second = true;
             return nonNullableType;
         }
@@ -185,21 +185,21 @@
             }

             if (subType == null) {
-                keyPairType = Index.getNonNullableType(fieldType);
+                keyPairType = Index.getNonNullableType(fieldType, 
index.getIndexType());
                 break;
             }
         }
         if (subType != null) {
-            keyPairType = Index.getNonNullableKeyFieldType(fieldName, recType);
+            keyPairType = Index.getNonNullableKeyFieldType(fieldName, recType, 
index.getIndexType());
         }
         keyPairType.second = keyPairType.second || nullable;
         return keyPairType;
     }

-    public static Pair<IAType, Boolean> 
getNonNullableKeyFieldType(List<String> expr, ARecordType recType)
-            throws AlgebricksException {
+    public static Pair<IAType, Boolean> 
getNonNullableKeyFieldType(List<String> expr, ARecordType recType,
+            IndexType indexType) throws AlgebricksException {
         IAType keyType = Index.keyFieldType(expr, recType);
-        Pair<IAType, Boolean> pair = getNonNullableType(keyType);
+        Pair<IAType, Boolean> pair = getNonNullableType(keyType, indexType);
         pair.second = pair.second || recType.isSubFieldNullable(expr);
         return pair;
     }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ArrayIndexUtil.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ArrayIndexUtil.java
index 1abf300..aaa1551 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ArrayIndexUtil.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ArrayIndexUtil.java
@@ -22,6 +22,7 @@
 import java.util.Collections;
 import java.util.List;

+import org.apache.asterix.common.config.DatasetConfig;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
@@ -166,14 +167,14 @@
             }

             if (subType == null) {
-                keyPairType = Index.getNonNullableType(fieldType);
+                keyPairType = Index.getNonNullableType(fieldType, 
DatasetConfig.IndexType.ARRAY);
                 break;
             }
         }

         if (subType != null) {
             IAType keyType = ArrayIndexUtil.getSubFieldType(recType, 
unnestList, projectList);
-            Pair<IAType, Boolean> pair = Index.getNonNullableType(keyType);
+            Pair<IAType, Boolean> pair = Index.getNonNullableType(keyType, 
DatasetConfig.IndexType.ARRAY);
             pair.second = pair.second || 
ArrayIndexUtil.isSubFieldNullable(recType, unnestList, projectList);
             keyPairType = pair;
         }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryArrayIndexBTreeOperationsHelper.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryArrayIndexBTreeOperationsHelper.java
index 5b4fac8..242f335 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryArrayIndexBTreeOperationsHelper.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryArrayIndexBTreeOperationsHelper.java
@@ -206,7 +206,7 @@
                             : metaType;
             addSKEvalFactories(itemType, numSecondaryKeys, true);
             Pair<IAType, Boolean> keyTypePair;
-            keyTypePair = Index.getNonNullableKeyFieldType(filterFieldName, 
filterItemType);
+            keyTypePair = Index.getNonNullableKeyFieldType(filterFieldName, 
filterItemType, index.getIndexType());
             IAType type = keyTypePair.first;
             ISerializerDeserializer serde = 
serdeProvider.getSerializerDeserializer(type);
             secondaryRecFields[numPrimaryKeys + numSecondaryKeys] = serde;
@@ -535,7 +535,7 @@
         IScalarEvaluatorFactory sef = 
metadataProvider.getDataFormat().getFieldAccessEvaluatorFactory(
                 metadataProvider.getFunctionManager(), recordType, 
filterFieldName, numPrimaryKeys, sourceLoc);
         evalFactoryAndRecDescStackBuilder.addFilter(sef,
-                Index.getNonNullableKeyFieldType(filterFieldName, 
recordType).first);
+                Index.getNonNullableKeyFieldType(filterFieldName, recordType, 
index.getIndexType()).first);
     }

     class EvalFactoryAndRecDescInvoker implements 
ArrayIndexUtil.TypeTrackerCommandExecutor {
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
index 1889aa1..18810a5 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
@@ -238,7 +238,8 @@
                 sourceColumn = recordColumn + 1;
                 enforcedType = enforcedMetaType;
             }
-            IAType filterType = 
Index.getNonNullableKeyFieldType(filterFieldName, sourceType).first;
+            IAType filterType =
+                    Index.getNonNullableKeyFieldType(filterFieldName, 
sourceType, index.getIndexType()).first;
             IScalarEvaluatorFactory filterAccessor = 
createFieldAccessor(sourceType, sourceColumn, filterFieldName);
             secondaryFieldAccessEvalFactories[numSecondaryKeys] =
                     createFieldCast(filterAccessor, isOverridingKeyFieldTypes, 
enforcedType, sourceType, filterType);
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java
index 2b948ef..41fcb9a 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java
@@ -200,7 +200,8 @@
                 sourceColumn = recordColumn + 1;
                 enforcedType = enforcedMetaType;
             }
-            IAType filterType = 
Index.getNonNullableKeyFieldType(filterFieldName, sourceType).first;
+            IAType filterType =
+                    Index.getNonNullableKeyFieldType(filterFieldName, 
sourceType, index.getIndexType()).first;
             IScalarEvaluatorFactory filterAccessor = 
createFieldAccessor(sourceType, sourceColumn, filterFieldName);
             secondaryFieldAccessEvalFactories[numSecondaryKeys] =
                     createFieldCast(filterAccessor, isOverridingKeyTypes, 
enforcedType, sourceType, filterType);
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java
index cd3f01c..a437217 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java
@@ -131,7 +131,8 @@
             secondaryFieldAccessEvalFactories[numSecondaryKeys] = 
metadataProvider.getDataFormat()
                     
.getFieldAccessEvaluatorFactory(metadataProvider.getFunctionManager(), 
filterItemType,
                             filterFieldName, recordColumn, sourceLoc);
-            Pair<IAType, Boolean> keyTypePair = 
Index.getNonNullableKeyFieldType(filterFieldName, filterItemType);
+            Pair<IAType, Boolean> keyTypePair =
+                    Index.getNonNullableKeyFieldType(filterFieldName, 
filterItemType, indexType);
             IAType type = keyTypePair.first;
             ISerializerDeserializer serde = 
serdeProvider.getSerializerDeserializer(type);
             secondaryRecFields[numPrimaryKeys + numSecondaryKeys] = serde;
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java
index 302ad74..f50853f 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java
@@ -134,7 +134,8 @@
                 rtreeFields[i] = i;
             }

-            Pair<IAType, Boolean> typePair = 
Index.getNonNullableKeyFieldType(filterFieldName, filterItemType);
+            Pair<IAType, Boolean> typePair =
+                    Index.getNonNullableKeyFieldType(filterFieldName, 
filterItemType, index.getIndexType());
             IAType type = typePair.first;
             ISerializerDeserializer serde = 
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(type);
             secondaryRecFields[numPrimaryKeys + numNestedSecondaryKeyFields] = 
serde;
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java
index fa55105..b3fda76 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java
@@ -135,7 +135,8 @@
             secondaryFieldAccessEvalFactories[numSecondaryKeys] = 
metadataProvider.getDataFormat()
                     
.getFieldAccessEvaluatorFactory(metadataProvider.getFunctionManager(), 
filterItemType,
                             filterFieldName, numPrimaryKeys, sourceLoc);
-            Pair<IAType, Boolean> keyTypePair = 
Index.getNonNullableKeyFieldType(filterFieldName, filterItemType);
+            Pair<IAType, Boolean> keyTypePair =
+                    Index.getNonNullableKeyFieldType(filterFieldName, 
filterItemType, indexType);
             IAType type = keyTypePair.first;
             ISerializerDeserializer serde = 
serdeProvider.getSerializerDeserializer(type);
             secondaryRecFields[numPrimaryKeys + numSecondaryKeys] = serde;
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java
index 1c20eff..7b2499f 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java
@@ -147,7 +147,8 @@
                 rtreeFields[i] = i;
             }

-            Pair<IAType, Boolean> typePair = 
Index.getNonNullableKeyFieldType(filterFieldName, filterItemType);
+            Pair<IAType, Boolean> typePair =
+                    Index.getNonNullableKeyFieldType(filterFieldName, 
filterItemType, index.getIndexType());
             IAType type = typePair.first;
             ISerializerDeserializer serde = 
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(type);
             secondaryRecFields[numPrimaryKeys + numNestedSecondaryKeyFields] = 
serde;

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17748
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings

Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Change-Id: I2e2163755e396678eec87771d70978e6134a9232
Gerrit-Change-Number: 17748
Gerrit-PatchSet: 1
Gerrit-Owner: Ian Maxon <[email protected]>
Gerrit-CC: Shahrzad Haji Amin Shirazi <[email protected]>
Gerrit-MessageType: newchange

Reply via email to