Class: Graphiti::Scope
Instance Attribute Summary collapse
-
#object ⇒ Object
Returns the value of attribute object.
-
#pagination ⇒ Object
readonly
Returns the value of attribute pagination.
-
#unpaginated_object ⇒ Object
Returns the value of attribute unpaginated_object.
Class Method Summary collapse
Instance Method Summary collapse
- #cache_key ⇒ Object
- #cache_key_with_version ⇒ Object
- #future_resolve {|resolved| ... } ⇒ Object
-
#initialize(object, resource, query, opts = {}) ⇒ Scope
constructor
A new instance of Scope.
- #parent_resource ⇒ Object
- #resolve ⇒ Object
- #resolve_sideloads(results) ⇒ Object
- #updated_at ⇒ Object (also: #last_modified_at)
Constructor Details
#initialize(object, resource, query, opts = {}) ⇒ Scope
Returns a new instance of Scope.
34 35 36 37 38 39 40 41 42 43 |
# File 'lib/graphiti/scope.rb', line 34 def initialize(object, resource, query, opts = {}) @object = object @resource = resource @query = query @opts = opts @object = @resource.around_scoping(@object, @query.hash) { |scope| apply_scoping(scope, opts) } end |
Instance Attribute Details
#object ⇒ Object
Returns the value of attribute object.
3 4 5 |
# File 'lib/graphiti/scope.rb', line 3 def object @object end |
#pagination ⇒ Object (readonly)
Returns the value of attribute pagination.
4 5 6 |
# File 'lib/graphiti/scope.rb', line 4 def pagination @pagination end |
#unpaginated_object ⇒ Object
Returns the value of attribute unpaginated_object.
3 4 5 |
# File 'lib/graphiti/scope.rb', line 3 def unpaginated_object @unpaginated_object end |
Class Method Details
.global_thread_pool_executor ⇒ Object
24 25 26 |
# File 'lib/graphiti/scope.rb', line 24 def self.global_thread_pool_executor GLOBAL_THREAD_POOL_EXECUTOR.value! end |
.global_thread_pool_stats ⇒ Object
28 29 30 31 32 |
# File 'lib/graphiti/scope.rb', line 28 def self.global_thread_pool_stats GLOBAL_THREAD_POOL_EXECUTOR_BROADCAST_STATS.each_with_object({}) do |key, memo| memo[key] = global_thread_pool_executor.send(key) end end |
Instance Method Details
#cache_key ⇒ Object
79 80 81 82 83 84 85 86 87 |
# File 'lib/graphiti/scope.rb', line 79 def cache_key # This is the combined cache key for the base query and the query for all sideloads # Changing the query will yield a different cache key cache_keys = sideload_resource_proxies.map { |proxy| proxy.try(:cache_key) } cache_keys << @object.try(:cache_key) # this is what calls into the ORM (ActiveRecord, most likely) ActiveSupport::Cache.(cache_keys.flatten.compact) end |
#cache_key_with_version ⇒ Object
89 90 91 92 93 94 95 96 97 |
# File 'lib/graphiti/scope.rb', line 89 def cache_key_with_version # This is the combined and versioned cache key for the base query and the query for all sideloads # If any returned model's updated_at changes, this key will change cache_keys = sideload_resource_proxies.map { |proxy| proxy.try(:cache_key_with_version) } cache_keys << @object.try(:cache_key_with_version) # this is what calls into ORM (ActiveRecord, most likely) ActiveSupport::Cache.(cache_keys.flatten.compact) end |
#future_resolve {|resolved| ... } ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/graphiti/scope.rb', line 53 def future_resolve return Concurrent::Promises.fulfilled_future([], self.class.global_thread_pool_executor) if @query.zero_results? resolved = broadcast_data { |payload| @object = @resource.before_resolve(@object, @query) payload[:results] = @resource.resolve(@object) payload[:results] } resolved.compact! assign_serializer(resolved) yield resolved if block_given? @opts[:after_resolve]&.call(resolved) sideloaded = @query.parents.any? close_adapter = Graphiti.config.concurrency && sideloaded if close_adapter @resource.adapter.close end future_resolve_sideloads(resolved) .then_on(self.class.global_thread_pool_executor, resolved) { resolved } end |
#parent_resource ⇒ Object
75 76 77 |
# File 'lib/graphiti/scope.rb', line 75 def parent_resource @resource end |
#resolve ⇒ Object
45 46 47 |
# File 'lib/graphiti/scope.rb', line 45 def resolve future_resolve.value! end |
#resolve_sideloads(results) ⇒ Object
49 50 51 |
# File 'lib/graphiti/scope.rb', line 49 def resolve_sideloads(results) future_resolve_sideloads(results).value! end |
#updated_at ⇒ Object Also known as: last_modified_at
99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/graphiti/scope.rb', line 99 def updated_at updated_time = nil begin updated_ats = sideload_resource_proxies.map(&:updated_at) updated_ats << @object.maximum(:updated_at) updated_time = updated_ats.compact.max rescue => e Graphiti.log(["error calculating last_modified_at for #{@resource.class}", :red]) Graphiti.log(e) end updated_time || Time.now end |