Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/dtos/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ interface IInSegmentMatcher extends ISplitMatcherBase {
userDefinedSegmentMatcherData: IInSegmentMatcherData
}

interface IInLargeSegmentMatcher extends ISplitMatcherBase {
matcherType: 'IN_LARGE_SEGMENT',
userDefinedSegmentMatcherData: IInSegmentMatcherData
}

interface IWhitelistMatcher extends ISplitMatcherBase {
matcherType: 'WHITELIST',
whitelistMatcherData: IWhitelistMatcherData
Expand Down Expand Up @@ -165,7 +170,8 @@ interface IInListSemverMatcher extends ISplitMatcherBase {
export type ISplitMatcher = IAllKeysMatcher | IInSegmentMatcher | IWhitelistMatcher | IEqualToMatcher | IGreaterThanOrEqualToMatcher |
ILessThanOrEqualToMatcher | IBetweenMatcher | IEqualToSetMatcher | IContainsAnyOfSetMatcher | IContainsAllOfSetMatcher | IPartOfSetMatcher |
IStartsWithMatcher | IEndsWithMatcher | IContainsStringMatcher | IInSplitTreatmentMatcher | IEqualToBooleanMatcher | IMatchesStringMatcher |
IEqualToSemverMatcher | IGreaterThanOrEqualToSemverMatcher | ILessThanOrEqualToSemverMatcher | IBetweenSemverMatcher | IInListSemverMatcher
IEqualToSemverMatcher | IGreaterThanOrEqualToSemverMatcher | ILessThanOrEqualToSemverMatcher | IBetweenSemverMatcher | IInListSemverMatcher |
IInLargeSegmentMatcher

/** Split object */
export interface ISplitPartition {
Expand Down
25 changes: 25 additions & 0 deletions src/evaluator/matchers/__tests__/segment/client_side.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,28 @@ test('MATCHER IN_SEGMENT / should return true ONLY when the segment is defined i
expect(await matcherTrue()).toBe(true); // segment found in mySegments list
expect(await matcherFalse()).toBe(false); // segment not found in mySegments list
});

test('MATCHER IN_LARGE_SEGMENT / should return true ONLY when the segment is defined inside the segment storage', async function () {
const segment = 'employees';

const matcherTrue = matcherFactory(loggerMock, {
type: matcherTypes.IN_LARGE_SEGMENT,
value: segment
} as IMatcherDto, {
largeSegments: {
isInSegment(segmentName) {
return segment === segmentName;
}
}
} as IStorageSync) as IMatcher;

const matcherFalse = matcherFactory(loggerMock, {
type: matcherTypes.IN_LARGE_SEGMENT,
value: segment
} as IMatcherDto, {
largeSegments: undefined
} as IStorageSync) as IMatcher;

expect(await matcherTrue()).toBe(true); // large segment found in mySegments list
expect(await matcherFalse()).toBe(false); // large segment storage is not defined
});
2 changes: 2 additions & 0 deletions src/evaluator/matchers/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { allMatcherContext } from './all';
import { segmentMatcherContext } from './segment';
import { largeSegmentMatcherContext } from './large_segment';
import { whitelistMatcherContext } from './whitelist';
import { equalToMatcherContext } from './eq';
import { greaterThanEqualMatcherContext } from './gte';
Expand Down Expand Up @@ -48,6 +49,7 @@ const matchers = [
lessThanEqualToSemverMatcherContext, // LESS_THAN_OR_EQUAL_TO_SEMVER: 20
betweenSemverMatcherContext, // BETWEEN_SEMVER: 21
inListSemverMatcherContext, // IN_LIST_SEMVER: 22
largeSegmentMatcherContext, // IN_LARGE_SEGMENT: 23
];

/**
Expand Down
18 changes: 18 additions & 0 deletions src/evaluator/matchers/large_segment.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { MaybeThenable } from '../../dtos/types';
import { ISegmentsCacheBase } from '../../storages/types';
import { thenable } from '../../utils/promise/thenable';

export function largeSegmentMatcherContext(largeSegmentName: string, storage: { largeSegments?: ISegmentsCacheBase }) {

return function largeSegmentMatcher(key: string): MaybeThenable<boolean> {
const isInLargeSegment = storage.largeSegments ? storage.largeSegments.isInSegment(largeSegmentName, key) : false;

if (thenable(isInLargeSegment)) {
isInLargeSegment.then(result => {
return result;
});
}

return isInLargeSegment;
};
}
1 change: 1 addition & 0 deletions src/evaluator/matchers/matcherTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export const matcherTypes: Record<string, number> = {
LESS_THAN_OR_EQUAL_TO_SEMVER: 20,
BETWEEN_SEMVER: 21,
IN_LIST_SEMVER: 22,
IN_LARGE_SEGMENT: 23,
};

export const matcherDataTypes = {
Expand Down
2 changes: 1 addition & 1 deletion src/evaluator/matchersTransform/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export function matchersTransform(matchers: ISplitMatcher[]): IMatcherDto[] {
let dataType = matcherDataTypes.STRING;
let value = undefined;

if (type === matcherTypes.IN_SEGMENT) {
if (type === matcherTypes.IN_SEGMENT || type === matcherTypes.IN_LARGE_SEGMENT) {
value = segmentTransform(userDefinedSegmentMatcherData as IInSegmentMatcherData);
} else if (type === matcherTypes.EQUAL_TO) {
value = numericTransform(unaryNumericMatcherData as IUnaryNumericMatcherData);
Expand Down