Skip to content

Commit a78f03f

Browse files
committed
Genearlize the Remaining Rules and Add Logic
1 parent d9fdce8 commit a78f03f

12 files changed

Lines changed: 956 additions & 119 deletions

src/main/java/org/qed/Backends/Cockroach/CockroachGenerator.java

Lines changed: 611 additions & 2 deletions
Large diffs are not rendered by default.

src/main/java/org/qed/Backends/Cockroach/CockroachTester.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ public static Seq<RRule> ruleList() {
5757
if (files != null) {
5858
for (java.io.File file : files) {
5959
String className = file.getName().replace(".java", "");
60-
if (className.contains("Distinct") || className.contains("Pull") ||
61-
className.contains("ProjectAggregateMerge") ||
62-
className.contains("AggregativeJoinRemove") || className.contains("AggregateProjectConstantToDummyJoin")) {
60+
if ((className.contains("Distinct") && !className.contains("UnionToDistinct")) ||
61+
(className.contains("Pull") && !className.contains("UnionPullUpConstants")) ||
62+
className.contains("AggregativeJoinRemove")) {
6363
continue;
6464
}
6565

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
[AggregateProjectConstantToDummyJoin, Normalize]
2+
(GroupBy
3+
$input_3:(Project $input_0:* $projections_1:* $passthrough_2:*)
4+
$aggregations_4:*
5+
$groupingPrivate_5:* &
6+
(Let
7+
($constantGroupingCols_6 $constantValues_7 $dummyCols_8 $ok_9):(ExtractConstantGroupingColsAndBuildDummy
8+
$input_3
9+
$groupingPrivate_5
10+
)
11+
$ok_9
12+
)
13+
)
14+
=>
15+
(GroupBy
16+
(Project
17+
(InnerJoin
18+
$input_0
19+
(ConstructDummyValuesTable $constantValues_7 $dummyCols_8)
20+
[ (FiltersItem (True)) ]
21+
(EmptyJoinPrivate)
22+
)
23+
(RemapProjectionsForDummyJoin $projections_1 $constantGroupingCols_6 $dummyCols_8)
24+
(IntersectionCols $passthrough_2 (OutputCols $input_0))
25+
)
26+
$aggregations_4
27+
(AddColsToGrouping
28+
(RemoveGroupingCols $groupingPrivate_5 $constantGroupingCols_6)
29+
(ColListToSet $dummyCols_8)
30+
)
31+
)
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
[JoinExtractFilter, Normalize]
22
(InnerJoin
3-
$input_0:*
4-
$input_1:*
5-
$cond_2:*
3+
$left_4:*
4+
$right_5:*
5+
$on_6:*
66
$private_3:*
77
)
88
=>
99
(Select
1010
(InnerJoin
11-
$input_0
12-
$input_1
13-
$true
11+
(Select $left_4 (ExtractBoundConditions $on_6 (OutputCols $left_4)))
12+
(Select $right_5 (ExtractBoundConditions $on_6 (OutputCols $right_5)))
13+
(ExtractUnboundConditions
14+
(ExtractUnboundConditions $on_6 (OutputCols $left_4))
15+
(OutputCols $right_5)
16+
)
1417
$private_3
1518
)
16-
$cond_2
19+
$on_6
1720
)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[ProjectAggregateMerge, Normalize]
2+
(Project
3+
$input_3:(GroupBy
4+
$input_0:*
5+
$aggregations_1:*
6+
$groupingPrivate_2:*
7+
)
8+
$projections_4:*
9+
$passthrough_5:* &
10+
(CanPruneAggCols
11+
$aggregations_1
12+
$needed_6:(UnionCols
13+
(ProjectionOuterCols $projections_4)
14+
$passthrough_5
15+
)
16+
)
17+
)
18+
=>
19+
(Project
20+
(GroupBy
21+
$input_0
22+
(PruneAggCols $aggregations_1 $needed_6)
23+
$groupingPrivate_2
24+
)
25+
$projections_4
26+
$passthrough_5
27+
)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
[UnionPullUpConstants, Normalize]
2+
(UnionAll
3+
$left_3:(Project * $leftProjections_4:* *)
4+
$right_8:(Project * $rightProjections_9:* *)
5+
$private_10:(SetPrivate $leftCols_11:* $rightCols_12:* $outCols_13:*) &
6+
(Let
7+
($constantPositions_14 $constantValues_15 $ok_16):(ExtractMatchingConstantsFromUnion
8+
$leftProjections_4
9+
$rightProjections_9
10+
$leftCols_11
11+
$rightCols_12
12+
$outCols_13
13+
)
14+
$ok_16
15+
)
16+
)
17+
=>
18+
(Project
19+
(UnionAll
20+
(PruneCols $left_3 (ComputeNeededColsForUnionPullUp $constantPositions_14 $outCols_13))
21+
(PruneCols $right_8 (ComputeNeededColsForUnionPullUp $constantPositions_14 $outCols_13))
22+
(PruneSetPrivate (ComputeNeededColsForUnionPullUp $constantPositions_14 $outCols_13) $private_10)
23+
)
24+
(AddConstantsToProjections $constantPositions_14 $constantValues_15 $outCols_13)
25+
(MakeEmptyColSet)
26+
)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[UnionToDistinct, Normalize]
2+
(Union
3+
$left_1:*
4+
$right_3:*
5+
$private_4:(SetPrivate * * $outCols_5:*)
6+
)
7+
=>
8+
(DistinctOn
9+
(UnionAll $left_1 $right_3 $private_4)
10+
[]
11+
(MakeGrouping (ColListToSet $outCols_5) (EmptyOrdering))
12+
)
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package norm
2+
3+
import (
4+
"github.com/cockroachdb/cockroach/pkg/sql/opt"
5+
"github.com/cockroachdb/cockroach/pkg/sql/opt/memo"
6+
"github.com/cockroachdb/errors"
7+
)
8+
9+
func (c *CustomFuncs) ExtractConstantGroupingColsAndBuildDummy(
10+
input memo.RelExpr, groupingPrivate *memo.GroupingPrivate,
11+
) (constantCols opt.ColSet, constantValues memo.ScalarListExpr, dummyCols opt.ColList, ok bool) {
12+
project, ok := input.(*memo.ProjectExpr)
13+
if !ok {
14+
return opt.ColSet{}, nil, nil, false
15+
}
16+
17+
groupingCols := groupingPrivate.GroupingCols
18+
constantCols = opt.ColSet{}
19+
constantValues = make(memo.ScalarListExpr, 0)
20+
21+
for i := range project.Projections {
22+
item := &project.Projections[i]
23+
if groupingCols.Contains(item.Col) && opt.IsConstValueOp(item.Element) {
24+
constantCols.Add(item.Col)
25+
constantValues = append(constantValues, item.Element)
26+
}
27+
}
28+
29+
if constantCols.Empty() {
30+
return opt.ColSet{}, nil, nil, false
31+
}
32+
33+
md := c.mem.Metadata()
34+
dummyCols = make(opt.ColList, len(constantValues))
35+
for i := range constantValues {
36+
dummyCols[i] = md.AddColumn("", constantValues[i].DataType())
37+
}
38+
39+
return constantCols, constantValues, dummyCols, true
40+
}
41+
42+
func (c *CustomFuncs) ConstructDummyValuesTable(
43+
constantValues memo.ScalarListExpr, dummyCols opt.ColList,
44+
) memo.RelExpr {
45+
tuple := c.f.ConstructTuple(constantValues, nil)
46+
rows := memo.ScalarListExpr{tuple}
47+
return c.f.ConstructValues(rows, &memo.ValuesPrivate{
48+
Cols: dummyCols,
49+
ID: c.mem.Metadata().NextUniqueID(),
50+
})
51+
}
52+
53+
func (c *CustomFuncs) RemapProjectionsForDummyJoin(
54+
projections memo.ProjectionsExpr,
55+
constantCols opt.ColSet,
56+
dummyCols opt.ColList,
57+
) memo.ProjectionsExpr {
58+
constantColList := constantCols.ToList()
59+
constantToDummy := make(map[opt.ColumnID]opt.ColumnID)
60+
for i := range constantColList {
61+
if i < len(dummyCols) {
62+
constantToDummy[constantColList[i]] = dummyCols[i]
63+
}
64+
}
65+
66+
newProjections := make(memo.ProjectionsExpr, 0, len(projections))
67+
for i := range projections {
68+
item := &projections[i]
69+
if dummyCol, ok := constantToDummy[item.Col]; ok {
70+
newProjections = append(newProjections, c.f.ConstructProjectionsItem(
71+
c.f.ConstructVariable(dummyCol),
72+
item.Col,
73+
))
74+
} else {
75+
newProjections = append(newProjections, *item)
76+
}
77+
}
78+
return newProjections
79+
}
80+
81+
func (c *CustomFuncs) ExtractMatchingConstantsFromUnion(
82+
leftProjections memo.ProjectionsExpr,
83+
rightProjections memo.ProjectionsExpr,
84+
leftCols opt.ColList,
85+
rightCols opt.ColList,
86+
outCols opt.ColList,
87+
) (constantPositions []int, constantValues memo.ScalarListExpr, ok bool) {
88+
if len(leftCols) != len(rightCols) || len(leftCols) != len(outCols) {
89+
return nil, nil, false
90+
}
91+
92+
leftColToProj := make(map[opt.ColumnID]int)
93+
for i := range leftProjections {
94+
leftColToProj[leftProjections[i].Col] = i
95+
}
96+
rightColToProj := make(map[opt.ColumnID]int)
97+
for i := range rightProjections {
98+
rightColToProj[rightProjections[i].Col] = i
99+
}
100+
101+
constantPositions = make([]int, 0)
102+
constantValues = make(memo.ScalarListExpr, 0)
103+
104+
for outIdx := range outCols {
105+
leftCol := leftCols[outIdx]
106+
rightCol := rightCols[outIdx]
107+
108+
leftProjIdx, leftHasProj := leftColToProj[leftCol]
109+
rightProjIdx, rightHasProj := rightColToProj[rightCol]
110+
111+
if !leftHasProj || !rightHasProj {
112+
continue
113+
}
114+
115+
leftItem := &leftProjections[leftProjIdx]
116+
rightItem := &rightProjections[rightProjIdx]
117+
118+
if opt.IsConstValueOp(leftItem.Element) && opt.IsConstValueOp(rightItem.Element) {
119+
if c.IsConstValueEqual(leftItem.Element, rightItem.Element) {
120+
constantPositions = append(constantPositions, outIdx)
121+
constantValues = append(constantValues, leftItem.Element)
122+
}
123+
}
124+
}
125+
126+
if len(constantPositions) == 0 {
127+
return nil, nil, false
128+
}
129+
130+
return constantPositions, constantValues, true
131+
}
132+
133+
func (c *CustomFuncs) MakeColSetFromPositions(
134+
positions []int,
135+
colList opt.ColList,
136+
) opt.ColSet {
137+
result := opt.ColSet{}
138+
for _, pos := range positions {
139+
if pos < len(colList) {
140+
result.Add(colList[pos])
141+
}
142+
}
143+
return result
144+
}
145+
146+
func (c *CustomFuncs) ComputeNeededColsForUnionPullUp(
147+
constantPositions []int,
148+
outCols opt.ColList,
149+
) opt.ColSet {
150+
constantCols := c.MakeColSetFromPositions(constantPositions, outCols)
151+
return outCols.ToSet().Difference(constantCols)
152+
}
153+
154+
func (c *CustomFuncs) AddConstantsToProjections(
155+
constantPositions []int,
156+
constantValues memo.ScalarListExpr,
157+
outCols opt.ColList,
158+
) memo.ProjectionsExpr {
159+
if len(constantPositions) != len(constantValues) {
160+
panic(errors.AssertionFailedf("constantPositions and constantValues must have same length"))
161+
}
162+
163+
projections := make(memo.ProjectionsExpr, 0, len(constantPositions))
164+
for i, pos := range constantPositions {
165+
if pos >= len(outCols) {
166+
panic(errors.AssertionFailedf("position %d out of range for outCols", pos))
167+
}
168+
outCol := outCols[pos]
169+
projections = append(projections, c.f.ConstructProjectionsItem(constantValues[i], outCol))
170+
}
171+
172+
return projections
173+
}
174+
175+
func (c *CustomFuncs) ColListToSet(colList opt.ColList) opt.ColSet {
176+
return colList.ToSet()
177+
}

0 commit comments

Comments
 (0)