@@ -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 , 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
+
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,51 @@ 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 , []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
+
1575
1666
func filterDiff (a , b []sql.Expression ) []sql.Expression {
1576
1667
var result []sql.Expression
1577
1668
0 commit comments