diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/GroupDataSet.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/GroupDataSet.java index de1f80fd03a7aacb1425dbb6ee420aee2ed77c83..ed98981bee30fdedf939f12b42662bed3bd0de26 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/GroupDataSet.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/GroupDataSet.java @@ -12,6 +12,8 @@ import org.tinygroup.tinyscript.dataset.impl.AggregateResult; */ public abstract class GroupDataSet extends DynamicDataSet { + protected static final String AGGREGATE_TYPE = "aggregate"; + /** * 获取完整的分组数据 * @@ -24,7 +26,7 @@ public abstract class GroupDataSet extends DynamicDataSet { * * @param aggregateName */ - public abstract void createAggregateResult(String aggregateName); + public abstract void createAggregateResult(String aggregateName, Object... params); /** * 获取聚合结果 @@ -85,20 +87,22 @@ public abstract class GroupDataSet extends DynamicDataSet { sb.append("----------------------------------------\n"); for (int k = 0; k < dataSets.size(); k++) { try { - if(k == 0) { + if (k == 0) { for (Field f : dataSets.get(k).getFields()) { - sb.append(f.getName()).append(" "); + if (!AGGREGATE_TYPE.equals(f.getType())) + sb.append(f.getName()).append(" "); } for (AggregateResult result : list) { sb.append(result.getName()).append(" "); } sb.append("\n"); - } - + } + sb.append("----------------------------------------\n"); for (int i = 0; i < dataSets.get(k).getRows(); i++) { for (int j = 0; j < dataSets.get(k).getColumns(); j++) { - sb.append(dataSets.get(k).getData(getShowIndex(i), getShowIndex(j))).append(" "); + if (!AGGREGATE_TYPE.equals(dataSets.get(k).getFields().get(j).getType())) + sb.append(dataSets.get(k).getData(getShowIndex(i), getShowIndex(j))).append(" "); } for (AggregateResult result : list) { sb.append(result.getData(k)).append(" "); diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractGroupFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractGroupFunction.java index 09a5304baafd1dd0b46a3f9d391d994350912606..d22a9234dc9769f3cb0a6aeaf4c0050aeb624e3f 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractGroupFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractGroupFunction.java @@ -5,12 +5,15 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.tinygroup.beancontainer.BeanContainerFactory; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; import org.tinygroup.tinyscript.dataset.DynamicDataSet; import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.impl.AggregateResult; +import org.tinygroup.tinyscript.dataset.impl.MultiLevelGroupDataSet; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.impl.DefaultScriptContext; @@ -18,21 +21,23 @@ import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; /** * 分组函数抽象基类 + * * @author yancheng11334 * */ -public abstract class AbstractGroupFunction extends AbstractScriptFunction{ +public abstract class AbstractGroupFunction extends AbstractScriptFunction { public String getBindingTypes() { return DataSet.class.getName(); } - - public boolean enableExpressionParameter(){ + + public boolean enableExpressionParameter() { return true; } - + /** * 具体分组逻辑 + * * @param dataSet * @param fields * @return @@ -40,44 +45,44 @@ public abstract class AbstractGroupFunction extends AbstractScriptFunction{ */ protected List group(DynamicDataSet dataSet, String[] fields) throws Exception { Map result = new LinkedHashMap(); - try{ + try { int[] showColumns = getShowColumns(dataSet, fields); int rowNum = dataSet.getRows(); - + // 逐条遍历记录 for (int i = 0; i < rowNum; i++) { int showRow = dataSet.getShowIndex(i); - Object key = createKey(showRow,showColumns,dataSet); + Object key = createKey(showRow, showColumns, dataSet); DynamicDataSet groupDataSet = result.get(key); - if(groupDataSet==null){ - // 新建分组结果的数据集 - groupDataSet = DataSetUtil.createDynamicDataSet(dataSet, i); - result.put(key, groupDataSet); - }else{ - // 更新分组结果的数据集 - int groupRowNum = groupDataSet.getRows(); - int groupShowRow = groupDataSet.getShowIndex(groupRowNum); - groupDataSet.insertRow(groupShowRow); - for (int j = 0; j < groupDataSet.getColumns(); j++) { - int showColumn = groupDataSet.getShowIndex(j); - groupDataSet.setData(groupShowRow, showColumn, dataSet.getData(showRow, showColumn)); - } + if (groupDataSet == null) { + // 新建分组结果的数据集 + groupDataSet = DataSetUtil.createDynamicDataSet(dataSet, i); + result.put(key, groupDataSet); + } else { + // 更新分组结果的数据集 + int groupRowNum = groupDataSet.getRows(); + int groupShowRow = groupDataSet.getShowIndex(groupRowNum); + groupDataSet.insertRow(groupShowRow); + for (int j = 0; j < groupDataSet.getColumns(); j++) { + int showColumn = groupDataSet.getShowIndex(j); + groupDataSet.setData(groupShowRow, showColumn, dataSet.getData(showRow, showColumn)); + } } } - - }catch(ScriptException e){ + + } catch (ScriptException e) { throw e; - }catch(Exception e){ + } catch (Exception e) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } return new ArrayList(result.values()); } - + protected int[] getShowColumns(DynamicDataSet dataSet, String[] fields) throws Exception { int[] columns = DataSetUtil.getFieldIndex(dataSet.getFields(), fields); int[] showColumns = new int[columns.length]; - for(int i=0;i keys = new ArrayList(); for (int showColumn : showColumns) { @@ -93,16 +98,28 @@ public abstract class AbstractGroupFunction extends AbstractScriptFunction{ } return keys; } - //更新上下文 - protected ScriptContext updateScriptContext(AbstractDataSet dataSet,int row,ScriptContext context) throws Exception{ + + // 更新上下文 + protected ScriptContext updateScriptContext(AbstractDataSet dataSet, int row, ScriptContext context) + throws Exception { ScriptContext subContext = new DefaultScriptContext(); subContext.setParent(context); - for(int i=0;i list = group(subDataSet.getSource(),expression,context); subDataSet.setGroups(list); } + updateAggregateResult(multiLevelGroupDataSet); return multiLevelGroupDataSet; }else{ //首次分组 diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupFunction.java index 54062da6f44909a5ca976fd4dcdfd67c3922ddac..8a27e1a64d9a005f97efe9ec37089fd054eeb23a 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupFunction.java @@ -22,8 +22,7 @@ public class DataSetGroupFunction extends AbstractGroupFunction { return "group"; } - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); @@ -47,34 +46,35 @@ public class DataSetGroupFunction extends AbstractGroupFunction { /** * 多级分组 + * * @param dataSet * @param fields * @return * @throws Exception */ private GroupDataSet groups(DynamicDataSet dataSet, String[] fields) throws Exception { - try{ - if(dataSet instanceof MultiLevelGroupDataSet){ - //某一级序表进行分组 + try { + if (dataSet instanceof MultiLevelGroupDataSet) { + // 某一级序表进行分组 MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; List subDataSetList = multiLevelGroupDataSet.getUnGroups(); - for(MultiLevelGroupDataSet subDataSet:subDataSetList){ - List list = group(subDataSet.getSource(),fields); + for (MultiLevelGroupDataSet subDataSet : subDataSetList) { + List list = group(subDataSet.getSource(), fields); subDataSet.setGroups(list); } + updateAggregateResult(multiLevelGroupDataSet); return multiLevelGroupDataSet; - }else{ - //首次分组 - List list = group(dataSet,fields); - MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(dataSet,list); + } else { + // 首次分组 + List list = group(dataSet, fields); + MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(dataSet, list); return multiLevelGroupDataSet; } - }catch (ScriptException e) { + } catch (ScriptException e) { throw e; - }catch (Exception e) { + } catch (Exception e) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupStagedFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupStagedFunction.java index 59f48db5a8d7a44a82363fe05ba646c3bc436372..a29263f7e26718afa8499ef532ff4e85bbc91c22 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupStagedFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupStagedFunction.java @@ -18,6 +18,7 @@ import org.tinygroup.tinyscript.interpret.ScriptContextUtil; /** * 数据集按条件分组 + * * @author yancheng11334 * */ @@ -27,101 +28,103 @@ public class DataSetGroupStagedFunction extends AbstractGroupFunction { return "groupStaged"; } - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { - try{ - if(parameters == null || parameters.length == 0){ + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); - }else if(parameters.length>1){ + } else if (parameters.length > 1) { DynamicDataSet dataSet = (DynamicDataSet) getValue(parameters[0]); - String[] expressions = new String[parameters.length-1]; - for(int i=0;i subDataSetList = multiLevelGroupDataSet.getUnGroups(); - for(MultiLevelGroupDataSet subDataSet:subDataSetList){ - List list = group(subDataSet.getSource(),expressions,context); + for (MultiLevelGroupDataSet subDataSet : subDataSetList) { + List list = group(subDataSet.getSource(), expressions, context); subDataSet.setGroups(list); } + updateAggregateResult(multiLevelGroupDataSet); return multiLevelGroupDataSet; - }else{ - //首次分组 - List list = group(dataSet,expressions,context); - MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(dataSet,list); + } else { + // 首次分组 + List list = group(dataSet, expressions, context); + MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(dataSet, list); return multiLevelGroupDataSet; } - }catch (ScriptException e) { + } catch (ScriptException e) { throw e; - }catch (Exception e) { + } catch (Exception e) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - - private List group(AbstractDataSet dataSet,String[] expressions,ScriptContext context) throws Exception{ - Map result = new HashMap(); - try{ + + private List group(AbstractDataSet dataSet, String[] expressions, ScriptContext context) + throws Exception { + Map result = new HashMap(); + try { int rowNum = dataSet.getRows(); - - //逐条遍历记录 - for(int i=0;i groups = new ArrayList(); - for(String expression:expressions){ + for (String expression : expressions) { DynamicDataSet groupDataSet = result.get(expression); - if(groupDataSet!=null){ - groups.add(groupDataSet); + if (groupDataSet != null) { + groups.add(groupDataSet); } } DynamicDataSet otherDataSet = result.get(""); - if(otherDataSet!=null){ - groups.add(otherDataSet); + if (otherDataSet != null) { + groups.add(otherDataSet); } - + return groups; - }catch (ScriptException e) { + } catch (ScriptException e) { throw e; - }catch (Exception e) { + } catch (Exception e) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetAggregateFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetAggregateFunction.java index 9f0c5710af1607684c4b433963dfd446cc65514a..e46846dfca1aed6741996b65126c593a47bc3534 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetAggregateFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetAggregateFunction.java @@ -11,6 +11,7 @@ import org.tinygroup.tinyscript.dataset.DataSet; import org.tinygroup.tinyscript.dataset.DynamicDataSet; import org.tinygroup.tinyscript.dataset.GroupDataSet; import org.tinygroup.tinyscript.dataset.impl.AggregateResult; +import org.tinygroup.tinyscript.dataset.impl.MultiLevelGroupDataSet; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; import org.tinygroup.tinyscript.expression.ExpressionUtil; import org.tinygroup.tinyscript.function.DynamicNameScriptFunction; @@ -65,7 +66,15 @@ public class GroupDataSetAggregateFunction extends DynamicNameScriptFunction { groupDataSet.createAggregateResult(aggregateName); int col = getColumn(groupDataSet, fieldName); for (int i = 0; i < groupDataSet.getRows(); i++) { - DynamicDataSet subDataSet = groupDataSet.getGroups().get(i); + DynamicDataSet subDataSet; + if (groupDataSet.getGroups() != null && groupDataSet.getGroups().size() > 0) { + subDataSet = groupDataSet.getGroups().get(i); + } else { + subDataSet = ((MultiLevelGroupDataSet) groupDataSet).getSource(); + } + if (subDataSet instanceof GroupDataSet) { + executeGroupDataSet((GroupDataSet) subDataSet, fieldName, functionName, params); + } Object value = executeAggregate(subDataSet, col, functionName, params); groupDataSet.setData(groupDataSet.getShowIndex(i), aggregateName, value); } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/AggregateResult.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/AggregateResult.java index 0b4db1bf9f3bafc2920ee7f45f187b7ccc48749d..17647e3cde443b70d0aacb8468ff788fda13378f 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/AggregateResult.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/AggregateResult.java @@ -2,23 +2,29 @@ package org.tinygroup.tinyscript.dataset.impl; public class AggregateResult { - String aggregateName; //聚合名 - Object[] array; //聚合结果 - - public String getName(){ + String aggregateName; // 聚合名 + Object[] params;// 聚合的额外参数(当更新分组信息时同步更新聚合结果需要用到 + Object[] array; // 聚合结果 + + public String getName() { return aggregateName; } + + public Object[] getParams() { + return params; + } - public AggregateResult(String name,int size){ + public AggregateResult(String name, int size, Object... params) { + this.params = params; this.aggregateName = name; this.array = new Object[size]; } - - public Object getData(int row){ + + public Object getData(int row) { return array[row]; } - - public void setData(int row,Object value){ + + public void setData(int row, Object value) { array[row] = value; } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/MultiLevelGroupDataSet.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/MultiLevelGroupDataSet.java index 25b838db2947c5eab481c3b1203a1b1b40e2686c..e86d35c721bf4fee0145f62a84daa3b033e8e014 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/MultiLevelGroupDataSet.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/MultiLevelGroupDataSet.java @@ -3,6 +3,7 @@ package org.tinygroup.tinyscript.dataset.impl; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Iterator; import java.util.List; import org.tinygroup.tinyscript.dataset.DataSet; @@ -14,304 +15,320 @@ import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; /** * 多级分组序表 + * * @author yancheng11334 * */ public class MultiLevelGroupDataSet extends GroupDataSet { - private static final String AGGREGATE_TYPE="aggregate"; - /** * 源序表 */ - private DynamicDataSet source; - + private DynamicDataSet source; + /** * 分组序表的序列 */ private List subDataSetList = new ArrayList(); - + private int currentRow = -1; - + private boolean groupTag = false; - - private MultiLevelGroupDataSet parent; - + + private MultiLevelGroupDataSet parent; + private List aggregateResultList = new ArrayList(); // 聚合结果 - + /** * 未分组的构造函数 + * * @param dataSet */ - public MultiLevelGroupDataSet(DynamicDataSet dataSet){ + public MultiLevelGroupDataSet(DynamicDataSet dataSet) { currentRow = 0; source = dataSet; setFields(new ArrayList(source.getFields())); setIndexFromOne(source.isIndexFromOne()); } - + /** * 分组的构造函数 + * * @param dataSet * @param dataSetList */ - public MultiLevelGroupDataSet(DynamicDataSet dataSet,List dataSetList){ + public MultiLevelGroupDataSet(DynamicDataSet dataSet, List dataSetList) { this(dataSet); setGroups(dataSetList); groupTag = true; } - - - public void setGroups(List dataSetList){ + + public void setGroups(List dataSetList) { subDataSetList.clear(); - if(dataSetList!=null){ - for(DynamicDataSet dataSet:dataSetList){ - if(dataSet instanceof MultiLevelGroupDataSet){ - MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; - multiLevelGroupDataSet.parent = this; - subDataSetList.add(dataSet); - }else{ - MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(dataSet); - multiLevelGroupDataSet.parent = this; - subDataSetList.add(multiLevelGroupDataSet); - } - } + if (dataSetList != null) { + for (DynamicDataSet dataSet : dataSetList) { + if (dataSet instanceof MultiLevelGroupDataSet) { + MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; + multiLevelGroupDataSet.parent = this; + subDataSetList.add(dataSet); + } else { + MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(dataSet); + multiLevelGroupDataSet.parent = this; + subDataSetList.add(multiLevelGroupDataSet); + } + } } groupTag = true; } - - public MultiLevelGroupDataSet getParent(){ + + public MultiLevelGroupDataSet getParent() { return parent; } - - public DynamicDataSet getSource(){ + + public DynamicDataSet getSource() { return source; } - + /** * 判断当前序表是否进行分组 + * * @return */ - public boolean isGrouped(){ + public boolean isGrouped() { return groupTag; } - + public int getLevel() { - MultiLevelGroupDataSet p = parent; + MultiLevelGroupDataSet p = parent; int level = 0; - while(p!=null){ + while (p != null) { p = p.parent; level++; } return level; } - private AggregateResult getAggregateResult(String name){ - for(AggregateResult result:aggregateResultList){ - if(name!=null && name.equals(result.getName())){ - return result; + private AggregateResult getAggregateResult(String name) { + for (AggregateResult result : aggregateResultList) { + if (name != null && name.equals(result.getName())) { + return result; } } return null; } - + public boolean isReadOnly() { return false; } public void first() throws Exception { - if(isGrouped()){ + if (isGrouped()) { currentRow = 0; - }else{ + } else { source.first(); } } public boolean previous() throws Exception { - if(isGrouped()){ - if(currentRow>0){ - currentRow--; - return true; + if (isGrouped()) { + if (currentRow > 0) { + currentRow--; + return true; } return false; - }else{ + } else { return source.previous(); } - + } public void beforeFirst() throws Exception { - if(isGrouped()){ + if (isGrouped()) { throw new Exception( ResourceBundleUtil.getResourceMessage("dataset", "dataset.operate.nosupport", "beforeFirst")); - }else{ + } else { source.beforeFirst(); } - + } public void afterLast() throws Exception { - if(isGrouped()){ - throw new Exception(ResourceBundleUtil.getResourceMessage("dataset", "dataset.operate.nosupport", "afterLast")); - }else{ + if (isGrouped()) { + throw new Exception( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.operate.nosupport", "afterLast")); + } else { source.afterLast(); } } public boolean next() throws Exception { - if(isGrouped()){ - if(currentRow=0 && temp<=subDataSetList.size() - 1){ - currentRow = temp; - return true; - } - return false; - }else{ - return source.absolute(row); + if (isGrouped()) { + int temp = getActualIndex(row); + if (temp >= 0 && temp <= subDataSetList.size() - 1) { + currentRow = temp; + return true; + } + return false; + } else { + return source.absolute(row); } - + } public int getRows() throws Exception { - if(isGrouped()){ - return subDataSetList.size(); - }else{ - return source.getRows(); + if (isGrouped()) { + return subDataSetList.size(); + } else { + return source.getRows(); } - + } public int getColumns() throws Exception { - if(isGrouped()){ - return getFields().size(); - }else{ - return source.getColumns(); + if (isGrouped()) { + return getFields().size(); + } else { + return source.getColumns(); } - + } @SuppressWarnings("unchecked") public T getData(int row, int col) throws Exception { - if(isGrouped()){ - int actualCol = getActualIndex(col); - int actualRow = getActualIndex(row); - Field field = getFields().get(actualCol); - if(AGGREGATE_TYPE.equals(field.getType())){ - //聚合字段 - return (T) getAggregateResult(field.getName()).getData(actualRow); - }else{ - //非聚合字段 - DynamicDataSet subDataSet = subDataSetList.get(actualRow); - return subDataSet.getData(subDataSet.getShowIndex(0), col); - } - }else{ - return source.getData(row, col); + if (isGrouped()) { + int actualCol = getActualIndex(col); + int actualRow = getActualIndex(row); + Field field = getFields().get(actualCol); + if (AGGREGATE_TYPE.equals(field.getType())) { + // 聚合字段 + return (T) getAggregateResult(field.getName()).getData(actualRow); + } else { + // 非聚合字段 + DynamicDataSet subDataSet = subDataSetList.get(actualRow); + return subDataSet.getData(subDataSet.getShowIndex(0), col); + } + } else { + return source.getData(row, col); } } public void setData(int row, int col, T data) throws Exception { - if(isGrouped()){ - int actualCol = getActualIndex(col); - int actualRow = getActualIndex(row); - Field field = getFields().get(actualCol); - if(AGGREGATE_TYPE.equals(field.getType())){ - //聚合字段 - getAggregateResult(field.getName()).setData(actualRow, data); - }else{ - //非聚合字段 - DynamicDataSet subDataSet = subDataSetList.get(actualRow); - subDataSet.setData(subDataSet.getShowIndex(0), col, data); - } - }else{ - source.setData(row, col, data); + if (isGrouped()) { + int actualCol = getActualIndex(col); + int actualRow = getActualIndex(row); + Field field = getFields().get(actualCol); + if (AGGREGATE_TYPE.equals(field.getType())) { + // 聚合字段 + getAggregateResult(field.getName()).setData(actualRow, data); + } else { + // 非聚合字段 + DynamicDataSet subDataSet = subDataSetList.get(actualRow); + subDataSet.setData(subDataSet.getShowIndex(0), col, data); + } + } else { + source.setData(row, col, data); } - + } public T getData(int col) throws Exception { - if(isGrouped()){ - return getData(getShowIndex(currentRow), col); - }else{ - return source.getData(col); + if (isGrouped()) { + return getData(getShowIndex(currentRow), col); + } else { + return source.getData(col); } - + } public void setData(int col, T data) throws Exception { - if(isGrouped()){ + if (isGrouped()) { setData(getShowIndex(currentRow), col, data); - }else{ + } else { source.setData(col, data); } } public List getGroups() { - return subDataSetList; + return subDataSetList; } - + /** * 获得指定级别的序表子集 + * * @param level * @return */ - public List getGroups(int level){ + public List getGroups(int level) { List list = new ArrayList(); - getGroups(this,level,list); + getGroups(this, level, list); return list; } - - /** * 获得未排序的序表子集 + * * @param ds * @return */ - public List getUnGroups(){ + public List getUnGroups() { List list = new ArrayList(); - getGroups(this,list); + getGroups(this, list); return list; } - - private void getGroups(MultiLevelGroupDataSet ds,int level,List list){ - if(ds.getLevel()==level){ - list.add(ds); - }else if( ds.getLevel() list) { + if (ds.getLevel() == level) { + list.add(ds); + } else if (ds.getLevel() < level) { + for (DynamicDataSet dataSet : ds.getGroups()) { + MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; + getGroups(multiLevelGroupDataSet, level, list); + } } } - - private void getGroups(MultiLevelGroupDataSet ds,List list){ - if(ds.isGrouped()){ - for(DynamicDataSet dataSet:ds.getGroups()){ - MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; - getGroups(multiLevelGroupDataSet,list); - } - }else{ - list.add(ds); + + private void getGroups(MultiLevelGroupDataSet ds, List list) { + if (ds.isGrouped()) { + for (DynamicDataSet dataSet : ds.getGroups()) { + MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; + getGroups(multiLevelGroupDataSet, list); + } + } else { + list.add(ds); } } - public void createAggregateResult(String aggregateName) { - AggregateResult result = new AggregateResult(aggregateName, subDataSetList.size()); + public void createAggregateResult(String aggregateName, Object... params) { + Iterator iterator = aggregateResultList.iterator(); + while(iterator.hasNext()) { + if(iterator.next().getName().equals(aggregateName)) { + iterator.remove(); + } + } + AggregateResult result; + if (subDataSetList.size() > 0) + result = new AggregateResult(aggregateName, subDataSetList.size(), params); + else + try { + result = new AggregateResult(aggregateName, source.getRows(), params); + } catch (Exception e) { + throw new RuntimeException(e); + } aggregateResultList.add(result); - Field aggregateField = new Field(aggregateName,aggregateName,AGGREGATE_TYPE); + Field aggregateField = new Field(aggregateName, aggregateName, AGGREGATE_TYPE); getFields().add(aggregateField); } @@ -326,34 +343,37 @@ public class MultiLevelGroupDataSet extends GroupDataSet { public GroupDataSet subGroup(int beginIndex, int endIndex) throws Exception { List newDataSetList = new ArrayList(); - for(DynamicDataSet dataSet:subDataSetList){ - MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; - newDataSetList.add(DataSetUtil.createDynamicDataSet(multiLevelGroupDataSet.getSource(), getActualIndex(beginIndex), getActualIndex(endIndex))); + for (DynamicDataSet dataSet : subDataSetList) { + MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; + newDataSetList.add(DataSetUtil.createDynamicDataSet(multiLevelGroupDataSet.getSource(), + getActualIndex(beginIndex), getActualIndex(endIndex))); } - MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(source,newDataSetList); + MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(source, newDataSetList); return multiLevelGroupDataSet; } public GroupDataSet subGroup(int beginIndex) throws Exception { List newDataSetList = new ArrayList(); - for(DynamicDataSet dataSet:subDataSetList){ - MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; - newDataSetList.add(DataSetUtil.createDynamicDataSet(multiLevelGroupDataSet.getSource(), getActualIndex(beginIndex), multiLevelGroupDataSet.getRows()-1)); + for (DynamicDataSet dataSet : subDataSetList) { + MultiLevelGroupDataSet multiLevelGroupDataSet = (MultiLevelGroupDataSet) dataSet; + newDataSetList.add(DataSetUtil.createDynamicDataSet(multiLevelGroupDataSet.getSource(), + getActualIndex(beginIndex), multiLevelGroupDataSet.getRows() - 1)); } - MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(source,newDataSetList); + MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(source, newDataSetList); return multiLevelGroupDataSet; } public List getAggregateResultList() throws Exception { return aggregateResultList; } - + /** * 底层API已经实现分组和未分组两种场景,所以可以直接使用统一接口创建新的序表 + * * @return * @throws Exception */ - private DataSet createDataSet() throws Exception { + private DataSet createDataSet() throws Exception { List newFields = new ArrayList(); for (Field field : getFields()) { newFields.add(field); @@ -361,9 +381,9 @@ public class MultiLevelGroupDataSet extends GroupDataSet { int row = getRows(); int col = getColumns(); Object[][] dataArray = new Object[row][]; - for(int i=0;i sortList = new ArrayList(); // 排序中间对象 - for (int i = 0; i < subDataSetList.size(); i++) { - Object[] rowInfo = new Object[getColumns() + 1]; // 多一位记录原始顺序 - for (int j = 0; j < getColumns(); j++) { + if (isGrouped()) { + List sortList = new ArrayList(); // 排序中间对象 + for (int i = 0; i < subDataSetList.size(); i++) { + Object[] rowInfo = new Object[getColumns() + 1]; // 多一位记录原始顺序 + for (int j = 0; j < getColumns(); j++) { rowInfo[j] = getData(getShowIndex(i), getShowIndex(j)); - } - rowInfo[getColumns()] = i; - sortList.add(rowInfo); - } - // 执行排序 - Collections.sort(sortList, c); - List newSubDataSetList = new ArrayList(); - List newAggregateResultList = new ArrayList(); - for (int i = 0; i < aggregateResultList.size(); i++) { + } + rowInfo[getColumns()] = i; + sortList.add(rowInfo); + } + // 执行排序 + Collections.sort(sortList, c); + List newSubDataSetList = new ArrayList(); + List newAggregateResultList = new ArrayList(); + for (int i = 0; i < aggregateResultList.size(); i++) { AggregateResult result = aggregateResultList.get(i); AggregateResult newResult = new AggregateResult(result.getName(), subDataSetList.size()); newAggregateResultList.add(newResult); - } - for (int i = 0; i < sortList.size(); i++) { + } + for (int i = 0; i < sortList.size(); i++) { int oldOrder = (Integer) sortList.get(i)[getColumns()]; // 设置普通字段数据 newSubDataSetList.add(subDataSetList.get(oldOrder)); @@ -456,25 +476,50 @@ public class MultiLevelGroupDataSet extends GroupDataSet { // 替换结果 subDataSetList = newSubDataSetList; aggregateResultList = newAggregateResultList; - }else{ - source.sort(c); + } else { + source.sort(c); } return this; } public int getCurrentRow() throws Exception { - if(isGrouped()){ + if (isGrouped()) { return getShowIndex(currentRow); - }else{ - return source.getCurrentRow(); + } else { + return source.getCurrentRow(); } } - - public String toString(){ - if(isGrouped()){ + + public String toString() { + if (isGrouped()) { return super.toString(); - }else{ - return source.toString(); + } else { + StringBuilder sb = new StringBuilder(); + try { + for (Field f : getFields()) { + if (!AGGREGATE_TYPE.equals(f.getType())) + sb.append(f.getName()).append(" "); + } + for (AggregateResult result : getAggregateResultList()) { + sb.append(result.getName()).append(" "); + } + sb.append("\n"); + for (int i = 0; i < source.getRows(); i++) { + for (int j = 0; j < source.getColumns(); j++) { + sb.append(getData(getShowIndex(i), getShowIndex(j))).append(" "); + } + for (AggregateResult result : getAggregateResultList()) { + sb.append(result.getData(i)).append(" "); + } + if (i != getRows() - 1) { + sb.append("\n"); + } + } + } catch (Exception e) { + // 可能会抛出异常 + throw new RuntimeException(e); + } + return sb.toString(); } } diff --git a/org.tinygroup.tinyscript/src/test/resources/group/group.tsf b/org.tinygroup.tinyscript/src/test/resources/group/group.tsf index 1ff9694998c39f97fb97d555e299125142202ca5..554be0d7a37e47202b6edc5593ec197f648b19c5 100644 --- a/org.tinygroup.tinyscript/src/test/resources/group/group.tsf +++ b/org.tinygroup.tinyscript/src/test/resources/group/group.tsf @@ -9,7 +9,10 @@ gs1 = ds.group("sex"); println("输出分组序表:"); println(gs1); -gs2 = ds.group("sex").groupStaged(AGE<=18,AGE>=18 && AGE <60 , AGE>=60); +gs2 = ds.group("sex"); +gs2 = gs2.avgGroup("age"); +gs2 = gs2.groupStaged(AGE<=18,AGE>=18 && AGE <60 , AGE>=60);//此处会对聚合结果进行更新 +println(gs2); level1 = gs2.getGroups(1); //获取第一级分组 println("一级分组个数:"+level1.size()); println("遍历第一级序表:");