Class: GraphQL::Schema

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/graphql/schema.rb,
lib/graphql/schema/printer.rb,
lib/graphql/schema/type_map.rb,
lib/graphql/schema/validation.rb,
lib/graphql/schema/reduce_types.rb,
lib/graphql/schema/possible_types.rb,
lib/graphql/schema/type_expression.rb,
lib/graphql/schema/middleware_chain.rb,
lib/graphql/schema/rescue_middleware.rb,
lib/graphql/schema/invalid_type_error.rb,
lib/graphql/schema/timeout_middleware.rb,
lib/graphql/schema/catchall_middleware.rb

Overview

A GraphQL schema which may be queried with Query.

Defined Under Namespace

Modules: CatchallMiddleware, Printer, ReduceTypes, TypeExpression Classes: InvalidTypeError, MiddlewareChain, PossibleTypes, RescueMiddleware, TimeoutMiddleware, TypeMap, Validation

Constant Summary collapse

DIRECTIVES =
[GraphQL::Directive::SkipDirective, GraphQL::Directive::IncludeDirective]
DYNAMIC_FIELDS =
["__type", "__typename", "__schema"]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(query:, mutation: nil, subscription: nil, max_depth: nil, max_complexity: nil, types: []) ⇒ Schema

Returns a new instance of Schema.

Parameters:

  • query (GraphQL::ObjectType)

    the query root for the schema

  • mutation (GraphQL::ObjectType) (defaults to: nil)

    the mutation root for the schema

  • subscription (GraphQL::ObjectType) (defaults to: nil)

    the subscription root for the schema

  • max_depth (Integer) (defaults to: nil)

    maximum query nesting (if it’s greater, raise an error)

  • types (Array<GraphQL::BaseType>) (defaults to: [])

    additional types to include in this schema



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/graphql/schema.rb', line 40

def initialize(query:, mutation: nil, subscription: nil, max_depth: nil, max_complexity: nil, types: [])
  @query    = query
  @mutation = mutation
  @subscription = subscription
  @max_depth = max_depth
  @max_complexity = max_complexity
  @orphan_types = types
  @directives = DIRECTIVES.reduce({}) { |m, d| m[d.name] = d; m }
  @static_validator = GraphQL::StaticValidation::Validator.new(schema: self)
  @rescue_middleware = GraphQL::Schema::RescueMiddleware.new
  @middleware = [@rescue_middleware]
  @query_analyzers = []
  # Default to the built-in execution strategy:
  self.query_execution_strategy = GraphQL::Query::SerialExecution
  self.mutation_execution_strategy = GraphQL::Query::SerialExecution
  self.subscription_execution_strategy = GraphQL::Query::SerialExecution
end

Instance Attribute Details

#directivesObject (readonly)

Returns the value of attribute directives.



20
21
22
# File 'lib/graphql/schema.rb', line 20

def directives
  @directives
end

#max_complexityObject

Returns the value of attribute max_complexity.



22
23
24
# File 'lib/graphql/schema.rb', line 22

def max_complexity
  @max_complexity
end

#max_depthObject

Returns the value of attribute max_depth.



21
22
23
# File 'lib/graphql/schema.rb', line 21

def max_depth
  @max_depth
end

#middlewareArray<#call> (readonly)

Returns Middlewares suitable for MiddlewareChain, applied to fields during execution.

