in src/UXClient/Utils/Utils.ts [717:793]
static mergeSeriesForScatterPlot(chartData: any, scatterMeasures: any){
let xMeasure = chartData[scatterMeasures.X_MEASURE], yMeasure = chartData[scatterMeasures.Y_MEASURE], rMeasure = chartData[scatterMeasures.R_MEASURE];
let measureNames = Utils.getScatterPlotMeasureNames(chartData, scatterMeasures);
// Create data label
let xLabel = xMeasure.additionalFields.Variable.substring(0, 15) + (xMeasure.additionalFields.Variable.length > 15 ? "... vs" : " vs");
let yLabel = " " + yMeasure.additionalFields.Variable.substring(0, 15) + (yMeasure.additionalFields.Variable.length > 15 ? "... " : "");
let rLabel = (rMeasure != null ? " vs " + rMeasure.additionalFields.Variable.substring(0, 15) + (rMeasure.additionalFields.Variable.length > 15 ? "... " : "") : "");
let dataTitle = xLabel + yLabel + rLabel;
// Initialize scatter plot data object
let scatterData = {
[dataTitle] : {
"": {}
}
};
// Create measure types
let measureTypes = {
X_MEASURE_TYPE: 'avg' in xMeasure.measureTypes ? xMeasure.measureTypes['avg'] : xMeasure.measureTypes[0],
Y_MEASURE_TYPE: 'avg' in yMeasure.measureTypes ? yMeasure.measureTypes['avg'] : yMeasure.measureTypes[0],
R_MEASURE_TYPE: null
}
// Takes query and returns normalized time data
let normalizeTimestampKeys = (query) => {
let newTS = {}
Object.keys(query.data[query.alias][""]).forEach((key) => {
let oldTime = new Date(key).valueOf();
let timeShift = query.timeShift != "" ? this.parseShift(query.timeShift, query.startAt, query.searchSpan): 0;
// Calculate real timeshift based on bucket snapping
let bucketShiftInMillis = this.adjustStartMillisToAbsoluteZero(timeShift, this.parseShift(query.searchSpan.bucketSize));
let normalizedTime = oldTime - bucketShiftInMillis;
let timestamp = new Date(normalizedTime).toISOString();
newTS[timestamp] = query.data[query.alias][""][key];
})
return newTS;
}
// Normalize timestamp data
xMeasure.data[xMeasure.alias][""] = normalizeTimestampKeys(xMeasure);
yMeasure.data[yMeasure.alias][""] = normalizeTimestampKeys(yMeasure);
if(rMeasure){
rMeasure.data[rMeasure.alias][""] = normalizeTimestampKeys(rMeasure);
measureTypes.R_MEASURE_TYPE = 'avg' in rMeasure.measureTypes ? rMeasure.measureTypes['avg'] : rMeasure.measureTypes[0]
}
// For each timestamp in X data mix measures of other series
Object.keys(xMeasure.data[xMeasure.alias][""]).forEach((key) => {
if(key in yMeasure.data[yMeasure.alias][""]){
let measures = {}
measures[measureNames.X_MEASURE] = xMeasure.data[xMeasure.alias][""][key][measureTypes.X_MEASURE_TYPE];
measures[measureNames.Y_MEASURE] = yMeasure.data[yMeasure.alias][""][key][measureTypes.Y_MEASURE_TYPE];
// Add optional R measure
if(rMeasure != null && key in rMeasure.data[rMeasure.alias][""]){
measures[measureNames.R_MEASURE] = rMeasure.data[rMeasure.alias][""][key][measureTypes.R_MEASURE_TYPE];
}
// Discard timestamps with null valued measures
if(xMeasure.data[xMeasure.alias][""][key][measureTypes.X_MEASURE_TYPE] && yMeasure.data[yMeasure.alias][""][key][measureTypes.Y_MEASURE_TYPE])
{
if(rMeasure != null){
if(key in rMeasure.data[rMeasure.alias][""] && rMeasure.data[rMeasure.alias][""][key][measureTypes.R_MEASURE_TYPE])
scatterData[dataTitle][""][key] = measures;
}
else{
scatterData[dataTitle][""][key] = measures;
}
}
}
});
return scatterData;
}