in src/dataViewBuilder/testDataViewBuilder.ts [239:309]
protected createCategoricalDataViewBuilder(
categoriesColumns: (TestDataViewBuilderCategoryColumnOptions | TestDataViewBuilderCategoryColumnOptions[])[],
valuesColumns: (DataViewBuilderValuesColumnOptions | DataViewBuilderValuesColumnOptions[])[],
columnNames: string[],
customizeColumns?: CustomizeColumnFn): IDataViewBuilderCategorical {
let builder = createCategoricalDataViewBuilder();
let originalOptions = TestDataViewBuilder.createDataViewBuilderColumnOptions(
categoriesColumns,
valuesColumns,
columnNames && (options => includes(columnNames, options.source.displayName)),
customizeColumns);
let options = TestDataViewBuilder.setUpDataViewBuilderColumnOptions(originalOptions, this.aggregateFunction);
if (!isEmpty(options.categories)) {
let identityFrom = TestDataViewBuilder.getDataViewBuilderColumnIdentitySources(options.categories);
builder.withCategories(options.categories.map((category, i) => <DataViewCategoryColumn>{
source: category.source,
values: category.values,
objects: category.objects,
identity: identityFrom[i].identities,
identityFields: identityFrom[i].fields
}));
}
if (!isEmpty(options.grouped)) {
let groupedCategory = options.grouped[0]; // Finished only for one category.
let categoryValues = originalOptions.categories
&& originalOptions.categories[0]
&& originalOptions.categories[0].values
|| [];
let uniqueCategoryValues = uniq(categoryValues) || [undefined],
uniqueGroupedValues = uniq(groupedCategory.values);
builder.withGroupedValues({
groupColumn: {
source: groupedCategory.source,
values: uniqueGroupedValues,
identityFrom: TestDataViewBuilder.getDataViewBuilderColumnIdentitySources(groupedCategory)[0]
} as DataViewBuilderCategoryColumnOptions,
valueColumns: options.values.map(x => <TestDataViewBuilderColumnOptions>{ source: x.source }),
data: uniqueGroupedValues.map(groupedValue => options.values.map((column, columnIndex) =>
<DataViewBuilderSeriesData>{
values: column.values && uniqueCategoryValues
.map(categoryValue => {
let index = findIndex(range(categoryValues.length),
i => categoryValues[i] === categoryValue && groupedCategory.values[i] === groupedValue);
return column.values[index] === undefined ? null : column.values[index];
}),
highlights: column.highlights,
minLocal: column.minLocal,
maxLocal: column.maxLocal
}))
});
} else if (!isEmpty(options.values)) {
builder.withValues({ columns: options.values });
}
let builderBuild = builder.build.bind(builder);
builder.build = () => {
return TestDataViewBuilder.setUpDataView(builderBuild(), options);
};
return builder;
}