Sha256: dbd48630bbfcea715cfc4cf68f99c5efd09060aeff3a934dc481b64c6a185f5d
Contents?: true
Size: 1.73 KB
Versions: 4
Compression:
Stored size: 1.73 KB
Contents
# frozen_string_literal: true module GraphQL module Groups module HasAggregates def self.included(base) base.extend(ClassMethods) end module ClassMethods def aggregate(name, *_, **options, &block) aggregate_type = aggregate_type(name) # TODO: Handle method name conflicts, or no query method found error resolve_method = "resolve_#{name}".to_sym query_method = options[:query_method] || name field = aggregate_field name, aggregate_type, null: false, query_method: query_method, resolver_method: resolve_method, **options, &block aggregate_type.add_fields(field.own_attributes) # TODO: Avoid overwriting existing method define_method query_method do |**kwargs| scope = kwargs[:scope] attribute = kwargs[:attribute] scope.public_send(name, attribute) end define_method resolve_method do group_result[1][name] end end def aggregate_field(*args, **kwargs, &block) field_defn = Schema::AggregateField.from_options(*args, owner: self, **kwargs, &block) add_field(field_defn) field_defn end private def aggregate_type(name) # TODO: Handle no aggregate type found name = "#{name}AggregateType".upcase_first own_aggregate_types[name] ||= Class.new(Schema::AggregateType) do graphql_name name end end def own_aggregate_types @own_aggregate_types ||= {} end end end end end
Version data entries
4 entries across 4 versions & 1 rubygems