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

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

package com.datastax.data.exploration.biz.stat;

import com.alibaba.fastjson.JSONObject;
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.util.Consts;

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

/**
 * 饼图
 */
public class Pie {

    /**
     * 获取饼图展示的数据
     *
     * @param id    数据集id
     * @param group 聚合属性
     * @param val   取值属性
     * @param func  聚合函数
     * @return 返回的是饼图的展示数据
     */
    public static List operator(String id, String group, String val, String func) {
        List listValue = new ArrayList<>();
        DataTable table = File2DataTable.exactTable(id);
        Function function = Function.getFunction(func);
        aggMath(table, group, val).forEach((k, v) -> {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("name", k);
            if (v.typeIsNumber()) {
                jsonObject.put("value", v.calculate(function));
            } else if (Function.COUNT.equals(function)) {
                jsonObject.put("value", v.calculate(function));
            }
            listValue.add(jsonObject);
        });
        return listValue;
    }

    /**
     * 获取聚合属性
     *
     * @param table shuju表
     * @param group 聚合属性
     * @param val   取值属性
     * @return
     */
    private static Map aggMath(DataTable table, String group, String val) {
        Map map = new HashMap<>();
        table.getRows().aggList(group).forEach((k, v) -> {
            if (!Consts.NONE.equals(val) && table.getColumns().getColumn(val) instanceof NumberColumn) {
                List list = v.parallelStream().map(row -> row.getValue(val)).collect(Collectors.toList());
                map.put((String) k, new MathStat<>(list.toArray(new Number[0])));
            } else {
                map.put((String) k, new MathStat(v.size()));
            }
        });
        return map;
    }
}