Dmitry Lychagin has submitted this change and it was merged. Change subject: [ASTERIXDB-2438][COMP] Allow assigns when pushing limit into data scan ......................................................................
[ASTERIXDB-2438][COMP] Allow assigns when pushing limit into data scan - user model changes: no - storage format changes: no - interface changes: no Details: - Handle assign operators between select and data scan when pushing limit into data scan Change-Id: I3b68890d034dded3db7572462f47161721aa18fa Reviewed-on: https://asterix-gerrit.ics.uci.edu/2856 Tested-by: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Reviewed-by: Taewoo Kim <[email protected]> --- M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushLimitIntoPrimarySearchRule.java M asterixdb/asterix-app/src/test/resources/optimizerts/results/push_limit.plan A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.6.query.sqlpp M asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.1.ddl.sqlpp M asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.7.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.9.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.6.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.7.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.9.adm M hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java 18 files changed, 351 insertions(+), 28 deletions(-) Approvals: Anon. E. Moose #1000171: Taewoo Kim: Looks good to me, approved Jenkins: Verified; ; Verified Objections: Jenkins: Violations found 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 85d1c29..f9b5c38 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 @@ -353,6 +353,8 @@ physicalRewritesTopLevel.add(new ConstantFoldingRule(appCtx)); physicalRewritesTopLevel.add(new PushLimitIntoOrderByRule()); physicalRewritesTopLevel.add(new PushLimitIntoPrimarySearchRule()); + // remove assigns that could become unused after PushLimitIntoPrimarySearchRule + physicalRewritesTopLevel.add(new RemoveUnusedAssignAndAggregateRule()); physicalRewritesTopLevel.add(new IntroduceProjectsRule()); physicalRewritesTopLevel.add(new SetAlgebricksPhysicalOperatorsRule()); physicalRewritesTopLevel.add(new IntroduceRapidFrameFlushProjectAssignRule()); diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushLimitIntoPrimarySearchRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushLimitIntoPrimarySearchRule.java index 5427ca6..b7eb8b3 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushLimitIntoPrimarySearchRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushLimitIntoPrimarySearchRule.java @@ -19,13 +19,17 @@ package org.apache.asterix.optimizer.rules; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Set; import org.apache.asterix.metadata.declared.DataSource; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.optimizer.rules.am.AccessMethodJobGenParams; import org.apache.commons.lang3.mutable.Mutable; +import org.apache.commons.lang3.mutable.MutableObject; 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; @@ -34,16 +38,18 @@ import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOperator; import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil; import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule; +import org.apache.hyracks.algebricks.rewriter.rules.InlineVariablesRule; /** * Pattern: - * SCAN or UNNEST_MAP -> (SELECT)? -> (EXCHANGE)? -> LIMIT + * SCAN or UNNEST_MAP -> ((ASSIGN)* -> (SELECT))? -> (EXCHANGE)? -> LIMIT * We push both SELECT condition and LIMIT to SCAN or UNNEST_MAP * */ @@ -78,7 +84,7 @@ } boolean changed; if (childOp.getValue().getOperatorTag() == LogicalOperatorTag.SELECT) { - changed = rewriteSelect(childOp, outputLimit); + changed = rewriteSelect(childOp, outputLimit, context); } else { changed = setLimitForScanOrUnnestMap(childOp.getValue(), outputLimit); } @@ -88,30 +94,64 @@ return changed; } - private boolean rewriteSelect(Mutable<ILogicalOperator> op, int outputLimit) { + private boolean rewriteSelect(Mutable<ILogicalOperator> op, int outputLimit, IOptimizationContext context) + throws AlgebricksException { SelectOperator select = (SelectOperator) op.getValue(); + ILogicalExpression selectCondition = select.getCondition().getValue(); Set<LogicalVariable> selectedVariables = new HashSet<>(); - select.getCondition().getValue().getUsedVariables(selectedVariables); + selectCondition.getUsedVariables(selectedVariables); + + MutableObject<ILogicalExpression> selectConditionRef = new MutableObject<>(selectCondition.cloneExpression()); + + // If the select condition uses variables from assigns then inline those variables into it ILogicalOperator child = select.getInputs().get(0).getValue(); - boolean changed = false; - if (child.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) { - DataSourceScanOperator scan = (DataSourceScanOperator) child; - if (isScanPushable(scan, selectedVariables)) { - scan.setSelectCondition(select.getCondition()); - scan.setOutputLimit(outputLimit); - changed = true; + InlineVariablesRule.InlineVariablesVisitor inlineVisitor = null; + Map<LogicalVariable, ILogicalExpression> varAssignRhs = null; + for (; child.getOperatorTag() == LogicalOperatorTag.ASSIGN; child = child.getInputs().get(0).getValue()) { + if (varAssignRhs == null) { + varAssignRhs = new HashMap<>(); + } else { + varAssignRhs.clear(); } - } else if (child.getOperatorTag() == LogicalOperatorTag.UNNEST_MAP) { - UnnestMapOperator unnestMap = (UnnestMapOperator) child; - if (isUnnestMapPushable(unnestMap, selectedVariables)) { - unnestMap.setSelectCondition(select.getCondition()); - unnestMap.setOutputLimit(outputLimit); - changed = true; + AssignOperator assignOp = (AssignOperator) child; + extractInlinableVariablesFromAssign(assignOp, selectedVariables, varAssignRhs); + if (!varAssignRhs.isEmpty()) { + if (inlineVisitor == null) { + inlineVisitor = new InlineVariablesRule.InlineVariablesVisitor(varAssignRhs); + inlineVisitor.setContext(context); + inlineVisitor.setOperator(select); + } + if (!inlineVisitor.transform(selectConditionRef)) { + break; + } + selectedVariables.clear(); + selectConditionRef.getValue().getUsedVariables(selectedVariables); } } + + boolean changed = false; + switch (child.getOperatorTag()) { + case DATASOURCESCAN: + DataSourceScanOperator scan = (DataSourceScanOperator) child; + if (isScanPushable(scan, selectedVariables)) { + scan.setSelectCondition(selectConditionRef); + scan.setOutputLimit(outputLimit); + changed = true; + } + break; + case UNNEST_MAP: + UnnestMapOperator unnestMap = (UnnestMapOperator) child; + if (isUnnestMapPushable(unnestMap, selectedVariables)) { + unnestMap.setSelectCondition(selectConditionRef); + unnestMap.setOutputLimit(outputLimit); + changed = true; + } + break; + } + if (changed) { // SELECT is not needed - op.setValue(child); + op.setValue(op.getValue().getInputs().get(0).getValue()); } return changed; } @@ -174,4 +214,18 @@ return true; } + private void extractInlinableVariablesFromAssign(AssignOperator assignOp, Set<LogicalVariable> includeVariables, + Map<LogicalVariable, ILogicalExpression> outVarExprs) { + List<LogicalVariable> vars = assignOp.getVariables(); + List<Mutable<ILogicalExpression>> exprs = assignOp.getExpressions(); + for (int i = 0, ln = vars.size(); i < ln; i++) { + LogicalVariable var = vars.get(i); + if (includeVariables.contains(var)) { + ILogicalExpression expr = exprs.get(i).getValue(); + if (expr.isFunctional()) { + outVarExprs.put(var, expr); + } + } + } + } } diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/push_limit.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/push_limit.plan index fcd5b75..09a484e 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/push_limit.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/push_limit.plan @@ -6,10 +6,9 @@ -- STREAM_PROJECT |PARTITIONED| -- SORT_MERGE_EXCHANGE [$$9(ASC) ] |PARTITIONED| -- STREAM_LIMIT |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| \ No newline at end of file + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.query.sqlpp new file mode 100644 index 0000000..ab6451b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.query.sqlpp @@ -0,0 +1,28 @@ +/* + * 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 + substring(c.l_shipdate, 0, 4) as shipdate, + c.l_suppkey > 0 as suppkey +from LineItem as c +where c.l_suppkey < 150 +limit 5; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.6.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.6.query.sqlpp new file mode 100644 index 0000000..e7ac96d --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.6.query.sqlpp @@ -0,0 +1,27 @@ +/* + * 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 + substring(c.l_shipdate, 0, 4) as shipdate, + c.l_suppkey > 0 as suppkey +from LineItem as c +where c.l_suppkey < 150 +limit 5; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.1.ddl.sqlpp index f214dc0..917715e 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.1.ddl.sqlpp @@ -28,7 +28,6 @@ use test; - create type test.DBLPType as { id : bigint, @@ -38,5 +37,11 @@ misc : string }; -create dataset DBLP1(DBLPType) primary key id; +create type test.TweetMessageType as +{ + tweetid : string +}; +create dataset DBLP1(DBLPType) primary key id; + +create dataset TweetMessages(TweetMessageType) primary key tweetid; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.2.update.sqlpp index 2e0f056..a18f3e2 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.2.update.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.2.update.sqlpp @@ -22,3 +22,5 @@ load dataset DBLP1 using localfs ((`path`=`asterix_nc1://data/dblp-small/dblp-small-id.txt`),(`format`=`delimited-text`),(`delimiter`=`:`)); + +load dataset TweetMessages using localfs ((`path`=`asterix_nc1://data/tinysocial/twm.adm`),(`format`=`adm`)); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.query.sqlpp new file mode 100644 index 0000000..affde8e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.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 substring(dblpid, 0, 21) +from DBLP1 +where dblpid > "series" +limit 1; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.7.query.sqlpp new file mode 100644 index 0000000..d47e735 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.7.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 substring(dblpid, 0, 21) +from DBLP1 +where dblpid > "series" +limit 1; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.query.sqlpp new file mode 100644 index 0000000..c818522 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.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 value t.user.lang +from TweetMessages t +where t.user.friends_count between 0 and 150 +limit 2 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.9.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.9.query.sqlpp new file mode 100644 index 0000000..7f6a607 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.9.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 value t.user.lang +from TweetMessages t +where t.user.friends_count between 0 and 150 +limit 2 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.adm new file mode 100644 index 0000000..6f265b3 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.5.adm @@ -0,0 +1,40 @@ +distribute result [$$17] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 5 + -- STREAM_LIMIT |UNPARTITIONED| + project ([$$17]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$19(ASC), $$20(ASC) ] |PARTITIONED| + project ([$$19, $$20, $$17]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$17] <- [{"shipdate": substring($$c.getField(10), 0, 4), "suppkey": gt($$18, 0)}] + -- ASSIGN |PARTITIONED| + limit 5 + -- STREAM_LIMIT |PARTITIONED| + assign [$$18] <- [$$c.getField(2)] + -- ASSIGN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + unnest-map [$$19, $$20, $$c] <- index-search("LineItem", 0, "test", "LineItem", FALSE, FALSE, 2, $$24, $$25, 2, $$24, $$25, TRUE, TRUE, TRUE) condition (lt($$c.getField(2), 150)) limit 5 + -- BTREE_SEARCH |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + order (ASC, $$24) (ASC, $$25) + -- STABLE_SORT [$$24(ASC), $$25(ASC)] |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + project ([$$24, $$25]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + unnest-map [$$23, $$24, $$25] <- index-search("idx_LineItem_suppkey", 0, "test", "LineItem", FALSE, FALSE, 0, 1, $$22, TRUE, FALSE, FALSE) + -- BTREE_SEARCH |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + assign [$$22] <- [150] + -- ASSIGN |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.6.adm new file mode 100644 index 0000000..9b218e2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-lookup-select/push-limit-to-primary-lookup-select.6.adm @@ -0,0 +1,5 @@ +{ "shipdate": "1996", "suppkey": true } +{ "shipdate": "1996", "suppkey": true } +{ "shipdate": "1996", "suppkey": true } +{ "shipdate": "1996", "suppkey": true } +{ "shipdate": "1996", "suppkey": true } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.adm new file mode 100644 index 0000000..94608d0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.6.adm @@ -0,0 +1,28 @@ +distribute result [$$16] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 1 + -- STREAM_LIMIT |UNPARTITIONED| + project ([$$16]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$18(ASC) ] |PARTITIONED| + project ([$$18, $$16]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$16] <- [{"$1": substring($$17, 0, 21)}] + -- ASSIGN |PARTITIONED| + limit 1 + -- STREAM_LIMIT |PARTITIONED| + project ([$$18, $$17]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$17] <- [$$DBLP1.getField(1)] + -- ASSIGN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$18, $$DBLP1] <- test.DBLP1 condition (gt($$DBLP1.getField(1), "series")) limit 1 + -- 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/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.7.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.7.adm new file mode 100644 index 0000000..9a4a69d --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.7.adm @@ -0,0 +1 @@ +{ "$1": "series/synthesis/2009" } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.adm new file mode 100644 index 0000000..7fa0bce --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.8.adm @@ -0,0 +1,28 @@ +distribute result [$$19] +-- DISTRIBUTE_RESULT |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 2 + -- STREAM_LIMIT |UNPARTITIONED| + project ([$$19]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$22(ASC) ] |PARTITIONED| + limit 2 + -- STREAM_LIMIT |PARTITIONED| + project ([$$22, $$19]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$19] <- [$$23.getField("lang")] + -- ASSIGN |PARTITIONED| + project ([$$22, $$23]) + -- STREAM_PROJECT |PARTITIONED| + assign [$$23] <- [$$t.getField("user")] + -- ASSIGN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$22, $$t] <- test.TweetMessages condition (and(le(0, $$t.getField("user").getField("friends_count")), le($$t.getField("user").getField("friends_count"), 150))) limit 2 + -- 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/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.9.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.9.adm new file mode 100644 index 0000000..51d3671 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.9.adm @@ -0,0 +1,2 @@ +"en" +"en" diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java index cd42407..6967271 100644 --- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java +++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineVariablesRule.java @@ -187,7 +187,7 @@ return modified; } - protected class InlineVariablesVisitor implements ILogicalExpressionReferenceTransform { + public static class InlineVariablesVisitor implements ILogicalExpressionReferenceTransform { private final Map<LogicalVariable, ILogicalExpression> varAssignRhs; private final Set<LogicalVariable> liveVars = new HashSet<>(); -- To view, visit https://asterix-gerrit.ics.uci.edu/2856 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I3b68890d034dded3db7572462f47161721aa18fa Gerrit-PatchSet: 2 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Dmitry Lychagin <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Dmitry Lychagin <[email protected]> Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Reviewer: Luo Chen <[email protected]> Gerrit-Reviewer: Taewoo Kim <[email protected]> Gerrit-Reviewer: Till Westmann <[email protected]> Gerrit-Reviewer: Xikui Wang <[email protected]>
