Skip to content

Instantly share code, notes, and snippets.

@yana-gi
Created February 25, 2024 11:44
Show Gist options
  • Save yana-gi/0d897ecb9a793d08d223b2aecdf7d1e8 to your computer and use it in GitHub Desktop.
Save yana-gi/0d897ecb9a793d08d223b2aecdf7d1e8 to your computer and use it in GitHub Desktop.
graphql-rubyのカーソルを作っているながれ
{
"$schema": "https://aka.ms/codetour-schema",
"title": "カーソルがどうやって作られているか",
"steps": [
{
"file": "lib/graphql/types/relay/page_info.rb",
"description": "pageinfoの定義から見ていく\n",
"line": 6
},
{
"file": "lib/graphql/types/relay/page_info.rb",
"description": "PageInfoBehaviorsをincludeしている",
"line": 7
},
{
"file": "lib/graphql/types/relay/page_info_behaviors.rb",
"description": "end_cursor はここ\n",
"line": 18
},
{
"file": "lib/graphql/types/relay/page_info_behaviors.rb",
"description": "includedされた時にこのメソッドが呼び出される\n\nhttps://docs.ruby-lang.org/ja/latest/method/Module/i/included.html\n",
"line": 6
},
{
"file": "lib/graphql/types/relay/page_info_behaviors.rb",
"description": "child_class のメソッドにClassMethodsを追加している\n\nつまり今回は default_relay?がPageInfoクラスに追加される\n(今後ClassMethodsが増えても記述量が増えなくて便利、的な?)\n",
"line": 7
},
{
"file": "lib/graphql/types/relay/page_info_behaviors.rb",
"description": "pageInfoにhas_next_pageメソッドを追加している",
"line": 9
},
{
"file": "lib/graphql/types/relay/page_info_behaviors.rb",
"description": "pageInfoにend_cursorメソッドを追加している",
"line": 18
},
{
"file": "lib/graphql/pagination/connection.rb",
"description": "end_cursorの実装はここ",
"line": 214
},
{
"file": "lib/graphql/pagination/connection.rb",
"description": "end_cursorの実装はここ",
"line": 214
},
{
"file": "lib/graphql/pagination/connection.rb",
"description": "nodes.lastがある場合(つまりnodeがなかった場合はnulが返ってくる)\ncursor_for(nodes.last)の値が返ってくる\n\n",
"line": 215
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "nodes.index(item) + 1\nindexは Array#index のindex。つまりnodeの中でitemが何番目の要素かを返す。0始まりなので+1してる",
"line": 50
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "@paged_nodes_offset はここで入れてる\n\nrelation_offsetとは",
"line": 210
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "初期代入はここっぽい \n@sliced_nodes_offsetとは",
"line": 188
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "sliced_nodes_offsetの代入場所\n\nnext_offsetとは",
"line": 141
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "next_offsetの代入場所\n\nrelation_offsetとは",
"line": 119
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "itemsの型によるっぽい",
"line": 66
},
{
"file": "lib/graphql/pagination/active_record_relation_connection.rb",
"description": "ここでrelation_offsetを定義してる",
"line": 35
},
{
"file": "lib/graphql/pagination/active_record_relation_connection.rb",
"description": "relation.class は User::ActiveRecord_Relation\n\noffset_valueの定義場所\n\n04:0> m = relation.method(:offset_value)\n05:0> m.source_location\n=> \n[\"/Users/yana/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/activerecord-6.1.6.1/lib/active_record/relation/query_methods.rb\", , 98]",
"line": 40
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "難しくなったのでもう一度ここに帰る\n\n(relation対象のnodesのindex + 1) + nodes_offsetのpaged? -\n\nusers(first:1, after:\"Mg\")(Mgは2番目の要素)\nの計算式は 1 + 2 - 0 だった\n\npaged_nodes_offset は afterより前のnodeの数と考えていいのかな",
"line": 51
},
{
"file": "lib/graphql/pagination/connection.rb",
"description": "ここでは定義されていないので継承先で実装されていそう",
"line": 222
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "nodesはload_nodesした後の@nodesの値",
"line": 50
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "ActiveRecordRelationはRelationConnectionを継承しているので、cursor_forの実装はここ",
"line": 47
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "```ruby\n08:0> limited_nodes.to_a\n=> \n[#<User:0x0000000114997f18 \n id: 3, \n name: \"user\", \n email: nil, \n created_at: Mon, 18 Jul 2022 09:49:16.616049000 UTC +00:00, \n updated_at: Mon, 18 Jul 2022 09:49:16.616049000 UTC +00:00>] \nirb(#<GraphQL::Pagination::ActiveRecordRelationConnection:0x0000000114dae930>):0\n\n```\nlimited_nodes自体はUser::ActiveRecord_Relation",
"line": 222
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "pagenationで指定された対象のnodesを @nodes 格納していた",
"line": 48
},
{
"file": "lib/graphql/pagination/relation_connection.rb",
"description": "load_nodesは何をしているか",
"line": 48
}
],
"ref": "master"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment