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