>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