graphql-rubyでcursorとlimitはどう計算されているのか
code:ruby
def cursor
@cursor ||= @connection.cursor_for(@node)
end
code:ruby
def cursor_for(item)
load_nodes
# index in nodes + existing offset + 1 (because it's offset, not index)
offset = nodes.index(item) + 1 + (@paged_nodes_offset || 0) - (relation_offset(items) || 0)
encode(offset.to_s)
end
🤔なんの計算?
offset = nodes.index(item) + 1 + (@paged_nodes_offset || 0) - (relation_offset(items) || 0)
nodes.index(item) + 1
itemのindex。
indexは0始まりだけどoffsetは1始まりなので+1している
+ (@paged_nodes_offset || 0)
現在のページのオフセットを足す
未設定の場合は0
- (relation_offset(items) || 0)
- 元のリレーションのオフセットを減らす
👀 実際の数値で考えてみる
3より後の2つのnodeを取得する場合
users(first: 2, after: "YXJyYXljb25uZWN0aW9uOjM=") { (afterは3をencodeしたものとする)
4番目のユーザーのcursorの計算
nodes.index(item) は 0 (配列内の最初の要素)
@paged_nodes_offset は 3 (最初の3つをスキップしたため)
relation_offset(items) は 0 (元のリレーションのオフセット)
→ offset = 0 + 1 + 3 - 0 = 4
5番目のユーザーのcursorの計算
nodes.index(item) は 1 (配列内の2番目の要素、0から数えて)
@paged_nodes_offset は 3 (最初の3つをスキップしたため)
relation_offset(items) は 0 (元のリレーションのオフセット)
→offset = 1 + 1 + 3 - 0 = 5
🤔 relation_offset が0以上ってどんなとき?
ARの場合
code:ruby
def relation_offset(relation)
if relation.is_a?(Array)
nil
else
relation.offset_value
end
end
User.offset(10)のようなクエリを作成すると、offset_valueが10で設定される(雰囲気理解)