static mergeSeriesForScatterPlot()

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;
    }