From bd6fff7d34befb5a1509039c090dd55bfa270895 Mon Sep 17 00:00:00 2001 From: Kavitha Conjeevaram Mohan Date: Tue, 10 Oct 2023 16:48:38 -0700 Subject: [PATCH] 2.11 Bug fix for checking Date Field presence Signed-off-by: Kavitha Conjeevaram Mohan --- server/routes/utils/dataReportHelpers.ts | 104 +++++++++++++---------- 1 file changed, 61 insertions(+), 43 deletions(-) diff --git a/server/routes/utils/dataReportHelpers.ts b/server/routes/utils/dataReportHelpers.ts index 718af5f3..1be1c504 100644 --- a/server/routes/utils/dataReportHelpers.ts +++ b/server/routes/utils/dataReportHelpers.ts @@ -135,50 +135,54 @@ export const getOpenSearchData = ( keys = dateField.split('.'); const dateValue = data._source[dateField]; const fieldDateValue = fields[dateField]; - // if its not a nested date field - if (keys.length === 1) { - // if conditions to determine if the date field's value is an array or a string - if (typeof dateValue === 'string') { - data._source[keys] = moment(dateValue).format(dateFormat); - } else if ( - fieldDateValue.length !== 0 && - fieldDateValue instanceof Array - ) { - fieldDateValue.forEach((element, index) => { - data._source[keys][index] = moment(element).format(dateFormat); - }); - } else { - data._source[keys] = []; - } - // else to cover cases with nested date fields - } else { - let keyElement = keys.shift(); - // if conditions to determine if the date field's value is an array or a string - if (typeof fieldDateValue === 'string') { - keys.push(moment(fieldDateValue).format(dateFormat)); - } else if ( - fieldDateValue.length !== 0 && - fieldDateValue instanceof Array - ) { - let tempArray: string[] = []; - fieldDateValue.forEach((index) => { - tempArray.push(moment(index).format(dateFormat)); - }); - keys.push(tempArray); - } else { - keys.push([]); - } - const nestedJSON = arrayToNestedJSON(keys); - let keyLength = Object.keys(data._source); - // to check if the nested field have anyother keys apart from date field - if (tempKeyElement.includes(keyElement) || keyLength.length > 1) { - data._source[keyElement] = { - ...data._source[keyElement], - ...nestedJSON, - }; + const isDateFieldPresent = isKeyPresent(data._source, dateField); + + if (isDateFieldPresent) { + // if its not a nested date field + if (keys.length === 1) { + // if conditions to determine if the date field's value is an array or a string + if (typeof dateValue === 'string') { + data._source[keys] = moment(dateValue).format(dateFormat); + } else if ( + fieldDateValue.length !== 0 && + fieldDateValue instanceof Array + ) { + fieldDateValue.forEach((element, index) => { + data._source[keys][index] = moment(element).format(dateFormat); + }); + } else { + data._source[keys] = []; + } + // else to cover cases with nested date fields } else { - data._source[keyElement] = nestedJSON; - tempKeyElement.push(keyElement); + let keyElement = keys.shift(); + // if conditions to determine if the date field's value is an array or a string + if (typeof fieldDateValue === 'string') { + keys.push(moment(fieldDateValue).format(dateFormat)); + } else if ( + fieldDateValue.length !== 0 && + fieldDateValue instanceof Array + ) { + let tempArray: string[] = []; + fieldDateValue.forEach((index) => { + tempArray.push(moment(index).format(dateFormat)); + }); + keys.push(tempArray); + } else { + keys.push([]); + } + const nestedJSON = arrayToNestedJSON(keys); + let keyLength = Object.keys(data._source); + // to check if the nested field have anyother keys apart from date field + if (tempKeyElement.includes(keyElement) || keyLength.length > 1) { + data._source[keyElement] = { + ...data._source[keyElement], + ...nestedJSON, + }; + } else { + data._source[keyElement] = nestedJSON; + tempKeyElement.push(keyElement); + } } } } @@ -277,6 +281,20 @@ function arrayToNestedJSON(arr: string[]) { } } +function isKeyPresent(data: any, key: string): boolean { + if (typeof data === 'object' && data !== null) { + if (key in data) { + return true; + } + for (const value of Object.values(data)) { + if (isKeyPresent(value, key)) { + return true; + } + } + } + return false; +} + const addDocValueFields = (report: any, requestBody: any) => { const docValues = []; for (const dateType of report._source.dateFields) {