11
11
using ArchUnitNET . Domain . Extensions ;
12
12
using ArchUnitNET . Fluent . Conditions ;
13
13
using ArchUnitNET . Fluent . Extensions ;
14
- using ArchUnitNET . Fluent . Freeze ;
15
14
using ArchUnitNET . Fluent . Predicates ;
16
15
using JetBrains . Annotations ;
17
16
@@ -98,17 +97,41 @@ public IEnumerable<EvaluationResult> EvaluateConditions(IEnumerable<T> filteredO
98
97
yield break ;
99
98
}
100
99
101
- var conditionResults = _conditionElements . Select ( conditionElement =>
102
- conditionElement . Check ( filteredObjectsList , architecture ) . ToList ( ) ) . ToList ( ) ;
100
+ //rough heuristic - if we have small number of comparisons, we are fine with sequential search
101
+ //but in large cases its quadratic behavior becomes too slow and building of a dictionary is justified
102
+ if ( filteredObjectsList . Count * _conditionElements . Count > 256 )
103
+ {
104
+ var conditionResults = _conditionElements . Select ( conditionElement =>
105
+ conditionElement . Check ( filteredObjectsList , architecture ) . ToDictionary ( x => x . ConditionResult . AnalyzedObject ) )
106
+ . ToList ( ) ;
103
107
104
- foreach ( var t in filteredObjectsList )
108
+ foreach ( var t in filteredObjectsList )
109
+ {
110
+ yield return CreateEvaluationResult ( FindResultsForObject ( conditionResults , t ) , architecture , archRuleCreator ) ;
111
+ }
112
+ }
113
+ else
105
114
{
106
- yield return CreateEvaluationResult (
107
- conditionResults . Select ( results => results . Find ( x => x . ConditionResult . AnalyzedObject . Equals ( t ) ) ) ,
108
- architecture , archRuleCreator ) ;
115
+ var conditionResults = _conditionElements . Select ( conditionElement =>
116
+ conditionElement . Check ( filteredObjectsList , architecture ) . ToList ( ) ) . ToList ( ) ;
117
+
118
+ foreach ( var t in filteredObjectsList )
119
+ {
120
+ yield return CreateEvaluationResult ( FindResultsForObject ( conditionResults , t ) , architecture , archRuleCreator ) ;
121
+ }
109
122
}
110
123
}
111
124
125
+ private IEnumerable < ConditionElementResult > FindResultsForObject ( List < Dictionary < ICanBeAnalyzed , ConditionElementResult > > conditionResults , T canBeAnalyzed )
126
+ {
127
+ return conditionResults . Select ( results => results [ canBeAnalyzed ] ) ;
128
+ }
129
+
130
+ private static IEnumerable < ConditionElementResult > FindResultsForObject ( List < List < ConditionElementResult > > conditionResults , T t )
131
+ {
132
+ return conditionResults . Select ( results => results . Find ( x => x . ConditionResult . AnalyzedObject . Equals ( t ) ) ) ;
133
+ }
134
+
112
135
private static EvaluationResult CreateEvaluationResult (
113
136
IEnumerable < ConditionElementResult > conditionElementResults ,
114
137
Architecture architecture , ICanBeEvaluated archRuleCreator )
@@ -298,7 +321,7 @@ public override int GetHashCode()
298
321
}
299
322
}
300
323
}
301
-
324
+
302
325
private class ConditionElementResult
303
326
{
304
327
public readonly ConditionResult ConditionResult ;
@@ -311,4 +334,6 @@ public ConditionElementResult(ConditionResult conditionResult, LogicalConjunctio
311
334
}
312
335
}
313
336
}
337
+
338
+
314
339
}
0 commit comments