Skip to content

Commit 0ba16e7

Browse files
authored
Merge branch 'master' into fix/index-explain
2 parents e886339 + 19fdc30 commit 0ba16e7

File tree

1 file changed

+92
-1
lines changed

1 file changed

+92
-1
lines changed

internal/rule/squashjoins.go

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,23 @@ func buildSquashedTable(
392392
}
393393
case nil:
394394
var f sql.Expression
395+
var refIt gitbase.RefsIter
396+
397+
if index == nil {
398+
f, filters, err = transferFilters(
399+
filters,
400+
gitbase.RefCommitsTableName,
401+
gitbase.ReferencesTableName,
402+
gitbase.RefsSchema,
403+
"ref_name", "repository_id",
404+
)
405+
if err != nil {
406+
return nil, err
407+
}
408+
409+
refIt = gitbase.NewAllRefsIter(f, true)
410+
}
411+
395412
f, filters, err = filtersForTable(
396413
gitbase.RefCommitsTableName,
397414
filters,
@@ -404,7 +421,7 @@ func buildSquashedTable(
404421
if index != nil {
405422
iter = gitbase.NewIndexRefCommitsIter(index, f)
406423
} else {
407-
iter = gitbase.NewAllRefCommitsIter(f)
424+
iter = gitbase.NewRefRefCommitsIter(refIt, f)
408425
}
409426
default:
410427
addUnsquashable(gitbase.RefCommitsTableName)
@@ -1141,6 +1158,35 @@ func filtersForTables(
11411158
return
11421159
}
11431160

1161+
func filtersForColumns(
1162+
filters []sql.Expression,
1163+
table string,
1164+
columns ...string,
1165+
) (columnFilters []sql.Expression, remaining []sql.Expression) {
1166+
var fTable []sql.Expression
1167+
fTable, remaining = filtersForTables(filters, table)
1168+
1169+
for _, f := range fTable {
1170+
valid := true
1171+
expression.Inspect(f, func(e sql.Expression) bool {
1172+
gf, ok := e.(*expression.GetField)
1173+
if ok && !stringInSlice(columns, gf.Name()) {
1174+
valid = false
1175+
return false
1176+
}
1177+
1178+
return true
1179+
})
1180+
1181+
if valid {
1182+
columnFilters = append(columnFilters, f)
1183+
} else {
1184+
remaining = append(remaining, f)
1185+
}
1186+
}
1187+
1188+
return
1189+
}
11441190
func stringInSlice(strs []string, str string) bool {
11451191
for _, s := range strs {
11461192
if s == str {
@@ -1572,6 +1618,51 @@ func fixFieldIndexes(e sql.Expression, schema sql.Schema) (sql.Expression, error
15721618
})
15731619
}
15741620

1621+
func transferFilters(
1622+
filters []sql.Expression,
1623+
from, to string,
1624+
schema sql.Schema,
1625+
columns ...string,
1626+
) (sql.Expression, []sql.Expression, error) {
1627+
f, r := filtersForColumns(filters, from, columns...)
1628+
fixed, err := fixFieldTable(expression.JoinAnd(f...), to, schema)
1629+
if err != nil {
1630+
return nil, nil, err
1631+
}
1632+
1633+
return fixed, r, err
1634+
}
1635+
1636+
func fixFieldTable(
1637+
e sql.Expression,
1638+
table string,
1639+
schema sql.Schema,
1640+
) (sql.Expression, error) {
1641+
if e == nil {
1642+
return nil, nil
1643+
}
1644+
return e.TransformUp(func(e sql.Expression) (sql.Expression, error) {
1645+
gf, ok := e.(*expression.GetField)
1646+
if !ok {
1647+
return e, nil
1648+
}
1649+
1650+
for idx, col := range schema {
1651+
if gf.Name() == col.Name {
1652+
return expression.NewGetFieldWithTable(
1653+
idx,
1654+
gf.Type(),
1655+
table,
1656+
gf.Name(),
1657+
gf.IsNullable(),
1658+
), nil
1659+
}
1660+
}
1661+
1662+
return nil, analyzer.ErrColumnTableNotFound.New(gf.Table(), gf.Name())
1663+
})
1664+
}
1665+
15751666
func filterDiff(a, b []sql.Expression) []sql.Expression {
15761667
var result []sql.Expression
15771668

0 commit comments

Comments
 (0)