Guest User

Untitled

a guest
Jan 23rd, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. def prefetch_and_select_related(query_set, info):
  2. if info.parent_type.name != 'Query':
  3. return query_set
  4.  
  5. select_list, prefetch_list = [], []
  6.  
  7. for ffield in info.field_asts:
  8. s, p = _prefetch_and_select_related(
  9. selections=ffield.selection_set.selections,
  10. prefix='',
  11. select_list=[],
  12. prefetch_list=[],
  13. )
  14. select_list += s
  15. prefetch_list += p
  16. print('Select', select_list)
  17. print('Prefetch', prefetch_list)
  18. if len(select_list) > 0:
  19. query_set = query_set.select_related(*select_list)
  20. if len(prefetch_list) > 0:
  21. query_set = query_set.prefetch_related(*prefetch_list)
  22. return query_set
  23.  
  24.  
  25. def _prefetch_and_select_related(selections, prefix, select_list, prefetch_list):
  26. for field in selections:
  27. if field.selection_set is not None:
  28. name = camelToSnake(field.name.value)
  29. if '_set' in name:
  30. select_list, prefetch_list = _prefetch_and_select_related(
  31. selections=field.selection_set.selections,
  32. prefix=concat(prefix, name),
  33. select_list=select_list,
  34. prefetch_list=prefetch_list + [concat(prefix, name)],
  35. )
  36. else:
  37. select_list, prefetch_list = _prefetch_and_select_related(
  38. selections=field.selection_set.selections,
  39. prefix=concat(prefix, name),
  40. select_list=select_list + [concat(prefix, name)],
  41. prefetch_list=prefetch_list,
  42. )
  43.  
  44. return select_list, prefetch_list
  45.  
  46.  
  47. def concat(prefix, name):
  48. return '__'.join(filter(lambda str: len(str) > 0, [prefix, name]))
  49.  
  50.  
  51. class PrefetchMiddleware(object):
  52. def resolve(self, next, root, info, **args):
  53. if info.parent_type.name != 'Query':
  54. return next(root, info, **args)
  55. else:
  56. return Promise.resolve(prefetch_and_select_related(next(root, info, **args).value, info))
Add Comment
Please, Sign In to add comment