Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@
/spec/reports/
/tmp/
.byebug_history
.idea
29 changes: 25 additions & 4 deletions lib/graphql/query_resolver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,41 @@ def self.run(model_class, context, return_type)
to_load
end

def self.map_dependencies(class_name, ast_node)
dependencies = {}
def self.using_relay_pagination?(selection)
selection.name == 'edges'
end

def self.map_relay_pagination_depencies(class_name, selection, dependencies)
node_selection = selection.selections.find { |sel| sel.name == 'node' }

if node_selection.present?
map_dependencies(class_name, node_selection, dependencies)
else
dependencies
end
end

def self.has_reflection_with_name?(class_name, selection_name)
class_name.reflections.with_indifferent_access[selection_name].present?
end

def self.map_dependencies(class_name, ast_node, dependencies={})
ast_node.selections.each do |selection|
name = selection.name

if class_name.reflections.with_indifferent_access[selection.name].present?
if using_relay_pagination?(selection)
map_relay_pagination_depencies(class_name, selection, dependencies)
next
end

if has_reflection_with_name?(class_name, name)
begin
current_class_name = selection.name.singularize.classify.constantize
dependencies[name] = map_dependencies(current_class_name, selection)
rescue NameError
selection_name = class_name.reflections.with_indifferent_access[selection.name].options[:class_name]
current_class_name = selection_name.singularize.classify.constantize
dependencies[selection.name.to_sym] = map_dependencies(current_class_name, selection)

next
end
end
Expand Down
28 changes: 28 additions & 0 deletions spec/graphql/query_resolver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,32 @@

expect(queries.size).to eq(2)
end

it 'works with pagination' do
query = %{
query {
vendors(first: 5) {
edges {
node {
id
name
ingredients {
name
quantity
}
}
cursor
}
pageInfo {
hasNextPage
}
}
}
}
queries = track_queries do
GQL.query(query)
end

expect(queries.size).to eq(2)
end
end
16 changes: 16 additions & 0 deletions spec/support/graphql_schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@

field :id, types.ID
field :name, types.String

field :ingredients do
type types[IngredientType]

resolve -> (obj, args, ctx) {
obj.ingredients
}
end
end

IngredientType = GraphQL::ObjectType.define do
Expand Down Expand Up @@ -97,6 +105,14 @@
end
}
end

connection :vendors, VendorType.connection_type, max_page_size: 50 do
resolve -> (obj, args, ctx) {
GraphQL::QueryResolver::run(Vendor, ctx, VendorType) do
Vendor.all.to_a
end
}
end
end

Schema = GraphQL::Schema.define do
Expand Down