graph_data_fun = {
const fun = function(
pre_card_filters = [],
dimension_filters = [],
grouping_column = 'card',
rank_filters = [],
card_sorting_columns = ['plays'],
group_sorting_column = 'plays',
sort_direction = true
) {
let pre_card_data = base_data;
pre_card_filters.forEach(function(pre_card_filter_fun) {
pre_card_data = pre_card_data.filter(pre_card_filter_fun);
});
const cards_data_with_performance = agg_performance_metrics_fun(
pre_card_data,
'card'
);
const cards_data_with_performance_and_details = cards_data_with_performance.map(
v => ({
...v,
...card_details_map.get(v.card)[0]
})
);
let pre_grouping_data = cards_data_with_performance_and_details;
dimension_filters.forEach(function(dim_filter_fun) {
pre_grouping_data = pre_grouping_data.filter(dim_filter_fun);
});
// ## Grouping
// First calculating rank
let pre_group_with_rank_df = aq.from(pre_grouping_data);
console.log(pre_group_with_rank_df.objects());
if (grouping_column) {
pre_group_with_rank_df = pre_group_with_rank_df
.groupby(grouping_column)
.orderby([
grouping_column,
...card_sorting_columns.map(d => (sort_direction ? aq.desc(d) : d))
])
.derive({ rank: op.rank()
//, perc_plays: d => d.plays / op.sum('plays')
})
.ungroup()
.params({ grouping_column: grouping_column })
.derive({ grouping: d => grouping_column })
.objects();
} else {
pre_group_with_rank_df = pre_group_with_rank_df
.orderby([
...card_sorting_columns.map(d => (sort_direction ? aq.desc(d) : d))
])
.derive({ rank: op.rank() })
.ungroup()
.derive({ grouping: d => null })
.objects();
}
// Cards df and filtering by rank_filters
let cards_with_rank = pre_group_with_rank_df;
rank_filters.forEach(function(rank_filter_fun) {
cards_with_rank = cards_with_rank.filter(rank_filter_fun);
});
// Returning without group performance if no grouping
if (!grouping_column) {
return {
cards_data: cards_with_rank,
groups_data: []
};
}
// Now calculating group performance
const pre_card_data_with_details = pre_card_data.map(v => ({
...v,
...card_details_map.get(v.card)[0]
}));
const groups_performance_df = aq.from(
agg_performance_metrics_fun(pre_card_data_with_details, grouping_column)
);
// Now collecting the cards in each group and adding to groups infos df
const groups_info_df = aq
.from(cards_with_rank)
.groupby(grouping_column)
.rollup({
cards: op.array_agg_distinct('card')
// perc_plays: d => d.plays / op.sum('plays')
})
.ungroup()
.join(groups_performance_df)
.orderby(aq.desc(group_sorting_column))
.params({ grouping_column: grouping_column })
.derive({ grouping: d => grouping_column });
return {
cards_data: cards_with_rank,
groups_data: groups_info_df.objects()
};
};
return fun;
}