Sfoglia il codice sorgente

修改实体类字段

zhangjinjun 6 anni fa
parent
commit
ff83b92153

+ 50 - 40
src/main/java/com/yihu/quota/model/view/ViewDimension.java

@ -18,21 +18,22 @@ import javax.persistence.Table;
@Table(name = "olap_view_dimension")
public class ViewDimension extends BaseAssignedEntity {
    public String viewId; // 视图Id
    public String dimensionCode; // 维度编码
    public String dimensionName; // 维度名称
    public String cubeCode; // 多维度数据集编码
    public String esIndex; // 多维数据集的 ES index
    public String esType; //  多维数据集的 ES type
    public String dimensionType; // 维度类型,row:行维度,col:列维度,drill:钻取维度,默认行维度。
    public Integer groupRow; // 行维度组
    public Integer groupRowOrder; // 组内行维度顺序
    public Integer columnDrillOrder; // 列维度/钻取维度的顺序
    public String rowMemberOrderType; // 行维度成员排序方式,name:按名称排序,sub_agg:按子聚合统计值排序,默认按名称排序。
    public String rowMemberOrderStrategy; // 行维度成员排序策略,asc:升序,desc:降序。
    public Integer rowMemberCount; // 行维度成员返回个数
    public String rowMemberDateFormat; // 行维度成员日期格式
    public String rowMemberDateInterval; // 行维度日期间隔
    private String viewId; // 视图Id
    private String dimensionCode; // 维度编码
    private String dimensionName; // 维度名称
    private String cubeCode; // 多维度数据集编码
    private String esIndex; // 多维数据集的 ES index
    private String esType; //  多维数据集的 ES type
    private String dimensionType; // 维度类型,row:行维度,col:列维度,drill:钻取维度,默认行维度。
    private Integer groupRow; // 行维度组
    private Integer groupRowOrder; // 组内行维度顺序
    private Integer columnDrillOrder; // 列维度/钻取维度的顺序
    private String memberOrderType; // 行/列维度成员排序方式,name:按名称排序,sub_agg:按子聚合统计值排序。
    private String memberOrderStrategy; // 行/列维度成员排序策略,asc:升序,desc:降序。
    private String memberOrderQuotaId; // 行/列维度成员按子聚合排序的指标ID。
    private Integer memberCount; // 行/列维度成员返回个数
    private String memberDateFormat; // 行/列维度成员日期格式
    private String memberDateInterval; // 行/列维度成员日期间隔
    @Column(name = "view_id")
    public String getViewId() {
@ -124,48 +125,57 @@ public class ViewDimension extends BaseAssignedEntity {
        this.columnDrillOrder = columnDrillOrder;
    }
    @Column(name = "row_member_order_type")
    public String getRowMemberOrderType() {
        return rowMemberOrderType;
    @Column(name = "member_order_type")
    public String getMemberOrderType() {
        return memberOrderType;
    }
    public void setRowMemberOrderType(String rowMemberOrderType) {
        this.rowMemberOrderType = rowMemberOrderType;
    public void setMemberOrderType(String memberOrderType) {
        this.memberOrderType = memberOrderType;
    }
    @Column(name = "row_member_order_strategy")
    public String getRowMemberOrderStrategy() {
        return rowMemberOrderStrategy;
    @Column(name = "member_order_strategy")
    public String getMemberOrderStrategy() {
        return memberOrderStrategy;
    }
    public void setRowMemberOrderStrategy(String rowMemberOrderStrategy) {
        this.rowMemberOrderStrategy = rowMemberOrderStrategy;
    public void setMemberOrderStrategy(String memberOrderStrategy) {
        this.memberOrderStrategy = memberOrderStrategy;
    }
    @Column(name = "row_member_count")
    public Integer getRowMemberCount() {
        return rowMemberCount;
    @Column(name = "member_order_quota_id")
    public String getMemberOrderQuotaId() {
        return memberOrderQuotaId;
    }
    public void setRowMemberCount(Integer rowMemberCount) {
        this.rowMemberCount = rowMemberCount;
    public void setMemberOrderQuotaId(String memberOrderQuotaId) {
        this.memberOrderQuotaId = memberOrderQuotaId;
    }
    @Column(name = "row_member_date_format")
    public String getRowMemberDateFormat() {
        return rowMemberDateFormat;
    @Column(name = "member_count")
    public Integer getMemberCount() {
        return memberCount;
    }
    public void setRowMemberDateFormat(String rowMemberDateFormat) {
        this.rowMemberDateFormat = rowMemberDateFormat;
    public void setMemberCount(Integer memberCount) {
        this.memberCount = memberCount;
    }
    @Column(name = "row_member_date_interval")
    public String getRowMemberDateInterval() {
        return rowMemberDateInterval;
    @Column(name = "member_date_format")
    public String getMemberDateFormat() {
        return memberDateFormat;
    }
    public void setRowMemberDateInterval(String rowMemberDateInterval) {
        this.rowMemberDateInterval = rowMemberDateInterval;
    public void setMemberDateFormat(String memberDateFormat) {
        this.memberDateFormat = memberDateFormat;
    }
    @Column(name = "member_date_interval")
    public String getMemberDateInterval() {
        return memberDateInterval;
    }
    public void setMemberDateInterval(String memberDateInterval) {
        this.memberDateInterval = memberDateInterval;
    }
}

+ 8 - 8
src/main/java/com/yihu/quota/model/view/ViewQuota.java

@ -20,14 +20,14 @@ import java.util.List;
@Table(name = "olap_view_quota")
public class ViewQuota extends BaseAssignedEntity {
    public String viewId; // 视图Id
    public String dimensionCode; // 维度编码
    public String dimensionName; // 维度名称
    public String esIndex; // 多维数据集的 ES index
    public String esType; //  多维数据集的 ES type
    public String formulaMode; // 计算方式,basic:基础公式,custom:自定义公式。
    public String basicFormulaType; // 基础公式:sum:求和,count.计数,avg:均值,max:最大值,min:最小值,cardinality:去重计数
    public String chartType; // 图表类型,line:折线图,bar:柱状图。
    private String viewId; // 视图Id
    private String dimensionCode; // 维度编码
    private String dimensionName; // 维度名称
    private String esIndex; // 多维数据集的 ES index
    private String esType; //  多维数据集的 ES type
    private String formulaMode; // 计算方式,basic:基础公式,custom:自定义公式。
    private String basicFormulaType; // 基础公式:sum:求和,count.计数,avg:均值,max:最大值,min:最小值,cardinality:去重计数
    private String chartType; // 图表类型,line:折线图,bar:柱状图。
    // 临时属性
    /**

+ 10 - 10
src/main/java/com/yihu/quota/model/view/ViewQuotaFilter.java

@ -18,16 +18,16 @@ import javax.persistence.Table;
@Table(name = "olap_view_quota_filter")
public class ViewQuotaFilter extends BaseAssignedEntity {
    public Integer relationId; // 视图/指标主键
    public String dimensionCode; // 维度编码
    public String dimensionName; // 维度名称
    public String cubeCode; // 多维度数据集编码
    public String esIndex; // 多维数据集的 ES index
    public String esType; //  多维数据集的 ES type
    public String filterType; // 过滤条件类型,view:视图,quota:指标。
    public String relationType; // 关系类型,关系类型,and:且,or:或
    public String compareType; //比较类型,belong:属于,not_belong:不属于,null:为空,not_null:非空,gt:大于,gte:大于等于,小于:lt,小于等于:lte,contain:包含,not_contain:不包含
    public Object filterValue; //过滤的值
    private Integer relationId; // 视图/指标主键
    private String dimensionCode; // 维度编码
    private String dimensionName; // 维度名称
    private String cubeCode; // 多维度数据集编码
    private String esIndex; // 多维数据集的 ES index
    private String esType; //  多维数据集的 ES type
    private String filterType; // 过滤条件类型,view:视图,quota:指标。
    private String relationType; // 关系类型,关系类型,and:且,or:或
    private String compareType; //比较类型,belong:属于,not_belong:不属于,null:为空,not_null:非空,gt:大于,gte:大于等于,小于:lt,小于等于:lte,contain:包含,not_contain:不包含
    private Object filterValue; //过滤的值
    @Column(name = "relation_id")
    public Integer getRelationId() {

+ 90 - 58
src/main/java/com/yihu/quota/service/view/ViewService.java

@ -118,8 +118,8 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
    /**
     * 获取视图统计结果
     *
     * @param viewCode
     * @param filterModelList
     * @param viewCode        视图编码
     * @param filterModelList 页面的过滤条件模型集合
     */
    public Aggregations statViewResult(String viewCode, List<ViewQuotaFilterModel> filterModelList) throws Exception {
        // 获取视图规则
@ -141,57 +141,26 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
        searchRequestBuilder.setQuery(viewBoolQueryBuilder);
        // 组装聚合
        // 顶层行维度
        List<ViewDimension> groupTopRowDimensionList = view.getGroupTopRowDimensionList();
        // 组内其他行维度
        Map<Integer, List<ViewDimension>> groupOtherRowDimensionsMap = view.getGroupOtherRowDimensionsMap();
        if (groupTopRowDimensionList.size() == 0) {
            if (!"1".equals(view.getDisplayType())) {
                throw new ApiException("请为视图至少配置一个行维度。");
            } else {
                // 视图为数值展示类型的场合,没有行/列维度
                List<ViewQuota> viewQuotaList = view.getViewQuotaList();
                for (ViewQuota quota : viewQuotaList) {
                    if ("basic".equals(quota.getFormulaMode())) {
                        if ("sum".equals(quota.getBasicFormulaType())) {
                            // 求和
                            String aggName = "sum-result";
                            SumBuilder sumAgg = AggregationBuilders.sum(aggName).field(quota.getDimensionCode());
                            this.joinNumericalAgg(searchRequestBuilder, sumAgg, quota);
                        } else if ("count".equals(quota.getBasicFormulaType())) {
                            // 计数
                            String aggName = "count-result";
                            ValueCountBuilder countAgg = AggregationBuilders.count(aggName).field(quota.getDimensionCode());
                            this.joinNumericalAgg(searchRequestBuilder, countAgg, quota);
                        } else if ("avg".equals(quota.getBasicFormulaType())) {
                            // 均值
                            String aggName = "avg-result";
                            AvgBuilder avgAgg = AggregationBuilders.avg(aggName).field(quota.getDimensionCode());
                            this.joinNumericalAgg(searchRequestBuilder, avgAgg, quota);
                        } else if ("max".equals(quota.getBasicFormulaType())) {
                            // 最大值
                            String aggName = "max-result";
                            MaxBuilder maxAgg = AggregationBuilders.max(aggName).field(quota.getDimensionCode());
                            this.joinNumericalAgg(searchRequestBuilder, maxAgg, quota);
                        } else if ("min".equals(quota.getBasicFormulaType())) {
                            // 最小值
                            String aggName = "min-result";
                            MinBuilder minAgg = AggregationBuilders.min(aggName).field(quota.getDimensionCode());
                            this.joinNumericalAgg(searchRequestBuilder, minAgg, quota);
                        } else if ("cardinality".equals(quota.getBasicFormulaType())) {
                            // 去重计数
                            String aggName = "cardinality-result";
                            CardinalityBuilder cardinalityAgg = AggregationBuilders.cardinality(aggName).field(quota.getDimensionCode());
                            this.joinNumericalAgg(searchRequestBuilder, cardinalityAgg, quota);
                        }
                    }
                }
                // 视图为数值展示类型的场合,没有行/列维度,直接对指标聚合。
                this.gatherMetricsAgg(searchRequestBuilder, view.getViewQuotaList());
            }
        } else {
            int indexCount = esIndices.length;
            // 遍历顶层行维度
            for (ViewDimension topRowDimension : groupTopRowDimensionList) {
                String topRowDimensionCode = topRowDimension.getDimensionCode();
                String topOrderType = topRowDimension.getRowMemberOrderType();
                boolean isTopAsc = "asc".equals(topRowDimension.getRowMemberOrderStrategy()) ? true : false;
                String topOrderType = topRowDimension.getMemberOrderType();
                boolean isTopAsc = "asc".equals(topRowDimension.getMemberOrderStrategy()) ? true : false;
                // 有多个多维度数据集时,设定顶层聚合的数据来自哪个多维数据集
                // 有多个多维度数据集时,设定顶层聚合的数据来自哪个多维数据集。
                FilterAggregationBuilder topFilterAgg = null;
                if (indexCount > 1) {
                    String aggName = topRowDimension.getDimensionCode() + "-index-filter";
@ -199,7 +168,9 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
                    topFilterAgg = AggregationBuilders.filter(aggName).filter(queryBuilder);
                }
                // 顶层行维度
                // TODO 当顶层行维度是合计维度时,合计维度与列维度组合的聚合都在聚合节点顶层。
                // 顶层行维度聚合
                AggregationBuilder topAgg = null;
                String fieldType = cubeService.findDimensionDataType(topRowDimension.getCubeCode(), topRowDimension.getDimensionCode());
                if (!"date".equals(fieldType)) {
@ -215,7 +186,7 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
                    }
                    // 设置分组个数
                    int memberCount = topRowDimension.getRowMemberCount();
                    int memberCount = topRowDimension.getMemberCount();
                    if (memberCount > 0) {
                        ((TermsBuilder) topAgg).size(memberCount);
                    } else {
@ -226,8 +197,8 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
                    String aggName = topRowDimensionCode + "-date_histogram";
                    topAgg = AggregationBuilders.dateHistogram(aggName).field(topRowDimensionCode);
                    ((DateHistogramBuilder) topAgg).minDocCount(0);
                    ((DateHistogramBuilder) topAgg).format(topRowDimension.getRowMemberDateFormat());
                    ((DateHistogramBuilder) topAgg).interval(new DateHistogramInterval(topRowDimension.getRowMemberDateInterval()));
                    ((DateHistogramBuilder) topAgg).format(topRowDimension.getMemberDateFormat());
                    ((DateHistogramBuilder) topAgg).interval(new DateHistogramInterval(topRowDimension.getMemberDateInterval()));
                    if (StringUtils.isEmpty(topOrderType) || "name".equals(topOrderType)) {
                        Histogram.Order order = isTopAsc ? Histogram.Order.KEY_ASC : Histogram.Order.KEY_DESC;
                        ((DateHistogramBuilder) topAgg).order(order);
@ -238,6 +209,22 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
                    // TODO 需动态根据条件范围设置,或设置默认值
                    ((DateHistogramBuilder) topAgg).extendedBounds("", "");
                }
                // 遍历同组其他行维度,其聚合按顺序嵌套于同组上层行维度聚合下。
                AggregationBuilder secondRowAgg = null; // 第二个行维度聚合
                AggregationBuilder lastRowAgg = null; // 最后一个行维度聚合
                List<ViewDimension> otherRowDimensionList = groupOtherRowDimensionsMap.get(topRowDimension.getGroupRow());
                int otherRowDimensionCount = otherRowDimensionList.size();
                for (int i = 0; i < otherRowDimensionCount; i++) {
                    ViewDimension otherRowDimension = otherRowDimensionList.get(i);
                    String otherRowDimensionCode = otherRowDimension.getDimensionCode();
                    ViewDimension nextOtherRowDimension = null;
                    if (i < otherRowDimensionCount - 1) {
                        nextOtherRowDimension = otherRowDimensionList.get(i + 1);
                    }
                }
            }
        }
@ -249,10 +236,10 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
    }
    /**
     * 拼接视图、指标的过滤条件
     * 拼接视图/指标的过滤条件
     *
     * @param boolQueryBuilder
     * @param filterModelList
     * @param boolQueryBuilder ES布尔查询构建器
     * @param filterModelList  视图/指标的过滤条件模型集合
     */
    private void joinFilters(BoolQueryBuilder boolQueryBuilder, List<ViewQuotaFilterModel> filterModelList) {
        if (filterModelList.size() != 0) {
@ -305,9 +292,9 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
    /**
     * 组装且/或/否查询
     *
     * @param boolQueryBuilder
     * @param queryBuilder
     * @param relationType
     * @param boolQueryBuilder ES布尔查询构建器
     * @param queryBuilder     ES查询构建器
     * @param relationType     且/或/非关系类型
     */
    private void joinBoolQuery(BoolQueryBuilder boolQueryBuilder, QueryBuilder queryBuilder, String relationType) {
        if ("and".equals(relationType)) {
@ -319,15 +306,60 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
        }
    }
    /**
     * 汇总视图为数值展示类型的各种度量聚合
     *
     * @param searchRequestBuilder ES请求构建器
     * @param viewQuotaList        视图的指标
     * @throws IOException
     */
    private void gatherMetricsAgg(SearchRequestBuilder searchRequestBuilder, List<ViewQuota> viewQuotaList) throws IOException {
        for (ViewQuota quota : viewQuotaList) {
            if ("basic".equals(quota.getFormulaMode())) {
                if ("sum".equals(quota.getBasicFormulaType())) {
                    // 求和
                    String aggName = "sum-result";
                    SumBuilder sumAgg = AggregationBuilders.sum(aggName).field(quota.getDimensionCode());
                    this.joinMetricAgg(searchRequestBuilder, sumAgg, quota);
                } else if ("count".equals(quota.getBasicFormulaType())) {
                    // 计数
                    String aggName = "count-result";
                    ValueCountBuilder countAgg = AggregationBuilders.count(aggName).field(quota.getDimensionCode());
                    this.joinMetricAgg(searchRequestBuilder, countAgg, quota);
                } else if ("avg".equals(quota.getBasicFormulaType())) {
                    // 均值
                    String aggName = "avg-result";
                    AvgBuilder avgAgg = AggregationBuilders.avg(aggName).field(quota.getDimensionCode());
                    this.joinMetricAgg(searchRequestBuilder, avgAgg, quota);
                } else if ("max".equals(quota.getBasicFormulaType())) {
                    // 最大值
                    String aggName = "max-result";
                    MaxBuilder maxAgg = AggregationBuilders.max(aggName).field(quota.getDimensionCode());
                    this.joinMetricAgg(searchRequestBuilder, maxAgg, quota);
                } else if ("min".equals(quota.getBasicFormulaType())) {
                    // 最小值
                    String aggName = "min-result";
                    MinBuilder minAgg = AggregationBuilders.min(aggName).field(quota.getDimensionCode());
                    this.joinMetricAgg(searchRequestBuilder, minAgg, quota);
                } else if ("cardinality".equals(quota.getBasicFormulaType())) {
                    // 去重计数
                    String aggName = "cardinality-result";
                    CardinalityBuilder cardinalityAgg = AggregationBuilders.cardinality(aggName).field(quota.getDimensionCode());
                    this.joinMetricAgg(searchRequestBuilder, cardinalityAgg, quota);
                }
            }
        }
    }
    /**
     * 组装视图为数值展示类型的聚合
     *
     * @param searchRequestBuilder
     * @param numericalAgg
     * @param quota
     * @param searchRequestBuilder ES请求构建器
     * @param metricAgg            ES度量聚合构建器
     * @param quota                视图指标
     * @throws IOException
     */
    private void joinNumericalAgg(SearchRequestBuilder searchRequestBuilder, MetricsAggregationBuilder numericalAgg, ViewQuota quota) throws IOException {
    private void joinMetricAgg(SearchRequestBuilder searchRequestBuilder, MetricsAggregationBuilder metricAgg, ViewQuota quota) throws IOException {
        List<ViewQuotaFilter> quotaFilterList = quota.getQuotaFilterList();
        FilterAggregationBuilder filterAgg = null;
        if (quotaFilterList != null && quotaFilterList.size() > 0) {
@ -339,11 +371,11 @@ public class ViewService extends BaseJpaService<View, ViewDao> {
            String aggName = quota.getDimensionCode() + "-filter";
            filterAgg = AggregationBuilders.filter(aggName).filter(quotaBoolQueryBuilder);
            filterAgg.subAggregation(numericalAgg);
            filterAgg.subAggregation(metricAgg);
        }
        if (filterAgg == null) {
            searchRequestBuilder.addAggregation(numericalAgg);
            searchRequestBuilder.addAggregation(metricAgg);
        } else {
            searchRequestBuilder.addAggregation(filterAgg);
        }