Skip to content

Commit 008dbc2

Browse files
authored
Merge pull request #91 from graphql-python/feat-data-loader
Feat data loader
2 parents 98c2d76 + 9a35410 commit 008dbc2

File tree

4 files changed

+167
-97
lines changed

4 files changed

+167
-97
lines changed

graphene_mongo/fields.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import graphene
77
import mongoengine
8+
from promise import Promise
89
from graphene.relay import ConnectionField
910
from graphene.types.argument import to_arguments
1011
from graphene.types.dynamic import Dynamic
@@ -126,7 +127,6 @@ def fields(self):
126127
return self._type._meta.fields
127128

128129
def get_queryset(self, model, info, **args):
129-
130130
if args:
131131
reference_fields = get_model_reference_fields(self.model)
132132
hydrated_references = {}
@@ -157,36 +157,49 @@ def default_resolver(self, _root, info, **args):
157157
_id = args.pop('id', None)
158158

159159
if _id is not None:
160-
objs = [get_node_from_global_id(self.node_type, info, _id)]
160+
iterables = [get_node_from_global_id(self.node_type, info, _id)]
161161
list_length = 1
162162
elif callable(getattr(self.model, 'objects', None)):
163-
objs = self.get_queryset(self.model, info, **args)
164-
list_length = objs.count()
163+
iterables = self.get_queryset(self.model, info, **args)
164+
list_length = iterables.count()
165165
else:
166-
objs = []
166+
iterables = []
167167
list_length = 0
168168

169169
connection = connection_from_list_slice(
170-
list_slice=objs,
170+
list_slice=iterables,
171171
args=connection_args,
172172
list_length=list_length,
173173
connection_type=self.type,
174174
edge_type=self.type.Edge,
175175
pageinfo_type=graphene.PageInfo,
176176
)
177-
connection.iterable = objs
177+
connection.iterable = iterables
178178
connection.list_length = list_length
179179
return connection
180180

181-
def chained_resolver(self, resolver, root, info, **args):
182-
if not bool(args):
181+
def chained_resolver(self, resolver, is_partial, root, info, **args):
182+
if not bool(args) or not is_partial:
183183
# XXX: Filter nested args
184184
resolved = resolver(root, info, **args)
185185
if resolved is not None:
186186
return resolved
187187
return self.default_resolver(root, info, **args)
188188

189+
@classmethod
190+
def connection_resolver(cls, resolver, connection_type, root, info, **args):
191+
iterable = resolver(root, info, **args)
192+
if isinstance(connection_type, graphene.NonNull):
193+
connection_type = connection_type.of_type
194+
195+
on_resolve = partial(cls.resolve_connection, connection_type, args)
196+
if Promise.is_thenable(iterable):
197+
return Promise.resolve(iterable).then(on_resolve)
198+
199+
return on_resolve(iterable)
200+
189201
def get_resolver(self, parent_resolver):
190202
super_resolver = self.resolver or parent_resolver
191-
resolver = partial(self.chained_resolver, super_resolver)
203+
resolver = partial(
204+
self.chained_resolver, super_resolver, isinstance(super_resolver, partial))
192205
return partial(self.connection_resolver, resolver, self.type)

graphene_mongo/tests/test_query.py

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,23 @@
33
import json
44
import graphene
55

6+
from . import models
7+
from . import types
68
from .setup import fixtures, fixtures_dirname
7-
from .models import (
8-
Child, Editor, Player, Reporter, ProfessorVector, Parent, CellTower
9-
)
10-
from .types import (
11-
ChildType, EditorType, PlayerType, ReporterType, ProfessorVectorType, ParentType, CellTowerType
12-
)
139

1410

1511
def test_should_query_editor(fixtures, fixtures_dirname):
1612

1713
class Query(graphene.ObjectType):
1814

19-
editor = graphene.Field(EditorType)
20-
editors = graphene.List(EditorType)
15+
editor = graphene.Field(types.EditorType)
16+
editors = graphene.List(types.EditorType)
2117

