Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions rules/JoinCommute-.json
Original file line number Diff line number Diff line change
@@ -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"
} ]
}
} ]
}
10 changes: 10 additions & 0 deletions src/main/java/org/qed/CodeGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};
}
Expand Down Expand Up @@ -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);
};
}
Expand Down Expand Up @@ -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);
}
}
39 changes: 39 additions & 0 deletions src/main/java/org/qed/Generated/PruneEmptyMinus.java
Original file line number Diff line number Diff line change
@@ -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<PruneEmptyMinus.Config> {
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());
}

}
}
39 changes: 39 additions & 0 deletions src/main/java/org/qed/Generated/PruneEmptyUnion.java
Original file line number Diff line number Diff line change
@@ -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<PruneEmptyUnion.Config> {
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());
}

}
}
39 changes: 39 additions & 0 deletions src/main/java/org/qed/Generated/PruneZeroRowsTable.java
Original file line number Diff line number Diff line change
@@ -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<PruneZeroRowsTable.Config> {
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();
}

}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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.empty().union(false, b.empty());
}

@Override
public RelRN after() {
return a.empty();
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Loading