@@ -392,6 +392,23 @@ func buildSquashedTable(
392
392
}
393
393
case nil :
394
394
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
+
395
412
f , filters , err = filtersForTable (
396
413
gitbase .RefCommitsTableName ,
397
414
filters ,
@@ -404,7 +421,7 @@ func buildSquashedTable(
404
421
if index != nil {
405
422
iter = gitbase .NewIndexRefCommitsIter (index , f )
406
423
} else {
407
- iter = gitbase .NewAllRefCommitsIter ( f )
424
+ iter = gitbase .NewRefRefCommitsIter ( refIt , f )
408
425
}
409
426
default :
410
427
addUnsquashable (gitbase .RefCommitsTableName )
@@ -1141,6 +1158,35 @@ func filtersForTables(
1141
1158
return
1142
1159
}
1143
1160
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
+ }
1144
1190
func stringInSlice (strs []string , str string ) bool {
1145
1191
for _ , s := range strs {
1146
1192
if s == str {
@@ -1572,6 +1618,46 @@ func fixFieldIndexes(e sql.Expression, schema sql.Schema) (sql.Expression, error
1572
1618
})
1573
1619
}
1574
1620
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
+
1575
1661
func filterDiff (a , b []sql.Expression ) []sql.Expression {
1576
1662
var result []sql.Expression
1577
1663
0 commit comments