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 a7cddfad316b47e65e80b47444df715115713f05..d424accc94d0eb31b9e0b47f152fa72f85ca9bc9 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 @@ -1,6 +1,7 @@ package org.tinygroup.tinyscript.dataset.function; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -16,86 +17,91 @@ import org.tinygroup.tinyscript.dataset.impl.DefaultGroupDataSet; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.impl.DefaultScriptContext; -import org.tinygroup.tinyscript.interpret.ScriptContextUtil; +import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.interpret.call.FunctionCallExpressionParameter; public class GroupDataSetFilterFunction extends AbstractScriptFunction { public String getNames() { return "filterGroup"; } - + public String getBindingTypes() { return GroupDataSet.class.getName(); } - - public boolean enableExpressionParameter(){ + + public boolean enableExpressionParameter() { return true; } - 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("filterGroup函数的参数为空!"); - } else if(checkParameters(parameters, 2)){ - GroupDataSet groupDataSet = (GroupDataSet)getValue(parameters[0]); - String expression = getExpression(parameters[1]); - return filterGroup(context,groupDataSet,expression); + } else if (checkParameters(parameters, 2)) { + GroupDataSet groupDataSet = (GroupDataSet) getValue(parameters[0]); + LambdaFunction expression = (LambdaFunction) (((FunctionCallExpressionParameter) parameters[1]).eval()); + return filterGroup(context, groupDataSet, expression); } else { throw new ScriptException("filterGroup函数的参数格式不正确"); } - - }catch (ScriptException e) { + + } catch (ScriptException e) { throw e; } catch (Exception e) { throw new ScriptException("filterGroup函数的参数格式不正确!", e); } } - - private GroupDataSet filterGroup(ScriptContext context,GroupDataSet groupDataSet,String expression) throws Exception{ - - Set columns = DataSetUtil.getFieldArray(groupDataSet, expression); - expression = ScriptContextUtil.convertExpression(expression); - + + private Object filterGroup(ScriptContext context, GroupDataSet groupDataSet, LambdaFunction expression) + throws Exception { List newList = new ArrayList(); - - for(int dsNum =0; dsNum columns = new HashSet(); + for (int j = 0; j < groupDataSet.getFields().size(); j++) { + columns.add(j + 1); + } + + for (int dsNum = 0; dsNum < groupDataSet.getGroups().size(); dsNum++) { List matchRows = new ArrayList(); DynamicDataSet subDs = groupDataSet.getGroups().get(dsNum); - for(int i=0;i aggregateResultList,int row) throws Exception{ - for(AggregateResult result:aggregateResultList){ + + private void setAggregateValue(ScriptContext context, AbstractDataSet dataSet, + List aggregateResultList, int row) throws Exception { + for (AggregateResult result : aggregateResultList) { context.put(result.getName(), result.getData(row)); } } - - private void setRowValue(ScriptContext context,AbstractDataSet dataSet,Set columns,int row) throws Exception{ - for(int j=0;j columns, int row) + throws Exception { + for (int j = 0; j < dataSet.getColumns(); j++) { Field field = dataSet.getFields().get(j); - if(columns!=null && columns.contains(j)){ - //存在字段数组形式 - context.put(field.getName(),DataSetUtil.createDataSetColumn(dataSet, dataSet.getShowIndex(j))); - }else{ - //直接赋值 - context.put(field.getName(), dataSet.getData(dataSet.getShowIndex(row), dataSet.getShowIndex(j))); //设置行参数上下文 + if (columns != null && columns.contains(j)) { + // 存在字段数组形式 + context.put(field.getName(), DataSetUtil.createDataSetColumn(dataSet, dataSet.getShowIndex(j))); + } else { + // 直接赋值 + context.put(field.getName(), dataSet.getData(dataSet.getShowIndex(row), dataSet.getShowIndex(j))); // 设置行参数上下文 } - + } } diff --git a/org.tinygroup.tinyscript/src/test/resources/example/edu_grade.txt b/org.tinygroup.tinyscript/src/test/resources/example/edu_grade.txt new file mode 100644 index 0000000000000000000000000000000000000000..f542e6f496733ed7ef826dfc218768ecf99a5978 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/edu_grade.txt @@ -0,0 +1,13 @@ +id outid class_name score credit exam_natures grade_level +486183 2013013123 12457011 60 3 期末考试 大一第1学期 +486184 2013013123 12457012 70 4 期末考试 大二第1学期 +486185 2013013123 12457013 55 1 期末考试 大一第1学期 +486186 2013013123 12457021 合格 5 期末考试 大一第1学期 +486187 2013013123 12457022 60 3 期末考试 大一第1学期 +486188 2013013123 12457031 优 6 期末考试 大三第2学期 +486189 2013013123 12457032 85 3 期末考试 大一第1学期 +486190 2013013123 12457041 40 2 期末考试 大一第1学期 +486191 2013013123 12457042 良 3 期末考试 大四第4学期 +486192 2013013123 12457051 95 1 期末考试 大一第1学期 +486193 2013013123 12457052 90 3 期末考试 大一第1学期 +486194 2013013124 12457052 90 3 期末考试 大一第1学期 diff --git a/org.tinygroup.tinyscript/src/test/resources/example/own_school_org.txt b/org.tinygroup.tinyscript/src/test/resources/example/own_school_org.txt new file mode 100644 index 0000000000000000000000000000000000000000..725cbba2a76c0eaa4f9fb5c12769ed8525ed34bf --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/own_school_org.txt @@ -0,0 +1,51 @@ +id school_code school_name faculty_code faculty_name major_code major_name class_code +1 slg 苏州理工学院 11 船舶与建筑工程学院 45701 船舶与海洋工程 12457011 +2 slg 苏州理工学院 11 船舶与建筑工程学院 45701 船舶与海洋工程 12457012 +3 slg 苏州理工学院 11 船舶与建筑工程学院 45701 船舶与海洋工程 12457013 +4 slg 苏州理工学院 11 船舶与建筑工程学院 45702 土木工程 12457021 +5 slg 苏州理工学院 11 船舶与建筑工程学院 45702 土木工程 12457022 +6 slg 苏州理工学院 11 船舶与建筑工程学院 45703 工程管理 12457031 +7 slg 苏州理工学院 11 船舶与建筑工程学院 45703 工程管理 12457032 +8 slg 苏州理工学院 14 机电与动力工程学院 45704 机械设计制造及其自动化 12457041 +9 slg 苏州理工学院 14 机电与动力工程学院 45704 机械设计制造及其自动化 12457042 +10 slg 苏州理工学院 14 机电与动力工程学院 45705 机械电子工程 12457051 +11 slg 苏州理工学院 14 机电与动力工程学院 45705 机械电子工程 12457052 +12 slg 苏州理工学院 14 机电与动力工程学院 45706 热能与动力工程 12457061 +13 slg 苏州理工学院 14 机电与动力工程学院 45706 热能与动力工程 12457062 +14 slg 苏州理工学院 16 冶金与材料工程学院 45707 材料成型及控制工程 12457071 +15 slg 苏州理工学院 16 冶金与材料工程学院 45707 材料成型及控制工程 12457072 +16 slg 苏州理工学院 16 冶金与材料工程学院 45707 材料成型及控制工程 12457081 +17 slg 苏州理工学院 16 冶金与材料工程学院 45707 材料成型及控制工程 12457082 +18 slg 苏州理工学院 16 冶金与材料工程学院 45709 焊接技术与工程 12457091 +19 slg 苏州理工学院 16 冶金与材料工程学院 45709 焊接技术与工程 12457092 +20 slg 苏州理工学院 12 电气与信息工程学院 45710 电子信息工程 12457101 +21 slg 苏州理工学院 12 电气与信息工程学院 45710 电子信息工程 12457102 +22 slg 苏州理工学院 12 电气与信息工程学院 45711 通信工程 12457111 +23 slg 苏州理工学院 12 电气与信息工程学院 45711 通信工程 12457112 +24 slg 苏州理工学院 12 电气与信息工程学院 45712 电气工程及其自动化 12457121 +25 slg 苏州理工学院 12 电气与信息工程学院 45712 电气工程及其自动化 12457122 +26 slg 苏州理工学院 12 电气与信息工程学院 45713 计算机科学与技术 12457131 +27 slg 苏州理工学院 12 电气与信息工程学院 45713 计算机科学与技术 12457132 +28 slg 苏州理工学院 15 商学院 45714 物流管理 12457141 +29 slg 苏州理工学院 15 商学院 45714 物流管理 12457142 +30 slg 苏州理工学院 15 商学院 45715 经济学(国际贸易方向) 12457151 +31 slg 苏州理工学院 15 商学院 45715 经济学(国际贸易方向) 12457152 +32 slg 苏州理工学院 15 商学院 45716 工商管理 12457161 +33 slg 苏州理工学院 15 商学院 45716 工商管理 12457162 +34 slg 苏州理工学院 15 商学院 45717 人力资源管理 12457171 +35 slg 苏州理工学院 13 公共教育学院 45718 社会体育 12457181 +36 slg 苏州理工学院 13 公共教育学院 45719 英语 12457191 +37 slg 苏州理工学院 13 公共教育学院 45719 英语 12457192 +38 slg 苏州理工学院 14 机电与动力工程学院 45704 机械设计制造及其自动化 13457211 +39 slg 苏州理工学院 14 机电与动力工程学院 45704 机械设计制造及其自动化 13457212 +40 slg 苏州理工学院 14 机电与动力工程学院 45704 机械设计制造及其自动化 13457213 +41 slg 苏州理工学院 14 机电与动力工程学院 45705 机械电子工程 13457221 +42 slg 苏州理工学院 14 机电与动力工程学院 45705 机械电子工程 13457222 +43 slg 苏州理工学院 14 机电与动力工程学院 45723 能源与动力工程 13457231 +44 slg 苏州理工学院 14 机电与动力工程学院 45723 能源与动力工程 13457232 +45 slg 苏州理工学院 14 机电与动力工程学院 45724 轮机工程 13457241 +46 slg 苏州理工学院 14 机电与动力工程学院 45724 轮机工程 13457242 +47 slg 苏州理工学院 12 电气与信息工程学院 45710 电子信息工程 13457311 +48 slg 苏州理工学院 12 电气与信息工程学院 45710 电子信息工程 13457312 +49 slg 苏州理工学院 12 电气与信息工程学院 45711 通信工程 13457321 +50 slg 苏州理工学院 12 电气与信息工程学院 45711 通信工程 13457322 \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/example/sql.ts b/org.tinygroup.tinyscript/src/test/resources/example/sql.ts new file mode 100644 index 0000000000000000000000000000000000000000..4471b9841538280222288ebb91b22702e6bd659d --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/sql.ts @@ -0,0 +1,16 @@ +dataSet1 = readTxt("/example/own_school_org.txt"); +dataSet2 = readTxt("/example/edu_grade.txt"); +//============================================================================== + +result = dataSet2.match(dataSet1,class_code==class_name).group("outid","grade_level").insertColumn("total_num").countGroup("score"); +for(i = 1;i<=result.getRows();i++){ + result[i][16] = result[i][17]; +} +passresult = result.filterGroup(()->{return (score[0] in ["中", "通过", "良", "优", "及格", "合格"])||(int(score[0])>=60&&int(score[0])<=100);}); +passresult.countGroup("score"); + + +println("grade_level\toutid\tpass_num\ttotal_num"); +for(i = 1;i<=result.getRows();i++){ + println(result[i]["grade_level"]+" "+result[i]["outid"]+" "+passresult[i][17]+" "+result[i][16]); +} \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/stock.tinyscript b/org.tinygroup.tinyscript/src/test/resources/stock.tinyscript index 642e60697ea2a9cfb1dc1a9df3326662fcb6f3db..865ec63f872587b4fe2a55f93c74d566359abce1 100644 --- a/org.tinygroup.tinyscript/src/test/resources/stock.tinyscript +++ b/org.tinygroup.tinyscript/src/test/resources/stock.tinyscript @@ -12,7 +12,7 @@ class Example6 { groupds =ds.insertColumn(3,"UP").double("CL").group("CODE").sortGroup("DT ASC"); groupds.subGroup(1,1).update("UP",0d); //每月的第一天涨停率为0 groupds.update("UP",(CL[0]-CL[-1])/CL[-1]); //之后的每天统计当天的涨停率。 - resultds = groupds.filterGroup(UP[0]>ratio && UP[1]>ratio && UP[2]>ratio); + resultds = groupds.filterGroup(()->{return UP[0]>ratio && UP[1]>ratio && UP[2]>ratio;}); return resultds; } @@ -29,17 +29,17 @@ class Example6 { /* 统计订购产品的客户账户余额 */ countBalance(){ - customerDs = readTxt("src/test/resources/Customers.txt").double("acct_balance"); - orderDs = readTxt("src/test/resources/Orders.txt"); - orderDetailDs = readTxt("src/test/resources/OrderDetails.txt"); - productDs = readTxt("src/test/resources/Products2.txt"); + customerDs = readTxt("/Customers.txt").double("acct_balance"); + orderDs = readTxt("/Orders.txt"); + orderDetailDs = readTxt("/OrderDetails.txt"); + productDs = readTxt("/Products2.txt"); tempDs = orderDetailDs.join(orderDs,order_id=order_id).join(customerDs ,customer_id=customer_id).copy().select("customer_id","order_id","item_id","acct_balance"); //关联前三张表 groupDs = tempDs.group("customer_id"); //按客户分组 groupDs.distinctGroup("item_id"); //统计分组客户消费的产品 num = productDs.getRows(); //统计全部产品数目 - allProductDs = groupDs.filterGroup(distinctGroup_item_id.size()==num); //购买全部产品的客户分组集 - otherDs = groupDs.filterGroup("distinctGroup_item_id.size() < num"); //购买部分产品的客户分组集 + allProductDs = groupDs.filterGroup(()->{return distinctGroup_item_id.size()==num;}); //购买全部产品的客户分组集 + otherDs = groupDs.filterGroup(()->{return (distinctGroup_item_id.size() < num);}); //购买部分产品的客户分组集 balance1 = allProductDs.avg("acct_balance"); balance2 = otherDs.avg("acct_balance"); System.out.println("balance1="+balance1+" balance2="+balance2); @@ -47,8 +47,8 @@ class Example6 { /* 统计某年的大客户 */ countVip(){ - contractDs = readTxt("src/test/resources/Contract.txt").double("Amount"); - clientDs = readTxt("src/test/resources/Client.txt"); + contractDs = readTxt("/Contract.txt").double("Amount"); + clientDs = readTxt("/Client.txt"); firstDs = contractDs.filter(()->{return SellDate.startsWith("1998");}).join(clientDs,Client = ID); //过滤1998年的数据,并关联client表 groupDs = firstDs.select("Name","Amount").group("Name"); //保留计算字段,并按用户分组 groupDs.sumGroup("Amount"); //统计每个用户的金额