Skip to content

Commit 9cd5f3c

Browse files
committed
Fix empty or multiple date values in csv
Signed-off-by: Zhongnan Su <szhongna@amazon.com>
1 parent f581454 commit 9cd5f3c

2 files changed

Lines changed: 73 additions & 7 deletions

File tree

dashboards-reports/server/routes/utils/__tests__/savedSearchReportHelper.test.ts

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,59 @@ test('create report for data set with metadata fields', async () => {
466466
);
467467
}, 20000);
468468

469+
test('create report with empty/one/multiple(list) date values', async () => {
470+
const hits = [
471+
hit(
472+
{ category: 'c1', customer_gender: 'Ma', order_date: [] },
473+
{ order_date: [] }
474+
),
475+
hit(
476+
{
477+
category: 'c2',
478+
customer_gender: 'le',
479+
order_date: ['2021-12-16T14:04:55'],
480+
},
481+
{ order_date: ['2021-12-16T14:04:55'] }
482+
),
483+
hit(
484+
{
485+
category: 'c3',
486+
customer_gender: 'he',
487+
order_date: ['2021-12-17T14:04:55', '2021-12-18T14:04:55'],
488+
},
489+
{ order_date: ['2021-12-17T14:04:55', '2021-12-18T14:04:55'] }
490+
),
491+
hit(
492+
{
493+
category: 'c4',
494+
customer_gender: 'te',
495+
order_date: '2021-12-19T14:04:55',
496+
},
497+
{ order_date: ['2021-12-19T14:04:55'] }
498+
),
499+
];
500+
const client = mockOpenSearchClient(
501+
hits,
502+
'"category", "customer_gender", "order_date"'
503+
);
504+
const { dataUrl } = await createSavedSearchReport(
505+
input,
506+
client,
507+
mockDateFormat,
508+
',',
509+
undefined,
510+
mockLogger
511+
);
512+
513+
expect(dataUrl).toEqual(
514+
'category,customer_gender,order_date\n' +
515+
'c1,Ma,[]\n' +
516+
'c2,le,"[""12/16/2021 2:04:55.000 pm""]"\n' +
517+
'c3,he,"[""12/17/2021 2:04:55.000 pm"",""12/18/2021 2:04:55.000 pm""]"\n' +
518+
'c4,te,12/19/2021 2:04:55.000 pm'
519+
);
520+
}, 20000);
521+
469522
/**
470523
* Mock Elasticsearch client and return different mock objects based on endpoint and parameters.
471524
*/
@@ -588,8 +641,9 @@ function mockIndexSettings() {
588641
`);
589642
}
590643

591-
function hit(kv: any) {
644+
function hit(source_kv: any, fields_kv = {}) {
592645
return {
593-
_source: kv,
646+
_source: source_kv,
647+
fields: fields_kv,
594648
};
595649
}

dashboards-reports/server/routes/utils/dataReportHelpers.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,23 @@ export const getOpenSearchData = (
118118
for (let data of valueRes.hits) {
119119
const fields = data.fields;
120120
// get all the fields of type date and format them to excel format
121-
for (let dateType of report._source.dateFields) {
122-
if (data._source[dateType]) {
123-
data._source[dateType] = moment(fields[dateType][0]).format(
124-
dateFormat
125-
);
121+
for (let dateField of report._source.dateFields) {
122+
const dateValue = data._source[dateField];
123+
if (dateValue && dateValue.length !== 0) {
124+
if (dateValue instanceof Array) {
125+
// loop through array
126+
dateValue.forEach((element, index) => {
127+
data._source[dateField][index] = moment(
128+
fields[dateField][index]
129+
).format(dateFormat);
130+
});
131+
} else {
132+
// The fields response always returns an array of values for each field
133+
// https://www.elastic.co/guide/en/elasticsearch/reference/master/search-fields.html#search-fields-response
134+
data._source[dateField] = moment(fields[dateField][0]).format(
135+
dateFormat
136+
);
137+
}
126138
}
127139
}
128140
delete data['fields'];

0 commit comments

Comments
 (0)