From f36d9a9c466c8216525d49dadf2e94d2372f3a06 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Sun, 24 Dec 2017 15:30:25 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=AE=8C=E5=96=84=E5=88=86=E7=BB=84=E5=90=8E?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=81=9A=E5=90=88=E7=BB=93=E6=9E=9C=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=8F=90=E5=8D=87=E6=80=A7=E8=83=BD=E3=80=82?= =?UTF-8?q?2.=E7=9B=B8=E5=85=B3=E7=BB=93=E6=9E=84=E5=92=8C=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=A2=9E=E5=8A=A0it=E5=8F=98=E9=87=8F=E3=80=823.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9B=B8=E5=85=B3=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/list/FilterFunction.java | 2 + .../list/ListGroupDynamicFunction.java | 1 - .../list/ListGroupStagedFunction.java | 1 - .../function/list/RemoveFunction.java | 5 +- .../tinyscript/dataset/GroupDataSet.java | 3 +- .../function/AbstractGroupFunction.java | 14 ++-- .../function/DataSetFilterFunction.java | 56 ++++++------- .../function/DataSetFilterOneFunction.java | 2 + .../function/DataSetForEachFunction.java | 33 ++++---- .../function/DataSetGroupDynamicFunction.java | 81 ++++++++++--------- .../function/DataSetGroupFunction.java | 2 +- .../function/DataSetGroupStagedFunction.java | 4 +- .../function/DataSetRenameFunction.java | 9 +++ .../function/DataSetUpdateFunction.java | 81 ++++++++++--------- .../GroupDataSetAggregateFunction.java | 14 +--- .../function/GroupDataSetFilterFunction.java | 2 + .../dataset/impl/AggregateResult.java | 23 +++++- .../dataset/impl/MultiLevelGroupDataSet.java | 41 ++-------- .../src/test/resources/group/ListGroup.tsf | 3 - .../interpret/ScriptContextUtil.java | 2 +- 20 files changed, 197 insertions(+), 182 deletions(-) diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/FilterFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/FilterFunction.java index 3ba2ea0..46f75d6 100644 --- a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/FilterFunction.java +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/FilterFunction.java @@ -10,6 +10,7 @@ import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.impl.DefaultScriptContext; import org.tinygroup.tinyscript.interpret.LambdaFunction; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.ScriptContextUtil; /** * 序列过滤函数 @@ -55,6 +56,7 @@ public class FilterFunction extends AbstractScriptFunction { List result = new ArrayList(); for(Object obj:list){ + ScriptContextUtil.setCurData(subContext, obj); if((Boolean)function.execute(subContext, obj).getResult()){ result.add(obj); } diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupDynamicFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupDynamicFunction.java index 0566655..1853ee7 100644 --- a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupDynamicFunction.java +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupDynamicFunction.java @@ -54,7 +54,6 @@ public class ListGroupDynamicFunction extends AbstractScriptFunction { for (int i = 0; i < dataArray.size(); i++) { ScriptContext subContext = new DefaultScriptContext(); subContext.setParent(context); - subContext.put("it", dataArray.get(i)); ScriptContextUtil.setCurData(subContext, dataArray.get(i)); Object key = executeDynamicObject(expression, subContext); List group = result.get(key); diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupStagedFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupStagedFunction.java index b97f1c7..7536c35 100644 --- a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupStagedFunction.java +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/ListGroupStagedFunction.java @@ -57,7 +57,6 @@ public class ListGroupStagedFunction extends AbstractScriptFunction { String key = null; ScriptContext subContext = new DefaultScriptContext(); subContext.setParent(context); - subContext.put("it", dataArray.get(i)); ScriptContextUtil.setCurData(subContext, dataArray.get(i)); for (String expression : expressions) { if (executeDynamicBoolean(expression, subContext)) { diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/RemoveFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/RemoveFunction.java index 5b3584e..65e9ee4 100644 --- a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/RemoveFunction.java +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/list/RemoveFunction.java @@ -10,6 +10,7 @@ import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.impl.DefaultScriptContext; import org.tinygroup.tinyscript.interpret.LambdaFunction; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.ScriptContextUtil; import org.tinygroup.tinyscript.interpret.exception.NotMatchException; /** @@ -53,11 +54,11 @@ public class RemoveFunction extends AbstractScriptFunction { @SuppressWarnings("rawtypes") private List remove(ScriptContext context,List list,LambdaFunction function) throws Exception{ ScriptContext subContext = new DefaultScriptContext(); - subContext.setParent(context); - + subContext.setParent(context); Iterator it = list.iterator(); while(it.hasNext()){ Object obj = it.next(); + ScriptContextUtil.setCurData(subContext, obj); if(!(Boolean)function.execute(subContext, obj).getResult()){ it.remove(); } 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 ed98981..f1c1b8c 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 @@ -26,7 +26,8 @@ public abstract class GroupDataSet extends DynamicDataSet { * * @param aggregateName */ - public abstract void createAggregateResult(String aggregateName, Object... params); + public abstract void createAggregateResult(String aggregateName, Field field, String functionName, + Object... params); /** * 获取聚合结果 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 d22a923..b200230 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 @@ -12,6 +12,7 @@ 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.GroupDataSet; import org.tinygroup.tinyscript.dataset.impl.AggregateResult; import org.tinygroup.tinyscript.dataset.impl.MultiLevelGroupDataSet; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; @@ -111,14 +112,17 @@ public abstract class AbstractGroupFunction extends AbstractScriptFunction { return subContext; } - protected void updateAggregateResult(MultiLevelGroupDataSet multiLevelGroupDataSet) throws Exception { + protected void updateAggregateResult(List subDataSetList, + List aggregateResultList) throws Exception { GroupDataSetAggregateFunction aggregateFunction = BeanContainerFactory .getBeanContainer(getClass().getClassLoader()).getBean(GroupDataSetAggregateFunction.class); - for (AggregateResult result : multiLevelGroupDataSet.getAggregateResultList()) { - String fieldName = result.getName().split("_")[1]; - String functionName = result.getName().split("_")[0]; + for (AggregateResult result : aggregateResultList) { + String fieldName = result.getField().getName(); + String functionName = result.getFunctionName(); Object[] params = result.getParams(); - aggregateFunction.executeGroupDataSet(multiLevelGroupDataSet, fieldName, functionName, params); + for (MultiLevelGroupDataSet dataSet : subDataSetList) { + aggregateFunction.executeGroupDataSet((GroupDataSet) dataSet, fieldName, functionName, params); + } } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetFilterFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetFilterFunction.java index d8b0387..8d3b43b 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetFilterFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetFilterFunction.java @@ -15,9 +15,11 @@ import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.impl.DefaultScriptContext; import org.tinygroup.tinyscript.interpret.LambdaFunction; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.ScriptContextUtil; /** * 序表的过滤函数 + * * @author yancheng11334 * */ @@ -31,45 +33,45 @@ public class DataSetFilterFunction extends AbstractScriptFunction { return DataSet.class.getName(); } - 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(checkParameters(parameters, 2)){ + 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 (checkParameters(parameters, 2)) { AbstractDataSet dataSet = (AbstractDataSet) getValue(parameters[0]); - LambdaFunction function = (LambdaFunction) parameters[1]; - return filter(context,dataSet,function); + LambdaFunction function = (LambdaFunction) parameters[1]; + return filter(context, dataSet, function); } else { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - - }catch (ScriptException e) { + + } catch (ScriptException e) { throw e; } catch (Exception e) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - - private DataSet filter(ScriptContext context,AbstractDataSet dataSet,LambdaFunction function) throws Exception{ + + private DataSet filter(ScriptContext context, AbstractDataSet dataSet, LambdaFunction function) throws Exception { ScriptContext subContext = new DefaultScriptContext(); subContext.setParent(context); - + List result = new ArrayList(); - int rowNum = dataSet.getRows(); - for(int i=0;i subDataSetList = multiLevelGroupDataSet.getUnGroups(); - for(MultiLevelGroupDataSet subDataSet:subDataSetList){ - List list = group(subDataSet.getSource(),expression,context); + for (MultiLevelGroupDataSet subDataSet : subDataSetList) { + List list = group(subDataSet.getSource(), expression, context); subDataSet.setGroups(list); } - updateAggregateResult(multiLevelGroupDataSet); + updateAggregateResult(subDataSetList, multiLevelGroupDataSet.getAggregateResultList()); return multiLevelGroupDataSet; - }else{ - //首次分组 - List list = group(dataSet,expression,context); - MultiLevelGroupDataSet multiLevelGroupDataSet = new MultiLevelGroupDataSet(dataSet,list); + } else { + // 首次分组 + List list = group(dataSet, expression, 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 expression,ScriptContext context) throws Exception{ - Map result = new HashMap(); - try{ + + private List group(AbstractDataSet dataSet, String expression, ScriptContext context) + throws Exception { + Map result = new HashMap(); + try { int rowNum = dataSet.getRows(); - - //逐条遍历记录 - for(int i=0;i(result.values()); - }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/DataSetGroupFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetGroupFunction.java index 8a27e1a..53af69e 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 @@ -62,7 +62,7 @@ public class DataSetGroupFunction extends AbstractGroupFunction { List list = group(subDataSet.getSource(), fields); subDataSet.setGroups(list); } - updateAggregateResult(multiLevelGroupDataSet); + updateAggregateResult(subDataSetList, multiLevelGroupDataSet.getAggregateResultList()); return multiLevelGroupDataSet; } else { // 首次分组 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 a29263f..b574593 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 @@ -11,6 +11,7 @@ import org.tinygroup.tinyscript.ScriptSegment; import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DynamicDataSet; import org.tinygroup.tinyscript.dataset.GroupDataSet; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; import org.tinygroup.tinyscript.dataset.impl.MultiLevelGroupDataSet; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; @@ -60,7 +61,7 @@ public class DataSetGroupStagedFunction extends AbstractGroupFunction { List list = group(subDataSet.getSource(), expressions, context); subDataSet.setGroups(list); } - updateAggregateResult(multiLevelGroupDataSet); + updateAggregateResult(subDataSetList, multiLevelGroupDataSet.getAggregateResultList()); return multiLevelGroupDataSet; } else { // 首次分组 @@ -83,6 +84,7 @@ public class DataSetGroupStagedFunction extends AbstractGroupFunction { // 逐条遍历记录 for (int i = 0; i < rowNum; i++) { + ScriptContextUtil.setCurData(context, new DefaultDataSetRow(dataSet, dataSet.getShowIndex(i))); int showRow = dataSet.getShowIndex(i); String key = ""; for (String expression : expressions) { diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetRenameFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetRenameFunction.java index d3e779d..ebf3cf6 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetRenameFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetRenameFunction.java @@ -5,6 +5,8 @@ import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; import org.tinygroup.tinyscript.dataset.DataSet; import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.GroupDataSet; +import org.tinygroup.tinyscript.dataset.impl.AggregateResult; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; @@ -70,6 +72,13 @@ public class DataSetRenameFunction extends AbstractScriptFunction { newField.setTitle(oldField.getTitle()); newField.setType(oldField.getType()); dataSet.getFields().set(col, newField); + if ("aggregate".equals(oldField.getType()) && dataSet instanceof GroupDataSet) { + for (AggregateResult result : ((GroupDataSet) dataSet).getAggregateResultList()) { + if (oldField.getName().equals(result.getName())) { + result.setName(newField.getName()); + } + } + } return dataSet; } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUpdateFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUpdateFunction.java index 1a61a22..99e59e3 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUpdateFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUpdateFunction.java @@ -46,34 +46,34 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { AbstractDataSet dataSet = (AbstractDataSet) getValue(parameters[0]); String colName = (String) getValue(parameters[1]); String expression = getExpression(parameters[2]); - - //获取更新的列下标 + + // 获取更新的列下标 int col = DataSetUtil.getFieldIndex(dataSet, colName); if (col < 0) { throw new ScriptException( ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.notfound", colName)); } - - //获取包含数组的列下标 - Set columns = DataSetUtil.getFieldArray(dataSet, expression); - - //获取lambda表达式 + + // 获取包含数组的列下标 + Set columns = DataSetUtil.getFieldArray(dataSet, expression); + + // 获取lambda表达式 LambdaFunction lambdaFunction = getLambdaFunction(parameters[2]); - - if(lambdaFunction!=null){ - return updateByLambda(dataSet, col, columns,lambdaFunction, context); - }else{ - return updateByExpression(dataSet, col, columns,expression, context); + + if (lambdaFunction != null) { + return updateByLambda(dataSet, col, columns, lambdaFunction, context); + } else { + return updateByExpression(dataSet, col, columns, expression, context); } - + } else if (parameters != null && parameters.length == 4 && parameters[0] != null && parameters[1] != null) { - //重构结构 + // 重构结构 DynamicDataSet dynamicDataSet = (DynamicDataSet) getValue(parameters[0]); LambdaFunction lambdaFunction = (LambdaFunction) getValue(parameters[1]); List insertFields = convertFields(getValue(parameters[2])); List deleteFields = convertFields(getValue(parameters[3])); - - return updateField(dynamicDataSet,lambdaFunction,insertFields,deleteFields,context); + + return updateField(dynamicDataSet, lambdaFunction, insertFields, deleteFields, context); } else { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } @@ -83,8 +83,9 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - - private DynamicDataSet updateField(DynamicDataSet dynamicDataSet,LambdaFunction lambdaFunction,List insertFields,List deleteFields,ScriptContext context) throws Exception { + + private DynamicDataSet updateField(DynamicDataSet dynamicDataSet, LambdaFunction lambdaFunction, + List insertFields, List deleteFields, ScriptContext context) throws Exception { if (!CollectionUtil.isEmpty(insertFields)) { // 执行插入字段逻辑 for (Field field : insertFields) { @@ -113,8 +114,8 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { // 加载全部参数 for (int j = 0; j < dynamicDataSet.getFields().size(); j++) { Field f = dynamicDataSet.getFields().get(j); - subContext.put(f.getName(), dynamicDataSet.getData(dynamicDataSet.getShowIndex(i), - dynamicDataSet.getShowIndex(j))); + subContext.put(f.getName(), + dynamicDataSet.getData(dynamicDataSet.getShowIndex(i), dynamicDataSet.getShowIndex(j))); } // 动态执行lambda表达式 lambdaFunction.execute(subContext); @@ -136,6 +137,7 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { } return dynamicDataSet; } + /** * 转换字段信息 * @@ -176,19 +178,19 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } } - - private LambdaFunction getLambdaFunction(Object obj){ - try{ + + private LambdaFunction getLambdaFunction(Object obj) { + try { return (LambdaFunction) getValue(obj); - }catch(Exception e){ - //忽略异常 + } catch (Exception e) { + // 忽略异常 return null; } } - - private DataSet updateByExpression(AbstractDataSet dataSet, int col, Set columns,String expression, ScriptContext context) - throws ScriptException { - try{ + + private DataSet updateByExpression(AbstractDataSet dataSet, int col, Set columns, String expression, + ScriptContext context) throws ScriptException { + try { String runExpression = ScriptContextUtil.convertExpression(expression); if (dataSet instanceof GroupDataSet) { GroupDataSet groupDataSet = (GroupDataSet) dataSet; @@ -199,16 +201,16 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { updateRowWithExpression(dataSet, col, runExpression, columns, context); } return dataSet; - }catch (ScriptException e) { + } catch (ScriptException e) { throw e; } catch (Exception e) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - - private DataSet updateByLambda(AbstractDataSet dataSet, int col, Set columns,LambdaFunction function, ScriptContext context) - throws ScriptException { - try{ + + private DataSet updateByLambda(AbstractDataSet dataSet, int col, Set columns, LambdaFunction function, + ScriptContext context) throws ScriptException { + try { if (dataSet instanceof GroupDataSet) { GroupDataSet groupDataSet = (GroupDataSet) dataSet; for (DynamicDataSet subDs : groupDataSet.getGroups()) { @@ -218,14 +220,13 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { updateRowWithLambda(dataSet, col, function, columns, context); } return dataSet; - }catch (ScriptException e) { + } catch (ScriptException e) { throw e; } catch (Exception e) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - // 参数为实际下标 private void updateRowWithExpression(AbstractDataSet dataSet, int col, String expression, Set columns, ScriptContext context) throws Exception { @@ -236,6 +237,7 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { subContext.setParent(context); subContext.put("$currentRow", showRow); setRowValue(subContext, dataSet, columns, i); + ScriptContextUtil.setCurData(subContext, DataSetUtil.createDataSetRow(dataSet, dataSet.getShowIndex(i))); try { Object value = executeDynamicObject(expression, subContext); dataSet.setData(showRow, showCol, value); @@ -246,7 +248,7 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { } } - + private void updateRowWithLambda(AbstractDataSet dataSet, int col, LambdaFunction function, Set columns, ScriptContext context) throws Exception { int showCol = dataSet.getShowIndex(col); @@ -254,11 +256,12 @@ public class DataSetUpdateFunction extends AbstractScriptFunction { int showRow = dataSet.getShowIndex(i); ScriptContext subContext = new DefaultScriptContext(); subContext.setParent(context); - subContext.put("$currentRow",showRow); + subContext.put("$currentRow", showRow); setRowValue(subContext, dataSet, columns, i); + ScriptContextUtil.setCurData(subContext, DataSetUtil.createDataSetRow(dataSet, dataSet.getShowIndex(i))); try { ScriptResult value = function.execute(subContext, showRow); - dataSet.setData(showRow, showCol,value.getResult()); + dataSet.setData(showRow, showCol, value.getResult()); } catch (ScriptException e) { // 忽略脚本异常 continue; 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 e46846d..7867f9e 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,7 +11,6 @@ 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; @@ -63,18 +62,11 @@ public class GroupDataSetAggregateFunction extends DynamicNameScriptFunction { protected Object executeGroupDataSet(GroupDataSet groupDataSet, String fieldName, String functionName, Object... params) throws Exception { String aggregateName = createAggregateName(functionName, fieldName); - groupDataSet.createAggregateResult(aggregateName); + groupDataSet.createAggregateResult(aggregateName, + groupDataSet.getFields().get(DataSetUtil.getFieldIndex(groupDataSet, fieldName)), functionName, params); int col = getColumn(groupDataSet, fieldName); for (int i = 0; i < groupDataSet.getRows(); 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); - } + DynamicDataSet subDataSet = groupDataSet.getGroups().get(i); 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/function/GroupDataSetFilterFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetFilterFunction.java index b1f603c..f8b923c 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetFilterFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetFilterFunction.java @@ -17,6 +17,7 @@ import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.impl.DefaultScriptContext; import org.tinygroup.tinyscript.interpret.LambdaFunction; import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.interpret.ScriptContextUtil; import org.tinygroup.tinyscript.interpret.call.FunctionCallExpressionParameter; public class GroupDataSetFilterFunction extends AbstractScriptFunction { @@ -71,6 +72,7 @@ public class GroupDataSetFilterFunction extends AbstractScriptFunction { subContext.put("$currentRow", groupDataSet.getShowIndex(i)); DataSetUtil.setRowValue(subContext, subDs, columns, i); setAggregateValue(subContext,groupDataSet,dsNum); + ScriptContextUtil.setCurData(subContext, DataSetUtil.createDataSetRow(groupDataSet, groupDataSet.getShowIndex(i))); if ((Boolean) expression.execute(subContext).getResult()) { matchRows.add(i); } 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 17647e3..d61577b 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 @@ -1,10 +1,13 @@ package org.tinygroup.tinyscript.dataset.impl; -public class AggregateResult { +import org.tinygroup.tinyscript.dataset.Field; +public class AggregateResult { String aggregateName; // 聚合名 Object[] params;// 聚合的额外参数(当更新分组信息时同步更新聚合结果需要用到 Object[] array; // 聚合结果 + Field field;//聚合结果对应的字段 + String functionName;//聚合结果对应的方法名 public String getName() { return aggregateName; @@ -13,11 +16,13 @@ public class AggregateResult { public Object[] getParams() { return params; } - - public AggregateResult(String name, int size, Object... params) { + + public AggregateResult(String name, int size, Field field, String functionName, Object... params) { this.params = params; this.aggregateName = name; this.array = new Object[size]; + this.field = field; + this.functionName = functionName; } public Object getData(int row) { @@ -27,4 +32,16 @@ public class AggregateResult { public void setData(int row, Object value) { array[row] = value; } + + public Field getField() { + return field; + } + + public String getFunctionName() { + return functionName; + } + + public void setName(String aggregateName) { + this.aggregateName = aggregateName; + } } 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 e86d35c..389a9f5 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 @@ -311,19 +311,19 @@ public class MultiLevelGroupDataSet extends GroupDataSet { } } - public void createAggregateResult(String aggregateName, Object... params) { + public void createAggregateResult(String aggregateName, Field field, String functionName, Object... params) { Iterator iterator = aggregateResultList.iterator(); - while(iterator.hasNext()) { - if(iterator.next().getName().equals(aggregateName)) { + while (iterator.hasNext()) { + if (iterator.next().getName().equals(aggregateName)) { iterator.remove(); } } AggregateResult result; if (subDataSetList.size() > 0) - result = new AggregateResult(aggregateName, subDataSetList.size(), params); + result = new AggregateResult(aggregateName, subDataSetList.size(), field, functionName, params); else try { - result = new AggregateResult(aggregateName, source.getRows(), params); + result = new AggregateResult(aggregateName, source.getRows(), field, functionName, params); } catch (Exception e) { throw new RuntimeException(e); } @@ -459,7 +459,8 @@ public class MultiLevelGroupDataSet extends GroupDataSet { 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()); + AggregateResult newResult = new AggregateResult(result.getName(), subDataSetList.size(), + result.getField(), result.getFunctionName(), result.getParams()); newAggregateResultList.add(newResult); } for (int i = 0; i < sortList.size(); i++) { @@ -494,33 +495,7 @@ public class MultiLevelGroupDataSet extends GroupDataSet { if (isGrouped()) { return super.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(); + return source.toString(); } } - } diff --git a/org.tinygroup.tinyscript/src/test/resources/group/ListGroup.tsf b/org.tinygroup.tinyscript/src/test/resources/group/ListGroup.tsf index 0990fff..b58459f 100644 --- a/org.tinygroup.tinyscript/src/test/resources/group/ListGroup.tsf +++ b/org.tinygroup.tinyscript/src/test/resources/group/ListGroup.tsf @@ -1,6 +1,3 @@ list = [1..5]; -println(list.groupStaged(curData<3)); -println(list.groupDynamic(curData%2)); - println(list.groupStaged(it<3)); println(list.groupDynamic(it%2)); \ No newline at end of file diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java index b51cca3..82d5913 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/ScriptContextUtil.java @@ -24,7 +24,7 @@ public class ScriptContextUtil { private static final String DATASET_ROWID = "$rowId"; - private static final String CURRENT_DATA = "$curData"; + private static final String CURRENT_DATA = "$it"; private static final String CUSTOM_BEAN_NAME = "customBean"; -- Gitee