2218
def resolve_editor(self, *args, **kwargs):
23-
return Editor.objects.first()
19+
return models.Editor.objects.first()
2420

2521
def resolve_editors(self, *args, **kwargs):
26-
return list(Editor.objects.all())
22+
return list(models.Editor.objects.all())
2723

2824
query = '''
2925
query EditorQuery {
@@ -91,10 +87,10 @@ def resolve_editors(self, *args, **kwargs):
9187
def test_should_query_reporter(fixtures):
9288

9389
class Query(graphene.ObjectType):
94-
reporter = graphene.Field(ReporterType)
90+
reporter = graphene.Field(types.ReporterType)
9591

9692
def resolve_reporter(self, *args, **kwargs):
97-
return Reporter.objects.first()
93+
return models.Reporter.objects.first()
9894

9995
query = '''
10096
query ReporterQuery {
@@ -154,10 +150,10 @@ def test_should_custom_kwargs(fixtures):
154150

155151
class Query(graphene.ObjectType):
156152

157-
editors = graphene.List(EditorType, first=graphene.Int())
153+
editors = graphene.List(types.EditorType, first=graphene.Int())
158154

159155
def resolve_editors(self, *args, **kwargs):
160-
editors = Editor.objects()
156+
editors = models.Editor.objects()
161157
if 'first' in kwargs:
162158
editors = editors[:kwargs['first']]
163159
return list(editors)
@@ -192,10 +188,10 @@ def test_should_self_reference(fixtures):
192188

193189
class Query(graphene.ObjectType):
194190

195-
all_players = graphene.List(PlayerType)
191+
all_players = graphene.List(types.PlayerType)
196192

197193
def resolve_all_players(self, *args, **kwargs):
198-
return Player.objects.all()
194+
return models.Player.objects.all()
199195

200196
query = '''
201197
query PlayersQuery {
@@ -260,10 +256,10 @@ def resolve_all_players(self, *args, **kwargs):
260256
def test_should_query_with_embedded_document(fixtures):
261257

262258
class Query(graphene.ObjectType):
263-
professor_vector = graphene.Field(ProfessorVectorType, id=graphene.String())
259+
professor_vector = graphene.Field(types.ProfessorVectorType, id=graphene.String())
264260

265261
def resolve_professor_vector(self, info, id):
266-
return ProfessorVector.objects(metadata__id=id).first()
262+
return models.ProfessorVector.objects(metadata__id=id).first()
267263

268264
query = """
269265
query {
@@ -284,7 +280,8 @@ def resolve_professor_vector(self, info, id):
284280
}
285281
}
286282
}
287-
schema = graphene.Schema(query=Query, types=[ProfessorVectorType])
283+
schema = graphene.Schema(
284+
query=Query, types=[types.ProfessorVectorType])
288285
result = schema.execute(query)
289286
assert not result.errors
290287
assert result.data == expected
@@ -294,10 +291,10 @@ def test_should_query_child(fixtures):
294291

295292
class Query(graphene.ObjectType):
296293

297-
children = graphene.List(ChildType)
294+
children = graphene.List(types.ChildType)
298295

299296
def resolve_children(self, *args, **kwargs):
300-
return list(Child.objects.all())
297+
return list(models.Child.objects.all())
301298

302299
query = '''
303300
query Query {
@@ -338,10 +335,10 @@ def test_should_query_cell_tower(fixtures):
338335

339336
class Query(graphene.ObjectType):
340337

341-
cell_towers = graphene.List(CellTowerType)
338+
cell_towers = graphene.List(types.CellTowerType)
342339

343340
def resolve_cell_towers(self, *args, **kwargs):
344-
return list(CellTower.objects.all())
341+
return list(models.CellTower.objects.all())
345342

346343
query = '''
347344
query Query {

0 commit comments

Comments
 (0)