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 5139956867b43da6be5cf6c7996764126f2b71f0 Author: glennga <[email protected]> AuthorDate: Wed Jan 18 15:48:00 2023 -0800 [ASTERIXDB-3099][COMP] Enable intersection of array indexes - user model changes: no - storage format changes: no - interface changes: no Details: A small fix to allow array indexes to be intersected with other array indexes when the same array is shared. This fix does **not** enable array indexes to be intersected with atomic/column indexes, nor does it allow array indexes to be intersected with other array indexes when their arrays are not shared (these would involve a more significant design change). Change-Id: I0aa1c28298cb898fc512e908aa12fd8a896375a4 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17318 Reviewed-by: Ali Alsuliman <[email protected]> Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17354 Reviewed-by: Michael Blow <[email protected]> --- .../rules/am/IntroduceSelectAccessMethodRule.java | 35 +++++++++----- .../multiple-indexes/query1.sqlpp | 39 ++++++++++++++++ .../multiple-indexes/query2.sqlpp | 44 ++++++++++++++++++ .../open/multiple-indexes/query1.sqlpp | 40 ++++++++++++++++ .../open/multiple-indexes/query2.sqlpp | 45 ++++++++++++++++++ .../multiple-indexes/query1.plan | 43 +++++++++++++++++ .../multiple-indexes/query2.plan | 54 ++++++++++++++++++++++ .../open/multiple-indexes/query1.plan | 35 ++++++++++++++ .../open/multiple-indexes/query2.plan | 46 ++++++++++++++++++ .../multiple-indexes/multiple-indexes.1.ddl.sqlpp | 38 +++++++++++++++ .../multiple-indexes.2.update.sqlpp | 32 +++++++++++++ .../multiple-indexes.3.query.sqlpp | 26 +++++++++++ .../multiple-indexes.4.query.sqlpp | 27 +++++++++++ .../multiple-indexes/multiple-indexes.1.ddl.sqlpp | 38 +++++++++++++++ .../multiple-indexes.2.update.sqlpp | 32 +++++++++++++ .../multiple-indexes.3.query.sqlpp | 26 +++++++++++ .../multiple-indexes.4.query.sqlpp | 27 +++++++++++ .../multiple-indexes/multiple-indexes.3.adm | 4 ++ .../multiple-indexes/multiple-indexes.4.adm | 4 ++ .../open/multiple-indexes/multiple-indexes.3.adm | 4 ++ .../open/multiple-indexes/multiple-indexes.4.adm | 4 ++ .../test/resources/runtimets/testsuite_sqlpp.xml | 10 ++++ 22 files changed, 641 insertions(+), 12 deletions(-) diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java index 69b7d5670e..fce260c294 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java @@ -50,6 +50,7 @@ import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator.ExecutionMode; import org.apache.hyracks.algebricks.core.algebra.operators.logical.DelegateOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.DistinctOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; @@ -324,21 +325,31 @@ public class IntroduceSelectAccessMethodRule extends AbstractIntroduceAccessMeth "The primary search has multiple inputs."); } + // The operator directly under the subroot may either be an ORDER-BY or a DISTINCT (if an array index). ILogicalOperator curRoot = subRoots.get(i); - OrderOperator order = (OrderOperator) curRoot.getInputs().get(0).getValue(); - List<LogicalVariable> orderedColumn = new ArrayList<>(order.getOrderExpressions().size()); - for (Pair<OrderOperator.IOrder, Mutable<ILogicalExpression>> orderExpression : order - .getOrderExpressions()) { - if (orderExpression.second.getValue().getExpressionTag() != LogicalExpressionTag.VARIABLE) { - throw new CompilationException(ErrorCode.COMPILATION_ERROR, - orderExpression.second.getValue().getSourceLocation(), - "The order by expression should be variables, but they aren't variables."); + ILogicalOperator curRootInput = curRoot.getInputs().get(0).getValue(); + if (curRootInput.getOperatorTag() == LogicalOperatorTag.ORDER) { + OrderOperator order = (OrderOperator) curRootInput; + List<LogicalVariable> orderedColumn = new ArrayList<>(order.getOrderExpressions().size()); + for (Pair<OrderOperator.IOrder, Mutable<ILogicalExpression>> orderExpression : order + .getOrderExpressions()) { + if (orderExpression.second.getValue().getExpressionTag() != LogicalExpressionTag.VARIABLE) { + throw new CompilationException(ErrorCode.COMPILATION_ERROR, + orderExpression.second.getValue().getSourceLocation(), + "The order by expression should be variables, but they aren't variables."); + } + VariableReferenceExpression orderedVar = + (VariableReferenceExpression) orderExpression.second.getValue(); + orderedColumn.add(orderedVar.getVariableReference()); } - VariableReferenceExpression orderedVar = - (VariableReferenceExpression) orderExpression.second.getValue(); - orderedColumn.add(orderedVar.getVariableReference()); + inputVars.add(orderedColumn); + } else if (curRootInput.getOperatorTag() == LogicalOperatorTag.DISTINCT) { + DistinctOperator distinct = (DistinctOperator) curRootInput; + inputVars.add(distinct.getDistinctByVarList()); + } else { + throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, curRootInput.getSourceLocation(), + "Operator directly below the primary index search should be either a DISTINCT or an ORDER!"); } - inputVars.add(orderedColumn); } List<LogicalVariable> inputVars0 = inputVars.get(0); diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query1.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query1.sqlpp new file mode 100644 index 0000000000..114fc2753f --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query1.sqlpp @@ -0,0 +1,39 @@ +/* + * 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; + +CREATE TYPE GenericType AS { _id: uuid }; +CREATE DATASET KSI (GenericType) +PRIMARY KEY _id AUTOGENERATED; + +CREATE INDEX KS1_array_index1 ON KSI ( + UNNEST uarr_i + SELECT a : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index2 ON KSI ( + UNNEST uarr_i + SELECT b : bigint +) EXCLUDE UNKNOWN KEY; + +FROM KSI k +WHERE (ANY v IN k.uarr_i SATISFIES v.a = 284 AND + v.b = 263) +SELECT *; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query2.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query2.sqlpp new file mode 100644 index 0000000000..6316ab080d --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-quantified-queries/multiple-indexes/query2.sqlpp @@ -0,0 +1,44 @@ +/* + * 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; + +CREATE TYPE GenericType AS { _id: uuid }; +CREATE DATASET KSI (GenericType) +PRIMARY KEY _id AUTOGENERATED; + +CREATE INDEX KS1_array_index1 ON KSI ( + UNNEST uarr_i + SELECT a : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index2 ON KSI ( + UNNEST uarr_i + SELECT b : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index3 ON KSI ( + UNNEST uarr_i + SELECT c : bigint +) EXCLUDE UNKNOWN KEY; + +FROM KSI k +WHERE (ANY v IN k.uarr_i SATISFIES v.a = 284 AND + v.b = 263 AND + v.c = 123 ) +SELECT *; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query1.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query1.sqlpp new file mode 100644 index 0000000000..56b061a0be --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query1.sqlpp @@ -0,0 +1,40 @@ +/* + * 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; + +CREATE TYPE GenericType AS { _id: uuid }; +CREATE DATASET KSI (GenericType) +PRIMARY KEY _id AUTOGENERATED; + +CREATE INDEX KS1_array_index1 ON KSI ( + UNNEST uarr_i + SELECT a : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index2 ON KSI ( + UNNEST uarr_i + SELECT b : bigint +) EXCLUDE UNKNOWN KEY; + +FROM KSI k +UNNEST k.uarr_i v +WHERE v.a = 284 AND + v.b = 263 +SELECT *; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query2.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query2.sqlpp new file mode 100644 index 0000000000..b926f71bd3 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/array-index/select-unnest-queries/open/multiple-indexes/query2.sqlpp @@ -0,0 +1,45 @@ +/* + * 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; + +CREATE TYPE GenericType AS { _id: uuid }; +CREATE DATASET KSI (GenericType) +PRIMARY KEY _id AUTOGENERATED; + +CREATE INDEX KS1_array_index1 ON KSI ( + UNNEST uarr_i + SELECT a : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index2 ON KSI ( + UNNEST uarr_i + SELECT b : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index3 ON KSI ( + UNNEST uarr_i + SELECT c : bigint +) EXCLUDE UNKNOWN KEY; + +FROM KSI k +UNNEST k.uarr_i v +WHERE v.a = 284 AND + v.b = 263 AND + v.c = 123 +SELECT *; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan new file mode 100644 index 0000000000..060ee79e75 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query1.plan @@ -0,0 +1,43 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- SUBPLAN |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- STREAM_SELECT |LOCAL| + -- ASSIGN |LOCAL| + -- UNNEST |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KSI) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- INTERSECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$40(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index1) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$44(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index2) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan new file mode 100644 index 0000000000..e3d1c5d407 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-quantified-queries/multiple-indexes/query2.plan @@ -0,0 +1,54 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- SUBPLAN |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- STREAM_SELECT |LOCAL| + -- ASSIGN |LOCAL| + -- UNNEST |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KSI) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- INTERSECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$43(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index1) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$47(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index2) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$51(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index3) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query1.plan new file mode 100644 index 0000000000..def9040769 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query1.plan @@ -0,0 +1,35 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- UNNEST |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KSI) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- INTERSECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$39(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index1) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$43(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index2) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query2.plan new file mode 100644 index 0000000000..1c73ebc934 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/array-index/select-unnest-queries/open/multiple-indexes/query2.plan @@ -0,0 +1,46 @@ +-- DISTRIBUTE_RESULT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- UNNEST |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KSI) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- INTERSECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$42(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index1) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$46(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index2) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_SORTED_DISTINCT_BY |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$50(ASC)] |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- BTREE_SEARCH (Test.KSI.KS1_array_index3) |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.1.ddl.sqlpp new file mode 100644 index 0000000000..73e442e736 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.1.ddl.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. + */ +DROP DATAVERSE Test IF EXISTS; +CREATE DATAVERSE Test; +USE Test; + +CREATE TYPE GenericType AS { id: bigint }; +CREATE DATASET KSI (GenericType) +PRIMARY KEY id; + +CREATE INDEX KS1_array_index1 ON KSI ( + UNNEST uarr_i + SELECT a : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index2 ON KSI ( + UNNEST uarr_i + SELECT b : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index3 ON KSI ( + UNNEST uarr_i + SELECT c : bigint +) EXCLUDE UNKNOWN KEY; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.2.update.sqlpp new file mode 100644 index 0000000000..1276c972b1 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.2.update.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; + +INSERT INTO KSI [ + { "id": 1, "uarr_i": [ {"a": 1, "b": 1, "c": 1 } ] }, + { "id": 2, "uarr_i": [ {"a": 1, "b": 1, "c": 1 }, + {"a": 2, "b": 2, "c": 2 } ] }, + { "id": 3, "uarr_i": [ {"a": 1, "b": 1, "c": 1 }, + {"a": 3, "b": 3, "c": 3 } ] }, + { "id": 4, "uarr_i": [ {"a": 2, "b": 2, "c": 2 }, + {"a": 3, "b": 3, "c": 3 } ] }, + { "id": 5, "uarr_i": [ {"a": 1, "b": 1, "c": 1 }, + {"a": 2, "b": 2, "c": 2 }, + {"a": 3, "b": 3, "c": 3 } ] } +]; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.query.sqlpp new file mode 100644 index 0000000000..697cca1f0c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.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; + +FROM KSI k +WHERE ( SOME i IN k.uarr_i + SATISFIES i.a = 1 AND + i.b = 1 ) +SELECT k.id +ORDER BY k.id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.query.sqlpp new file mode 100644 index 0000000000..948d367009 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.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; + +FROM KSI k +WHERE ( SOME i IN k.uarr_i + SATISFIES i.a = 1 AND + i.b = 1 AND + i.c = 1 ) +SELECT k.id +ORDER BY k.id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.1.ddl.sqlpp new file mode 100644 index 0000000000..73e442e736 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.1.ddl.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. + */ +DROP DATAVERSE Test IF EXISTS; +CREATE DATAVERSE Test; +USE Test; + +CREATE TYPE GenericType AS { id: bigint }; +CREATE DATASET KSI (GenericType) +PRIMARY KEY id; + +CREATE INDEX KS1_array_index1 ON KSI ( + UNNEST uarr_i + SELECT a : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index2 ON KSI ( + UNNEST uarr_i + SELECT b : bigint +) EXCLUDE UNKNOWN KEY; +CREATE INDEX KS1_array_index3 ON KSI ( + UNNEST uarr_i + SELECT c : bigint +) EXCLUDE UNKNOWN KEY; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.2.update.sqlpp new file mode 100644 index 0000000000..1276c972b1 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.2.update.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; + +INSERT INTO KSI [ + { "id": 1, "uarr_i": [ {"a": 1, "b": 1, "c": 1 } ] }, + { "id": 2, "uarr_i": [ {"a": 1, "b": 1, "c": 1 }, + {"a": 2, "b": 2, "c": 2 } ] }, + { "id": 3, "uarr_i": [ {"a": 1, "b": 1, "c": 1 }, + {"a": 3, "b": 3, "c": 3 } ] }, + { "id": 4, "uarr_i": [ {"a": 2, "b": 2, "c": 2 }, + {"a": 3, "b": 3, "c": 3 } ] }, + { "id": 5, "uarr_i": [ {"a": 1, "b": 1, "c": 1 }, + {"a": 2, "b": 2, "c": 2 }, + {"a": 3, "b": 3, "c": 3 } ] } +]; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.query.sqlpp new file mode 100644 index 0000000000..38808015fb --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.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; + +FROM KSI k +UNNEST k.uarr_i i +WHERE i.a = 1 AND + i.b = 1 +SELECT k.id +ORDER BY k.id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.query.sqlpp new file mode 100644 index 0000000000..252e07381c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.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; + +FROM KSI k +UNNEST k.uarr_i i +WHERE i.a = 1 AND + i.b = 1 AND + i.c = 1 +SELECT k.id +ORDER BY k.id; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.adm new file mode 100644 index 0000000000..9545720b40 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.3.adm @@ -0,0 +1,4 @@ +{ "id": 1 } +{ "id": 2 } +{ "id": 3 } +{ "id": 5 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.adm new file mode 100644 index 0000000000..9545720b40 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-quantified-queries/multiple-indexes/multiple-indexes.4.adm @@ -0,0 +1,4 @@ +{ "id": 1 } +{ "id": 2 } +{ "id": 3 } +{ "id": 5 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.adm new file mode 100644 index 0000000000..9545720b40 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.3.adm @@ -0,0 +1,4 @@ +{ "id": 1 } +{ "id": 2 } +{ "id": 3 } +{ "id": 5 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.adm new file mode 100644 index 0000000000..9545720b40 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array-index/select-unnest-queries/open/multiple-indexes/multiple-indexes.4.adm @@ -0,0 +1,4 @@ +{ "id": 1 } +{ "id": 2 } +{ "id": 3 } +{ "id": 5 } \ No newline at end of file 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 c37716835c..b77dac5b85 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -8586,6 +8586,11 @@ <output-dir compare="Text">using-feed</output-dir> </compilation-unit> </test-case> + <test-case FilePath="array-index/select-unnest-queries/open"> + <compilation-unit name="multiple-indexes"> + <output-dir compare="Text">multiple-indexes</output-dir> + </compilation-unit> + </test-case> </test-group> <test-group name="array-index/select-quantified-queries"> <test-case FilePath="array-index/select-quantified-queries"> @@ -8618,6 +8623,11 @@ <output-dir compare="Text">with-open-index</output-dir> </compilation-unit> </test-case> + <test-case FilePath="array-index/select-quantified-queries"> + <compilation-unit name="multiple-indexes"> + <output-dir compare="Text">multiple-indexes</output-dir> + </compilation-unit> + </test-case> </test-group> <test-group name="array-index/composite-index-queries"> <test-case FilePath="array-index">
