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 92890381c9f3ff40f5d035abe5db46cffdac4978 Author: Wail Alkowaileet <[email protected]> AuthorDate: Wed Feb 8 17:00:57 2023 -0800 [ASTERIXDB-3105][COMP] Fix limit pushdown in views with uuid() keys - user model changes: no - storage format changes: no - interface changes: no Details: LIMIT (with and without SELECTs) are not pushed down when a uuid() is used as a PK in views. The reason is that queries against views create (sometimes) unnecessary is-null checks (e.g., on a call to uuid()). Change-Id: I717fdfca8d09144443b1f49c5588defeb895766e Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17303 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> --- .../asterix/optimizer/base/RuleCollections.java | 10 +- .../optimizer/rules/ConstantFoldingRule.java | 42 +++-- .../rules/RemoveOrReplaceDefaultNullCastRule.java | 180 +++++++++++++++++++++ ...moveUnknownCheckForKnownTypeExpressionRule.java | 121 ++++++++++++++ .../optimizer/rules/am/AccessMethodUtils.java | 8 +- .../cast-default-null/cast-default-null-25.sqlpp | 38 +++++ .../cast-default-null/cast-default-null-01.plan | 20 +-- .../cast-default-null/cast-default-null-02.plan | 28 ++-- .../cast-default-null/cast-default-null-03.plan | 20 +-- .../cast-default-null/cast-default-null-05.plan | 2 +- .../cast-default-null/cast-default-null-10.plan | 28 ++-- .../cast-default-null/cast-default-null-11.plan | 28 ++-- .../cast-default-null/cast-default-null-12.plan | 28 ++-- .../cast-default-null/cast-default-null-13.plan | 28 ++-- .../cast-default-null/cast-default-null-14.plan | 28 ++-- .../cast-default-null/cast-default-null-15.plan | 28 ++-- .../cast-default-null/cast-default-null-16.plan | 20 +-- .../cast-default-null/cast-default-null-17.plan | 20 +-- .../cast-default-null/cast-default-null-18.plan | 20 +-- .../cast-default-null/cast-default-null-19.plan | 2 +- .../cast-default-null/cast-default-null-20.plan | 28 ++-- .../cast-default-null/cast-default-null-21.plan | 20 +-- .../cast-default-null/cast-default-null-22.plan | 20 +-- .../cast-default-null/cast-default-null-23.plan | 28 ++-- .../cast-default-null/cast-default-null-25.plan | 19 +++ .../view/view-pushdown/view-pushdown.01.ddl.sqlpp | 98 +++++++++++ .../view-pushdown/view-pushdown.02.update.sqlpp | 25 +++ .../view-pushdown/view-pushdown.03.query.sqlpp | 32 ++++ .../view-pushdown/view-pushdown.04.query.sqlpp | 32 ++++ .../view-pushdown/view-pushdown.05.query.sqlpp | 25 +++ .../view-pushdown/view-pushdown.06.query.sqlpp | 25 +++ .../view-pushdown/view-pushdown.07.query.sqlpp | 32 ++++ .../view-pushdown/view-pushdown.08.query.sqlpp | 32 ++++ .../view-pushdown/view-pushdown.09.query.sqlpp | 26 +++ .../view-pushdown/view-pushdown.10.query.sqlpp | 26 +++ .../view-pushdown/view-pushdown.11.query.sqlpp | 32 ++++ .../view-pushdown/view-pushdown.12.query.sqlpp | 32 ++++ .../view-pushdown/view-pushdown.13.query.sqlpp | 26 +++ .../view-pushdown/view-pushdown.14.query.sqlpp | 26 +++ .../view/view-pushdown/view-pushdown.03.adm | 3 + .../view/view-pushdown/view-pushdown.04.plan | 34 ++++ .../view/view-pushdown/view-pushdown.05.adm | 3 + .../view/view-pushdown/view-pushdown.06.plan | 22 +++ .../view/view-pushdown/view-pushdown.07.adm | 3 + .../view/view-pushdown/view-pushdown.08.plan | 26 +++ .../view/view-pushdown/view-pushdown.09.adm | 3 + .../view/view-pushdown/view-pushdown.10.plan | 26 +++ .../view/view-pushdown/view-pushdown.11.adm | 3 + .../view/view-pushdown/view-pushdown.12.plan | 26 +++ .../view/view-pushdown/view-pushdown.13.adm | 3 + .../view/view-pushdown/view-pushdown.14.plan | 26 +++ .../test/resources/runtimets/testsuite_sqlpp.xml | 5 + 52 files changed, 1223 insertions(+), 243 deletions(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java index bebc4f24b4..473c8ecb12 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java @@ -81,9 +81,11 @@ import org.apache.asterix.optimizer.rules.PushSimilarityFunctionsBelowJoin; import org.apache.asterix.optimizer.rules.PushValueAccessToExternalDataScanRule; import org.apache.asterix.optimizer.rules.RemoveDuplicateFieldsRule; import org.apache.asterix.optimizer.rules.RemoveLeftOuterUnnestForLeftOuterJoinRule; +import org.apache.asterix.optimizer.rules.RemoveOrReplaceDefaultNullCastRule; import org.apache.asterix.optimizer.rules.RemoveRedundantListifyRule; import org.apache.asterix.optimizer.rules.RemoveRedundantSelectRule; import org.apache.asterix.optimizer.rules.RemoveSortInFeedIngestionRule; +import org.apache.asterix.optimizer.rules.RemoveUnknownCheckForKnownTypeExpressionRule; import org.apache.asterix.optimizer.rules.RemoveUnusedOneToOneEquiJoinRule; import org.apache.asterix.optimizer.rules.RewriteDistinctAggregateRule; import org.apache.asterix.optimizer.rules.SetAsterixMemoryRequirementsRule; @@ -342,6 +344,12 @@ public final class RuleCollections { planCleanupRules.add(new RemoveCartesianProductWithEmptyBranchRule()); planCleanupRules.add(new InjectTypeCastForFunctionArgumentsRule()); planCleanupRules.add(new InjectTypeCastForUnionRule()); + // (1) RemoveOrReplaceDefaultNullCastRule and (2) RemoveUnknownCheckForKnownTypesRule has to run in this order + // to ensure removing unknown checks, which requires the removal of null producers by (1) + planCleanupRules.add(new RemoveOrReplaceDefaultNullCastRule()); + planCleanupRules.add(new RemoveUnknownCheckForKnownTypeExpressionRule()); + // relies on RemoveOrReplaceDefaultNullCastRule AND RemoveUnknownCheckForKnownTypeExpressionRule + planCleanupRules.add(new RemoveRedundantSelectRule()); // Needs to invoke ByNameToByIndexFieldAccessRule as the last logical optimization rule because // some rules can push a FieldAccessByName to a place where the name it tries to access is in the closed part. @@ -387,7 +395,7 @@ public final class RuleCollections { physicalRewritesAllLevels.add(new InlineSingleReferenceVariablesRule()); physicalRewritesAllLevels.add(new RemoveUnusedAssignAndAggregateRule()); physicalRewritesAllLevels.add(new ConsolidateAssignsRule(true)); - // After adding projects, we may need need to set physical operators again. + // After adding projects, we may need to set physical operators again. physicalRewritesAllLevels.add(new SetAsterixPhysicalOperatorsRule()); // Optimized spatial join's query plan produces more join conditions, so we need to pull out these conditions physicalRewritesAllLevels.add(new PullSelectOutOfSpatialJoin()); diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java index 92e9ddabed..fe000c32cd 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ConstantFoldingRule.java @@ -221,10 +221,10 @@ public class ConstantFoldingRule implements IAlgebraicRewriteRule { boolean changed = constantFoldArgs(expr, arg); List<Mutable<ILogicalExpression>> argList = expr.getArguments(); int argConstantCount = countConstantArgs(argList); + FunctionIdentifier fid = expr.getFunctionIdentifier(); if (argConstantCount != argList.size()) { - if (argConstantCount > 0 && expr.getFunctionIdentifier().equals(BuiltinFunctions.OR) - && expr.isFunctional()) { - if (foldOrArgs(expr)) { + if (argConstantCount > 0 && (BuiltinFunctions.OR.equals(fid) || BuiltinFunctions.AND.equals(fid))) { + if (foldOrAndArgs(expr)) { ILogicalExpression changedExpr = expr.getArguments().size() == 1 ? expr.getArguments().get(0).getValue() : expr; return new Pair<>(true, changedExpr); @@ -238,7 +238,7 @@ public class ConstantFoldingRule implements IAlgebraicRewriteRule { } try { - if (expr.getFunctionIdentifier().equals(BuiltinFunctions.FIELD_ACCESS_BY_NAME)) { + if (BuiltinFunctions.FIELD_ACCESS_BY_NAME.equals(fid)) { IAType argType = (IAType) _emptyTypeEnv.getType(expr.getArguments().get(0).getValue()); if (argType.getTypeTag() == ATypeTag.OBJECT) { ARecordType rt = (ARecordType) argType; @@ -250,7 +250,7 @@ public class ConstantFoldingRule implements IAlgebraicRewriteRule { } } } - IAObject c = FUNC_ID_TO_CONSTANT.get(expr.getFunctionIdentifier()); + IAObject c = FUNC_ID_TO_CONSTANT.get(fid); if (c != null) { ConstantExpression constantExpression = new ConstantExpression(new AsterixConstantValue(c)); constantExpression.setSourceLocation(expr.getSourceLocation()); @@ -430,7 +430,7 @@ public class ConstantFoldingRule implements IAlgebraicRewriteRule { return true; } - private boolean foldOrArgs(ScalarFunctionCallExpression expr) { + private boolean foldOrAndArgs(ScalarFunctionCallExpression expr) { // or(true,x,y) -> true; or(false,x,y) -> or(x,y) boolean changed = false; List<Mutable<ILogicalExpression>> argList = expr.getArguments(); @@ -442,15 +442,21 @@ public class ConstantFoldingRule implements IAlgebraicRewriteRule { if (argExpr.getExpressionTag() != LogicalExpressionTag.CONSTANT) { continue; } + ConstantExpression cExpr = (ConstantExpression) argExpr; IAlgebricksConstantValue cValue = cExpr.getValue(); - if (cValue.isTrue()) { + FunctionIdentifier fid = expr.getFunctionIdentifier(); + + if (replaceAndReturn(cValue, fid)) { // or(true,x,y) -> true; + // and(false, x, y) -> false argList.clear(); argList.add(argExprRef); return true; - } else if (cValue.isFalse()) { - // remove 'false' from arg list, but save the expression. + } else if (removeAndContinue(cValue, fid)) { + // or(false, x, y) -> or(x, y) + // and(true, x, y) -> and(x, y) + // remove 'false' (or 'true') from arg list, but save the expression. argFalse = argExprRef; argIter.remove(); changed = true; @@ -462,6 +468,24 @@ public class ConstantFoldingRule implements IAlgebraicRewriteRule { return changed; } + private boolean replaceAndReturn(IAlgebricksConstantValue cValue, FunctionIdentifier fid) { + if (BuiltinFunctions.OR.equals(fid)) { + return cValue.isTrue(); + } else { + // BuiltinFunctions.AND + return cValue.isFalse(); + } + } + + private boolean removeAndContinue(IAlgebricksConstantValue cValue, FunctionIdentifier fid) { + if (BuiltinFunctions.OR.equals(fid)) { + return cValue.isFalse(); + } else { + // BuiltinFunctions.AND + return cValue.isTrue(); + } + } + // IEvaluatorContext @Override diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveOrReplaceDefaultNullCastRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveOrReplaceDefaultNullCastRule.java new file mode 100644 index 0000000000..5791bd720b --- /dev/null +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveOrReplaceDefaultNullCastRule.java @@ -0,0 +1,180 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.asterix.optimizer.rules; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.asterix.metadata.declared.MetadataProvider; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.AUnionType; +import org.apache.asterix.om.types.IAType; +import org.apache.asterix.om.types.hierachy.ATypeHierarchy; +import org.apache.commons.lang3.mutable.Mutable; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator; +import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext; +import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag; +import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; +import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression; +import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; +import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule; + +/** + * This rule removes unnecessary default-null casts functions for known types + * For example: + * <p> + * Before: + * assign [$$uid] <- [uuid-default-null(uuid())] + * After: + * assign [$$uid] <- [uuid()] + * <p> + * Before: + * assign [$$uid] <- [string-default-null(uuid())] + * After: + * assign [$$uid] <- [string(uuid())] + * <p> + * It is known that uuid() will not produce a null value. Hence, casting it using uuid-default-null() or + * string-default-null() are useless + */ +public class RemoveOrReplaceDefaultNullCastRule implements IAlgebraicRewriteRule { + private static final Map<FunctionIdentifier, FunctionIdentifier> CAST_MAP; + + static { + CAST_MAP = new HashMap<>(); + CAST_MAP.put(BuiltinFunctions.BOOLEAN_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.BOOLEAN_CONSTRUCTOR); + + CAST_MAP.put(BuiltinFunctions.INT8_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.INT8_CONSTRUCTOR); + CAST_MAP.put(BuiltinFunctions.INT16_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.INT16_CONSTRUCTOR); + CAST_MAP.put(BuiltinFunctions.INT32_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.INT32_CONSTRUCTOR); + CAST_MAP.put(BuiltinFunctions.INT64_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.INT64_CONSTRUCTOR); + + CAST_MAP.put(BuiltinFunctions.FLOAT_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.FLOAT_CONSTRUCTOR); + CAST_MAP.put(BuiltinFunctions.DOUBLE_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.DOUBLE_CONSTRUCTOR); + + // *_DEFAULT_NULL_WITH_FORMAT_CONSTRUCTOR are not considered here as format may differ from the original value + CAST_MAP.put(BuiltinFunctions.DATE_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.DATE_CONSTRUCTOR); + CAST_MAP.put(BuiltinFunctions.TIME_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.TIME_CONSTRUCTOR); + CAST_MAP.put(BuiltinFunctions.DATETIME_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.DATETIME_CONSTRUCTOR); + + CAST_MAP.put(BuiltinFunctions.DURATION_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.DURATION_CONSTRUCTOR); + CAST_MAP.put(BuiltinFunctions.DAY_TIME_DURATION_DEFAULT_NULL_CONSTRUCTOR, + BuiltinFunctions.DAY_TIME_DURATION_CONSTRUCTOR); + CAST_MAP.put(BuiltinFunctions.YEAR_MONTH_DURATION_DEFAULT_NULL_CONSTRUCTOR, + BuiltinFunctions.YEAR_MONTH_DURATION_CONSTRUCTOR); + + CAST_MAP.put(BuiltinFunctions.STRING_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.STRING_CONSTRUCTOR); + + CAST_MAP.put(BuiltinFunctions.BINARY_BASE64_DEFAULT_NULL_CONSTRUCTOR, + BuiltinFunctions.BINARY_BASE64_CONSTRUCTOR); + + CAST_MAP.put(BuiltinFunctions.UUID_DEFAULT_NULL_CONSTRUCTOR, BuiltinFunctions.UUID_CONSTRUCTOR); + } + + @Override + public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) + throws AlgebricksException { + ILogicalOperator op = opRef.getValue(); + + if (op.getOperatorTag() == LogicalOperatorTag.ASSIGN) { + //process assign + AssignOperator assignOp = (AssignOperator) op; + return processExpressions(context, assignOp, assignOp.getExpressions()); + } else if (op.getOperatorTag() == LogicalOperatorTag.SELECT) { + //process select + SelectOperator selectOp = (SelectOperator) op; + return processExpression(context, selectOp, selectOp.getCondition()); + } + return false; + } + + private boolean processExpressions(IOptimizationContext context, ILogicalOperator op, + List<Mutable<ILogicalExpression>> expressions) throws AlgebricksException { + boolean changed = false; + for (Mutable<ILogicalExpression> exprRef : expressions) { + changed |= processExpression(context, op, exprRef); + } + return changed; + } + + private boolean processExpression(IOptimizationContext context, ILogicalOperator op, + Mutable<ILogicalExpression> exprRef) throws AlgebricksException { + ILogicalExpression expr = exprRef.getValue(); + if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) { + return false; + } + + AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr; + FunctionIdentifier fid = funcExpr.getFunctionIdentifier(); + + // First, process arguments to handle nested casts + boolean changed = processExpressions(context, op, funcExpr.getArguments()); + if (!CAST_MAP.containsKey(fid)) { + return changed; + } + + ILogicalExpression castArgExpr = funcExpr.getArguments().get(0).getValue(); + IVariableTypeEnvironment env = context.getOutputTypeEnvironment(op); + + IAType outputType = ((AUnionType) env.getType(funcExpr)).getActualType(); + IAType argType = (IAType) env.getType(castArgExpr); + + //If arg type is a union type (or unknowable), then the function removed as below + if (isDerivedOrAny(argType) || !outputType.equals(argType) && !isConvertableType(fid, outputType, argType)) { + // The types of cast and its argument are different + // Also, the cast function isn't a string function + return changed; + } + + if (outputType.equals(argType)) { + exprRef.setValue(castArgExpr); + } else { + MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider(); + IFunctionInfo functionInfo = metadataProvider.lookupFunction(CAST_MAP.get(fid)); + funcExpr.setFunctionInfo(functionInfo); + context.computeAndSetTypeEnvironmentForOperator(op); + } + return true; + } + + private boolean isDerivedOrAny(IAType argType) { + ATypeTag argTypeTag = argType.getTypeTag(); + return argTypeTag.isDerivedType() || argTypeTag == ATypeTag.ANY; + } + + private boolean isConvertableType(FunctionIdentifier fid, IAType outputType, IAType argType) { + ATypeTag outputTypeTag = outputType.getTypeTag(); + ATypeTag argTypeTag = argType.getTypeTag(); + + boolean convertableNumeric = ATypeHierarchy.getTypeDomain(outputTypeTag) == ATypeHierarchy.Domain.NUMERIC + && ATypeHierarchy.getTypeDomain(argTypeTag) == ATypeHierarchy.Domain.NUMERIC + && (ATypeHierarchy.canPromote(argTypeTag, outputTypeTag) + || ATypeHierarchy.canDemote(argTypeTag, outputTypeTag)); + + // converting to string is suitable for all non-derived types + return BuiltinFunctions.STRING_DEFAULT_NULL_CONSTRUCTOR.equals(fid) || convertableNumeric; + } +} diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveUnknownCheckForKnownTypeExpressionRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveUnknownCheckForKnownTypeExpressionRule.java new file mode 100644 index 0000000000..93cf6c5b9f --- /dev/null +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveUnknownCheckForKnownTypeExpressionRule.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.asterix.optimizer.rules; + +import java.util.List; + +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.types.ATypeTag; +import org.apache.asterix.om.types.AUnionType; +import org.apache.asterix.om.types.IAType; +import org.apache.commons.lang3.mutable.Mutable; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression; +import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator; +import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext; +import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag; +import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; +import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression; +import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression; +import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; +import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule; + +/** + * Removes unnecessary unknown checks (e.g., not(is-unknown(expr))) for known types + * For example: + * <p> + * Before: + * select (not(is-unknown(uid)) + * * assign [$$uid] <- [uuid()] + * After: + * select (true) <-- will be removed by another rule later + * * assign [$$uid] <- [uuid()] + */ +public class RemoveUnknownCheckForKnownTypeExpressionRule implements IAlgebraicRewriteRule { + @Override + public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) + throws AlgebricksException { + ILogicalOperator op = opRef.getValue(); + if (op.getOperatorTag() != LogicalOperatorTag.SELECT) { + return false; + } + + SelectOperator selectOp = (SelectOperator) op; + return processExpression(context, selectOp, selectOp.getCondition()); + } + + private boolean processExpressions(IOptimizationContext context, ILogicalOperator op, + List<Mutable<ILogicalExpression>> expressions) throws AlgebricksException { + boolean changed = false; + for (Mutable<ILogicalExpression> exprRef : expressions) { + changed |= processExpression(context, op, exprRef); + } + return changed; + } + + private boolean processExpression(IOptimizationContext context, ILogicalOperator op, + Mutable<ILogicalExpression> exprRef) throws AlgebricksException { + + AbstractFunctionCallExpression notFuncExpr = getFunctionExpression(exprRef); + if (notFuncExpr == null) { + return false; + } + FunctionIdentifier fid = notFuncExpr.getFunctionIdentifier(); + if (!BuiltinFunctions.NOT.equals(fid)) { + return processExpressions(context, op, notFuncExpr.getArguments()); + } + + AbstractFunctionCallExpression unknownCheckFuncExpr = getFunctionExpression(notFuncExpr.getArguments().get(0)); + if (unknownCheckFuncExpr == null || !isNullOrIsMissingOrIsUnknownCheck(unknownCheckFuncExpr)) { + return false; + } + + ILogicalExpression unknownCheckArg = unknownCheckFuncExpr.getArguments().get(0).getValue(); + IVariableTypeEnvironment env = op.computeInputTypeEnvironment(context); + + IAType type = (IAType) env.getType(unknownCheckArg); + ATypeTag typeTag = type.getTypeTag(); + if (typeTag == ATypeTag.ANY || typeTag == ATypeTag.UNION && ((AUnionType) type).isUnknownableType()) { + // Stop if it is ANY, or it is actually an unknown-able type + return false; + } + + // Set the expression to true and allow the constant folding to remove the SELECT if possible + exprRef.setValue(ConstantExpression.TRUE); + return true; + } + + private boolean isNullOrIsMissingOrIsUnknownCheck(AbstractFunctionCallExpression funcExpr) { + FunctionIdentifier fid = funcExpr.getFunctionIdentifier(); + return BuiltinFunctions.IS_NULL.equals(fid) || BuiltinFunctions.IS_MISSING.equals(fid) + || BuiltinFunctions.IS_UNKNOWN.equals(fid); + } + + private AbstractFunctionCallExpression getFunctionExpression(Mutable<ILogicalExpression> exprRef) { + ILogicalExpression expr = exprRef.getValue(); + + if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) { + return null; + } + + return (AbstractFunctionCallExpression) expr; + } +} diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java index 0196d912b3..256551fc81 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java @@ -60,6 +60,7 @@ import org.apache.asterix.om.typecomputer.base.TypeCastUtils; import org.apache.asterix.om.typecomputer.impl.TypeComputeUtils; 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.BuiltinType; import org.apache.asterix.om.types.IAType; import org.apache.asterix.om.types.hierachy.ATypeHierarchy; @@ -1938,8 +1939,9 @@ public class AccessMethodUtils { } // New < For external datasets indexing> - private static void appendExternalRecTypes(Dataset dataset, IAType itemType, List<Object> target) { - target.add(itemType); + private static void appendExternalRecTypes(IAType itemType, List<Object> target) { + // the output of external-lookup could be missing. Make it unknowable + target.add(AUnionType.createUnknownableType(itemType)); } private static void appendExternalRecPrimaryKeys(Dataset dataset, List<Object> target) throws AlgebricksException { @@ -1999,7 +2001,7 @@ public class AccessMethodUtils { List<Object> outputTypes = new ArrayList<>(); // Append output variables/types generated by the data scan (not forwarded from input). externalUnnestVars.addAll(dataSourceOp.getVariables()); - appendExternalRecTypes(dataset, recordType, outputTypes); + appendExternalRecTypes(recordType, outputTypes); IFunctionInfo externalLookup = FunctionUtil.getFunctionInfo(BuiltinFunctions.EXTERNAL_LOOKUP); AbstractFunctionCallExpression externalLookupFunc = diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-25.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-25.sqlpp new file mode 100644 index 0000000000..9c2803824c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-25.sqlpp @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// repeat_exec: %with% = ["", "WITH {'merge-policy': {'name': 'correlated-prefix','parameters': { 'max-mergable-component-size': 16384, 'max-tolerance-component-count': 3 }}}" ] +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +// Similar to cast-default-null-20.sqlpp but with s_f2 being not optional +CREATE TYPE t1 AS { id: int, s_f1: string, s_f2: string, i_f: int? }; +CREATE DATASET ds7(t1) PRIMARY KEY id %with%; + +CREATE INDEX idx1 ON ds7(s_f2); +CREATE INDEX idx2 ON ds7(s_f2: string) CAST (DEFAULT NULL); +CREATE INDEX idx3 ON ds7(s_f2: int) CAST (DEFAULT NULL); + +CREATE VIEW view7_1(id int, s_f2 string, i_f int) DEFAULT NULL AS SELECT id, s_f2, i_f FROM ds7; +CREATE VIEW view7_2(id int, s_f2 int, i_f int) DEFAULT NULL AS SELECT id, s_f2, i_f FROM ds7; + +USE test; +// index idx2 should (still) be used +SELECT id, s_f2 FROM view7_1 WHERE s_f2 < "4" ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-01.plan index 0dcfc44000..a3d4489caf 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-01.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-01.plan @@ -2,15 +2,11 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$66(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$66(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN (test.ds1) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- SORT_MERGE_EXCHANGE [$$59(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN (test.ds1) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-02.plan index 7997aad5dc..09d5382be6 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-02.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-02.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$66(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$66(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$59(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds2.ds2) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$72(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds2.ds2) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$72(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds2.idx2) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds2.idx2) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-03.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-03.plan index d1264cb2e1..40e63cb207 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-03.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-03.plan @@ -2,15 +2,11 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$66(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$66(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN (test.ds3) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- SORT_MERGE_EXCHANGE [$$59(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN (test.ds3) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-05.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-05.plan index 6285f16209..1c9845f581 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-05.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-05.plan @@ -24,4 +24,4 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- DATASOURCE_SCAN (test.ds4) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-10.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-10.plan index 19fe8ce8b4..9e396877e8 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-10.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-10.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds5.ds5) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$59(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds5.ds5) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$59(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds5.idx5_dt_fmt) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds5.idx5_dt_fmt) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-11.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-11.plan index b6361062ab..505a8345cb 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-11.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-11.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds5.ds5) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$59(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds5.ds5) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$59(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds5.idx5_d_fmt) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds5.idx5_d_fmt) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-12.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-12.plan index 382c39a3cb..11a2618908 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-12.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-12.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds5.ds5) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$59(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds5.ds5) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$59(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds5.idx5_t_fmt) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds5.idx5_t_fmt) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-13.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-13.plan index babda5c75b..7736d9971f 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-13.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-13.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds6.ds6) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$59(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds6.ds6) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$59(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds6.idx6_dt) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds6.idx6_dt) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-14.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-14.plan index d55a9a2ace..d9444e769e 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-14.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-14.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds6.ds6) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$59(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds6.ds6) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$59(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds6.idx6_d) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds6.idx6_d) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-15.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-15.plan index 2799b4843b..e4b5cd7c06 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-15.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-15.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds6.ds6) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$59(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds6.ds6) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$59(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds6.idx6_t) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds6.idx6_t) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-16.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-16.plan index 6291577ee5..753d23d037 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-16.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-16.plan @@ -2,15 +2,11 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN (test.ds5) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN (test.ds5) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-17.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-17.plan index 8757f3e47a..f6647d43b3 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-17.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-17.plan @@ -2,15 +2,11 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN (test.ds6) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN (test.ds6) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-18.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-18.plan index 6291577ee5..753d23d037 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-18.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-18.plan @@ -2,15 +2,11 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$56(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$56(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN (test.ds5) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- SORT_MERGE_EXCHANGE [$$48(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN (test.ds5) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-19.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-19.plan index cb86b1347c..2327f39edc 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-19.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-19.plan @@ -24,4 +24,4 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- DATASOURCE_SCAN (test.ds6) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-20.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-20.plan index 885b6ba1cf..d71b03af4c 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-20.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-20.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$65(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$65(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$58(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds7.ds7) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$70(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds7.ds7) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$70(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds7.idx2) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds7.idx2) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-21.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-21.plan index a560c7f24b..e5fd2d4580 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-21.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-21.plan @@ -2,15 +2,11 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$65(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$65(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN (test.ds7) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- SORT_MERGE_EXCHANGE [$$58(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN (test.ds7) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-22.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-22.plan index a560c7f24b..e5fd2d4580 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-22.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-22.plan @@ -2,15 +2,11 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$65(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$65(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN (test.ds7) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- SORT_MERGE_EXCHANGE [$$58(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN (test.ds7) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-23.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-23.plan index 88537b6326..5972aaef8e 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-23.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-23.plan @@ -2,22 +2,18 @@ -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| - -- SORT_MERGE_EXCHANGE [$$65(ASC) ] |PARTITIONED| - -- STABLE_SORT [$$65(ASC)] |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$58(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds7.ds7) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$70(ASC)] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds7.ds7) |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$70(ASC)] |PARTITIONED| + -- BTREE_SEARCH (test.ds7.idx3) |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- BTREE_SEARCH (test.ds7.idx3) |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-25.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-25.plan new file mode 100644 index 0000000000..d71b03af4c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-selection/cast-default-null/cast-default-null-25.plan @@ -0,0 +1,19 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- SORT_MERGE_EXCHANGE [$$58(ASC) ] |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds7.ds7) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$70(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (test.ds7.idx2) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.01.ddl.sqlpp new file mode 100644 index 0000000000..a500927f00 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.01.ddl.sqlpp @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +// ************** Types ************** + +CREATE TYPE OpenType AS { +}; + +CREATE TYPE TypeWithKnownField AS { + id: int, + review: string +}; + +// ************** Datasets ************** + +CREATE External Dataset ExternalDataset(OpenType) USING localfs ( + ("path" = "asterix_nc1://data/json/single-line/20-records.json"), + ("format" = "json") +); + +CREATE DATASET DatasetWithKnownField(TypeWithKnownField) +PRIMARY KEY id; + +// ************** Views ************** + +CREATE OR REPLACE VIEW ExternalView ( + uid uuid, + id int, + year int, + quarter int, + review string +) +DEFAULT NULL +PRIMARY KEY (uid) NOT ENFORCED +AS +SELECT + uuid() uid, + d.id, + d.year, + d.quarter, + d.review +FROM ExternalDataset d; + + +CREATE OR REPLACE VIEW ViewWithKnownField ( + id int, + year int, + quarter int, + review string +) +DEFAULT NULL +PRIMARY KEY (id) NOT ENFORCED +AS +SELECT + d.id, + d.year, + d.quarter, + d.review +FROM DatasetWithKnownField d; + + +CREATE OR REPLACE VIEW ViewWithKnownFieldAndUuidKey ( + uid uuid, + id int, + year int, + quarter int, + review string +) +DEFAULT NULL +PRIMARY KEY (uid) NOT ENFORCED +AS +SELECT + uuid() uid, + d.id, + d.year, + d.quarter, + d.review +FROM DatasetWithKnownField d; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.02.update.sqlpp new file mode 100644 index 0000000000..29b78b4a80 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.02.update.sqlpp @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + +LOAD DATASET DatasetWithKnownField USING localfs ( + ("path" = "asterix_nc1://data/json/single-line/20-records.json"), + ("format" = "json") +); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.03.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.03.query.sqlpp new file mode 100644 index 0000000000..e87ab52726 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.03.query.sqlpp @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + + +SELECT x.id, x.review +FROM ( + SELECT v.id, v.review + FROM ExternalView v + WHERE v.review = "good" + AND year IS NOT UNKNOWN + AND quarter IS NOT UNKNOWN + LIMIT 3 +) x +ORDER BY x.id diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.04.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.04.query.sqlpp new file mode 100644 index 0000000000..ae30b4851e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.04.query.sqlpp @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + +EXPLAIN +SELECT x.id, x.review +FROM ( + SELECT v.id, v.review + FROM ExternalView v + WHERE v.review = "good" + AND year IS NOT UNKNOWN + AND quarter IS NOT UNKNOWN + LIMIT 3 +) x +ORDER BY x.id diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.05.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.05.query.sqlpp new file mode 100644 index 0000000000..e66cd7dcf6 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.05.query.sqlpp @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + + +SELECT v.id, v.review +FROM ExternalView v +LIMIT 3 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.06.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.06.query.sqlpp new file mode 100644 index 0000000000..6b272ce613 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.06.query.sqlpp @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + +EXPLAIN +SELECT v.id, v.review +FROM ExternalView v +LIMIT 3 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.07.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.07.query.sqlpp new file mode 100644 index 0000000000..e703f5d14e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.07.query.sqlpp @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + + +SELECT x.id, x.review +FROM ( + SELECT v.id, v.review + FROM ViewWithKnownField v + WHERE v.review = "good" + AND year IS NOT UNKNOWN + AND quarter IS NOT UNKNOWN + LIMIT 3 +) x +ORDER BY x.id diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.08.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.08.query.sqlpp new file mode 100644 index 0000000000..0661cc4c54 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.08.query.sqlpp @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + +EXPLAIN +SELECT x.id, x.review +FROM ( + SELECT v.id, v.review + FROM ViewWithKnownField v + WHERE v.review = "good" + AND year IS NOT UNKNOWN + AND quarter IS NOT UNKNOWN + LIMIT 3 +) x +ORDER BY x.id \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.09.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.09.query.sqlpp new file mode 100644 index 0000000000..676227e8df --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.09.query.sqlpp @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + + +SELECT v.id, v.review +FROM ViewWithKnownField v +ORDER BY v.id +LIMIT 3 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.10.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.10.query.sqlpp new file mode 100644 index 0000000000..aec8c67eea --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.10.query.sqlpp @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + +EXPLAIN +SELECT v.id, v.review +FROM ViewWithKnownField v +ORDER BY v.id +LIMIT 3 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.11.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.11.query.sqlpp new file mode 100644 index 0000000000..acf950eb9b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.11.query.sqlpp @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + + +SELECT x.id, x.review +FROM ( + SELECT v.id, v.review + FROM ViewWithKnownFieldAndUuidKey v + WHERE v.review = "good" + AND year IS NOT UNKNOWN + AND quarter IS NOT UNKNOWN + LIMIT 3 +) x +ORDER BY x.id diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.12.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.12.query.sqlpp new file mode 100644 index 0000000000..9feb85ca68 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.12.query.sqlpp @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + +EXPLAIN +SELECT x.id, x.review +FROM ( + SELECT v.id, v.review + FROM ViewWithKnownFieldAndUuidKey v + WHERE v.review = "good" + AND year IS NOT UNKNOWN + AND quarter IS NOT UNKNOWN + LIMIT 3 +) x +ORDER BY x.id diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.13.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.13.query.sqlpp new file mode 100644 index 0000000000..4ff1f897db --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.13.query.sqlpp @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + + +SELECT v.id, v.review +FROM ViewWithKnownFieldAndUuidKey v +ORDER BY v.id +LIMIT 3 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.14.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.14.query.sqlpp new file mode 100644 index 0000000000..3d451bcaf1 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/view/view-pushdown/view-pushdown.14.query.sqlpp @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +USE test; + +EXPLAIN +SELECT v.id, v.review +FROM ViewWithKnownFieldAndUuidKey v +ORDER BY v.id +LIMIT 3 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.03.adm new file mode 100644 index 0000000000..b5aed50f0b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.03.adm @@ -0,0 +1,3 @@ +{ "id": 5, "review": "good" } +{ "id": 7, "review": "good" } +{ "id": 11, "review": "good" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.04.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.04.plan new file mode 100644 index 0000000000..2ad4d606b5 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.04.plan @@ -0,0 +1,34 @@ +distribute result [$$91] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + project ([$$91]) + -- STREAM_PROJECT |UNPARTITIONED| + assign [$$91] <- [{"id": $$106, "review": $$111}] + -- ASSIGN |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + order (ASC, $$106) + -- STABLE_SORT [$$106(ASC)] |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 3 + -- STREAM_LIMIT |UNPARTITIONED| + exchange + -- RANDOM_MERGE_EXCHANGE |PARTITIONED| + project ([$$111, $$106]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$106] <- [int64-default-null($$d.getField("id"))] + -- ASSIGN |PARTITIONED| + limit 3 + -- STREAM_LIMIT |PARTITIONED| + assign [$$111] <- [string-default-null($$d.getField("review"))] + -- ASSIGN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$d] <- test.ExternalDataset condition (and(not(is-unknown(int64-default-null($$d.getField("year")))), not(is-unknown(int64-default-null($$d.getField("quarter")))), eq(string-default-null($$d.getField("review")), "good"))) limit 3 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.05.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.05.adm new file mode 100644 index 0000000000..28f5b1715e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.05.adm @@ -0,0 +1,3 @@ +{ "id": 1, "review": "good" } +{ "id": 2, "review": "good" } +{ "id": 3, "review": "good" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.06.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.06.plan new file mode 100644 index 0000000000..a8465a50a2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.06.plan @@ -0,0 +1,22 @@ +distribute result [$$67] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 3 + -- STREAM_LIMIT |UNPARTITIONED| + exchange + -- RANDOM_MERGE_EXCHANGE |PARTITIONED| + project ([$$67]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$67] <- [{"id": int64-default-null($$d.getField("id")), "review": string-default-null($$d.getField("review"))}] + -- ASSIGN |PARTITIONED| + limit 3 + -- STREAM_LIMIT |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$d] <- test.ExternalDataset limit 3 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.07.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.07.adm new file mode 100644 index 0000000000..b5aed50f0b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.07.adm @@ -0,0 +1,3 @@ +{ "id": 5, "review": "good" } +{ "id": 7, "review": "good" } +{ "id": 11, "review": "good" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.08.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.08.plan new file mode 100644 index 0000000000..a74c18ea17 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.08.plan @@ -0,0 +1,26 @@ +distribute result [$$85] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + project ([$$85]) + -- STREAM_PROJECT |UNPARTITIONED| + assign [$$85] <- [{"id": $$88, "review": $$92}] + -- ASSIGN |UNPARTITIONED| + limit 3 + -- STREAM_LIMIT |UNPARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$88(ASC) ] |PARTITIONED| + limit 3 + -- STREAM_LIMIT |PARTITIONED| + project ([$$88, $$92]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$92] <- [$$d.getField(1)] + -- ASSIGN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$88, $$d] <- test.DatasetWithKnownField condition (and(not(is-unknown(int64-default-null($$d.getField("year")))), not(is-unknown(int64-default-null($$d.getField("quarter")))), eq($$d.getField(1), "good"))) limit 3 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.09.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.09.adm new file mode 100644 index 0000000000..28f5b1715e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.09.adm @@ -0,0 +1,3 @@ +{ "id": 1, "review": "good" } +{ "id": 2, "review": "good" } +{ "id": 3, "review": "good" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.10.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.10.plan new file mode 100644 index 0000000000..cc8d1c5e5b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.10.plan @@ -0,0 +1,26 @@ +distribute result [$$61] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 3 + -- STREAM_LIMIT |UNPARTITIONED| + project ([$$61]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$61] <- [{"id": $$63, "review": $$67}] + -- ASSIGN |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$63(ASC) ] |PARTITIONED| + project ([$$63, $$67]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$67] <- [$$d.getField(1)] + -- ASSIGN |PARTITIONED| + limit 3 + -- STREAM_LIMIT |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$63, $$d] <- test.DatasetWithKnownField limit 3 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.11.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.11.adm new file mode 100644 index 0000000000..b5aed50f0b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.11.adm @@ -0,0 +1,3 @@ +{ "id": 5, "review": "good" } +{ "id": 7, "review": "good" } +{ "id": 11, "review": "good" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.12.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.12.plan new file mode 100644 index 0000000000..149c739074 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.12.plan @@ -0,0 +1,26 @@ +distribute result [$$91] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + project ([$$91]) + -- STREAM_PROJECT |UNPARTITIONED| + assign [$$91] <- [{"id": $$94, "review": $$98}] + -- ASSIGN |UNPARTITIONED| + limit 3 + -- STREAM_LIMIT |UNPARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$94(ASC) ] |PARTITIONED| + limit 3 + -- STREAM_LIMIT |PARTITIONED| + project ([$$94, $$98]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$98] <- [$$d.getField(1)] + -- ASSIGN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$94, $$d] <- test.DatasetWithKnownField condition (and(not(is-unknown(int64-default-null($$d.getField("year")))), not(is-unknown(int64-default-null($$d.getField("quarter")))), eq($$d.getField(1), "good"))) limit 3 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.13.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.13.adm new file mode 100644 index 0000000000..28f5b1715e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.13.adm @@ -0,0 +1,3 @@ +{ "id": 1, "review": "good" } +{ "id": 2, "review": "good" } +{ "id": 3, "review": "good" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.14.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.14.plan new file mode 100644 index 0000000000..911a1c8b54 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/view/view-pushdown/view-pushdown.14.plan @@ -0,0 +1,26 @@ +distribute result [$$67] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 3 + -- STREAM_LIMIT |UNPARTITIONED| + project ([$$67]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$67] <- [{"id": $$69, "review": $$73}] + -- ASSIGN |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$69(ASC) ] |PARTITIONED| + project ([$$69, $$73]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$73] <- [$$d.getField(1)] + -- ASSIGN |PARTITIONED| + limit 3 + -- STREAM_LIMIT |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$69, $$d] <- test.DatasetWithKnownField limit 3 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index 755d65d581..addced1707 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -13564,6 +13564,11 @@ <expected-error>ASX1050: Cannot find dataset with name v3 in dataverse test1 (in line 24, at column 1)</expected-error> </compilation-unit> </test-case> + <test-case FilePath="view"> + <compilation-unit name="view-pushdown"> + <output-dir compare="Text">view-pushdown</output-dir> + </compilation-unit> + </test-case> </test-group> <test-group name="load"> <test-case FilePath="load">
