Skip to content

Commit c9d114a

Browse files
committed
rule: do not iterate all references in squashed ref_commits
When ref_commits was the first table in the chain all the commits from all references are retrieved and then filtered. Filters for ref_name and repository_id are used on references iterator. A new function (transferFilters) was added to extract filters for specific columns and change its table. Signed-off-by: Javi Fontan <[email protected]>
1 parent 7760b71 commit c9d114a

File tree

1 file changed

+87
-1
lines changed

1 file changed

+87
-1
lines changed

internal/rule/squashjoins.go

Lines changed: 87 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, 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,46 @@ 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, error) {
1627+
f, _ := filtersForColumns(filters, from, columns...)
1628+
return fixFieldTable(expression.JoinAnd(f...), to, schema)
1629+
}
1630+
1631+
func fixFieldTable(
1632+
e sql.Expression,
1633+
table string,
1634+
schema sql.Schema,
1635+
) (sql.Expression, error) {
1636+
if e == nil {
1637+
return nil, nil
1638+
}
1639+
return e.TransformUp(func(e sql.Expression) (sql.Expression, error) {
1640+
gf, ok := e.(*expression.GetField)
1641+
if !ok {
1642+
return e, nil
1643+
}
1644+
1645+
for idx, col := range schema {
1646+
if gf.Name() == col.Name {
1647+
return expression.NewGetFieldWithTable(
1648+
idx,
1649+
gf.Type(),
1650+
table,
1651+
gf.Name(),
1652+
gf.IsNullable(),
1653+
), nil
1654+
}
1655+
}
1656+
1657+
return nil, analyzer.ErrColumnTableNotFound.New(gf.Table(), gf.Name())
1658+
})
1659+
}
1660+
15751661
func filterDiff(a, b []sql.Expression) []sql.Expression {
15761662
var result []sql.Expression
15771663

0 commit comments

Comments
 (0)