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 3ba2ea0b2002a007f75b14ec6c1b583baee4c835..46f75d6aa16cbbc5686eb8e4875de74b88f15e6f 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 0566655dbedea179f203fa0393a6dbc286720f6c..1853ee7eaedd7537965b6a250427d1b67ba16430 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 b97f1c7a4401b709b6a5f1361c4bb72b3d4072ed..7536c358756992d5ac1f45e24d06d4bb99010f28 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 5b3584eae6026a2d5512cf203322e9861f3f4f34..65e9ee4d7a8c7c2c2e6b29b4d108978342049c83 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 ed98981bee30fdedf939f12b42662bed3bd0de26..f1c1b8c011fd283063c98e950bfb6e7d1aba83f7 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 d22a9234dc9769f3cb0a6aeaf4c0050aeb624e3f..b200230a40a1ea375364b090b479e1186a4bf68e 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 d8b038791bfaa77df71e9993f33e6e312c052b90..8d3b43bf0d470ffe096503f0706fea1740ab21c2 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 8a27e1a64d9a005f97efe9ec37089fd054eeb23a..53af69e4b9bb18cc47410ad982db4b37612adbf3 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 a29263f7e26718afa8499ef532ff4e85bbc91c22..b574593129591e34633614e4f9784cd3adeaa4b1 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 d3e779d0d3f69a25cf49a1b297afac454b4ab15e..ebf3cf60c489dd1b1449d585181259ea17b246df 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 1a61a221503f3bbdcef2a571c6792f4aa10e214e..99e59e3a1de43e079b4d0498112c9f66c57b402d 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 e46846dfca1aed6741996b65126c593a47bc3534..7867f9efd094f4b29543fd61faef1c738dd020dc 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 b1f603c2c6d04b7a9684aa47aa885447066f8b6d..f8b923c10631d1e5713f19f9011fb2c4443b4469 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 17647e3cde443b70d0aacb8468ff788fda13378f..d61577b0ca31ad4a031eb047a8ebf41398b60022 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 e86d35c721bf4fee0145f62a84daa3b033e8e014..389a9f5937aa6221f365ddc16e3efa4e1440ae03 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 0990fffb420a11e63847a5223488454c87f653eb..b58459f95c05d9bd8df41693278e4e986588dbc9 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 b51cca3379426a62545579b171f8080cc74385bd..82d5913a4f0bdffe1f28bd5f0ccedb9a91519a74 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";