Repository: asterixdb Updated Branches: refs/heads/master 6a38e2b62 -> 7dc566bdc
[ASTERIXDB-2333][COMP] Allow filters to work alongside autogenerated keys - user model changes: no - storage format changes: no - interface changes: no Details: Fixes a bug preventing autogenerated keys from working when there is a filtering field present. Added test. Change-Id: I450b4e20175992414955d59116e672450d442f81 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2504 Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Xikui Wang <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/7dc566bd Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/7dc566bd Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/7dc566bd Branch: refs/heads/master Commit: 7dc566bdc0ef575c31d29caa8cfc1749d44f2883 Parents: 6a38e2b Author: Steven Glenn Jacobs <[email protected]> Authored: Mon Mar 26 14:44:10 2018 -0700 Committer: Steven Jacobs <[email protected]> Committed: Thu Mar 29 12:06:57 2018 -0700 ---------------------------------------------------------------------- .../rules/IntroduceAutogenerateIDRule.java | 40 +++++++++++++++----- .../filter-auto-key/filter-auto-key.1.ddl.sqlpp | 38 +++++++++++++++++++ .../filter-auto-key.2.update.sqlpp | 24 ++++++++++++ .../filter-auto-key.3.query.sqlpp | 23 +++++++++++ .../filter-auto-key/filter-auto-key.1.adm | 1 + .../resources/runtimets/testsuite_sqlpp.xml | 5 +++ 6 files changed, 122 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7dc566bd/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java index c3e036e..14c3d87 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java @@ -66,11 +66,14 @@ public class IntroduceAutogenerateIDRule implements IAlgebraicRewriteRule { throws AlgebricksException { // match: commit OR distribute-result OR SINK - ... followed by: - // [insert to internal dataset with autogenerated id] - assign - project - // produce: insert - assign - assign* - project + // [insert to internal dataset with autogenerated id] - assign - assign? - project + // produce: insert - assign - assign? - assign* - project // ** - // OR [insert to internal dataset with autogenerated id] - assign - [datasource scan] - // produce insert - assign - assign* - datasource scan + // OR [insert to internal dataset with autogenerated id] - assign - assign? - [datasource scan] + // produce: insert - assign - assign? - assign* - datasource scan + // ** + // where assign* is the newly added assign that adds the autogenerated id + // and assign? is an assign that may exist when a filter is used AbstractLogicalOperator currentOp = (AbstractLogicalOperator) opRef.getValue(); if (currentOp.getOperatorTag() == LogicalOperatorTag.DELEGATE_OPERATOR) { @@ -120,15 +123,28 @@ public class IntroduceAutogenerateIDRule implements IAlgebraicRewriteRule { AssignOperator assignOp = (AssignOperator) parentOp; LogicalVariable inputRecord; - //TODO: bug here. will not work for internal datasets with filters since the pattern becomes - //[project-assign-assign-insert] + boolean hasFilter = false; AbstractLogicalOperator grandparentOp = (AbstractLogicalOperator) parentOp.getInputs().get(0).getValue(); + AbstractLogicalOperator newAssignParentOp = grandparentOp; + AbstractLogicalOperator newAssignChildOp = assignOp; if (grandparentOp.getOperatorTag() == LogicalOperatorTag.PROJECT) { ProjectOperator projectOp = (ProjectOperator) grandparentOp; inputRecord = projectOp.getVariables().get(0); } else if (grandparentOp.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) { DataSourceScanOperator dssOp = (DataSourceScanOperator) grandparentOp; inputRecord = dssOp.getVariables().get(0); + } else if (grandparentOp.getOperatorTag() == LogicalOperatorTag.ASSIGN) { + AbstractLogicalOperator greatgrandparentOp = + (AbstractLogicalOperator) grandparentOp.getInputs().get(0).getValue(); + if (greatgrandparentOp.getOperatorTag() != LogicalOperatorTag.PROJECT) { + return false; + } + //filter case + ProjectOperator projectOp = (ProjectOperator) greatgrandparentOp; + inputRecord = projectOp.getVariables().get(0); + newAssignParentOp = greatgrandparentOp; + newAssignChildOp = grandparentOp; + hasFilter = true; } else { return false; } @@ -142,13 +158,19 @@ public class IntroduceAutogenerateIDRule implements IAlgebraicRewriteRule { LogicalVariable v = context.newVar(); AssignOperator newAssign = new AssignOperator(v, new MutableObject<ILogicalExpression>(nonNullMergedRec)); - newAssign.getInputs().add(new MutableObject<ILogicalOperator>(grandparentOp)); - assignOp.getInputs().set(0, new MutableObject<ILogicalOperator>(newAssign)); + newAssign.getInputs().add(new MutableObject<ILogicalOperator>(newAssignParentOp)); + newAssignChildOp.getInputs().set(0, new MutableObject<ILogicalOperator>(newAssign)); + if (hasFilter) { + VariableUtilities.substituteVariables(newAssignChildOp, inputRecord, v, context); + } VariableUtilities.substituteVariables(assignOp, inputRecord, v, context); VariableUtilities.substituteVariables(insertOp, inputRecord, v, context); context.computeAndSetTypeEnvironmentForOperator(newAssign); + if (hasFilter) { + context.computeAndSetTypeEnvironmentForOperator(newAssignChildOp); + } context.computeAndSetTypeEnvironmentForOperator(assignOp); - context.computeAndSetTypeEnvironmentForOperator(insertOp);; + context.computeAndSetTypeEnvironmentForOperator(insertOp); for (AbstractLogicalOperator op : opStack) { VariableUtilities.substituteVariables(op, inputRecord, v, context); context.computeAndSetTypeEnvironmentForOperator(op); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7dc566bd/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.1.ddl.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.1.ddl.sqlpp new file mode 100644 index 0000000..95c1c38 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.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. + */ +/* + * Description : Test filters with autogenerated keys + * Expected Res : Success + * Date : 20th Mar 2018 + */ + +drop dataverse test if exists; +create dataverse test; + +use test; + +create type UserLocation as closed { +recordId: uuid, +location: circle, +userName: string +}; + + +create dataset UserLocations(UserLocation) +primary key recordId autogenerated with filter on userName; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7dc566bd/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.2.update.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.2.update.sqlpp new file mode 100644 index 0000000..cee10ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.2.update.sqlpp @@ -0,0 +1,24 @@ +/* + * 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 UserLocations( +{"userName" : "c1121u1" , "location" : circle("4171.58,1083.41 100.0")} +); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7dc566bd/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.3.query.sqlpp ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.3.query.sqlpp new file mode 100644 index 0000000..945fc1d --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/filter-auto-key/filter-auto-key.3.query.sqlpp @@ -0,0 +1,23 @@ +/* + * 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 l.userName from UserLocations l +where l.userName = "c1121u1"; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7dc566bd/asterixdb/asterix-app/src/test/resources/runtimets/results/filters/filter-auto-key/filter-auto-key.1.adm ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/filters/filter-auto-key/filter-auto-key.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/filters/filter-auto-key/filter-auto-key.1.adm new file mode 100644 index 0000000..022f6a7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/filters/filter-auto-key/filter-auto-key.1.adm @@ -0,0 +1 @@ +{ "userName": "c1121u1" } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/7dc566bd/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml ---------------------------------------------------------------------- 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 e545c3b..ca95282 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -9305,6 +9305,11 @@ </compilation-unit> </test-case> <test-case FilePath="filters"> + <compilation-unit name="filter-auto-key"> + <output-dir compare="Text">filter-auto-key</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="filters"> <compilation-unit name="load"> <output-dir compare="Text">load</output-dir> </compilation-unit>
