Module: Gitlab::Graphql::Laziness

Overview

This module allows your class to easily defer and force values. Its methods are just sugar for calls to the Gitlab::Graphql::Lazy class.

example:

class MyAwesomeClass
  include ::Gitlab::Graphql::Laziness

  # takes a list of id and list of factors, and computes
  # sum of [SomeObject[i]#value * factor[i]]
  def resolve(ids:, factors:)
    ids.zip(factors)
      .map { |id, factor| promise_an_int(id, factor) }
      .map(&method(:force))
      .sum
  end

  # returns a promise for an Integer
  def (id, factor)
    thunk = SomeObject.lazy_find(id)
    defer { force(thunk).value * factor }
  end
end

In the example above, we use defer to delay forcing the batch-loaded item until we need it, and then we use ‘force` to consume the lazy values

If ‘SomeObject.lazy_find(id)` batches correctly, calling `resolve` will only perform one batched load for all objects, rather than loading them individually before combining the results.

Instance Method Summary collapse

Instance Method Details

#defer(&block) ⇒ Object



37
38
39
# File 'lib/gitlab/graphql/laziness.rb', line 37

def defer(&block)
  ::Gitlab::Graphql::Lazy.new(&block)
end

#force(lazy) ⇒ Object



41
42
43
# File 'lib/gitlab/graphql/laziness.rb', line 41

def force(lazy)
  ::Gitlab::Graphql::Lazy.force(lazy)
end