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