Skip to content

Commit fe893b0

Browse files
Implement prerequisites matcher and refactor engineParser for prerequisite evaluation
1 parent 77d44b6 commit fe893b0

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

src/evaluator/Engine.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { IStorageAsync, IStorageSync } from '../storages/types';
1010
import { IEvaluation, IEvaluationResult, ISplitEvaluator } from './types';
1111
import { ILogger } from '../logger/types';
1212
import { ENGINE_DEFAULT } from '../logger/constants';
13+
import { prerequisitesMatcherContext } from './matchers/prerequisites';
1314

1415
function evaluationResult(result: IEvaluation | undefined, defaultTreatment: string): IEvaluationResult {
1516
return {
@@ -24,15 +25,16 @@ export function engineParser(log: ILogger, split: ISplit, storage: IStorageSync
2425
const defaultTreatment = isString(split.defaultTreatment) ? split.defaultTreatment : CONTROL;
2526

2627
const evaluator = parser(log, conditions, storage);
28+
const prerequisiteMatcher = prerequisitesMatcherContext(prerequisites, storage, log);
2729

2830
return {
2931

3032
getTreatment(key: SplitIO.SplitKey, attributes: SplitIO.Attributes | undefined, splitEvaluator: ISplitEvaluator): MaybeThenable<IEvaluationResult> {
3133

3234
const parsedKey = keyParser(key);
3335

34-
function evaluate(matchPrerequisites: boolean) {
35-
if (!matchPrerequisites) {
36+
function evaluate(prerequisitesMet: boolean) {
37+
if (!prerequisitesMet) {
3638
log.debug(ENGINE_DEFAULT, ['Prerequisite not met']);
3739
return {
3840
treatment: defaultTreatment,
@@ -60,18 +62,11 @@ export function engineParser(log: ILogger, split: ISplit, storage: IStorageSync
6062
};
6163
}
6264

63-
const matchPrerequisites = prerequisites && prerequisites.length ?
64-
prerequisites.map(prerequisite => {
65-
const evaluation = splitEvaluator(log, key, prerequisite.n, attributes, storage);
66-
return thenable(evaluation) ?
67-
evaluation.then(evaluation => prerequisite.ts.indexOf(evaluation.treatment!) === -1) :
68-
prerequisite.ts.indexOf(evaluation.treatment!) === -1;
69-
}) :
70-
true;
65+
const prerequisitesMet = prerequisiteMatcher(key, attributes, splitEvaluator);
7166

72-
return thenable(matchPrerequisites) ?
73-
matchPrerequisites.then(evaluate) :
74-
evaluate(matchPrerequisites as boolean);
67+
return thenable(prerequisitesMet) ?
68+
prerequisitesMet.then(evaluate) :
69+
evaluate(prerequisitesMet);
7570
}
7671
};
7772

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { ISplit, MaybeThenable } from '../../dtos/types';
2+
import { IStorageAsync, IStorageSync } from '../../storages/types';
3+
import { ILogger } from '../../logger/types';
4+
import { thenable } from '../../utils/promise/thenable';
5+
import { ISplitEvaluator } from '../types';
6+
import SplitIO from '../../../types/splitio';
7+
8+
export function prerequisitesMatcherContext(prerequisites: ISplit['prerequisites'] = [], storage: IStorageSync | IStorageAsync, log: ILogger) {
9+
10+
return function prerequisitesMatcher(key: SplitIO.SplitKey, attributes: SplitIO.Attributes | undefined, splitEvaluator: ISplitEvaluator): MaybeThenable<boolean> {
11+
12+
function evaluatePrerequisite(prerequisite: { n: string; ts: string[] }): MaybeThenable<boolean> {
13+
const evaluation = splitEvaluator(log, key, prerequisite.n, attributes, storage);
14+
return thenable(evaluation)
15+
? evaluation.then(evaluation => prerequisite.ts.indexOf(evaluation.treatment!) === -1)
16+
: prerequisite.ts.indexOf(evaluation.treatment!) === -1;
17+
}
18+
19+
return prerequisites.reduce<MaybeThenable<boolean>>((prerequisitesMet, prerequisite) => {
20+
return thenable(prerequisitesMet) ?
21+
prerequisitesMet.then(prerequisitesMet => !prerequisitesMet ? false : evaluatePrerequisite(prerequisite)) :
22+
!prerequisitesMet ? false : evaluatePrerequisite(prerequisite);
23+
}, true);
24+
};
25+
}

0 commit comments

Comments
 (0)