export function extractFilterColumnTarget()

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