From 97f1b80c22e7c21cd0cc8c4ae576b6d53c412ddc Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Mon, 25 Sep 2017 20:20:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=88=A4=E6=96=ADfield?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E9=80=BB=E8=BE=91=EF=BC=88field=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E5=8F=AF=E4=BB=A5=E4=B8=8D=E4=B8=80=E6=A0=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/tinygroup/tinyscript/dataset/Field.java | 4 ++++ .../function/AbstractDataSetOperateFunction.java | 12 +++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/Field.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/Field.java index fd3c9f2..00303aa 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/Field.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/Field.java @@ -48,6 +48,10 @@ public final class Field { && this.title.equals(((Field) field).getTitle()); } + public int hashCode() { + return name.hashCode() + type.hashCode() + title.hashCode(); + } + public String toString() { return "Field [name=" + name + ", title=" + title + ", type=" + type + "]"; } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java index 85ed6b5..c5abb6a 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java @@ -1,9 +1,11 @@ package org.tinygroup.tinyscript.dataset.function; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.dataset.AbstractDataSet; @@ -50,8 +52,6 @@ public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunct return pksIndex; } - - protected Map createMapDataSetRows(AbstractDataSet dataSet, Object pks, ScriptContext context) throws Exception { Map result = new LinkedHashMap(); @@ -96,10 +96,12 @@ public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunct if (dataSet1.getColumns() != dataSet2.getColumns()) { return false; } else { + Set fields = new HashSet(); for (int i = 0; i < dataSet1.getFields().size(); i++) { - Field field1 = dataSet1.getFields().get(i); - Field field2 = dataSet2.getFields().get(i); - if (!field1.equals(field2)) { + fields.add(dataSet1.getFields().get(i)); + } + for (int i = 0; i < dataSet2.getFields().size(); i++) { + if (!fields.contains(dataSet2.getFields().get(i))) { return false; } } -- Gitee From 1c276339c0cd002e3fb569cf5159922af7802414 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Tue, 26 Sep 2017 17:35:33 +0800 Subject: [PATCH 2/2] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0filterone=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E3=80=822.=E5=A2=9E=E5=8A=A0map=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E3=80=823.=E5=A2=9E=E5=8A=A0=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/map/CreateMapFunction.java | 42 +++++++++++ .../src/main/resources/collection.beans.xml | 4 ++ .../function/DataSetFilterOneFunction.java | 69 +++++++++++++++++++ .../function/GroupDataSetFilterFunction.java | 20 +----- .../tinyscript/dataset/util/DataSetUtil.java | 15 ++++ .../src/main/resources/dataset.beans.xml | 4 ++ .../impl/DefaultTinyScriptEngine.java | 4 ++ .../resources/dataSetExample/filterone.ts | 3 + .../src/test/resources/dataSetExample/map.ts | 9 +++ 9 files changed, 152 insertions(+), 18 deletions(-) create mode 100644 org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/map/CreateMapFunction.java create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetFilterOneFunction.java create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/filterone.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/map.ts diff --git a/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/map/CreateMapFunction.java b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/map/CreateMapFunction.java new file mode 100644 index 0000000..56e2fc7 --- /dev/null +++ b/org.tinygroup.tinyscript.collection/src/main/java/org/tinygroup/tinyscript/collection/function/map/CreateMapFunction.java @@ -0,0 +1,42 @@ +package org.tinygroup.tinyscript.collection.function.map; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; + +public class CreateMapFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "map"; + } + + @Override + 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)) { + List key = (List) parameters[0]; + List value = (List) parameters[1]; + int size = key.size() <= value.size() ? key.size() : value.size(); + Map result = new HashMap(); + for (int i = 0; i < size; i++) { + result.put(key.get(i), value.get(i)); + } + return result; + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + +} diff --git a/org.tinygroup.tinyscript.collection/src/main/resources/collection.beans.xml b/org.tinygroup.tinyscript.collection/src/main/resources/collection.beans.xml index f49e035..64b6187 100644 --- a/org.tinygroup.tinyscript.collection/src/main/resources/collection.beans.xml +++ b/org.tinygroup.tinyscript.collection/src/main/resources/collection.beans.xml @@ -110,4 +110,8 @@ + + + diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetFilterOneFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetFilterOneFunction.java new file mode 100644 index 0000000..714ae52 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetFilterOneFunction.java @@ -0,0 +1,69 @@ +package org.tinygroup.tinyscript.dataset.function; + +import java.util.HashSet; +import java.util.Set; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.impl.DefaultScriptContext; +import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; + +public class DataSetFilterOneFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "filterOne"; + } + + public String getBindingTypes() { + return DataSet.class.getName(); + } + + @Override + 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 expression = (LambdaFunction) parameters[1]; + return filterOne(dataSet, expression, context); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + + } + + private DataSetRow filterOne(AbstractDataSet dataSet, LambdaFunction filterFunction, ScriptContext context) + throws Exception { + Set columns = new HashSet(); + for (int j = 0; j < dataSet.getFields().size(); j++) { + columns.add(j); + } + + for (int i = 0; i < dataSet.getRows(); i++) { + DataSetRow dataSetRow = DataSetUtil.createDataSetRow(dataSet, dataSet.getShowIndex(i)); + ScriptContext subContext = new DefaultScriptContext(); + subContext.setParent(context); + subContext.put("$currentRow", dataSet.getShowIndex(i)); + DataSetUtil.setRowValue(subContext, dataSet, columns, i); + if ((Boolean) filterFunction.execute(subContext).getResult()) { + return dataSetRow; + } + } + return null; + } + +} 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 6623c5c..1a8d402 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 @@ -10,7 +10,6 @@ import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; import org.tinygroup.tinyscript.dataset.AbstractDataSet; 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.DefaultGroupDataSet; @@ -60,7 +59,7 @@ public class GroupDataSetFilterFunction extends AbstractScriptFunction { Set columns = new HashSet(); for (int j = 0; j < groupDataSet.getFields().size(); j++) { - columns.add(j + 1); + columns.add(j); } for (int dsNum = 0; dsNum < groupDataSet.getGroups().size(); dsNum++) { @@ -70,7 +69,7 @@ public class GroupDataSetFilterFunction extends AbstractScriptFunction { ScriptContext subContext = new DefaultScriptContext(); subContext.setParent(context); subContext.put("$currentRow", groupDataSet.getShowIndex(i)); - setRowValue(subContext, subDs, columns, i); + DataSetUtil.setRowValue(subContext, subDs, columns, i); setAggregateValue(subContext, subDs, groupDataSet.getAggregateResultList(), dsNum); if ((Boolean) expression.execute(subContext).getResult()) { matchRows.add(i); @@ -91,19 +90,4 @@ public class GroupDataSetFilterFunction extends AbstractScriptFunction { } } - private void setRowValue(ScriptContext context, AbstractDataSet dataSet, Set 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))); // 设置行参数上下文 - } - - } - } - } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java index 953d591..c9fca5f 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java @@ -445,4 +445,19 @@ public final class DataSetUtil { return result; } + public static void setRowValue(ScriptContext context, AbstractDataSet dataSet, Set 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))); // 设置行参数上下文 + } + + } + } + } diff --git a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml index 73cd231..1f546ec 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml +++ b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml @@ -162,5 +162,9 @@ + + + diff --git a/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java index 15dc444..58e367c 100644 --- a/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java +++ b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java @@ -19,6 +19,7 @@ import org.tinygroup.tinyscript.collection.function.list.SortFunction; import org.tinygroup.tinyscript.collection.function.list.SubtractFunction; import org.tinygroup.tinyscript.collection.function.list.UnionFunction; import org.tinygroup.tinyscript.collection.function.list.XorFunction; +import org.tinygroup.tinyscript.collection.function.map.CreateMapFunction; import org.tinygroup.tinyscript.collection.function.map.MapIntersectionFunction; import org.tinygroup.tinyscript.collection.function.map.MapSubtractFunction; import org.tinygroup.tinyscript.collection.function.map.MapUnionFunction; @@ -48,6 +49,7 @@ import org.tinygroup.tinyscript.dataset.function.DataSetCopyFunction; import org.tinygroup.tinyscript.dataset.function.DataSetFieldFunction; import org.tinygroup.tinyscript.dataset.function.DataSetFillFunction; import org.tinygroup.tinyscript.dataset.function.DataSetFilterFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetFilterOneFunction; import org.tinygroup.tinyscript.dataset.function.DataSetForEachFunction; import org.tinygroup.tinyscript.dataset.function.DataSetGroupDynamicFunction; import org.tinygroup.tinyscript.dataset.function.DataSetGroupFunction; @@ -150,6 +152,7 @@ public class DefaultTinyScriptEngine extends DefaultScriptEngine implements Scri addScriptFunction(new MapIntersectionFunction()); addScriptFunction(new MapSubtractFunction()); addScriptFunction(new MapXorFunction()); + addScriptFunction(new CreateMapFunction()); addScriptFunction(new SetUnionFunction()); addScriptFunction(new SetIntersectionFunction()); @@ -193,6 +196,7 @@ public class DefaultTinyScriptEngine extends DefaultScriptEngine implements Scri addScriptFunction(new DataSetGroupStagedFunction()); addScriptFunction(new DataSetGroupDynamicFunction()); addScriptFunction(new ToDynamicDataSetFunction()); + addScriptFunction(new DataSetFilterOneFunction()); addScriptFunction(new GroupDataSetFilterFunction()); addScriptFunction(new GroupDataSetSortFunction()); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/filterone.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/filterone.ts new file mode 100644 index 0000000..021d5f0 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/filterone.ts @@ -0,0 +1,3 @@ +dataSet = readTxt("/dataSetExample/data1.txt"); +row = dataSet.filterOne(()->{return name[0]=="a";}); +println(row.getData("name")); \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/map.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/map.ts new file mode 100644 index 0000000..34f116a --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/map.ts @@ -0,0 +1,9 @@ +class Obj{ + name,weight,value; + Obj(name,weight,value){ + } +} + +list=[new Obj("a",2,6.0),new Obj("b",2,3.0),new Obj("c",6,5.0),new Obj("d",5,4.0),new Obj("e",4,6.0)]; +map = map(list.name,list.weight); +println(map); \ No newline at end of file -- Gitee