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 0000000000000000000000000000000000000000..56e2fc7c2d69a0bd7a996766642521a4cdf9cbbc --- /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 f49e03532309d654d0ed997beadf9cf89b3152d0..64b61870e3c3c1b8e9df7f8629614e5e35cbbafa 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/Field.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/Field.java index fd3c9f2b20aef330e10a4b2c6c637129339bbc20..00303aa6b877c39b03ae7da54d9afce87f2ac849 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 85ed6b5a5b073ec04a8a5ce9d164f2f347baace2..c5abb6a577ef38853b8e7e31567764fc5b5538db 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; } } 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 0000000000000000000000000000000000000000..714ae522a19aaba1103c7490f7110e6b21a58981 --- /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 6623c5c871362ff9bada33cced6683cb78609b85..1a8d40261ea32448a8d27ecd2d3448f036012833 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 953d5919c630358dff409fbfd291140a6d206b56..c9fca5ffae5a6b4e834027a5cb4eef96a23a9ba3 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 73cd231896f86238176bc51b8fa3986e5498ea33..1f546ec94f2f740cb7da76b1bb4cd71466c658e1 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 15dc444ac744ed4fc6b8cacf2b50de9d3a38975f..58e367ce2e430f6e9c5e95fd7e3f69c1a19d87ff 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 0000000000000000000000000000000000000000..021d5f0f878fffeea2579373bb205cdaa8a5776b --- /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 0000000000000000000000000000000000000000..34f116aecbc7535f58b18bd998980f3129c0ef84 --- /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