@@ -192,29 +192,45 @@ export class AllocationDecision {
192
192
}
193
193
}
194
194
195
+ export interface PreprocessedRules {
196
+ deploymentRulesMap : Map < string , IndexingRuleAttributes >
197
+ globalRule : IndexingRuleAttributes | undefined
198
+ }
199
+
200
+ export function preprocessRules ( rules : IndexingRuleAttributes [ ] ) : PreprocessedRules {
201
+ const globalRule = rules . find ( ( rule ) => rule . identifier === INDEXING_RULE_GLOBAL )
202
+ const deploymentRulesMap = new Map < string , IndexingRuleAttributes > ( )
203
+
204
+ rules . forEach ( rule => {
205
+ if ( rule . identifierType === SubgraphIdentifierType . DEPLOYMENT ) {
206
+ deploymentRulesMap . set ( rule . identifier , rule )
207
+ }
208
+ } )
209
+
210
+ return { deploymentRulesMap, globalRule }
211
+ }
212
+
195
213
export function evaluateDeployments (
196
214
logger : Logger ,
197
215
networkDeployments : SubgraphDeployment [ ] ,
198
216
rules : IndexingRuleAttributes [ ] ,
199
217
) : AllocationDecision [ ] {
218
+ const { deploymentRulesMap, globalRule } = preprocessRules ( rules )
219
+
200
220
return networkDeployments . map ( ( deployment ) =>
201
- isDeploymentWorthAllocatingTowards ( logger , deployment , rules ) ,
221
+ isDeploymentWorthAllocatingTowards ( logger , deployment , rules , deploymentRulesMap , globalRule ) ,
202
222
)
203
223
}
204
224
205
225
export function isDeploymentWorthAllocatingTowards (
206
226
logger : Logger ,
207
227
deployment : SubgraphDeployment ,
208
228
rules : IndexingRuleAttributes [ ] ,
229
+ deploymentRulesMap : Map < string , IndexingRuleAttributes > ,
230
+ globalRule : IndexingRuleAttributes | undefined ,
209
231
) : AllocationDecision {
210
- const globalRule = rules . find ( ( rule ) => rule . identifier === INDEXING_RULE_GLOBAL )
211
- const deploymentRule =
212
- rules
213
- . filter ( ( rule ) => rule . identifierType == SubgraphIdentifierType . DEPLOYMENT )
214
- . find (
215
- ( rule ) =>
216
- new SubgraphDeploymentID ( rule . identifier ) . bytes32 === deployment . id . bytes32 ,
217
- ) || globalRule
232
+ // Use the pre-processed map for O(1) lookup
233
+ const deploymentRule = deploymentRulesMap . get ( deployment . id . ipfsHash ) || globalRule
218
234
219
235
logger . trace ( 'Evaluating whether subgraphDeployment is worth allocating towards' , {
220
236
deployment,
0 commit comments