Skip to content

Commit

Permalink
[MOB-9652] support for nested JSON array
Browse files Browse the repository at this point in the history
  • Loading branch information
darshan-iterable committed Sep 30, 2024
1 parent 6ad85a2 commit e3c77f4
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 11 deletions.
45 changes: 35 additions & 10 deletions src/anonymousUserTracking/criteriaCompletionChecker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -350,16 +350,41 @@ class CriteriaCompletionChecker {
);

if (field.includes('.')) {
const fields = field.split('.');
const firstElement = eventData?.[fields[0]];
if (Array.isArray(firstElement)) {
return firstElement?.some((item: any) => {
const data = {
...eventData,
[fields[0]]: item
};
return this.evaluateFieldLogic(searchQueries, data);
});
const splitedField = field.split('.') as string[];
const fields =
eventData?.eventType === TRACK_EVENT &&
eventData?.eventName === splitedField[0]
? splitedField.slice(1)
: splitedField;

let fieldValue = eventData;
let isSubFieldArray = false;
let isSubMatch = false;

fields.forEach((subField) => {
const subFieldValue = fieldValue[subField];
if (Array.isArray(subFieldValue)) {
isSubFieldArray = true;
isSubMatch = subFieldValue.some((item: any) => {
const data = fields.reduceRight((acc: any, key) => {
if (key === subField) {
return { [key]: item };
}
return { [key]: acc };
}, {});

return this.evaluateFieldLogic(searchQueries, {
...eventData,
...data
});
});
} else {
fieldValue = subFieldValue;
}
});

if (isSubFieldArray) {
return isSubMatch;
}

const valueFromObj = this.getFieldValue(eventData, field);
Expand Down
43 changes: 43 additions & 0 deletions src/anonymousUserTracking/tests/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -871,6 +871,49 @@ export const NESTED_CRITERIA_MULTI_LEVEL = {
]
};

export const NESTED_CRITERIA_MULTI_LEVEL_ARRAY = {
count: 1,
criteriaSets: [
{
criteriaId: '436',
name: 'Criteria 2.1 - 09252024 Bug Bash',
createdAt: 1727286807360,
updatedAt: 1727445082036,
searchQuery: {
combinator: 'And',
searchQueries: [
{
combinator: 'And',
searchQueries: [
{
dataType: 'user',
searchCombo: {
combinator: 'And',
searchQueries: [
{
dataType: 'user',
field: 'furniture.material.type',
comparatorType: 'Contains',
value: 'table',
fieldType: 'string'
},
{
dataType: 'user',
field: 'furniture.material.color',
comparatorType: 'Equals',
values: ['black']
}
]
}
}
]
}
]
}
}
]
};

export const IS_ONE_OF_CRITERIA = {
count: 1,
criteriaSets: [
Expand Down
49 changes: 48 additions & 1 deletion src/anonymousUserTracking/tests/nestedTesting.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { SHARED_PREFS_EVENT_LIST_KEY } from '../../constants';
import CriteriaCompletionChecker from '../criteriaCompletionChecker';
import { NESTED_CRITERIA, NESTED_CRITERIA_MULTI_LEVEL } from './constants';
import {
NESTED_CRITERIA,
NESTED_CRITERIA_MULTI_LEVEL,
NESTED_CRITERIA_MULTI_LEVEL_ARRAY
} from './constants';

const localStorageMock = {
getItem: jest.fn(),
Expand Down Expand Up @@ -242,4 +246,47 @@ describe('nestedTesting', () => {
);
expect(result).toEqual(null);
});

it('should return criteriaId 436 (Multi level Nested field criteria)', () => {
(localStorage.getItem as jest.Mock).mockImplementation((key) => {
if (key === SHARED_PREFS_EVENT_LIST_KEY) {
return JSON.stringify([
{
dataFields: {
furniture: {
material: [
{
type: 'table',
color: 'black',
lengthInches: 40,
widthInches: 60
},
{
type: 'Sofa',
color: 'Gray',
lengthInches: 20,
widthInches: 30
}
]
}
},
eventType: 'user'
}
]);
}
return null;
});

const localStoredEventList = localStorage.getItem(
SHARED_PREFS_EVENT_LIST_KEY
);

const checker = new CriteriaCompletionChecker(
localStoredEventList === null ? '' : localStoredEventList
);
const result = checker.getMatchedCriteria(
JSON.stringify(NESTED_CRITERIA_MULTI_LEVEL_ARRAY)
);
expect(result).toEqual('436');
});
});

0 comments on commit e3c77f4

Please sign in to comment.