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 c07b0adc93eec8852868256a72e0fca10e2561f8 Author: Dmitry Lychagin <[email protected]> AuthorDate: Wed Sep 23 13:25:46 2020 -0700 [NO ISSUE][COMP] Fix isomorphism comparison of data-scan operators - user model changes: no - storage format changes: no - interface changes: no Details: - When comparing data-scan operators IsomorphismOperatorVisitor must consider their pushed conditions and limits Change-Id: Id07b42579c7905b751de0f0ac7bdee5720cd4e7d Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/8063 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Dmitry Lychagin <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> --- .../push-limit-to-primary-scan-select.1.ddl.sqlpp | 24 +++++++++- ...sh-limit-to-primary-scan-select.10.query.sqlpp} | 40 +++++++++-------- ...sh-limit-to-primary-scan-select.11.query.sqlpp} | 25 +++++++++-- ...ush-limit-to-primary-scan-select.2.update.sqlpp | 6 +-- .../push-limit-to-primary-scan.1.ddl.sqlpp | 21 +++++++++ .../push-limit-to-primary-scan.2.update.sqlpp | 3 +- .../push-limit-to-primary-scan.6.query.sqlpp} | 27 +++++++++-- ...pp => push-limit-to-primary-scan.7.query.sqlpp} | 24 +++++++++- .../push-limit-to-primary-scan-select.10.adm | 1 + .../push-limit-to-primary-scan-select.11.adm | 52 ++++++++++++++++++++++ .../push-limit-to-primary-scan.6.adm | 1 + .../push-limit-to-primary-scan.7.adm | 52 ++++++++++++++++++++++ .../visitors/IsomorphismOperatorVisitor.java | 11 +++-- 13 files changed, 252 insertions(+), 35 deletions(-) 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 917715e..319db54 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 @@ -42,6 +42,28 @@ create type test.TweetMessageType as tweetid : string }; +create type onekType1 as + closed { + unique1 : bigint, + unique2 : bigint, + two : bigint, + four : bigint, + ten : bigint, + twenty : bigint, + onePercent : bigint, + tenPercent : bigint, + twentyPercent : bigint, + fiftyPercent : bigint, + unique3 : bigint, + evenOnePercent : bigint, + oddOnePercent : bigint, + stringu1 : string, + stringu2 : string, + string4 : string +}; + create dataset DBLP1(DBLPType) primary key id; -create dataset TweetMessages(TweetMessageType) primary key tweetid; \ No newline at end of file +create dataset TweetMessages(TweetMessageType) primary key tweetid; + +create dataset onek1(onekType1) primary key unique2; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.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.10.query.sqlpp similarity index 65% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.10.query.sqlpp index 162cc35..a91cece 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.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.10.query.sqlpp @@ -1,3 +1,4 @@ + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -16,27 +17,30 @@ * specific language governing permissions and limitations * under the License. */ -/* scan and print a delimited text file */ -/* - * Description : Test push down limit into the primary index scan operator - * Expected Result : Success +/** + * Check that data-scan operator isomorphism comparison + * considers pushed condition. + * + * The dataset contains 100 tuples, 50 with two=0 and 50 with two=1. + * The expected result is 50. */ -drop dataverse test if exists; -create dataverse test; - use test; +with T1 as ( + select two from onek1 + where two between 1 and 10 + limit 1000 +), +T2 as ( + select two from onek1 + where two between -10 and -1 + limit 1000 +) -create type test.DBLPType as -{ - id : bigint, - dblpid : string, - title : string, - authors : string, - misc : string -}; - -create dataset DBLP1(DBLPType) primary key id; - +select value count(*) from ( + select two from T1 + union all + select two from T2 +) t; 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.11.query.sqlpp similarity index 70% copy from 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 copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.11.query.sqlpp index a18f3e2..34eb190 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.11.query.sqlpp @@ -1,3 +1,4 @@ + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -16,11 +17,29 @@ * specific language governing permissions and limitations * under the License. */ -/* scan and print a delimited text file */ + +/** + * Check that data-scan operator isomorphism comparison + * considers pushed condition + */ use test; +explain -load dataset DBLP1 using localfs ((`path`=`asterix_nc1://data/dblp-small/dblp-small-id.txt`),(`format`=`delimited-text`),(`delimiter`=`:`)); +with T1 as ( + select two from onek1 + where two between 1 and 10 + limit 1000 +), +T2 as ( + select two from onek1 + where two between -10 and -1 + limit 1000 +) -load dataset TweetMessages using localfs ((`path`=`asterix_nc1://data/tinysocial/twm.adm`),(`format`=`adm`)); \ No newline at end of file +select value count(*) from ( + select two from T1 + union all + select two from T2 +) t; 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 a18f3e2..cd3d45f 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 @@ -16,11 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -/* scan and print a delimited text file */ use test; - 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 +load dataset TweetMessages using localfs ((`path`=`asterix_nc1://data/tinysocial/twm.adm`),(`format`=`adm`)); + +load dataset onek1 using localfs ((`path`=`asterix_nc1://data/wisc/onektup.adm`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp index 162cc35..36af900 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.1.ddl.sqlpp @@ -38,5 +38,26 @@ create type test.DBLPType as misc : string }; +create type onekType1 as + closed { + unique1 : bigint, + unique2 : bigint, + two : bigint, + four : bigint, + ten : bigint, + twenty : bigint, + onePercent : bigint, + tenPercent : bigint, + twentyPercent : bigint, + fiftyPercent : bigint, + unique3 : bigint, + evenOnePercent : bigint, + oddOnePercent : bigint, + stringu1 : string, + stringu2 : string, + string4 : string +}; + create dataset DBLP1(DBLPType) primary key id; +create dataset onek1(onekType1) primary key unique2; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.2.update.sqlpp index 2e0f056..4d4065d 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.2.update.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.2.update.sqlpp @@ -20,5 +20,6 @@ use test; - load dataset DBLP1 using localfs ((`path`=`asterix_nc1://data/dblp-small/dblp-small-id.txt`),(`format`=`delimited-text`),(`delimiter`=`:`)); + +load dataset onek1 using localfs ((`path`=`asterix_nc1://data/wisc/onektup.adm`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted; 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/push-limit-to-primary-scan.6.query.sqlpp similarity index 70% copy from 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 copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.6.query.sqlpp index a18f3e2..dd9eb15 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/push-limit-to-primary-scan.6.query.sqlpp @@ -1,3 +1,4 @@ + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -16,11 +17,29 @@ * specific language governing permissions and limitations * under the License. */ -/* scan and print a delimited text file */ -use test; +/** + * Check that data-scan operator isomorphism comparison + * considers pushed limit. + * + * The dataset contains 100 tuples, + * so the expected result is 110. + */ +use test; -load dataset DBLP1 using localfs ((`path`=`asterix_nc1://data/dblp-small/dblp-small-id.txt`),(`format`=`delimited-text`),(`delimiter`=`:`)); +with +T1 as ( + select two from onek1 + limit 100 +), +T2 as ( + select two from onek1 + limit 10 +) -load dataset TweetMessages using localfs ((`path`=`asterix_nc1://data/tinysocial/twm.adm`),(`format`=`adm`)); \ No newline at end of file +select value count(*) from ( + select two from T1 + union all + select two from T2 +) t; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.7.query.sqlpp similarity index 74% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.2.update.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.7.query.sqlpp index 2e0f056..a592faa 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.2.update.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.7.query.sqlpp @@ -1,3 +1,4 @@ + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -16,9 +17,28 @@ * specific language governing permissions and limitations * under the License. */ -/* scan and print a delimited text file */ + +/** + * Check that data-scan operator isomorphism comparison + * considers pushed limit. + */ use test; +explain + +with +T1 as ( + select two from onek1 + limit 100 +), +T2 as ( + select two from onek1 + limit 10 +) -load dataset DBLP1 using localfs ((`path`=`asterix_nc1://data/dblp-small/dblp-small-id.txt`),(`format`=`delimited-text`),(`delimiter`=`:`)); +select value count(*) from ( + select two from T1 + union all + select two from T2 +) t; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.10.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.10.adm new file mode 100644 index 0000000..c5b431b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.10.adm @@ -0,0 +1 @@ +50 \ 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.11.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.11.adm new file mode 100644 index 0000000..a040253 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan-select/push-limit-to-primary-scan-select.11.adm @@ -0,0 +1,52 @@ +distribute result [$$128] +-- DISTRIBUTE_RESULT |LOCAL| + exchange + -- ONE_TO_ONE_EXCHANGE |LOCAL| + aggregate [$$128] <- [agg-sql-sum($$129)] + -- AGGREGATE |LOCAL| + aggregate [$$129] <- [agg-sql-count(1)] + -- AGGREGATE |LOCAL| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + union + -- UNION_ALL |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 1000 + -- STREAM_LIMIT |UNPARTITIONED| + project ([]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$126(ASC) ] |PARTITIONED| + limit 1000 + -- STREAM_LIMIT |PARTITIONED| + project ([$$126]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$126, $$onek1] <- test.onek1 condition (and(ge($$onek1.getField(2), 1), le($$onek1.getField(2), 10))) limit 1000 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 1000 + -- STREAM_LIMIT |UNPARTITIONED| + project ([]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$127(ASC) ] |PARTITIONED| + limit 1000 + -- STREAM_LIMIT |PARTITIONED| + project ([$$127]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$127, $$onek1] <- test.onek1 condition (and(ge($$onek1.getField(2), -10), le($$onek1.getField(2), -1))) limit 1000 + -- 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/push-limit-to-primary-scan.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.6.adm new file mode 100644 index 0000000..97e3504 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.6.adm @@ -0,0 +1 @@ +110 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.7.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.7.adm new file mode 100644 index 0000000..f6de6e3 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/limit/push-limit-to-primary-scan/push-limit-to-primary-scan.7.adm @@ -0,0 +1,52 @@ +distribute result [$$114] +-- DISTRIBUTE_RESULT |LOCAL| + exchange + -- ONE_TO_ONE_EXCHANGE |LOCAL| + aggregate [$$114] <- [agg-sql-sum($$115)] + -- AGGREGATE |LOCAL| + aggregate [$$115] <- [agg-sql-count(1)] + -- AGGREGATE |LOCAL| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + union + -- UNION_ALL |UNPARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 100 + -- STREAM_LIMIT |UNPARTITIONED| + project ([]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$112(ASC) ] |PARTITIONED| + limit 100 + -- STREAM_LIMIT |PARTITIONED| + project ([$$112]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$112, $$onek1] <- test.onek1 limit 100 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |UNPARTITIONED| + limit 10 + -- STREAM_LIMIT |UNPARTITIONED| + project ([]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- SORT_MERGE_EXCHANGE [$$113(ASC) ] |PARTITIONED| + limit 10 + -- STREAM_LIMIT |PARTITIONED| + project ([$$113]) + -- STREAM_PROJECT |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + data-scan []<-[$$113, $$onek1] <- test.onek1 limit 10 + -- DATASOURCE_SCAN |PARTITIONED| + exchange + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + empty-tuple-source + -- EMPTY_TUPLE_SOURCE |PARTITIONED| diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java index 7b3f53a..e50ea65 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java @@ -460,12 +460,17 @@ public class IsomorphismOperatorVisitor implements ILogicalOperatorVisitor<Boole return Boolean.FALSE; } DataSourceScanOperator argScan = (DataSourceScanOperator) arg; - if (!argScan.getDataSource().toString().equals(op.getDataSource().toString())) { + boolean isomorphic = op.getDataSource().getId().equals(argScan.getDataSource().getId()) + && op.getOutputLimit() == argScan.getOutputLimit(); + if (!isomorphic) { return Boolean.FALSE; } DataSourceScanOperator scanOpArg = (DataSourceScanOperator) copyAndSubstituteVar(op, arg); - boolean isomorphic = VariableUtilities.varListEqualUnordered(op.getVariables(), scanOpArg.getVariables()) - && op.getDataSource().toString().equals(scanOpArg.getDataSource().toString()); + ILogicalExpression opCondition = op.getSelectCondition() != null ? op.getSelectCondition().getValue() : null; + ILogicalExpression argCondition = + scanOpArg.getSelectCondition() != null ? scanOpArg.getSelectCondition().getValue() : null; + isomorphic = VariableUtilities.varListEqualUnordered(op.getVariables(), scanOpArg.getVariables()) + && Objects.equals(opCondition, argCondition); return isomorphic; }
