Class: GraphQL::Relay::BaseConnection
- Inherits:
-
Object
- Object
- GraphQL::Relay::BaseConnection
- Defined in:
- lib/graphql/relay/base_connection.rb
Overview
Subclasses must implement:
- #cursor_from_node, which returns an opaque cursor for the given item
- #sliced_nodes, which slices by before
& after
- #paged_nodes, which applies first
& last
limits
In a subclass, you have access to - #nodes, the collection which the connection will wrap - #first, #after, #last, #before (arguments passed to the field) - #max_page_size (the specified maximum page size that can be returned from a connection)
Direct Known Subclasses
Constant Summary collapse
- CURSOR_SEPARATOR =
Just to encode data in the cursor, use something that won’t conflict
"---"
- CONNECTION_IMPLEMENTATIONS =
Map of collection class names -> connection_classes eg
{"Array" => ArrayConnection}
{}
Instance Attribute Summary collapse
-
#arguments ⇒ Object
readonly
Returns the value of attribute arguments.
-
#context ⇒ Object
readonly
Returns the value of attribute context.
-
#field ⇒ Object
readonly
Returns the value of attribute field.
-
#max_page_size ⇒ Object
readonly
Returns the value of attribute max_page_size.
-
#nodes ⇒ Object
readonly
Returns the value of attribute nodes.
-
#parent ⇒ Object
readonly
Returns the value of attribute parent.
Class Method Summary collapse
-
.connection_for_nodes(nodes) ⇒ subclass of BaseConnection
Find a connection implementation suitable for exposing
nodes
. -
.register_connection_implementation(nodes_class, connection_class) ⇒ Object
Add
connection_class
as the connection wrapper fornodes_class
eg,RelationConnection
is the implementation forAR::Relation
.
Instance Method Summary collapse
-
#after ⇒ String?
The value passed as
after:
, if there was one. -
#before ⇒ String?
The value passed as
before:
, if there was one. -
#cursor_from_node(object) ⇒ Object
An opaque operation which returns a connection-specific cursor.
-
#decode(data) ⇒ Object
-
#edge_nodes ⇒ Object
These are the nodes to render for this connection, probably wrapped by Edge.
-
#encode(data) ⇒ Object
-
#end_cursor ⇒ Object
Used by
pageInfo
. -
#first ⇒ Integer?
The value passed as
first:
, if there was one. -
#has_next_page ⇒ Object
Used by
pageInfo
. -
#has_previous_page ⇒ Object
Used by
pageInfo
. -
#initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil) ⇒ BaseConnection
constructor
Make a connection, wrapping
nodes
. -
#inspect ⇒ Object
-
#last ⇒ Integer?
The value passed as
last:
, if there was one. -
#page_info ⇒ Object
Support the
pageInfo
field. -
#start_cursor ⇒ Object
Used by
pageInfo
.
Constructor Details
#initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil) ⇒ BaseConnection
Make a connection, wrapping nodes
57 58 59 60 61 62 63 64 65 |
# File 'lib/graphql/relay/base_connection.rb', line 57 def initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil) @context = context @nodes = nodes @arguments = arguments @field = field @parent = parent @encoder = context ? @context.schema.cursor_encoder : GraphQL::Schema::Base64Encoder @max_page_size = max_page_size.nil? && context ? @context.schema.default_max_page_size : max_page_size end |
Instance Attribute Details
#arguments ⇒ Object (readonly)
Returns the value of attribute arguments
48 49 50 |
# File 'lib/graphql/relay/base_connection.rb', line 48 def arguments @arguments end |
#context ⇒ Object (readonly)
Returns the value of attribute context
48 49 50 |
# File 'lib/graphql/relay/base_connection.rb', line 48 def context @context end |
#field ⇒ Object (readonly)
Returns the value of attribute field
48 49 50 |
# File 'lib/graphql/relay/base_connection.rb', line 48 def field @field end |
#max_page_size ⇒ Object (readonly)
Returns the value of attribute max_page_size
48 49 50 |
# File 'lib/graphql/relay/base_connection.rb', line 48 def max_page_size @max_page_size end |
#nodes ⇒ Object (readonly)
Returns the value of attribute nodes
48 49 50 |
# File 'lib/graphql/relay/base_connection.rb', line 48 def nodes @nodes end |
#parent ⇒ Object (readonly)
Returns the value of attribute parent
48 49 50 |
# File 'lib/graphql/relay/base_connection.rb', line 48 def parent @parent end |
Class Method Details
.connection_for_nodes(nodes) ⇒ subclass of BaseConnection
Find a connection implementation suitable for exposing nodes
27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/graphql/relay/base_connection.rb', line 27 def connection_for_nodes(nodes) # Check for class _names_ because classes can be redefined in Rails development nodes.class.ancestors.each do |ancestor| conn_impl = CONNECTION_IMPLEMENTATIONS[ancestor.name] if conn_impl return conn_impl end end # Should have found a connection during the loop: raise("No connection implementation to wrap #{nodes.class} (#{nodes})") end |
.register_connection_implementation(nodes_class, connection_class) ⇒ Object
Add connection_class
as the connection wrapper for nodes_class
eg, RelationConnection
is the implementation for AR::Relation
43 44 45 |
# File 'lib/graphql/relay/base_connection.rb', line 43 def register_connection_implementation(nodes_class, connection_class) CONNECTION_IMPLEMENTATIONS[nodes_class.name] = connection_class end |
Instance Method Details
#after ⇒ String?
The value passed as after:
, if there was one
85 86 87 |
# File 'lib/graphql/relay/base_connection.rb', line 85 def after arguments[:after] end |
#before ⇒ String?
The value passed as before:
, if there was one
97 98 99 |
# File 'lib/graphql/relay/base_connection.rb', line 97 def before arguments[:before] end |
#cursor_from_node(object) ⇒ Object
An opaque operation which returns a connection-specific cursor.
141 142 143 |
# File 'lib/graphql/relay/base_connection.rb', line 141 def cursor_from_node(object) raise GraphQL::RequiredImplementationMissingError, "must return a cursor for this object/connection pair" end |
#decode(data) ⇒ Object
71 72 73 74 75 |
# File 'lib/graphql/relay/base_connection.rb', line 71 def decode(data) @encoder.decode(data, nonce: true) rescue ArgumentError raise GraphQL::ExecutionError, "Invalid cursor: #{data.inspect}" end |
#edge_nodes ⇒ Object
These are the nodes to render for this connection, probably wrapped by Edge
103 104 105 |
# File 'lib/graphql/relay/base_connection.rb', line 103 def edge_nodes @edge_nodes ||= paged_nodes end |
#encode(data) ⇒ Object
67 68 69 |
# File 'lib/graphql/relay/base_connection.rb', line 67 def encode(data) @encoder.encode(data, nonce: true) end |
#end_cursor ⇒ Object
Used by pageInfo
132 133 134 135 136 137 138 |
# File 'lib/graphql/relay/base_connection.rb', line 132 def end_cursor if end_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).last return cursor_from_node(end_node) else return nil end end |
#first ⇒ Integer?
The value passed as first:
, if there was one. Negative numbers become 0
.
79 80 81 |
# File 'lib/graphql/relay/base_connection.rb', line 79 def first @first ||= get_limited_arg(:first) end |
#has_next_page ⇒ Object
Used by pageInfo
113 114 115 |
# File 'lib/graphql/relay/base_connection.rb', line 113 def has_next_page !!(first && sliced_nodes.count > first) end |
#has_previous_page ⇒ Object
Used by pageInfo
118 119 120 |
# File 'lib/graphql/relay/base_connection.rb', line 118 def has_previous_page !!(last && sliced_nodes.count > last) end |
#inspect ⇒ Object
145 146 147 |
# File 'lib/graphql/relay/base_connection.rb', line 145 def inspect "#<GraphQL::Relay::Connection @parent=#{@parent.inspect} @arguments=#{@arguments.to_h.inspect}>" end |
#last ⇒ Integer?
The value passed as last:
, if there was one. Negative numbers become 0
.
91 92 93 |
# File 'lib/graphql/relay/base_connection.rb', line 91 def last @last ||= get_limited_arg(:last) end |
#page_info ⇒ Object
Support the pageInfo
field
108 109 110 |
# File 'lib/graphql/relay/base_connection.rb', line 108 def page_info self end |
#start_cursor ⇒ Object
Used by pageInfo
123 124 125 126 127 128 129 |
# File 'lib/graphql/relay/base_connection.rb', line 123 def start_cursor if start_node = (respond_to?(:paged_nodes_array, true) ? paged_nodes_array : paged_nodes).first return cursor_from_node(start_node) else return nil end end |