All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.datastax.data.exploration.biz.stat.StackedBar Maven / Gradle / Ivy

The newest version!
package com.datastax.data.exploration.biz.stat;

import com.datastax.data.exploration.biz.datatable.DataRow;
import com.datastax.data.exploration.biz.datatable.DataTable;
import com.datastax.data.exploration.biz.datatable.column.NumberColumn;
import com.datastax.data.exploration.biz.datatable.column.math.Function;
import com.datastax.data.exploration.biz.datatable.column.math.MathStat;
import com.datastax.data.exploration.common.File2DataTable;
import com.datastax.data.exploration.dto.dataChart.stackedBar.StackedBarChartValue;
import com.datastax.data.exploration.util.Consts;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 堆叠图
 */
public class StackedBar {

    /**
     * 获取堆叠图的展示数据
     *
     * @param id    数据集id
     * @param group 分组属性
     * @param stack 堆叠属性
     * @param val   取值属性
     * @param func  聚合函数
     * @return 返回的是堆叠图的展示数据
     */
    public static List operator(String id, String group, String stack, String val, String func) {
        DataTable table = File2DataTable.exactTable(id);
        Map> mapSub = aggSubList(table, group, stack, val);
        Function function = Function.getFunction(func);
        List listStackBarValue = new ArrayList<>();
        mapSub.forEach((k, v) -> {
            StackedBarChartValue stackedBarValue = new StackedBarChartValue(k);
            v.forEach((ksub, vsub) -> {
                double value = 0;
                if (vsub.typeIsNumber()) {
                    value = vsub.calculate(function);
                } else if (Function.COUNT.equals(function)) {
                    value = vsub.calculate(function);
                }
                stackedBarValue.put(ksub, value);
            });
            listStackBarValue.add(stackedBarValue);
        });
        return listStackBarValue;
    }

    /**
     * 获取分组的聚合属性
     *
     * @param table 数据表
     * @param group 分组属性
     * @param stack 堆叠属性
     * @param val   取值属性
     * @return 分组的聚合属性
     */
    private static Map> aggSubList(DataTable table, String group, String stack, String val) {
        Map> mapSub = new HashMap<>();
        table.getRows().aggList(group).forEach((k, v) -> {
            Map mapMath = new HashMap<>();
            if (!Consts.NONE.equals(val)) {
                Map> map = new HashMap<>();
                for (DataRow row : v) {
                    Object key = row.getValue(stack);
                    Object item = row.getValue(val);
                    if (key != null && item != null) {
                        List list = map.get(key);
                        if (list == null) {
                            list = new ArrayList<>();
                            map.put(key, list);
                        }
                        list.add(item);
                    }
                }
                map.forEach((ksub, vsub) -> {
                    if (table.getColumns().getColumn(val) instanceof NumberColumn) {
                        mapMath.put((String) ksub, new MathStat<>(vsub.toArray(new Number[0])));
                    } else {
                        mapMath.put((String) ksub, new MathStat(vsub.size()));
                    }
                });
            } else {
                Map map = new HashMap<>();
                for (DataRow row : v) {
                    Object key = row.getValue(stack);
                    if (key != null) {
                        Integer count = map.get(key);
                        if (count == null) {
                            count = 0;
                        }
                        count++;
                        map.put(key,count);
                    }
                }
                map.forEach((ksub, vsub) -> {
                    mapMath.put((String) ksub, new MathStat(vsub));
                });
            }
            mapSub.put((String) k, mapMath);
        });
        return mapSub;
    }

}