@@ -1201,9 +1201,12 @@ type ISeekReadIndexedRowReader<'RowT, 'KeyT, 'T when 'RowT: struct> =
12011201 abstract CompareKey: 'KeyT -> int
12021202 abstract ConvertRow: byref < 'RowT > -> 'T
12031203
1204- let seekReadIndexedRowsByInterface numRows binaryChop ( reader : ISeekReadIndexedRowReader < 'RowT , _ , _ >) =
1204+ let seekReadIndexedRowsRange numRows binaryChop ( reader : ISeekReadIndexedRowReader < 'RowT , _ , _ >) =
12051205 let mutable row = Unchecked.defaultof< 'RowT>
12061206
1207+ let mutable startRid = - 1
1208+ let mutable endRid = - 1
1209+
12071210 if binaryChop then
12081211 let mutable low = 0
12091212 let mutable high = numRows + 1
@@ -1222,12 +1225,13 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12221225 elif c < 0 then high <- mid
12231226 else fin <- true
12241227
1225- let res = ImmutableArray.CreateBuilder()
1226-
12271228 if high - low > 1 then
12281229 // now read off rows, forward and backwards
12291230 let mid = ( low + high) / 2
12301231
1232+ startRid <- mid
1233+ endRid <- mid
1234+
12311235 // read backwards
12321236 let mutable fin = false
12331237 let mutable curr = mid - 1
@@ -1239,17 +1243,15 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12391243 reader.GetRow( curr, & row)
12401244
12411245 if reader.CompareKey( reader.GetKey(& row)) = 0 then
1242- res.Add ( reader.ConvertRow (& row ))
1246+ startRid <- curr
12431247 else
12441248 fin <- true
12451249
12461250 curr <- curr - 1
12471251
1248- res.Reverse()
1249-
12501252 // read forward
12511253 let mutable fin = false
1252- let mutable curr = mid
1254+ let mutable curr = mid + 1
12531255
12541256 while not fin do
12551257 if curr > numRows then
@@ -1258,23 +1260,49 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12581260 reader.GetRow( curr, & row)
12591261
12601262 if reader.CompareKey( reader.GetKey(& row)) = 0 then
1261- res.Add ( reader.ConvertRow (& row ))
1263+ endRid <- curr
12621264 else
12631265 fin <- true
12641266
12651267 curr <- curr + 1
12661268
1267- res.ToArray()
12681269 else
1269- let res = ImmutableArray.CreateBuilder ()
1270+ let mutable rid = 1
12701271
1271- for i = 1 to numRows do
1272- reader.GetRow( i , & row)
1272+ while rid <= numRows && startRid = - 1 do
1273+ reader.GetRow( rid , & row)
12731274
12741275 if reader.CompareKey( reader.GetKey(& row)) = 0 then
1275- res.Add( reader.ConvertRow(& row))
1276+ startRid <- rid
1277+ endRid <- rid
1278+
1279+ rid <- rid + 1
1280+
1281+ let mutable fin = false
1282+
1283+ while rid <= numRows && not fin do
1284+ reader.GetRow( rid, & row)
1285+
1286+ if reader.CompareKey( reader.GetKey(& row)) = 0 then
1287+ endRid <- rid
1288+ else
1289+ fin <- true
1290+
1291+ rid <- rid + 1
1292+
1293+ startRid, endRid
1294+
1295+ let seekReadIndexedRowsByInterface numRows binaryChop ( reader : ISeekReadIndexedRowReader < 'RowT , _ , _ >) =
1296+ let startRid , endRid = seekReadIndexedRowsRange numRows binaryChop reader
1297+
1298+ if startRid <= 0 || endRid < startRid then
1299+ [||]
1300+ else
12761301
1277- res.ToArray()
1302+ Array.init ( endRid - startRid + 1 ) ( fun i ->
1303+ let mutable row = Unchecked.defaultof< 'RowT>
1304+ reader.GetRow( startRid + i, & row)
1305+ reader.ConvertRow(& row))
12781306
12791307[<Struct>]
12801308type CustomAttributeRow =
0 commit comments