@@ -1220,9 +1220,12 @@ type ISeekReadIndexedRowReader<'RowT, 'KeyT, 'T when 'RowT: struct> =
12201220 abstract CompareKey: 'KeyT -> int
12211221 abstract ConvertRow: byref < 'RowT > -> 'T
12221222
1223- let seekReadIndexedRowsByInterface numRows binaryChop ( reader : ISeekReadIndexedRowReader < 'RowT , _ , _ >) =
1223+ let seekReadIndexedRowsRange numRows binaryChop ( reader : ISeekReadIndexedRowReader < 'RowT , _ , _ >) =
12241224 let mutable row = Unchecked.defaultof< 'RowT>
12251225
1226+ let mutable startRid = - 1
1227+ let mutable endRid = - 1
1228+
12261229 if binaryChop then
12271230 let mutable low = 0
12281231 let mutable high = numRows + 1
@@ -1241,12 +1244,12 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12411244 elif c < 0 then high <- mid
12421245 else fin <- true
12431246
1244- let res = ImmutableArray.CreateBuilder()
1245-
12461247 if high - low > 1 then
12471248 // now read off rows, forward and backwards
12481249 let mid = ( low + high) / 2
12491250
1251+ startRid <- mid
1252+
12501253 // read backwards
12511254 let mutable fin = false
12521255 let mutable curr = mid - 1
@@ -1258,14 +1261,12 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12581261 reader.GetRow( curr, & row)
12591262
12601263 if reader.CompareKey( reader.GetKey(& row)) = 0 then
1261- res.Add ( reader.ConvertRow (& row ))
1264+ startRid <- curr
12621265 else
12631266 fin <- true
12641267
12651268 curr <- curr - 1
12661269
1267- res.Reverse()
1268-
12691270 // read forward
12701271 let mutable fin = false
12711272 let mutable curr = mid
@@ -1277,23 +1278,47 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12771278 reader.GetRow( curr, & row)
12781279
12791280 if reader.CompareKey( reader.GetKey(& row)) = 0 then
1280- res.Add ( reader.ConvertRow (& row ))
1281+ endRid <- curr
12811282 else
12821283 fin <- true
12831284
12841285 curr <- curr + 1
12851286
1286- res.ToArray()
12871287 else
1288- let res = ImmutableArray.CreateBuilder ()
1288+ let mutable rid = 1
12891289
1290- for i = 1 to numRows do
1291- reader.GetRow( i , & row)
1290+ while rid <= numRows && startRid = - 1 do
1291+ reader.GetRow( rid , & row)
12921292
12931293 if reader.CompareKey( reader.GetKey(& row)) = 0 then
1294- res.Add( reader.ConvertRow(& row))
1294+ startRid <- rid
1295+ endRid <- rid
1296+
1297+ rid <- rid + 1
1298+
1299+ let mutable fin = false
1300+
1301+ while rid <= numRows && not fin do
1302+ reader.GetRow( rid, & row)
1303+
1304+ if reader.CompareKey( reader.GetKey(& row)) = 0 then
1305+ endRid <- rid
1306+ else
1307+ fin <- true
1308+
1309+ startRid, endRid
1310+
1311+ let seekReadIndexedRowsByInterface numRows binaryChop ( reader : ISeekReadIndexedRowReader < 'RowT , _ , _ >) =
1312+ let startRid , endRid = seekReadIndexedRowsRange numRows binaryChop reader
1313+
1314+ if startRid <= 0 || endRid < startRid then
1315+ [||]
1316+ else
12951317
1296- res.ToArray()
1318+ Array.init ( endRid - startRid + 1 ) ( fun i ->
1319+ let mutable row = Unchecked.defaultof< 'RowT>
1320+ reader.GetRow( startRid + i, & row)
1321+ reader.ConvertRow(& row))
12971322
12981323[<Struct>]
12991324type CustomAttributeRow =
0 commit comments