From 911a2b632ac23c132a9639eb5f9d1f00adeba1cf Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Sat, 9 Sep 2017 11:32:50 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=BA=8F=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E9=9B=86=E5=90=88=E8=BF=90=E7=AE=97=E4=BB=A5=E5=8F=8A=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E3=80=822.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9for=E5=BE=AA=E7=8E=AF=E5=99=A8=EF=BC=88?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E5=BE=AA=E7=8E=AF=E5=89=8D=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=8F=98=E9=87=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tinygroup/tinyscript/dataset/Field.java | 66 ++-- .../AbstractDataSetOperateFunction.java | 102 ++++++ .../function/DataSetIntersectionFunction.java | 89 +++++ .../function/DataSetSubtractFunction.java | 79 +++++ .../function/DataSetUnionFunction.java | 90 +++++ .../dataset/function/DataSetXorFunction.java | 98 ++++++ .../src/main/resources/dataset.beans.xml | 310 +++++++++--------- .../test/resources/dataSetExample/data1.txt | 6 + .../test/resources/dataSetExample/data2.txt | 6 + .../resources/dataSetExample/intersect.ts | 32 ++ .../test/resources/dataSetExample/subtract.ts | 32 ++ .../test/resources/dataSetExample/union.ts | 32 ++ .../src/test/resources/dataSetExample/xor.ts | 32 ++ .../context/ForContextProcessor.java | 185 ++++++----- 14 files changed, 892 insertions(+), 267 deletions(-) create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/data1.txt create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/data2.txt create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts 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 fb16faa..fd3c9f2 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 @@ -1,19 +1,18 @@ package org.tinygroup.tinyscript.dataset; /** - * 字段类型 - * Created by luoguo on 2014/7/4. + * 字段类型 Created by luoguo on 2014/7/4. */ public final class Field { - private String name; - private String title; - private String type; - - public Field(){ - - } - - public Field(String name, String title, String type) { + private String name; + private String title; + private String type; + + public Field() { + + } + + public Field(String name, String title, String type) { super(); this.name = name; this.title = title; @@ -21,33 +20,36 @@ public final class Field { } public String getName() { - return name; - } + return name; + } + + public void setName(String name) { + this.name = name; + } - public void setName(String name) { - this.name = name; - } + public String getTitle() { + return title; + } - public String getTitle() { - return title; - } + public void setTitle(String title) { + this.title = title; + } - public void setTitle(String title) { - this.title = title; - } + public String getType() { + return type; + } - public String getType() { - return type; - } + public void setType(String type) { + this.type = type; + } - public void setType(String type) { - this.type = type; - } + public boolean equals(Object field) { + return this.name.equals(((Field) field).getName()) && this.type.equals(((Field) field).getType()) + && this.title.equals(((Field) field).getTitle()); + } public String toString() { - return "Field [name=" + name + ", title=" + title + ", type=" + type - + "]"; + 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 new file mode 100644 index 0000000..006bfc0 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java @@ -0,0 +1,102 @@ +package org.tinygroup.tinyscript.dataset.function; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunction { + + @Override + public String getBindingTypes() { + return DataSet.class.getName(); + } + + @SuppressWarnings("unchecked") + protected List showPkIndex(DataSet dataSet, Object pks) throws Exception { + List pksIndex = new ArrayList(); + if (pks instanceof List) { + for (String pk : (List) pks) { + int pkIndex = DataSetUtil.getFieldIndex(dataSet, pk); + if (pkIndex != -1) { + pksIndex.add(pkIndex); + } + } + } else if (pks instanceof String) { + int pkIndex = DataSetUtil.getFieldIndex(dataSet, (String) pks); + if (pkIndex != -1) { + pksIndex.add(pkIndex); + } + } + return pksIndex; + } + + protected int checkRowData(Object[] rowData, Object[][] dataArray, List pks) { + for (int i = 0; i < dataArray.length; i++) { + boolean flag = true; + for (int pk : pks) { + if (!rowData[pk].equals(dataArray[i][pk])) { + flag = false; + break; + } + } + if (flag) { + return i; + } + } + return -1; + } + + protected int checkRowData(SimpleDataSet dataSet1, SimpleDataSet dataSet2, int row, LambdaFunction pks, + ScriptContext context) throws Exception { + int flag = -1; + for (int j = 1; j <= dataSet2.getRows(); j++) { + HashMap map1 = new HashMap(); + HashMap map2 = new HashMap(); + for (Field field : dataSet1.getFields()) { + int col = DataSetUtil.getFieldIndex(dataSet1, field.getName()); + map1.put(field.getName(), dataSet1.getData(row, dataSet1.getShowIndex(col))); + map2.put(field.getName(), dataSet2.getData(j, dataSet2.getShowIndex(col))); + } + if ((Boolean) (((LambdaFunction) pks).execute(context, map1, map2).getResult())) { + flag = j; + break; + } + } + return flag; + } + + /** + * 检查两个序表的列属性是否完全一致 + * + * @param dataSet1 + * @param dataSet2 + * @return + * @throws Exception + */ + protected boolean checkField(DataSet dataSet1, DataSet dataSet2) throws Exception { + if (dataSet1.getColumns() != dataSet2.getColumns()) { + return false; + } else { + 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)) { + return false; + } + } + } + return true; + } + + protected abstract DataSet operate(SimpleDataSet dataArray1, SimpleDataSet dataArray2, Object pks, + ScriptContext context) throws Exception; + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java new file mode 100644 index 0000000..59dea62 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java @@ -0,0 +1,89 @@ +package org.tinygroup.tinyscript.dataset.function; + +import java.util.ArrayList; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public class DataSetIntersectionFunction extends AbstractDataSetOperateFunction { + + @Override + public String getNames() { + return "intersect"; + } + + @Override + 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("intersect函数的参数为空!"); + } else if (checkParameters(parameters, 3)) { + if (parameters[0].getClass() != parameters[1].getClass()) { + throw new ScriptException("参数类型类型不一致不支持集合运算"); + } + + DataSet dataSet1 = (DataSet) parameters[0]; + DataSet dataSet2 = (DataSet) parameters[1]; + + if (!checkField(dataSet1, dataSet2)) { + throw new ScriptException("序表参数不一致"); + } + + if (dataSet1 instanceof SimpleDataSet) { + return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); + } else { + throw new ScriptException("不支持的序表类型"); + } + } else { + throw new ScriptException("intersect函数的参数格式不正确!"); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException("inersect函数执行错误!", e); + } + } + + /** + * 交集操作 + * + * @param dataSet1 + * @param dataSet2 + * @param pks + * @param context + * @return + * @throws Exception + */ + protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + throws Exception { + List result = new ArrayList(); + + if (pks instanceof List || pks instanceof String) { + List pksIndex = showPkIndex(dataSet1, pks); + for (int i = 1; i <= dataSet1.getRows(); i++) { + if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) != -1) { + result.add(i - 1); + } + } + } else if (pks instanceof LambdaFunction) { + for (int i = 1; i <= dataSet1.getRows(); i++) { + if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) != -1) { + result.add(i - 1); + } + } + } + return DataSetUtil.createDynamicDataSet(dataSet1, result); + } + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java new file mode 100644 index 0000000..d2308c7 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java @@ -0,0 +1,79 @@ +package org.tinygroup.tinyscript.dataset.function; + +import java.util.ArrayList; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public class DataSetSubtractFunction extends AbstractDataSetOperateFunction { + @Override + public String getNames() { + return "subtract"; + } + + @Override + 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("union函数的参数为空!"); + } else if (checkParameters(parameters, 3)) { + if (parameters[0].getClass() != parameters[1].getClass()) { + throw new ScriptException("参数类型类型不一致不支持集合运算"); + } + + DataSet dataSet1 = (DataSet) parameters[0]; + DataSet dataSet2 = (DataSet) parameters[1]; + + if (!checkField(dataSet1, dataSet2)) { + throw new ScriptException("序表参数不一致"); + } + + if (dataSet1 instanceof SimpleDataSet) { + return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); + } else { + throw new ScriptException("不支持的序表类型"); + } + } else { + throw new ScriptException("union函数的参数格式不正确!"); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException("union函数执行错误!", e); + } + } + + protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + throws Exception { + List result = new ArrayList(); + + if (pks instanceof List || pks instanceof String) { + List pksIndex = showPkIndex(dataSet1, pks); + for (int i = 1; i <= dataSet1.getRows(); i++) { + if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) == -1) { + result.add(i - 1); + } + } + } else if (pks instanceof LambdaFunction) { + for (int i = 1; i <= dataSet1.getRows(); i++) { + if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) == -1) { + result.add(i - 1); + } + } + } + + return DataSetUtil.createDynamicDataSet(dataSet1, result); + } + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java new file mode 100644 index 0000000..08d45a6 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java @@ -0,0 +1,90 @@ +package org.tinygroup.tinyscript.dataset.function; + +import java.util.LinkedList; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public class DataSetUnionFunction extends AbstractDataSetOperateFunction { + + @Override + public String getNames() { + return "unite"; + } + + @Override + 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("unite函数的参数为空!"); + } else if (checkParameters(parameters, 3)) { + + if (parameters[0].getClass() != parameters[1].getClass()) { + throw new ScriptException("参数类型类型不一致不支持集合运算"); + } + + DataSet dataSet1 = (DataSet) parameters[0]; + DataSet dataSet2 = (DataSet) parameters[1]; + + if (!checkField(dataSet1, dataSet2)) { + throw new ScriptException("序表参数不一致"); + } + + if (dataSet1 instanceof SimpleDataSet) { + return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); + } else { + throw new ScriptException("不支持的序表类型"); + } + } else { + throw new ScriptException("unite函数的参数格式不正确!"); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException("unite函数执行错误!", e); + } + } + + @Override + protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + throws Exception { + List resultArray = new LinkedList(); + for (int i = 0; i < dataSet2.getRows(); i++) { + resultArray.add(dataSet2.getDataArray()[i]); + } + + if (pks instanceof List || pks instanceof String) { + List pksIndex = showPkIndex(dataSet1, pks); + for (int i = 1; i <= dataSet1.getRows(); i++) { + if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) == -1) { + resultArray.add(dataSet1.getDataArray()[i - 1]); + } + } + } else if (pks instanceof LambdaFunction) { + for (int i = 1; i <= dataSet1.getRows(); i++) { + if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) == -1) { + resultArray.add(dataSet1.getDataArray()[i - 1]); + } + + } + } + + Object[][] newArray = new Object[resultArray.size()][]; + for (int i = 0; i < newArray.length; i++) { + newArray[i] = resultArray.get(i); + } + + return new SimpleDataSet(dataSet1.getFields(), newArray, dataSet1.isIndexFromOne()); + } + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java new file mode 100644 index 0000000..eb56831 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java @@ -0,0 +1,98 @@ +package org.tinygroup.tinyscript.dataset.function; + +import java.util.ArrayList; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public class DataSetXorFunction extends AbstractDataSetOperateFunction { + + @Override + public String getNames() { + return "xor"; + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { + throw new ScriptException("xor函数的参数为空!"); + } else if (checkParameters(parameters, 3)) { + + if (parameters[0].getClass() != parameters[1].getClass()) { + throw new ScriptException("参数类型类型不一致不支持集合运算"); + } + + DataSet dataSet1 = (DataSet) parameters[0]; + DataSet dataSet2 = (DataSet) parameters[1]; + + if (!checkField(dataSet1, dataSet2)) { + throw new ScriptException("序表参数不一致"); + } + + if (dataSet1 instanceof SimpleDataSet) { + return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); + } else { + throw new ScriptException("不支持的序表类型"); + } + } else { + throw new ScriptException("xor函数的参数格式不正确!"); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException("xor函数执行错误!", e); + } + } + + @Override + protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + throws Exception { + List result = new ArrayList(); + List equalResult = new ArrayList(); + + if (pks instanceof List || pks instanceof String) { + List pksIndex = showPkIndex(dataSet1, pks); + for (int i = 1; i <= dataSet1.getRows(); i++) { + int flag = checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex); + if (flag == -1) { + result.add(i - 1); + } else { + equalResult.add(flag + 1); + } + } + } else if (pks instanceof LambdaFunction) { + for (int i = 1; i <= dataSet1.getRows(); i++) { + int flag = checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context); + if (flag == -1) { + result.add(i - 1); + }else { + equalResult.add(flag); + } + } + } + + Object[][] newArray = new Object[dataSet2.getRows() + result.size()][]; + System.arraycopy(dataSet2.getDataArray(), 0, newArray, 0, dataSet2.getRows()); + + for (int i = dataSet2.getRows(); i < newArray.length; i++) { + newArray[i] = dataSet1.getDataArray()[result.get(i - dataSet1.getRows())]; + } + + SimpleDataSet uniteDataSet = new SimpleDataSet(dataSet1.getFields(), newArray, dataSet1.isIndexFromOne()); + + int count = 0; + for (int i : equalResult) { + uniteDataSet.deleteRow(i - count); + count++; + } + + return uniteDataSet; + } + +} 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 344fbef..73cd231 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml +++ b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml @@ -1,150 +1,166 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns="http://www.springframework.org/schema/beans" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/data1.txt b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/data1.txt new file mode 100644 index 0000000..2a3ddc6 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/data1.txt @@ -0,0 +1,6 @@ +name weight value count +a 2 6 1 +b 2 3 1 +c 6 5 1 +e 4 6 1 +d 5 4 1 diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/data2.txt b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/data2.txt new file mode 100644 index 0000000..5fdd615 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/data2.txt @@ -0,0 +1,6 @@ +name weight value count +a 2 6 1 +b 1 3 1 +r 6 5 1 +f 5 4 1 +e 4 6 1 \ No newline at end of file diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts new file mode 100644 index 0000000..708699b --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts @@ -0,0 +1,32 @@ +dataSet1 = readTxt("/dataSetExample/data1.txt"); +dataSet2 = readTxt("/dataSetExample/data2.txt"); +result = dataSet1.intersect(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} +println("================================================================"); +result = dataSet1.intersect(dataSet2,["name","weight"]); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} +println("================================================================"); +result = dataSet1.intersect(dataSet2,"name"); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} + + + + + + + diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts new file mode 100644 index 0000000..7c06410 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts @@ -0,0 +1,32 @@ +dataSet1 = readTxt("/dataSetExample/data1.txt"); +dataSet2 = readTxt("/dataSetExample/data2.txt"); +result = dataSet1.subtract(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} +println("================================================================"); +result = dataSet2.subtract(dataSet1,["name","weight"]); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} +println("================================================================"); +result = dataSet1.subtract(dataSet2,"name"); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} + + + + + + + diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts new file mode 100644 index 0000000..0a68e53 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts @@ -0,0 +1,32 @@ +dataSet1 = readTxt("/dataSetExample/data1.txt"); +dataSet2 = readTxt("/dataSetExample/data2.txt"); +result = dataSet1.unite(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} +println("================================================================"); +result = dataSet1.unite(dataSet2,["name","weight"]); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} +println("================================================================"); +result = dataSet1.unite(dataSet2,"name"); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} + + + + + + + diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts new file mode 100644 index 0000000..e2f6466 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts @@ -0,0 +1,32 @@ +dataSet1 = readTxt("/dataSetExample/data1.txt"); +dataSet2 = readTxt("/dataSetExample/data2.txt"); +result = dataSet1.xor(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} +println("================================================================"); +result = dataSet1.xor(dataSet2,["name","weight"]); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} +println("================================================================"); +result = dataSet1.xor(dataSet2,"name"); +for(i = 1;i<=result.getRows();i++){ + for(j=1;j<=result.getColumns();j++){ + print(result[i][j]+" "); + } + println(); +} + + + + + + + diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/context/ForContextProcessor.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/context/ForContextProcessor.java index 2deebac..c743e0d 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/context/ForContextProcessor.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/context/ForContextProcessor.java @@ -25,93 +25,102 @@ import org.tinygroup.tinyscript.parser.grammer.TinyScriptParser.VariableDeclarat * Created by luoguo on 16/8/10. */ public class ForContextProcessor implements ParserRuleContextProcessor { - public Class getType() { - return TinyScriptParser.ForContext.class; - } - - public ScriptResult process(TinyScriptParser.ForContext parseTree, ScriptInterpret interpret, ScriptSegment segment, ScriptContext context) throws Exception { - - //处理for循环 - ForControlContext forControlContext = parseTree.forControl(); - ScriptContext forScriptContext = new DefaultScriptContext(); //构造for循环上下文 - Set paramNames = new HashSet();//记录临时变量 - - if (forControlContext.enhancedForControl() != null) { - //冒号格式的for循环 - String name = forControlContext.enhancedForControl().Identifier().getText(); - paramNames.add(name); - forScriptContext.setParent(context); - Iterator it = ExpressionUtil.getIterator(interpret.interpretParseTreeValue(forControlContext.enhancedForControl().expression(), segment, forScriptContext)); - while (it.hasNext()) { - forScriptContext.put(name, it.next()); - try { - interpret.interpretParseTree(parseTree.statement(), segment, forScriptContext); - } catch (ContinueException e) { - continue; - } catch (BreakException e) { - break; - } - } - - } else { - - //分号格式的for循环 - List names = null; - forScriptContext.setParent(context); - if (forControlContext.forInit() != null) { - interpret.interpretParseTree(forControlContext.forInit(), segment, forScriptContext); - names = getForInitParamNames(forControlContext.forInit()); - paramNames.addAll(names); - } - - boolean runtag = true; - while (runtag) { - - try { - interpret.interpretParseTree(parseTree.statement(), segment, forScriptContext); - //执行更新 - if (forControlContext.forUpdate() != null) { - interpret.interpretParseTree(forControlContext.forUpdate(), segment, forScriptContext); - } - if (forControlContext.expression() != null) { - runtag = ExpressionUtil.getBooleanValue(interpret.interpretParseTreeValue(forControlContext.expression(), segment, forScriptContext)); - } - } catch (ContinueException e) { - //执行更新 - if (forControlContext.forUpdate() != null) { - interpret.interpretParseTree(forControlContext.forUpdate(), segment, forScriptContext); - } - if (forControlContext.expression() != null) { - runtag = ExpressionUtil.getBooleanValue(interpret.interpretParseTreeValue(forControlContext.expression(), segment, forScriptContext)); - } - continue; - } catch (BreakException e) { - break; - } - - } - - } - - //更新原始上下文 - for(Entry entry:forScriptContext.getItemMap().entrySet()){ - //非临时变量的结果保存到原始上下文 - if(!paramNames.contains(entry.getKey())){ - context.put(entry.getKey(), entry.getValue()); - } - } - - return ScriptResult.VOID_RESULT; - } - - private List getForInitParamNames(ForInitContext forInitContext) { - List names = new ArrayList(); - if (forInitContext.localVariableDeclaration() != null) { - for (VariableDeclaratorContext variableDeclaratorContext : forInitContext.localVariableDeclaration().variableDeclarators().variableDeclarator()) { - names.add(variableDeclaratorContext.Identifier().getText()); - } - } - return names; - } + public Class getType() { + return TinyScriptParser.ForContext.class; + } + + public ScriptResult process(TinyScriptParser.ForContext parseTree, ScriptInterpret interpret, ScriptSegment segment, + ScriptContext context) throws Exception { + + // 处理for循环 + ForControlContext forControlContext = parseTree.forControl(); + ScriptContext forScriptContext = new DefaultScriptContext(); // 构造for循环上下文 + Set paramNames = new HashSet();// 记录临时变量 + + if (forControlContext.enhancedForControl() != null) { + // 冒号格式的for循环 + String name = forControlContext.enhancedForControl().Identifier().getText(); + paramNames.add(name); + forScriptContext.setParent(context); + Iterator it = ExpressionUtil.getIterator(interpret.interpretParseTreeValue( + forControlContext.enhancedForControl().expression(), segment, forScriptContext)); + while (it.hasNext()) { + forScriptContext.put(name, it.next()); + try { + interpret.interpretParseTree(parseTree.statement(), segment, forScriptContext); + } catch (ContinueException e) { + continue; + } catch (BreakException e) { + break; + } + } + + } else { + + // 分号格式的for循环 + List names = null; + forScriptContext.setParent(context); + if (forControlContext.forInit() != null) { + interpret.interpretParseTree(forControlContext.forInit(), segment, forScriptContext); + names = getForInitParamNames(forControlContext.forInit()); + paramNames.addAll(names); + } + + boolean runtag = true; + if (forControlContext.expression() != null) { + runtag = ExpressionUtil.getBooleanValue( + interpret.interpretParseTreeValue(forControlContext.expression(), segment, forScriptContext)); + } + while (runtag) { + + try { + interpret.interpretParseTree(parseTree.statement(), segment, forScriptContext); + // 执行更新 + if (forControlContext.forUpdate() != null) { + interpret.interpretParseTree(forControlContext.forUpdate(), segment, forScriptContext); + } + if (forControlContext.expression() != null) { + runtag = ExpressionUtil.getBooleanValue(interpret + .interpretParseTreeValue(forControlContext.expression(), segment, forScriptContext)); + } + } catch (ContinueException e) { + // 执行更新 + if (forControlContext.forUpdate() != null) { + interpret.interpretParseTree(forControlContext.forUpdate(), segment, forScriptContext); + } + if (forControlContext.expression() != null) { + runtag = ExpressionUtil.getBooleanValue(interpret + .interpretParseTreeValue(forControlContext.expression(), segment, forScriptContext)); + } + continue; + } catch (BreakException e) { + break; + } + + } + + } + + // 更新原始上下文 + for (Entry entry : forScriptContext.getItemMap().entrySet()) { + // 非临时变量的结果保存到原始上下文 + if (!paramNames.contains(entry.getKey())) { + context.put(entry.getKey(), entry.getValue()); + } + } + + return ScriptResult.VOID_RESULT; + } + + private List getForInitParamNames(ForInitContext forInitContext) { + List names = new ArrayList(); + if (forInitContext.localVariableDeclaration() != null) { + for (VariableDeclaratorContext variableDeclaratorContext : forInitContext.localVariableDeclaration() + .variableDeclarators().variableDeclarator()) { + names.add(variableDeclaratorContext.Identifier().getText()); + } + } + return names; + } } -- Gitee