@@ -74,41 +74,36 @@ local patchOrExcludeRule(rule, ruleSet, operation) =
7474 else
7575 [] + patchOrExcludeRule(rule, ruleSet[1 :], operation);
7676
77+ local findRuleName(rule, ruleSet) =
78+ local _findSameRuleName(rule, ruleSet, index) =
79+ if std.length (ruleSet) == index then
80+ []
81+ else if (('alert' in rule && 'alert' in ruleSet[index] && rule.alert == ruleSet[index].alert) ||
82+ ('record' in rule && 'record' in ruleSet[index] && rule.record == ruleSet[index].record)) then
83+ [index] + _findSameRuleName(rule, ruleSet, index + 1 )
84+ else
85+ [] + _findSameRuleName(rule, ruleSet, index + 1 );
86+ _findSameRuleName(rule, ruleSet, 0 );
7787
78- local sameRuleName(rule1, rule2) =
79- if ('alert' in rule1 && 'alert' in rule2) then
80- rule1.alert == rule2.alert
81- else if ('record' in rule1 && 'record' in rule2) then
82- rule1.record == rule2.record
83- else
84- false ;
85-
86- local indexRules(lastRule, ruleSet) =
87- if std.length (ruleSet) == 0 then
88- []
89- else if (lastRule != null ) && sameRuleName(lastRule, ruleSet[0 ]) then
90- local updatedRule = std.mergePatch (ruleSet[0 ], { index: lastRule.index + 1 });
91- [updatedRule] + indexRules(updatedRule, ruleSet[1 :])
92- else
93- local updatedRule = std.mergePatch (ruleSet[0 ], { index: 0 });
94- [updatedRule] + indexRules(updatedRule, ruleSet[1 :]);
95-
96- local ruleName(rule) =
97- if ('alert' in rule) then
98- rule.alert
99- else if ('record' in rule) then
100- rule.record
101- else
102- assert false : 'rule should have either "alert" or "record" field' + std.toString (rule);
103- '' ;
88+ local indexRules(ruleSet) =
89+ local _indexRules(ruleSet, index) =
90+ if std.length (ruleSet) == index then
91+ []
92+ else
93+ // First we find the number of occurences of the rule in the ruleSet and
94+ // get an array containing the indexes of all the occurences.
95+ // Then, based on the current index of the rule in the ruleSet we are able
96+ // to deduce the index of the rule in the list of rules with the same name.
97+ local ruleIndex = std.find (index, findRuleName(ruleSet[index], ruleSet))[0 ];
98+ local updatedRule = std.mergePatch (ruleSet[index], { index: ruleIndex });
99+ [updatedRule] + _indexRules(ruleSet, index + 1 );
100+ _indexRules(ruleSet, 0 );
104101
105102local patchOrExcludeRuleGroup(group, groupSet, operation) =
106103 if std.length (groupSet) == 0 then
107104 [group.rules]
108105 else if (group.name == groupSet[0 ].name) then
109- local indexedRules = indexRules(null , std.sort (
110- group.rules, keyF=ruleName
111- ));
106+ local indexedRules = indexRules(group.rules);
112107 [patchOrExcludeRule(rule, groupSet[0 ].rules, operation) for rule in indexedRules]
113108 else
114109 [] + patchOrExcludeRuleGroup(group, groupSet[1 :], operation);
0 commit comments