@@ -7,7 +7,7 @@ use std::time::{Duration, Instant};
7
7
use crate :: prelude:: { QueryExecutionOptions , StoreResolver , SubscriptionExecutionOptions } ;
8
8
use crate :: query:: execute_query;
9
9
use crate :: subscription:: execute_prepared_subscription;
10
- use graph:: prelude:: MetricsRegistry ;
10
+ use graph:: prelude:: { MetricsRegistry , QueryResult } ;
11
11
use graph:: prometheus:: { Gauge , Histogram } ;
12
12
use graph:: {
13
13
components:: store:: SubscriptionManager ,
@@ -21,6 +21,8 @@ use graph::{
21
21
data:: query:: { QueryResults , QueryTarget } ,
22
22
prelude:: QueryStore ,
23
23
} ;
24
+ use graphql_tools:: validation:: validate:: { validate, ValidationPlan } ;
25
+ use graphql_tools:: validation:: rules:: { OverlappingFieldsCanBeMerged } ;
24
26
25
27
use lazy_static:: lazy_static;
26
28
@@ -77,6 +79,7 @@ pub struct GraphQlRunner<S, SM> {
77
79
subscription_manager : Arc < SM > ,
78
80
load_manager : Arc < LoadManager > ,
79
81
result_size : Arc < ResultSizeMetrics > ,
82
+ graphql_validation_plan : ValidationPlan ,
80
83
}
81
84
82
85
lazy_static ! {
@@ -135,12 +138,16 @@ where
135
138
) -> Self {
136
139
let logger = logger. new ( o ! ( "component" => "GraphQlRunner" ) ) ;
137
140
let result_size = Arc :: new ( ResultSizeMetrics :: new ( registry) ) ;
141
+ let mut graphql_validation_plan = ValidationPlan { rules : Vec :: new ( ) } ;
142
+ graphql_validation_plan. add_rule ( Box :: new ( OverlappingFieldsCanBeMerged { } ) ) ;
143
+
138
144
GraphQlRunner {
139
145
logger,
140
146
store,
141
147
subscription_manager,
142
148
load_manager,
143
149
result_size,
150
+ graphql_validation_plan
144
151
}
145
152
}
146
153
@@ -197,6 +204,11 @@ where
197
204
let state = store. deployment_state ( ) . await ?;
198
205
let network = Some ( store. network_name ( ) . to_string ( ) ) ;
199
206
let schema = store. api_schema ( ) ?;
207
+ let validation_errors = validate ( & schema. document ( ) , & query. document , & self . graphql_validation_plan ) ;
208
+
209
+ if validation_errors. len ( ) > 0 {
210
+ return Ok ( QueryResults :: from ( QueryResult :: from ( validation_errors) ) ) ;
211
+ }
200
212
201
213
// Test only, see c435c25decbc4ad7bbbadf8e0ced0ff2
202
214
#[ cfg( debug_assertions) ]
0 commit comments