我有一個服務必須以偏移格式、接收offset和limit引數接收分頁查詢。例如,如果我收到offset=5&limit=10,我希望收到第 5-14 件商品。我能夠對這些引數進行一些驗證,例如設定限制的最大值。
我的資料源必須接收頁碼格式的分頁請求,接收page_number和page_size引數。例如,如果我發送page_number=0&page_size=20,我會收到專案 0-19。資料源最多page_size有 100 個。
我需要能夠獲取我收到的偏移分頁引數并使用它們來確定page_number和page_size引數的適當值,以便從包含我需要的所有專案的資料源回傳一個范圍。可能會回傳附加專案以填充范圍的開始和/或結束,然后可以將其過濾掉以生成請求的范圍。
如果可能,我應該只向資料源發出一個請求。或者,可以通過最小化要從資料源請求的范圍的大小來提高性能(即,獲取 10 個專案以滿足對 8 個專案的請求比請求 100 個專案更有效)。
這感覺實作起來應該相對簡單,但是我對簡單數學解決方案的嘗試并沒有解決所有的邊緣情況,而且我對更強大的解決方案的嘗試已經開始進入更復雜的計算和迭代因子空間等等。
有沒有一種簡單的方法來計算適當的值?
我已經將測驗工具 REPL 與一組示例測驗用例放在一起,可以輕松地在此處試用不同的實作。
uj5u.com熱心網友回復:
一個合適的實作是從 開始page_size=limit,然后增加 page_size 直到有一個頁面包含從offset到的整個范圍offset limit。
如果您認為您不想浪費時間迭代,那么請考慮這種方法所花費的時間最多與結果集的大小成正比,與您閱讀的時間相比完全微不足道、編組、解組和處理結果本身。
我已經用offset limit <= 100000. 在所有情況下,page_size <= 2*limit 20。對于大的限制,最壞情況的開銷總是發生在limit=offset 1。在某些時候,發出 2 個請求會變得更有效率。你應該檢查一下。
uj5u.com熱心網友回復:
這個怎么樣 ?
if (limit > 100) {
// return error for exceeding limit...
}
mod_offset = (offset % limit)
page_number = (offset / limit) ;
page_size = limit;
// Sample test cases ..
// offset=25, limit=20 .. mod_offset = 5
(a) page_number = 1, page_size = 20 // skip first 'n' values equal to 'mod_offset'
(b) page_number = 1 1 = 2, page_size = 20 // include only first 'n' values equal to 'mod_offset'
// offset=50, limit=25 .. mod_offset = 0
(a) page_number = 2, page_size = 25 // if offset is multiple of limit, no need to fetch twice...
// offset=125, limit=20 .. mod_offset = 5
(a) page_number = 6, page_size = 20 // skip first 'n' values equal to 'mod_offset'
(b) page_number = 6 1 = 7, page_size = 20 // include only first 'n' values equal to 'mod_offset'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/353925.html
