From a966245c2c2a880741d2d9fc143ec2d3185b0dc6 Mon Sep 17 00:00:00 2001
From: fujie <405295521@qq.com>
Date: Sun, 19 Nov 2017 11:16:44 +0800
Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0in=E5=A4=84=E7=90=86?=
=?UTF-8?q?=E5=99=A8=EF=BC=88=E6=95=B0=E7=BB=84=EF=BC=8C=E9=9B=86=E5=90=88?=
=?UTF-8?q?=EF=BC=8Cmap=EF=BC=8Cdataset=E5=88=97=E5=AF=B9=E8=B1=A1?=
=?UTF-8?q?=EF=BC=89=E3=80=822.=E4=BF=AE=E6=94=B9insert=E5=87=BD=E6=95=B0?=
=?UTF-8?q?=EF=BC=88=E7=8E=B0=E5=9C=A8=E6=98=AF=E5=9C=A8=E5=8E=9F=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E9=9B=86=E4=B8=8A=E5=81=9A=E4=BF=AE=E6=94=B9=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../function/DataSetInsertFunction.java | 32 +++++++---------
.../dataset/in/DataSetColumnInProcessor.java | 25 +++++++++++++
.../src/main/resources/dataset.beans.xml | 4 ++
.../tinyscript/expression/ExpressionUtil.java | 37 ++++++++++---------
.../expression/InExpressionProcessor.java | 21 +++++++++++
.../expression/in/ArrayInProcessor.java | 27 ++++++++++++++
.../expression/in/CollectionInProcessor.java | 20 ++++++++++
.../expression/in/MapInProcessor.java | 20 ++++++++++
.../impl/AbstractScriptEngineBuilder.java | 7 ++++
.../impl/DefaultScriptEngineBuilder.java | 12 ++++++
10 files changed, 169 insertions(+), 36 deletions(-)
create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/in/DataSetColumnInProcessor.java
create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/InExpressionProcessor.java
create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/ArrayInProcessor.java
create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/CollectionInProcessor.java
create mode 100644 org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/MapInProcessor.java
diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetInsertFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetInsertFunction.java
index 05a4527..108ec1e 100644
--- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetInsertFunction.java
+++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetInsertFunction.java
@@ -3,8 +3,8 @@ package org.tinygroup.tinyscript.dataset.function;
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.DynamicDataSet;
import org.tinygroup.tinyscript.dataset.util.DataSetUtil;
import org.tinygroup.tinyscript.function.AbstractScriptFunction;
import org.tinygroup.tinyscript.interpret.ResourceBundleUtil;
@@ -15,19 +15,20 @@ public class DataSetInsertFunction extends AbstractScriptFunction {
public String getNames() {
return "insert";
}
-
+
@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(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames()));
} else if (checkParameters(parameters, 2)) {
- AbstractDataSet dataSet1 = (AbstractDataSet) getValue(parameters[0]);
- AbstractDataSet dataSet2 = (AbstractDataSet) getValue(parameters[1]);
+ DynamicDataSet dataSet1 = (DynamicDataSet) getValue(parameters[0]);
+ DynamicDataSet dataSet2 = (DynamicDataSet) getValue(parameters[1]);
return insert(dataSet1, dataSet2);
} else {
throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames()));
@@ -40,23 +41,18 @@ public class DataSetInsertFunction extends AbstractScriptFunction {
}
}
- private DataSet insert(AbstractDataSet dataSet1, AbstractDataSet dataSet2) throws Exception {
- Object[][] datas = new Object[dataSet1.getRows() + dataSet2.getRows()][dataSet1.getFields().size()];
- for (int i = 0; i < dataSet1.getRows(); i++) {
- for (int j = 0; j < datas[i].length; j++) {
- datas[i][j] = dataSet1.getData(dataSet1.getShowIndex(i), dataSet1.getShowIndex(j));
- }
- }
- for (int i = dataSet1.getRows(); i < dataSet2.getRows() + dataSet1.getRows(); i++) {
- for (int j = 0; j < datas[i].length; j++) {
- int rightFieldIndex = DataSetUtil.getFieldIndex(dataSet2, dataSet1.getFields().get(j).getName());
- if (rightFieldIndex > -1) {
- datas[i][j] = dataSet2.getData(dataSet2.getShowIndex(i - dataSet1.getRows()),
- dataSet2.getShowIndex(rightFieldIndex));
+ private DataSet insert(DynamicDataSet dataSet1, DynamicDataSet dataSet2) throws Exception {
+ for (int i = 0; i < dataSet2.getRows(); i++) {
+ dataSet1.insertRow(dataSet1.getShowIndex(dataSet1.getRows()));
+ for (int j = 0; j < dataSet1.getFields().size(); j++) {
+ int fieldIndex = DataSetUtil.getFieldIndex(dataSet2, dataSet1.getFields().get(j).getName());
+ if (fieldIndex > -1) {
+ Object data = dataSet2.getData(dataSet2.getShowIndex(i), dataSet2.getShowIndex(fieldIndex));
+ dataSet1.setData(dataSet1.getShowIndex(dataSet1.getRows() - 1), dataSet1.getShowIndex(j), data);
}
}
}
- return DataSetUtil.createDynamicDataSet(dataSet1.getFields(), datas, dataSet1.isIndexFromOne());
+ return dataSet1;
}
}
diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/in/DataSetColumnInProcessor.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/in/DataSetColumnInProcessor.java
new file mode 100644
index 0000000..9290b92
--- /dev/null
+++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/in/DataSetColumnInProcessor.java
@@ -0,0 +1,25 @@
+package org.tinygroup.tinyscript.dataset.in;
+
+import org.tinygroup.tinyscript.dataset.DataSetColumn;
+import org.tinygroup.tinyscript.expression.InExpressionProcessor;
+
+public class DataSetColumnInProcessor implements InExpressionProcessor {
+
+ @Override
+ public boolean isMatch(Object collection) throws Exception {
+ return collection instanceof DataSetColumn;
+ }
+
+ @Override
+ public boolean checkIn(Object collection, Object item) throws Exception {
+ DataSetColumn colData = (DataSetColumn) collection;
+ for (int i = 0; i < colData.getRows(); i++) {
+ if (item == colData.getData(colData.isIndexFromOne() ? i + 1 : i)
+ || item.equals(colData.getData(colData.isIndexFromOne() ? i + 1 : i))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
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 81fd9c3..37b5ac9 100644
--- a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml
+++ b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.beans.xml
@@ -6,6 +6,10 @@
+
+
+
diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/ExpressionUtil.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/ExpressionUtil.java
index a37e639..7032ef2 100644
--- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/ExpressionUtil.java
+++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/ExpressionUtil.java
@@ -61,6 +61,9 @@ import org.tinygroup.tinyscript.expression.convert.StringDouble;
import org.tinygroup.tinyscript.expression.convert.StringFloat;
import org.tinygroup.tinyscript.expression.convert.StringInteger;
import org.tinygroup.tinyscript.expression.convert.StringLong;
+import org.tinygroup.tinyscript.expression.in.ArrayInProcessor;
+import org.tinygroup.tinyscript.expression.in.CollectionInProcessor;
+import org.tinygroup.tinyscript.expression.in.MapInProcessor;
import org.tinygroup.tinyscript.expression.iteratorconvert.ArrayIteratorConverter;
import org.tinygroup.tinyscript.expression.iteratorconvert.CollectionIteratorConverter;
import org.tinygroup.tinyscript.expression.iteratorconvert.MapIteratorConverter;
@@ -125,6 +128,7 @@ public final class ExpressionUtil {
private static Map numberCalculatorMap = new HashMap();
private static List rangeOperators = new ArrayList();
+ private static List inProcessors = new ArrayList();
static {
typeMap.put(Byte.class, 0);
typeMap.put(Character.class, 1);
@@ -243,6 +247,11 @@ public final class ExpressionUtil {
addRangeOperator(new LongRangeOperator());
addRangeOperator(new NumberRangeOperator());
addRangeOperator(new CharRangeOperator());
+
+ // 添加in表达式处理器
+ addInProcessor(new ArrayInProcessor());
+ addInProcessor(new CollectionInProcessor());
+ addInProcessor(new MapInProcessor());
}
@SuppressWarnings("unchecked")
@@ -250,6 +259,10 @@ public final class ExpressionUtil {
return converters[typeMap.get(sourceType)][typeMap.get(destType)].convert(object);
}
+ public static void addInProcessor(InExpressionProcessor inProcessor) {
+ inProcessors.add(inProcessor);
+ }
+
public static Object convert(Object value, Class> destType) throws ScriptException {
try {
if (value == null || value.getClass() == destType) {
@@ -262,8 +275,6 @@ public final class ExpressionUtil {
}
}
-
-
public static Double convertDouble(Object value) throws ScriptException {
return (Double) convert(value, Double.class);
}
@@ -569,24 +580,14 @@ public final class ExpressionUtil {
* @param collection
* @param item
* @return
+ * @throws Exception
*/
- public static boolean in(Object collection, Object item) {
- boolean tag = false;
- if (collection.getClass().isArray()) {
- int length = Array.getLength(collection);
- for (int i = 0; i < length; i++) {
- if (item.equals(Array.get(collection, i))) {
- tag = true;
- break;
- }
+ public static boolean in(Object collection, Object item) throws Exception {
+ for(InExpressionProcessor inProcessor : inProcessors) {
+ if(inProcessor.isMatch(collection)) {
+ return inProcessor.checkIn(collection, item);
}
- } else if (collection instanceof Collection) {
- Collection c = (Collection) collection;
- tag = c.contains(item);
- } else if (collection instanceof Map) {
- Map map = (Map) collection;
- tag = map.containsKey(item);
}
- return tag;
+ return false;
}
}
diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/InExpressionProcessor.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/InExpressionProcessor.java
new file mode 100644
index 0000000..9425ee4
--- /dev/null
+++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/InExpressionProcessor.java
@@ -0,0 +1,21 @@
+package org.tinygroup.tinyscript.expression;
+
+public interface InExpressionProcessor {
+
+ /**
+ * 判断处理器是否匹配
+ * @param collection
+ * @return
+ * @throws Exception
+ */
+ public boolean isMatch(Object collection) throws Exception;
+
+ /**
+ * 执行in的逻辑
+ * @param collection
+ * @param item
+ * @return
+ * @throws Exception
+ */
+ public boolean checkIn(Object collection, Object item) throws Exception;
+}
diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/ArrayInProcessor.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/ArrayInProcessor.java
new file mode 100644
index 0000000..45edaf8
--- /dev/null
+++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/ArrayInProcessor.java
@@ -0,0 +1,27 @@
+package org.tinygroup.tinyscript.expression.in;
+
+import java.lang.reflect.Array;
+
+import org.tinygroup.tinyscript.expression.InExpressionProcessor;
+
+public class ArrayInProcessor implements InExpressionProcessor {
+
+ @Override
+ public boolean isMatch(Object collection) throws Exception {
+ return collection.getClass().isArray();
+ }
+
+ @Override
+ public boolean checkIn(Object collection, Object item) throws Exception {
+ boolean tag = false;
+ int length = Array.getLength(collection);
+ for (int i = 0; i < length; i++) {
+ if (item.equals(Array.get(collection, i))) {
+ tag = true;
+ break;
+ }
+ }
+ return tag;
+ }
+
+}
diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/CollectionInProcessor.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/CollectionInProcessor.java
new file mode 100644
index 0000000..89944e8
--- /dev/null
+++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/CollectionInProcessor.java
@@ -0,0 +1,20 @@
+package org.tinygroup.tinyscript.expression.in;
+
+import java.util.Collection;
+
+import org.tinygroup.tinyscript.expression.InExpressionProcessor;
+
+public class CollectionInProcessor implements InExpressionProcessor {
+
+ @Override
+ public boolean isMatch(Object collection) throws Exception {
+ return collection instanceof Collection;
+ }
+
+ @Override
+ public boolean checkIn(Object collection, Object item) throws Exception {
+ Collection> c = (Collection>) collection;
+ return c.contains(item);
+ }
+
+}
diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/MapInProcessor.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/MapInProcessor.java
new file mode 100644
index 0000000..96b6835
--- /dev/null
+++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/in/MapInProcessor.java
@@ -0,0 +1,20 @@
+package org.tinygroup.tinyscript.expression.in;
+
+import java.util.Map;
+
+import org.tinygroup.tinyscript.expression.InExpressionProcessor;
+
+public class MapInProcessor implements InExpressionProcessor {
+
+ @Override
+ public boolean isMatch(Object collection) throws Exception {
+ return collection instanceof Map;
+ }
+
+ @Override
+ public boolean checkIn(Object collection, Object item) throws Exception {
+ Map, ?> map = (Map, ?>) collection;
+ return map.containsKey(item);
+ }
+
+}
diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/AbstractScriptEngineBuilder.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/AbstractScriptEngineBuilder.java
index 91701d6..2970447 100644
--- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/AbstractScriptEngineBuilder.java
+++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/AbstractScriptEngineBuilder.java
@@ -39,6 +39,7 @@ public abstract class AbstractScriptEngineBuilder implements ScriptEngineBuilder
registerObjectItemProcessor();
registerCustomProcessor();
registerTypeConvertProcessor();
+ registerInProcessor();
}
/**
@@ -149,4 +150,10 @@ public abstract class AbstractScriptEngineBuilder implements ScriptEngineBuilder
* @throws ScriptException
*/
protected abstract void registerTypeConvertProcessor() throws ScriptException;
+
+ /**
+ * 注册可扩展in关键字处理器
+ * @throws ScriptException
+ */
+ protected abstract void registerInProcessor() throws ScriptException;
}
diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngineBuilder.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngineBuilder.java
index e7d2167..a7cb2a6 100644
--- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngineBuilder.java
+++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngineBuilder.java
@@ -13,6 +13,7 @@ import org.tinygroup.tinyscript.assignvalue.AssignValueUtil;
import org.tinygroup.tinyscript.collection.CollectionModelUtil;
import org.tinygroup.tinyscript.expression.BooleanConverter;
import org.tinygroup.tinyscript.expression.ExpressionUtil;
+import org.tinygroup.tinyscript.expression.InExpressionProcessor;
import org.tinygroup.tinyscript.expression.IteratorConverter;
import org.tinygroup.tinyscript.expression.NumberCalculator;
import org.tinygroup.tinyscript.expression.Operator;
@@ -226,4 +227,15 @@ public class DefaultScriptEngineBuilder extends AbstractScriptEngineBuilder{
}
}
}
+
+ @Override
+ protected void registerInProcessor() throws ScriptException {
+ Collection c = BeanContainerFactory.getBeanContainer(getClass().getClassLoader()).getBeans(InExpressionProcessor.class);
+ if(c!=null && !c.isEmpty()){
+ Iterator it = c.iterator();
+ while(it.hasNext()){
+ ExpressionUtil.addInProcessor(it.next());
+ }
+ }
+ }
}
--
Gitee