From e3c77f475da718929a030f2c63adda5cb5d231f8 Mon Sep 17 00:00:00 2001 From: Darshan Parmar Date: Mon, 30 Sep 2024 12:04:58 +0530 Subject: [PATCH] [MOB-9652] support for nested JSON array --- .../criteriaCompletionChecker.ts | 45 +++++++++++++---- src/anonymousUserTracking/tests/constants.ts | 43 ++++++++++++++++ .../tests/nestedTesting.test.ts | 49 ++++++++++++++++++- 3 files changed, 126 insertions(+), 11 deletions(-) diff --git a/src/anonymousUserTracking/criteriaCompletionChecker.ts b/src/anonymousUserTracking/criteriaCompletionChecker.ts index 2ec9958b..81582d77 100644 --- a/src/anonymousUserTracking/criteriaCompletionChecker.ts +++ b/src/anonymousUserTracking/criteriaCompletionChecker.ts @@ -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); diff --git a/src/anonymousUserTracking/tests/constants.ts b/src/anonymousUserTracking/tests/constants.ts index c49530f2..016a8bbd 100644 --- a/src/anonymousUserTracking/tests/constants.ts +++ b/src/anonymousUserTracking/tests/constants.ts @@ -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: [ diff --git a/src/anonymousUserTracking/tests/nestedTesting.test.ts b/src/anonymousUserTracking/tests/nestedTesting.test.ts index 68cffb8d..dad707ce 100644 --- a/src/anonymousUserTracking/tests/nestedTesting.test.ts +++ b/src/anonymousUserTracking/tests/nestedTesting.test.ts @@ -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(), @@ -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'); + }); });