@@ -137,36 +137,32 @@ where
137
137
} ,
138
138
)
139
139
} ;
140
- let by_block_constraint = query. block_constraint ( ) ?;
141
-
142
- // We want to optimize for the common case of a single block constraint,
143
- // where we can avoid cloning the result.
144
- match by_block_constraint. len ( ) {
145
- 0 => Ok ( Arc :: new ( QueryResult :: empty ( ) ) ) ,
146
- 1 => {
147
- let ( bc, selection_set) = by_block_constraint. into_iter ( ) . next ( ) . unwrap ( ) ;
140
+
141
+ // Unwrap: There is always at least one block constraint, even if it
142
+ // is an implicit 'BlockContraint::Latest'.
143
+ let mut by_block_constraint = query. block_constraint ( ) ?. into_iter ( ) ;
144
+ let ( bc, selection_set) = by_block_constraint. next ( ) . unwrap ( ) ;
145
+ let ( resolver, block_ptr) =
146
+ StoreResolver :: at_block ( & self . logger , self . store . clone ( ) , bc, & query. schema . id ) ?;
147
+ let mut result = execute ( selection_set, block_ptr, resolver) ;
148
+
149
+ // We want to optimize for the common case of a single block constraint, where we can avoid
150
+ // cloning the result. If there are multiple constraints we have to clone.
151
+ if by_block_constraint. len ( ) > 0 {
152
+ let mut partial_res = result. as_ref ( ) . clone ( ) ;
153
+ for ( bc, selection_set) in by_block_constraint {
148
154
let ( resolver, block_ptr) = StoreResolver :: at_block (
149
155
& self . logger ,
150
156
self . store . clone ( ) ,
151
157
bc,
152
158
& query. schema . id ,
153
159
) ?;
154
- Ok ( execute ( selection_set, block_ptr, resolver) )
155
- }
156
- _ => {
157
- let mut result = QueryResult :: empty ( ) ;
158
- for ( bc, selection_set) in query. block_constraint ( ) ? {
159
- let ( resolver, block_ptr) = StoreResolver :: at_block (
160
- & self . logger ,
161
- self . store . clone ( ) ,
162
- bc,
163
- & query. schema . id ,
164
- ) ?;
165
- result. append ( execute ( selection_set, block_ptr, resolver) . as_ref ( ) . clone ( ) ) ;
166
- }
167
- Ok ( Arc :: new ( result) )
160
+ partial_res. append ( execute ( selection_set, block_ptr, resolver) . as_ref ( ) . clone ( ) ) ;
168
161
}
162
+ result = Arc :: new ( partial_res) ;
169
163
}
164
+
165
+ Ok ( result)
170
166
}
171
167
}
172
168
0 commit comments