From f44de6b1921d457446abdb2941e9393949de09b9 Mon Sep 17 00:00:00 2001 From: wkaiz Date: Wed, 18 Jun 2025 18:53:22 -0700 Subject: [PATCH 1/8] Adding Prune Rules and Its Tests --- .../FilterAggregateTranspose.java | 50 +++++++++++++++ .../RRuleInstances/PruneEmptyMinus.java | 20 ++++++ .../RRuleInstances/PruneEmptyUnion.java | 20 ++++++ .../RRuleInstances/PruneZeroRowsTable.java | 19 ++++++ .../Tests-Trivial/PruneEmptyFilterTest.java | 46 ++++++++++++++ .../Tests-Trivial/PruneEmptyMinusTest.java | 51 +++++++++++++++ .../Tests-Trivial/PruneEmptyProjectTest.java | 41 ++++++++++++ .../Tests-Trivial/PruneEmptyUnionTest.java | 62 +++++++++++++++++++ .../Tests-Trivial/PruneZeroRowsTableTest.java | 40 ++++++++++++ 9 files changed, 349 insertions(+) create mode 100644 src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java create mode 100644 src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyMinus.java create mode 100644 src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyUnion.java create mode 100644 src/main/java/org/qed/Generated/RRuleInstances/PruneZeroRowsTable.java create mode 100644 src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyFilterTest.java create mode 100644 src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyMinusTest.java create mode 100644 src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyProjectTest.java create mode 100644 src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java create mode 100644 src/main/java/org/qed/Generated/Tests-Trivial/PruneZeroRowsTableTest.java diff --git a/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java b/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java new file mode 100644 index 0000000..0d87ddf --- /dev/null +++ b/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java @@ -0,0 +1,50 @@ +package org.qed.Generated.RRuleInstances; + +import kala.collection.Seq; +import org.qed.RelRN; +import org.qed.RelType; +import org.qed.RexRN; +import org.qed.RRule; + +public record FilterAggregateTranspose() implements RRule { + + // Define a source relation with at least two columns. + static final RelRN source = RelRN.scan("Source", "Source_Type"); + + // Define the grouping key for the aggregation, using the first column of the source. + static final Seq groupSet = Seq.of(source.field(0)); + + // Define an aggregate function call, e.g., SUM on the second column. + static final Seq aggCalls = Seq.of( + new RelRN.AggCall("SUM", false, RelType.fromString("INTEGER", true), Seq.of(source.field(1))) + ); + + // Define the aggregate node. Its output schema will be (group_key_type, sum_type). + static final RelRN aggregate = source.aggregate(groupSet, aggCalls); + + // Define a predicate that filters on the grouping key (the first column of the aggregate's output). + static final RexRN pred = aggregate.field(0).pred("pred"); + + /** + * The 'before' pattern represents a Filter applied on top of an Aggregate. + */ + @Override + public RelRN before() { + return aggregate.filter(pred); + } + + /** + * The 'after' pattern represents the transposed operators, where the Aggregate + * is applied on top of a Filter. + */ + @Override + public RelRN after() { + // The predicate is rewritten to apply to the aggregate's input (the source). + // The filter condition was on the first field of the aggregate's output (the group key), + // which corresponds to the first field of the original source. + RelRN filteredSource = source.filter(source.field(0).pred("pred")); + + // The aggregation is now applied to the filtered source. + return filteredSource.aggregate(groupSet, aggCalls); + } +} \ No newline at end of file diff --git a/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyMinus.java b/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyMinus.java new file mode 100644 index 0000000..09c424c --- /dev/null +++ b/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyMinus.java @@ -0,0 +1,20 @@ +package org.qed.Generated.RRuleInstances; + +import org.qed.RRule; +import org.qed.RelRN; +import org.qed.RexRN; + +public record PruneEmptyMinus() implements RRule { + static final RelRN a = RelRN.scan("A", "Common_Type"); + static final RelRN b = RelRN.scan("B", "Common_Type"); + + @Override + public RelRN before() { + return a.empty().minus(false, b); + } + + @Override + public RelRN after() { + return a.empty(); + } +} diff --git a/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyUnion.java b/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyUnion.java new file mode 100644 index 0000000..8d3ee24 --- /dev/null +++ b/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyUnion.java @@ -0,0 +1,20 @@ +package org.qed.Generated.RRuleInstances; + +import org.qed.RRule; +import org.qed.RelRN; +import org.qed.RexRN; + +public record PruneEmptyUnion() implements RRule { + static final RelRN a = RelRN.scan("A", "Common_Type"); + static final RelRN b = RelRN.scan("B", "Common_Type"); + + @Override + public RelRN before() { + return a.union(false, b.empty()); + } + + @Override + public RelRN after() { + return a; + } +} diff --git a/src/main/java/org/qed/Generated/RRuleInstances/PruneZeroRowsTable.java b/src/main/java/org/qed/Generated/RRuleInstances/PruneZeroRowsTable.java new file mode 100644 index 0000000..393b226 --- /dev/null +++ b/src/main/java/org/qed/Generated/RRuleInstances/PruneZeroRowsTable.java @@ -0,0 +1,19 @@ +package org.qed.Generated.RRuleInstances; + +import org.qed.RRule; +import org.qed.RelRN; +import org.qed.RexRN; + +public record PruneZeroRowsTable() implements RRule { + static final RelRN a = RelRN.scan("A", "Common_Type"); + + @Override + public RelRN before() { + return a; + } + + @Override + public RelRN after() { + return a; + } +} diff --git a/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyFilterTest.java b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyFilterTest.java new file mode 100644 index 0000000..dde4f6e --- /dev/null +++ b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyFilterTest.java @@ -0,0 +1,46 @@ +package org.qed.Generated.Tests; + +import kala.collection.Seq; +import kala.tuple.Tuple; +import org.qed.Generated.CalciteTester; +import org.qed.RelType; +import org.qed.RuleBuilder; + +public class PruneEmptyFilterTest { + + public static void runTest() { + var tester = new CalciteTester(); + var builder = RuleBuilder.create(); + + var table = builder.createQedTable( + Seq.of(Tuple.of(RelType.fromString("INTEGER", true), false)) + ); + builder.addTable(table); + + var before = builder + .scan(table.getName()) + .filter( + builder.call( + builder.genericPredicateOp("filter_cond", true), + builder.fields() + ) + ) + .empty() + .build(); + + var after = builder + .scan(table.getName()) + .empty() + .build(); + + var runner = CalciteTester.loadRule( + org.qed.Generated.PruneEmptyFilter.Config.DEFAULT.toRule() + ); + tester.verify(runner, before, after); + } + + public static void main(String[] args) { + System.out.println("Running PruneEmptyFilter test..."); + runTest(); + } +} diff --git a/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyMinusTest.java b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyMinusTest.java new file mode 100644 index 0000000..d24d6ad --- /dev/null +++ b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyMinusTest.java @@ -0,0 +1,51 @@ +package org.qed.Generated.Tests; + +import kala.collection.Seq; +import kala.tuple.Tuple; +import org.qed.Generated.CalciteTester; +import org.qed.RelType; +import org.qed.RuleBuilder; +import org.apache.calcite.rel.RelNode; + +public class PruneEmptyMinusTest { + + public static void runTest() { + var tester = new CalciteTester(); + var builder = RuleBuilder.create(); + + var table = builder.createQedTable( + Seq.of(Tuple.of(RelType.fromString("INTEGER", true), false)) + ); + builder.addTable(table); + + RelNode scanA = builder + .scan(table.getName()) + .build(); + + RelNode scanB = builder + .scan(table.getName()) + .build(); + + RelNode before = builder + .push(scanA) + .push(scanB) + .minus(false) + .empty() + .build(); + + RelNode after = builder + .push(scanA) + .empty() + .build(); + +// var runner = CalciteTester.loadRule( +// org.qed.Generated.PruneEmptyMinus.Config.DEFAULT.toRule() +// ); +// tester.verify(runner, before, after); + } + + public static void main(String[] args) { + System.out.println("Running PruneEmptyMinus test..."); + runTest(); + } +} diff --git a/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyProjectTest.java b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyProjectTest.java new file mode 100644 index 0000000..547da2c --- /dev/null +++ b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyProjectTest.java @@ -0,0 +1,41 @@ +package org.qed.Generated.Tests; + +import kala.collection.Seq; +import kala.tuple.Tuple; +import org.qed.Generated.CalciteTester; +import org.qed.RelType; +import org.qed.RuleBuilder; + +public class PruneEmptyProjectTest { + + public static void runTest() { + var tester = new CalciteTester(); + var builder = RuleBuilder.create(); + + var table = builder.createQedTable( + Seq.of(Tuple.of(RelType.fromString("INTEGER", true), false)) + ); + builder.addTable(table); + + var before = builder + .scan(table.getName()) + .empty() + .project(builder.field(0)) + .build(); + + var after = builder + .scan(table.getName()) + .empty() + .build(); + + var runner = CalciteTester.loadRule( + org.qed.Generated.PruneEmptyProject.Config.DEFAULT.toRule() + ); + tester.verify(runner, before, after); + } + + public static void main(String[] args) { + System.out.println("Running PruneEmptyProject test..."); + runTest(); + } +} diff --git a/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java new file mode 100644 index 0000000..a18b9eb --- /dev/null +++ b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java @@ -0,0 +1,62 @@ +package org.qed.Generated.Tests; + +import kala.collection.Seq; +import kala.tuple.Tuple; +import org.qed.Generated.CalciteTester; +import org.qed.RelType; +import org.qed.RuleBuilder; +import org.apache.calcite.rel.RelNode; + +public class PruneEmptyUnionTest { + + public static void runTest() { + var tester = new CalciteTester(); + var builder = RuleBuilder.create(); + + var table = builder.createQedTable( + Seq.of(Tuple.of(RelType.fromString("INTEGER", true), false)) + ); + builder.addTable(table); + + RelNode scanA = builder + .scan(table.getName()) + .build(); + + RelNode emptyA = builder + .push(scanA) + .empty() + .build(); + + RelNode scanB = builder + .scan(table.getName()) + .build(); + + RelNode emptyB = builder + .push(scanB) + .empty() + .build(); + + RelNode before = builder + .push(scanA) + .push(scanB) + .union(false) + .empty() + .build(); + + RelNode after = builder + .push(emptyA) + .push(emptyB) + .union(false) + .build(); + +// var runner = CalciteTester.loadRule( +// org.qed.Generated.PruneEmptyUnion.Config.DEFAULT.toRule() +// ); +// tester.verify(runner, before, after); + } + + public static void main(String[] args) { + System.out.println("Running PruneEmptyMinus test..."); + runTest(); + } +} diff --git a/src/main/java/org/qed/Generated/Tests-Trivial/PruneZeroRowsTableTest.java b/src/main/java/org/qed/Generated/Tests-Trivial/PruneZeroRowsTableTest.java new file mode 100644 index 0000000..b7a91ed --- /dev/null +++ b/src/main/java/org/qed/Generated/Tests-Trivial/PruneZeroRowsTableTest.java @@ -0,0 +1,40 @@ +package org.qed.Generated.Tests; + +import kala.collection.Seq; +import kala.tuple.Tuple; +import org.qed.Generated.CalciteTester; +import org.qed.RelType; +import org.qed.RuleBuilder; + +public class PruneZeroRowsTableTest { + + public static void runTest() { + var tester = new CalciteTester(); + var builder = RuleBuilder.create(); + + var table = builder.createQedTable( + Seq.of(Tuple.of(RelType.fromString("INTEGER", true), false)) + ); + builder.addTable(table); + + var before = builder + .scan(table.getName()) + .empty() + .build(); + + var after = builder + .scan(table.getName()) + .empty() + .build(); + +// var runner = CalciteTester.loadRule( +// org.qed.Generated.PruneZeroRowsTable.Config.DEFAULT.toRule() +// ); +// tester.verify(runner, before, after); + } + + public static void main(String[] args) { + System.out.println("Running PruneZeroRowsTableTest..."); + runTest(); + } +} From 60918b86e47da2d03584806568e63d1eca3acdb1 Mon Sep 17 00:00:00 2001 From: wkaiz Date: Wed, 18 Jun 2025 18:53:35 -0700 Subject: [PATCH 2/8] Testing Out Aggregate --- src/main/java/org/qed/CodeGenerator.java | 10 ++++++++++ src/main/java/org/qed/RelRN.java | 23 ++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/qed/CodeGenerator.java b/src/main/java/org/qed/CodeGenerator.java index bf7da08..7b5009e 100644 --- a/src/main/java/org/qed/CodeGenerator.java +++ b/src/main/java/org/qed/CodeGenerator.java @@ -28,6 +28,7 @@ default E onMatch(E env, RelRN pattern) { case RelRN.Intersect intersect -> onMatchIntersect(env, intersect); case RelRN.Minus minus -> onMatchMinus(env, minus); case RelRN.Empty empty -> onMatchEmpty(env, empty); + case RelRN.Aggregate aggregate -> onMatchAggregate(env, aggregate); default -> onMatchCustom(env, pattern); }; } @@ -65,6 +66,7 @@ default E transform(E env, RelRN target) { case RelRN.Intersect intersect -> transformIntersect(env, intersect); case RelRN.Minus minus -> transformMinus(env, minus); case RelRN.Empty empty -> transformEmpty(env, empty); + case RelRN.Aggregate aggregate -> transformAggregate(env, aggregate); default -> transformCustom(env, target); }; } @@ -250,4 +252,12 @@ default E transformFalse(E env, RexRN literal) { default E transformEmpty(E env, RelRN.Empty empty) { return unimplementedTransform(env, empty); } + + default E onMatchAggregate(E env, RelRN.Aggregate aggregate) { + return unimplementedOnMatch(env, aggregate); + } + + default E transformAggregate(E env, RelRN.Aggregate aggregate) { + return unimplementedTransform(env, aggregate); + } } diff --git a/src/main/java/org/qed/RelRN.java b/src/main/java/org/qed/RelRN.java index becc662..638985b 100644 --- a/src/main/java/org/qed/RelRN.java +++ b/src/main/java/org/qed/RelRN.java @@ -112,6 +112,10 @@ default Empty empty() { return new Empty(this); } + default Aggregate aggregate(Seq groupSet, Seq aggCalls) { + return new Aggregate(this, groupSet, aggCalls); + } + record Scan(String name, RelType.VarType ty, boolean unique) implements RelRN { @Override @@ -200,4 +204,21 @@ public RelNode semantics() { } } -} + record AggCall(String name, boolean distinct, RelType type, Seq operands) { + } + + record Aggregate(RelRN source, Seq groupSet, Seq aggCalls) implements RelRN { + @Override + public RelNode semantics() { + var builder = RuleBuilder.create(); + builder.push(source.semantics()); + var groupKey = builder.groupKey(groupSet.map(RexRN::semantics)); + var calls = aggCalls.map(agg -> { + var aggFunc = builder.genericAggregateOp(agg.name(), agg.type()); + return builder.aggregateCall(aggFunc, agg.distinct(), null, agg.name(), agg.operands().map(RexRN::semantics).asJava()); + }); + return builder.aggregate(groupKey, calls).build(); + } + } + +} \ No newline at end of file From 28db8b2eb513197d5b94f7c03c5d89ce630e4f82 Mon Sep 17 00:00:00 2001 From: wkaiz Date: Wed, 18 Jun 2025 19:01:11 -0700 Subject: [PATCH 3/8] Editing PruneEmptyUnion --- .../org/qed/Generated/PruneEmptyMinus.java | 39 +++++++++++++++++++ .../org/qed/Generated/PruneEmptyUnion.java | 39 +++++++++++++++++++ .../org/qed/Generated/PruneZeroRowsTable.java | 39 +++++++++++++++++++ .../RRuleInstances/PruneEmptyUnion.java | 4 +- 4 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/qed/Generated/PruneEmptyMinus.java create mode 100644 src/main/java/org/qed/Generated/PruneEmptyUnion.java create mode 100644 src/main/java/org/qed/Generated/PruneZeroRowsTable.java diff --git a/src/main/java/org/qed/Generated/PruneEmptyMinus.java b/src/main/java/org/qed/Generated/PruneEmptyMinus.java new file mode 100644 index 0000000..41bffd1 --- /dev/null +++ b/src/main/java/org/qed/Generated/PruneEmptyMinus.java @@ -0,0 +1,39 @@ +package org.qed.Generated; + +import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.plan.RelRule; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.JoinRelType; +import org.apache.calcite.rel.logical.*; + +public class PruneEmptyMinus extends RelRule { + protected PruneEmptyMinus(Config config) { + super(config); + } + + @Override + public void onMatch(RelOptRuleCall call) { + var var_3 = call.builder(); + call.transformTo(var_3.empty().build()); + } + + public interface Config extends EmptyConfig { + Config DEFAULT = new Config() {}; + + @Override + default PruneEmptyMinus toRule() { + return new PruneEmptyMinus(this); + } + + @Override + default String description() { + return "PruneEmptyMinus"; + } + + @Override + default RelRule.OperandTransform operandSupplier() { + return s_2 -> s_2.operand(LogicalMinus.class).inputs(s_0 -> s_0.operand(LogicalValues.class).noInputs(), s_1 -> s_1.operand(RelNode.class).anyInputs()); + } + + } +} diff --git a/src/main/java/org/qed/Generated/PruneEmptyUnion.java b/src/main/java/org/qed/Generated/PruneEmptyUnion.java new file mode 100644 index 0000000..df48a7d --- /dev/null +++ b/src/main/java/org/qed/Generated/PruneEmptyUnion.java @@ -0,0 +1,39 @@ +package org.qed.Generated; + +import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.plan.RelRule; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.JoinRelType; +import org.apache.calcite.rel.logical.*; + +public class PruneEmptyUnion extends RelRule { + protected PruneEmptyUnion(Config config) { + super(config); + } + + @Override + public void onMatch(RelOptRuleCall call) { + var var_3 = call.builder(); + call.transformTo(var_3.empty().build()); + } + + public interface Config extends EmptyConfig { + Config DEFAULT = new Config() {}; + + @Override + default PruneEmptyUnion toRule() { + return new PruneEmptyUnion(this); + } + + @Override + default String description() { + return "PruneEmptyUnion"; + } + + @Override + default RelRule.OperandTransform operandSupplier() { + return s_2 -> s_2.operand(LogicalUnion.class).inputs(s_0 -> s_0.operand(LogicalValues.class).noInputs(), s_1 -> s_1.operand(LogicalValues.class).noInputs()); + } + + } +} diff --git a/src/main/java/org/qed/Generated/PruneZeroRowsTable.java b/src/main/java/org/qed/Generated/PruneZeroRowsTable.java new file mode 100644 index 0000000..af02cf5 --- /dev/null +++ b/src/main/java/org/qed/Generated/PruneZeroRowsTable.java @@ -0,0 +1,39 @@ +package org.qed.Generated; + +import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.plan.RelRule; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.JoinRelType; +import org.apache.calcite.rel.logical.*; + +public class PruneZeroRowsTable extends RelRule { + protected PruneZeroRowsTable(Config config) { + super(config); + } + + @Override + public void onMatch(RelOptRuleCall call) { + var var_1 = call.builder(); + call.transformTo(var_1.push(call.rel(0)).build()); + } + + public interface Config extends EmptyConfig { + Config DEFAULT = new Config() {}; + + @Override + default PruneZeroRowsTable toRule() { + return new PruneZeroRowsTable(this); + } + + @Override + default String description() { + return "PruneZeroRowsTable"; + } + + @Override + default RelRule.OperandTransform operandSupplier() { + return s_0 -> s_0.operand(RelNode.class).anyInputs(); + } + + } +} diff --git a/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyUnion.java b/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyUnion.java index 8d3ee24..74d3fc5 100644 --- a/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyUnion.java +++ b/src/main/java/org/qed/Generated/RRuleInstances/PruneEmptyUnion.java @@ -10,11 +10,11 @@ public record PruneEmptyUnion() implements RRule { @Override public RelRN before() { - return a.union(false, b.empty()); + return a.empty().union(false, b.empty()); } @Override public RelRN after() { - return a; + return a.empty(); } } From 192d6856198780d3897f58487f62db71c1037d40 Mon Sep 17 00:00:00 2001 From: wkaiz Date: Wed, 18 Jun 2025 19:01:19 -0700 Subject: [PATCH 4/8] Adding Its Test --- .../qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java index a18b9eb..dcbbc9d 100644 --- a/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java +++ b/src/main/java/org/qed/Generated/Tests-Trivial/PruneEmptyUnionTest.java @@ -49,10 +49,10 @@ public static void runTest() { .union(false) .build(); -// var runner = CalciteTester.loadRule( -// org.qed.Generated.PruneEmptyUnion.Config.DEFAULT.toRule() -// ); -// tester.verify(runner, before, after); + var runner = CalciteTester.loadRule( + org.qed.Generated.PruneEmptyUnion.Config.DEFAULT.toRule() + ); + tester.verify(runner, before, after); } public static void main(String[] args) { From 727b4343094d0b87531dcfbc6d74d11e5a5a03c5 Mon Sep 17 00:00:00 2001 From: wkaiz Date: Thu, 19 Jun 2025 16:14:54 -0700 Subject: [PATCH 5/8] Removing comments --- rules/JoinCommute-.json | 72 +++++++++++++++++++ .../FilterAggregateTranspose.java | 21 ------ 2 files changed, 72 insertions(+), 21 deletions(-) create mode 100644 rules/JoinCommute-.json diff --git a/rules/JoinCommute-.json b/rules/JoinCommute-.json new file mode 100644 index 0000000..b6bdec7 --- /dev/null +++ b/rules/JoinCommute-.json @@ -0,0 +1,72 @@ +{ + "help" : [ "LogicalJoin(condition=[pred($0, $1)], joinType=[inner])\n LogicalTableScan(table=[[Left]])\n LogicalTableScan(table=[[Right]])\n", "LogicalProject(col-Left=[$1], col-Right=[$0])\n LogicalJoin(condition=[pred($1, $0)], joinType=[inner])\n LogicalTableScan(table=[[Right]])\n LogicalTableScan(table=[[Left]])\n" ], + "schemas" : [ { + "types" : [ "INTEGER" ], + "nullable" : [ true ], + "name" : "Left", + "guaranteed" : [ ], + "fields" : [ "col-Left" ], + "key" : [ ] + }, { + "types" : [ "INTEGER" ], + "nullable" : [ true ], + "name" : "Right", + "guaranteed" : [ ], + "fields" : [ "col-Right" ], + "key" : [ ] + } ], + "queries" : [ { + "join" : { + "condition" : { + "type" : "BOOLEAN", + "operand" : [ { + "column" : 0, + "type" : "INTEGER" + }, { + "column" : 1, + "type" : "INTEGER" + } ], + "operator" : "pred" + }, + "left" : { + "scan" : 0 + }, + "kind" : "INNER", + "right" : { + "scan" : 1 + } + } + }, { + "project" : { + "source" : { + "join" : { + "condition" : { + "type" : "BOOLEAN", + "operand" : [ { + "column" : 1, + "type" : "INTEGER" + }, { + "column" : 0, + "type" : "INTEGER" + } ], + "operator" : "pred" + }, + "left" : { + "scan" : 1 + }, + "kind" : "INNER", + "right" : { + "scan" : 0 + } + } + }, + "target" : [ { + "column" : 1, + "type" : "INTEGER" + }, { + "column" : 0, + "type" : "INTEGER" + } ] + } + } ] +} \ No newline at end of file diff --git a/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java b/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java index 0d87ddf..ff200db 100644 --- a/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java +++ b/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java @@ -8,43 +8,22 @@ public record FilterAggregateTranspose() implements RRule { - // Define a source relation with at least two columns. static final RelRN source = RelRN.scan("Source", "Source_Type"); - - // Define the grouping key for the aggregation, using the first column of the source. static final Seq groupSet = Seq.of(source.field(0)); - - // Define an aggregate function call, e.g., SUM on the second column. static final Seq aggCalls = Seq.of( new RelRN.AggCall("SUM", false, RelType.fromString("INTEGER", true), Seq.of(source.field(1))) ); - - // Define the aggregate node. Its output schema will be (group_key_type, sum_type). static final RelRN aggregate = source.aggregate(groupSet, aggCalls); - - // Define a predicate that filters on the grouping key (the first column of the aggregate's output). static final RexRN pred = aggregate.field(0).pred("pred"); - /** - * The 'before' pattern represents a Filter applied on top of an Aggregate. - */ @Override public RelRN before() { return aggregate.filter(pred); } - /** - * The 'after' pattern represents the transposed operators, where the Aggregate - * is applied on top of a Filter. - */ @Override public RelRN after() { - // The predicate is rewritten to apply to the aggregate's input (the source). - // The filter condition was on the first field of the aggregate's output (the group key), - // which corresponds to the first field of the original source. RelRN filteredSource = source.filter(source.field(0).pred("pred")); - - // The aggregation is now applied to the filtered source. return filteredSource.aggregate(groupSet, aggCalls); } } \ No newline at end of file From 30fc245b9e7c6737cbc612121d0b45f57d4fdcdf Mon Sep 17 00:00:00 2001 From: wkaiz Date: Thu, 19 Jun 2025 16:41:12 -0700 Subject: [PATCH 6/8] Updating FilterAggregateTranspose, should pass provability --- .../qed/Generated/RRuleInstances/FilterAggregateTranspose.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java b/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java index ff200db..f3ab0eb 100644 --- a/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java +++ b/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java @@ -11,7 +11,7 @@ public record FilterAggregateTranspose() implements RRule { static final RelRN source = RelRN.scan("Source", "Source_Type"); static final Seq groupSet = Seq.of(source.field(0)); static final Seq aggCalls = Seq.of( - new RelRN.AggCall("SUM", false, RelType.fromString("INTEGER", true), Seq.of(source.field(1))) + new RelRN.AggCall("SUM", false, RelType.fromString("INTEGER", true), Seq.of(source.field(0))) ); static final RelRN aggregate = source.aggregate(groupSet, aggCalls); static final RexRN pred = aggregate.field(0).pred("pred"); From c6810e6762c657bd815c5750bbf4baeabc94f25a Mon Sep 17 00:00:00 2001 From: wkaiz Date: Sat, 28 Jun 2025 16:54:53 -0700 Subject: [PATCH 7/8] Adding Everything Except for FilterAggregateTranpose since other works --- pom.xml | 4 +-- .../FilterAggregateTranspose.java | 29 ------------------- 2 files changed, 2 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java diff --git a/pom.xml b/pom.xml index fd29e81..9bf55a1 100644 --- a/pom.xml +++ b/pom.xml @@ -51,8 +51,8 @@ org.apache.maven.plugins maven-compiler-plugin - 23 - 23 + 24 + 24 --enable-preview diff --git a/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java b/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java deleted file mode 100644 index f3ab0eb..0000000 --- a/src/main/java/org/qed/Generated/RRuleInstances/FilterAggregateTranspose.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.qed.Generated.RRuleInstances; - -import kala.collection.Seq; -import org.qed.RelRN; -import org.qed.RelType; -import org.qed.RexRN; -import org.qed.RRule; - -public record FilterAggregateTranspose() implements RRule { - - static final RelRN source = RelRN.scan("Source", "Source_Type"); - static final Seq groupSet = Seq.of(source.field(0)); - static final Seq aggCalls = Seq.of( - new RelRN.AggCall("SUM", false, RelType.fromString("INTEGER", true), Seq.of(source.field(0))) - ); - static final RelRN aggregate = source.aggregate(groupSet, aggCalls); - static final RexRN pred = aggregate.field(0).pred("pred"); - - @Override - public RelRN before() { - return aggregate.filter(pred); - } - - @Override - public RelRN after() { - RelRN filteredSource = source.filter(source.field(0).pred("pred")); - return filteredSource.aggregate(groupSet, aggCalls); - } -} \ No newline at end of file From 75f0b8c07b7645bea9eaf0a38defafee40ff38de Mon Sep 17 00:00:00 2001 From: wkaiz Date: Sat, 28 Jun 2025 16:57:08 -0700 Subject: [PATCH 8/8] Reversing Target version for now --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9bf55a1..fd29e81 100644 --- a/pom.xml +++ b/pom.xml @@ -51,8 +51,8 @@ org.apache.maven.plugins maven-compiler-plugin - 24 - 24 + 23 + 23 --enable-preview