Skip to content

Commit f6ad46e

Browse files
authored
Merge pull request rmosolgo#4311 from rmosolgo/improve-interface-tms-2.0
Improve interface tms 2.0
2 parents 68f4937 + 7a30702 commit f6ad46e

4 files changed

Lines changed: 35 additions & 7 deletions

File tree

benchmark/run.rb

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def self.profile_large_result
8282
}
8383
end
8484

85-
result = StackProf.run(mode: :wall) do
85+
result = StackProf.run(mode: :wall, interval: 1) do
8686
schema.execute(document: document)
8787
end
8888
StackProf::Report.new(result).print_text
@@ -110,18 +110,28 @@ module ProfileLargeResult
110110
}
111111
}
112112

113+
module Bar
114+
include GraphQL::Schema::Interface
115+
field :string_array, [String], null: false
116+
end
117+
118+
module Baz
119+
include GraphQL::Schema::Interface
120+
implements Bar
121+
field :int_array, [Integer], null: false
122+
field :boolean_array, [Boolean], null: false
123+
end
124+
113125

114126
class FooType < GraphQL::Schema::Object
127+
implements Baz
115128
field :id, ID, null: false
116129
field :int1, Integer, null: false
117130
field :int2, Integer, null: false
118131
field :string1, String, null: false
119132
field :string2, String, null: false
120133
field :boolean1, Boolean, null: false
121134
field :boolean2, Boolean, null: false
122-
field :string_array, [String], null: false
123-
field :int_array, [Integer], null: false
124-
field :boolean_array, [Boolean], null: false
125135
end
126136

127137
class QueryType < GraphQL::Schema::Object
@@ -134,7 +144,7 @@ def foos
134144

135145
class Schema < GraphQL::Schema
136146
query QueryType
137-
use GraphQL::Dataloader
147+
# use GraphQL::Dataloader
138148
end
139149

140150
ALL_FIELDS = GraphQL.parse <<-GRAPHQL

lib/graphql/schema/member/has_fields.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def visible_interface_implementation?(type, context, warden)
141141
if type.respond_to?(:kind) && type.kind.interface?
142142
implements_this_interface = false
143143
implementation_is_visible = false
144-
interface_type_memberships.each do |tm|
144+
warden.interface_type_memberships(self, context).each do |tm|
145145
if tm.abstract_type == type
146146
implements_this_interface ||= true
147147
if warden.visible_type_membership?(tm, context)

lib/graphql/schema/member/has_interfaces.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,17 @@ def own_interface_type_memberships
5555
end
5656

5757
def interface_type_memberships
58-
own_interface_type_memberships + ((self.is_a?(Class) && superclass.respond_to?(:interface_type_memberships)) ? superclass.interface_type_memberships : [])
58+
own_tms = own_interface_type_memberships
59+
if (self.is_a?(Class) && superclass.respond_to?(:interface_type_memberships))
60+
inherited_tms = superclass.interface_type_memberships
61+
if inherited_tms.size > 0
62+
own_tms + inherited_tms
63+
else
64+
own_tms
65+
end
66+
else
67+
own_tms
68+
end
5969
end
6070

6171
# param context [Query::Context] If omitted, skip filtering.

lib/graphql/schema/warden.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def visible_argument?(arg, ctx); arg.visible?(ctx); end
8080
def visible_type?(type, ctx); type.visible?(ctx); end
8181
def visible_enum_value?(ev, ctx); ev.visible?(ctx); end
8282
def visible_type_membership?(tm, ctx); tm.visible?(ctx); end
83+
def interface_type_memberships(obj_t, ctx); obj_t.interface_type_memberships; end
8384
end
8485
end
8586

@@ -239,6 +240,13 @@ def visible_type_membership?(type_membership, _ctx = nil)
239240
visible?(type_membership)
240241
end
241242

243+
def interface_type_memberships(obj_type, _ctx = nil)
244+
@type_memberships ||= read_through do |obj_t|
245+
obj_t.interface_type_memberships
246+
end
247+
@type_memberships[obj_type]
248+
end
249+
242250
private
243251

244252
def visible_and_reachable_type?(type_defn)

0 commit comments

Comments
 (0)