Returns:

  • (Array<#call>)

    Middlewares suitable for MiddlewareChain, applied to fields during execution



33
34
35
# File 'lib/graphql/schema.rb', line 33

def middleware
  @middleware
end

#mutationObject (readonly)

Returns the value of attribute mutation.



20
21
22
# File 'lib/graphql/schema.rb', line 20

def mutation
  @mutation
end

#mutation_execution_strategyObject

Override these if you don’t want the default executor:



25
26
27
# File 'lib/graphql/schema.rb', line 25

def mutation_execution_strategy
  @mutation_execution_strategy
end

#node_identificationGraphQL::Relay::GlobalNodeIdentification

Returns the node identification instance for this schema, when using Relay.

Returns:



30
31
32
# File 'lib/graphql/schema.rb', line 30

def node_identification
  @node_identification
end

#queryObject (readonly)

Returns the value of attribute query.



20
21
22
# File 'lib/graphql/schema.rb', line 20

def query
  @query
end

#query_analyzersObject (readonly)

Returns the value of attribute query_analyzers.



20
21
22
# File 'lib/graphql/schema.rb', line 20

def query_analyzers
  @query_analyzers
end

#query_execution_strategyObject

Override these if you don’t want the default executor:



25
26
27
# File 'lib/graphql/schema.rb', line 25

def query_execution_strategy
  @query_execution_strategy
end

#static_validatorObject (readonly)

Returns the value of attribute static_validator.



20
21
22
# File 'lib/graphql/schema.rb', line 20

def static_validator
  @static_validator
end

#subscriptionObject (readonly)

Returns the value of attribute subscription.



20
21
22
# File 'lib/graphql/schema.rb', line 20

def subscription
  @subscription
end

#subscription_execution_strategyObject

Override these if you don’t want the default executor:



25
26
27
# File 'lib/graphql/schema.rb', line 25

def subscription_execution_strategy
  @subscription_execution_strategy
end

Instance Method Details

#execute(*args) ⇒ Hash

Execute a query on itself. See Query#initialize for arguments.

Returns:

  • (Hash)

    query result, ready to be serialized as JSON



71
72
73
74
# File 'lib/graphql/schema.rb', line 71

def execute(*args)
  query = GraphQL::Query.new(self, *args)
  query.result
end

#execution_strategy_for_operation(operation) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/graphql/schema.rb', line 117

def execution_strategy_for_operation(operation)
  case operation
  when "query"
    query_execution_strategy
  when "mutation"
    mutation_execution_strategy
  when "subscription"
    subscription_execution_strategy
  else
    raise ArgumentError, "unknown operation type: #{operation}"
  end
end

#get_field(parent_type, field_name) ⇒ Object

Resolve field named ‘field_name` for type `parent_type`. Handles dynamic fields `__typename`, `__type` and `__schema`, too



78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/graphql/schema.rb', line 78

def get_field(parent_type, field_name)
  defined_field = parent_type.get_field(field_name)
  if defined_field
    defined_field
  elsif field_name == "__typename"
    GraphQL::Introspection::TypenameField.create(parent_type)
  elsif field_name == "__schema" && parent_type == query
    GraphQL::Introspection::SchemaField.create(self)
  elsif field_name == "__type" && parent_type == query
    GraphQL::Introspection::TypeByNameField.create(self.types)
  else
    nil
  end
end

#possible_types(type_defn) ⇒ Array<GraphQL::ObjectType>

Returns types which belong to ‘type_defn` in this schema.

Parameters:

Returns:



99
100
101
102
# File 'lib/graphql/schema.rb', line 99

def possible_types(type_defn)
  @interface_possible_types ||= GraphQL::Schema::PossibleTypes.new(self)
  @interface_possible_types.possible_types(type_defn)
end

#root_type_for_operation(operation) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/graphql/schema.rb', line 104

def root_type_for_operation(operation)
  case operation
  when "query"
    query
  when "mutation"
    mutation
  when "subscription"
    subscription
  else
    raise ArgumentError, "unknown operation type: #{operation}"
  end
end

#type_from_ast(ast_node) ⇒ Object



93
94
95
# File 'lib/graphql/schema.rb', line 93

def type_from_ast(ast_node)
  GraphQL::Schema::TypeExpression.build_type(self, ast_node)
end

#typesGraphQL::Schema::TypeMap

Returns ‘{ name => type }` pairs of types in this schema.

Returns:



61
62
63
64
65
66
# File 'lib/graphql/schema.rb', line 61

def types
  @types ||= begin
    all_types = @orphan_types + [query, mutation, subscription, GraphQL::Introspection::SchemaType]
    GraphQL::Schema::ReduceTypes.reduce(all_types.compact)
  end
end