/** * Copy provided payload with new rows and now updatedAt * @param payload * @param newRows */ export function copyPayloadNewRows(payload, newRows, dataPipeline?) { const dataModelCopy: any = { data: undefined, hasError: payload.hasError, isInvalidated: payload.isInvalidated, updatedAt: new Date(), }; if (payload.data) { dataModelCopy.data = { columns: JSON.parse(JSON.stringify(payload.data.columns)), rows: newRows, query: payload.data.query, order_by_column: payload.data.order_by_column, order_by_method: payload.data.order_by_method, }; if (dataPipeline) { for (const col in payload.data.columns) { const dataType = payload.data.columns[col].dataType; if (dataType == 'numerical') { let tmp, min = Infinity, max = -Infinity; for (const row of payload.data.rows) { let testFunc, isValidRow = true; for (const transform of dataPipeline.transformArray) { testFunc = transform.operation?.test; if (testFunc && !transform.key.startsWith(col)) { isValidRow = testFunc(row) && isValidRow; } } if (isValidRow) { tmp = Number(row[col]); if (!isNaN(tmp)) { if (tmp < min) { min = tmp; } if (tmp > max) { max = tmp; } } } } dataModelCopy.data.columns[col].extent.min = min; dataModelCopy.data.columns[col].extent.max = max; } else if (dataType == 'categorical' || dataType == 'choice') { let valueSet = new Set(), v; for (const row of payload.data.rows) { v = row[col]; if (v !== undefined && v !== null) { valueSet.add(v); } } dataModelCopy.data.columns[col].extent = Array.from(valueSet).sort(); } } } } return dataModelCopy; }