public build()

in src/dataViewBuilder/dataViewBuilder.ts [262:348]


    public build(): DataView {
        let metadataColumns: DataViewMetadataColumn[] = [];
        let categorical: DataViewCategorical = {};

        let categoryMetadata = this.categories;
        let dynamicSeriesMetadata = this.dynamicSeriesMetadata;

        // --- Build metadata columns and value groups ---
        for (let columnMetadata of categoryMetadata) {
            pushIfNotExists(metadataColumns, columnMetadata.source);
        }

        if (this.hasDynamicSeries()) {
            // Dynamic series, or Dynamic & Static series.
            pushIfNotExists(metadataColumns, dynamicSeriesMetadata.column);

            // categorical.values = DataViewTransform.createValueColumns([], dynamicSeriesMetadata.identityFrom.fields, dynamicSeriesMetadata.column);
            categorical.values = createValueColumns([], dynamicSeriesMetadata.identityFrom.fields, dynamicSeriesMetadata.column);

            // For each series value we will make one column per measure
            let seriesValues = dynamicSeriesMetadata.values;
            for (let seriesIndex = 0; seriesIndex < seriesValues.length; seriesIndex++) {
                let seriesValue = seriesValues[seriesIndex];
                let seriesIdentity = getScopeIdentity(dynamicSeriesMetadata.identityFrom, seriesIndex, seriesValue, dynamicSeriesMetadata.column.type);

                for (let measure of this.dynamicMeasureColumns) {
                    let column = toPlainObject(measure);

                    column.groupName = <string>seriesValue;

                    pushIfNotExists(metadataColumns, column);
                    categorical.values.push({
                        source: column,
                        values: [],
                        identity: seriesIdentity,
                    });
                }
            }

            // If there is no data we should add a column that contains a pointer to the dynamic measure columns, for consistency with the dsrReader
            if (seriesValues.length === 0) {
                for (let measure of this.dynamicMeasureColumns) {
                    let column: DataViewMetadataColumn = toPlainObject(measure);

                    pushIfNotExists(metadataColumns, column);

                    categorical.values.push({ source: column, values: [] });
                }
            }

            if (this.hasStaticSeries()) {
                // IMPORTANT: In the Dynamic & Static series case, the groups array shall not include any static group. This is to match the behavior of production code that creates query DataView objects.
                // Get the current return value of grouped() before adding static measure columns, an use that as the return value of this categorical.
                // Otherwise, the default behavior of DataViewValueColumns.grouped() from DataViewTransform.createValueColumns() is to create series groups from all measure columns.
                let dynamicSeriesGroups: DataViewValueColumnGroup[] = categorical.values.grouped();

                categorical.values.grouped = () => dynamicSeriesGroups;

                this.appendStaticMeasureColumns(metadataColumns, categorical.values);
            }
        }
        else {
            // Static series only / no series
            categorical.values = createValueColumns();

            this.appendStaticMeasureColumns(metadataColumns, categorical.values);
        }

        let categories = this.categories;
        if (!isEmpty(categories)) {
            categorical.categories = categories;
        }

        // --- Fill in data point values ---
        this.fillData(categorical.values);

        let dataView: DataView = {
            metadata: {
                columns: metadataColumns,
            },
            categorical: categorical,
        };

        if (this.isLegalDataView(dataView)) {
            return dataView;
        }
    }