in src/interactivityFilterService.ts [64:104]
export function extractFilterColumnTarget(categoryColumn: powerbi.DataViewCategoryColumn | powerbi.DataViewMetadataColumn): IFilterColumnTarget {
// take an expression from source or column metadata
let expr: any = categoryColumn && (<any>categoryColumn).source && (<any>categoryColumn).source.expr
? <any>(<any>categoryColumn).source.expr
: <any>(<any>categoryColumn).expr;
// take table name from source.entity if column definition is simple
let filterTargetTable: string = expr && expr.source && expr.source.entity
? expr.source.entity
: null;
// take expr.ref as column name if column definition is simple
let filterTargetColumn: string = expr && expr.ref
? expr.ref
: null;
// special cases
// when data structure is hierarchical
if (expr && expr.kind === SQExprKind.HierarchyLevel && (<any>categoryColumn).identityExprs) {
filterTargetColumn = expr.level;
// Only if we have hierarchical structure with virtual table, take table name from identityExprs
// Power BI creates hierarchy for date type of data (Year, Quater, Month, Days)
// For it, Power BI creates a virtual table and gives it generated name as... 'LocalDateTable_bcfa94c1-7c12-4317-9a5f-204f8a9724ca'
// Visuals have to use a virtual table name as a target of JSON to filter date hierarchy properly
if (expr.arg && expr.arg.kind === SQExprKind.Hierarchy && expr.arg && expr.arg.arg &&
expr.arg.arg.kind === SQExprKind.PropertyVariationSource) {
if ((<any>categoryColumn).identityExprs && (<any>categoryColumn).identityExprs.length) {
filterTargetTable = (<any>(<any>categoryColumn).identityExprs[(<any>categoryColumn).identityExprs.length - 1]).source.entity;
}
} else {
// otherwise take column name from expr
filterTargetTable = expr.arg && expr.arg.arg && expr.arg.arg.entity;
}
}
return {
table: filterTargetTable,
column: filterTargetColumn
};
}