Jianfeng Jia has submitted this change and it was merged. Change subject: Support LSM-filter on multiple input paths ......................................................................
Support LSM-filter on multiple input paths The IntroduceLSMComponentFilterRule only checked one input path, which does not work for the multiple-path cases (e.g., intersection case) This patch fixes this bug. Change-Id: I390ac11f3a2781f10f726dce917d89ec640dd917 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1356 Reviewed-by: Taewoo Kim <wangs...@yahoo.com> Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> --- M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java A asterixdb/asterix-app/src/test/resources/optimizerts/queries/multi-indexes/btree-rtree-ngram-intersect-with-filter.aql A asterixdb/asterix-app/src/test/resources/optimizerts/results/multi-indexes/btree-rtree-ngram-intersect-with-filter.plan 3 files changed, 99 insertions(+), 6 deletions(-) Approvals: Taewoo Kim: Looks good to me, approved Jenkins: Verified; No violations found diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java index 0e54640..9b568b9 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java @@ -19,7 +19,9 @@ package org.apache.asterix.optimizer.rules.am; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; import org.apache.asterix.common.config.DatasetConfig.DatasetType; import org.apache.asterix.metadata.declared.AqlDataSource; @@ -149,8 +151,12 @@ private void changePlan(List<IOptimizableFuncExpr> optFuncExprs, AbstractLogicalOperator op, Dataset dataset, IOptimizationContext context) throws AlgebricksException { - AbstractLogicalOperator descendantOp = (AbstractLogicalOperator) op.getInputs().get(0).getValue(); - while (descendantOp != null) { + Queue<Mutable<ILogicalOperator>> queue = new LinkedList<>(op.getInputs()); + while (!queue.isEmpty()) { + AbstractLogicalOperator descendantOp = (AbstractLogicalOperator) queue.poll().getValue(); + if (descendantOp == null) { + continue; + } if (descendantOp.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) { DataSourceScanOperator dataSourceScanOp = (DataSourceScanOperator) descendantOp; AqlDataSource ds = (AqlDataSource) dataSourceScanOp.getDataSource(); @@ -208,10 +214,7 @@ } } } - if (descendantOp.getInputs().isEmpty()) { - break; - } - descendantOp = (AbstractLogicalOperator) descendantOp.getInputs().get(0).getValue(); + queue.addAll(descendantOp.getInputs()); } } diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/multi-indexes/btree-rtree-ngram-intersect-with-filter.aql b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/multi-indexes/btree-rtree-ngram-intersect-with-filter.aql new file mode 100644 index 0000000..353129e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/multi-indexes/btree-rtree-ngram-intersect-with-filter.aql @@ -0,0 +1,53 @@ +/* + * 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. + */ +/* + * Description : Tests three types of secondary indexes should trigger intersection rule + * Success : Yes + */ + +drop dataverse test if exists; +create dataverse test; +use dataverse test; + +create type tTweet as closed { + id: int32, + location: point, + message: string, + create_at: datetime, + misc: string +} + +create dataset dsTweet(tTweet) primary key id with filter on create_at; + +create index ngram_index on dsTweet(message) type ngram(3); +create index time_index on dsTweet(create_at) type btree; +create index location_index on dsTweet(location) type rtree; + +write output to nc1:"rttest/btree-rtree-ngram-intersect.adm"; + +let $region := create-rectangle(create-point(-128.43007812500002,20.298506037222175), create-point(-64.26992187500002,54.56902589732035)) +let $ts_start := datetime("2015-11-11T00:00:00Z") +let $ts_end := datetime("2015-12-18T23:59:59Z") +let $keyword := "hello" +for $t in dataset dsTweet +where $t.create_at >= $ts_start and $t.create_at < $ts_end + and spatial-intersect($t.location, $region) + and contains($t.message, $keyword) +return $t + diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/multi-indexes/btree-rtree-ngram-intersect-with-filter.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/multi-indexes/btree-rtree-ngram-intersect-with-filter.plan new file mode 100644 index 0000000..87a6f42 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/multi-indexes/btree-rtree-ngram-intersect-with-filter.plan @@ -0,0 +1,37 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- INTERSECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$29(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$31(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$40(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- RTREE_SEARCH |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| -- To view, visit https://asterix-gerrit.ics.uci.edu/1356 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I390ac11f3a2781f10f726dce917d89ec640dd917 Gerrit-PatchSet: 4 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Jianfeng Jia <jianfeng....@gmail.com> Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Gerrit-Reviewer: Jianfeng Jia <jianfeng....@gmail.com> Gerrit-Reviewer: Taewoo Kim <wangs...@yahoo.com> Gerrit-Reviewer: Till Westmann <ti...@apache.org>