如何利用Algo自定义函数实现分组并求最大值原创
12人赞赏了该文章
3,788次浏览
编辑于2022年04月14日 17:48:03
关键词
Algo,自定义聚合函数、max、字符串
一、需求背景
有一个报表开发的需求,对一个单据的数据进行汇总处理。要求根据“适用组织”字段进行分组,在报表中显示每个适用组织(组织类型字段)的最新(即版本号值最大的规则)的版本号(文本类型字段)和版本名称。
规则引擎列表数据如下:
二、实现方案
在algo中,可以通过dataSet.groupBy(a).max(b). finish(),但是要求b必须是整型或者日期类型的字段。但是在需求中的求最大值中的版本号是文本类型,即字符串类型,所以无法直接通过algo的max聚合函数直接求分组的最大值。需求通过自定义聚合函数,实现分组后求最大版本号的逻辑。
三、实现过程
1、创建自定义聚合函数
public class GroupMaxStrFunction extends CustomAggFunction<String> { public GroupMaxStrFunction() { super("group_maxstr", DataType.StringType); // TODO Auto-generated constructor stub } //分组返回的新值 @Override public String newAggValue() { return new String(); } //分组后遍历每一组的数据,进行自定义处理 @Override public String addValue(String oldValue, Object newValue) { String curRowData = String.valueOf(newValue); return oldValue.compareTo(curRowData)<0?curRowData:oldValue; } //分批处理分组情况下:分批结果之间处理 @Override public String combineAggValue(String paramT1, String paramT2) { // TODO Auto-generated method stub return null; } @Override public Object getResult(String result) { // TODO Auto-generated method stub return result; } } }
2、报表查询插件调用自定义聚合函数
public class RuleRptListDataPlugin extends AbstractReportListDataPlugin { @Override public DataSet query(ReportQueryParam arg0, Object arg1) throws Throwable { DataSet queryDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(),"kded_ruledemo","org,kded_vesion,kded_name as rulename",null, null); //agg(自定义聚合函数构造方法,处理的参数字段,输出处理结果的别名) DataSet groupbyresult = queryDataSet.groupBy(new String[] {"org"}).agg(new GroupMaxStrFunction(), "kded_vesion", "maxversion").finish(); DataSet result = queryDataSet.join(groupbyresult).on("kded_vesion", "maxversion").select(new String[] {"org","kded_name as rulename"},new String[] {"maxversion"}).finish(); return result; } }
注册报表查询插件
四、实现效果
点击预览报表
五、开发环境版本
COSMICV4.0.010.0
六、参考资料
algofunctiondemo.zip(5.00KB)
赞 12
12人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!