diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetAggregateFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetAggregateFunction.java index 268327f128e26585aeb33168029cef166d62e8d5..5a6224a8283f319a6c69f2e9b981806e3a3f604d 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetAggregateFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetAggregateFunction.java @@ -39,6 +39,11 @@ public class DataSetAggregateFunction extends DynamicNameScriptFunction { AbstractDataSet dataSet = (AbstractDataSet) getValue(parameters[0]); String fieldName = (String) getValue(parameters[1]); return executeDataSet(dataSet, fieldName, functionName); + } else if (parameters.length > 2) { + AbstractDataSet dataSet = (AbstractDataSet) getValue(parameters[0]); + String fieldName = (String) getValue(parameters[1]); + Object[] newParams = subArray(parameters, 2); + return executeDataSet(dataSet, fieldName, functionName, newParams); } else { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } @@ -53,7 +58,8 @@ public class DataSetAggregateFunction extends DynamicNameScriptFunction { return ExpressionUtil.getNumberCalculator(name) != null; } - protected Object executeDataSet(AbstractDataSet dataSet, String fieldName, String functionName) throws Exception { + protected Object executeDataSet(AbstractDataSet dataSet, String fieldName, String functionName, Object... params) + throws Exception { int col = getColumn(dataSet, fieldName); int rowNum = dataSet.getRows(); List parameterList = new ArrayList(); @@ -61,7 +67,7 @@ public class DataSetAggregateFunction extends DynamicNameScriptFunction { Object v = dataSet.getData(dataSet.getShowIndex(i), dataSet.getShowIndex(col)); parameterList.add(v); } - return ExpressionUtil.compute(functionName, parameterList); + return ExpressionUtil.compute(functionName, parameterList, params); } protected int getColumn(DataSet dataSet, Object obj) throws Exception { diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetAggregateFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetAggregateFunction.java index bba6f1786bf31f8d1d76d3a12809242b2ee9e4c3..9f0c5710af1607684c4b433963dfd446cc65514a 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetAggregateFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/GroupDataSetAggregateFunction.java @@ -43,7 +43,11 @@ public class GroupDataSetAggregateFunction extends DynamicNameScriptFunction { GroupDataSet dataSet = (GroupDataSet) getValue(parameters[0]); String fieldName = (String) getValue(parameters[1]); return executeGroupDataSet(dataSet, fieldName, functionName); - + } else if (parameters.length > 2) { + GroupDataSet dataSet = (GroupDataSet) getValue(parameters[0]); + String fieldName = (String) getValue(parameters[1]); + Object[] newParams = subArray(parameters, 2); + return executeGroupDataSet(dataSet, fieldName, functionName, newParams); } else { throw new ScriptException( ResourceBundleUtil.getDefaultMessage("function.parameter.error", functionName)); @@ -55,27 +59,28 @@ public class GroupDataSetAggregateFunction extends DynamicNameScriptFunction { } } - protected Object executeGroupDataSet(GroupDataSet groupDataSet, String fieldName, String functionName) - throws Exception { + protected Object executeGroupDataSet(GroupDataSet groupDataSet, String fieldName, String functionName, + Object... params) throws Exception { String aggregateName = createAggregateName(functionName, fieldName); groupDataSet.createAggregateResult(aggregateName); int col = getColumn(groupDataSet, fieldName); for (int i = 0; i < groupDataSet.getRows(); i++) { DynamicDataSet subDataSet = groupDataSet.getGroups().get(i); - Object value = executeAggregate(subDataSet, col, functionName); + Object value = executeAggregate(subDataSet, col, functionName, params); groupDataSet.setData(groupDataSet.getShowIndex(i), aggregateName, value); } return groupDataSet; } - protected Object executeAggregate(AbstractDataSet dataSet, int col, String functionName) throws Exception { + protected Object executeAggregate(AbstractDataSet dataSet, int col, String functionName, Object... params) + throws Exception { int rowNum = dataSet.getRows(); List parameterList = new ArrayList(); for (int i = 0; i < rowNum; i++) { Object v = dataSet.getData(dataSet.getShowIndex(i), dataSet.getShowIndex(col)); parameterList.add(v); } - return ExpressionUtil.compute(getCalculatorName(functionName), parameterList); + return ExpressionUtil.compute(getCalculatorName(functionName), parameterList, params); } protected int getColumn(DataSet dataSet, Object obj) throws Exception { @@ -129,8 +134,8 @@ public class GroupDataSetAggregateFunction extends DynamicNameScriptFunction { public List getFunctionNames() { List names = new ArrayList(); List list = ExpressionUtil.getCalculatorNames(); - for(String name:list){ - names.add(name+"Group"); + for (String name : list) { + names.add(name + "Group"); } return names; } diff --git a/org.tinygroup.tinyscript/src/test/java/org/tinygroup/tinyscript/TableauTest.java b/org.tinygroup.tinyscript/src/test/java/org/tinygroup/tinyscript/TableauTest.java new file mode 100644 index 0000000000000000000000000000000000000000..164898e29e8e6efccfa4721f730b1be14e906fa3 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/java/org/tinygroup/tinyscript/TableauTest.java @@ -0,0 +1,31 @@ +package org.tinygroup.tinyscript; + + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.tinygroup.tinyrunner.Runner; +import org.tinygroup.tinyscript.impl.DefaultTinyScriptEngine; + +public class TableauTest { + @BeforeClass + public static void doBeforeClass() throws Exception { + Runner.init("application.xml", null); + } + + @Test + public void testBase() throws Exception { + ScriptEngine engine = new DefaultTinyScriptEngine(); + Assert.assertEquals(-1, engine.execute("return sign(-0.1);")); + Assert.assertEquals(0, engine.execute("return sign(0.0);")); + Assert.assertEquals(1, engine.execute("return sign(114);")); + Assert.assertEquals(0.5235987755982988, engine.execute("return radians(30);")); + Assert.assertEquals(2.0, engine.execute("return log(100,10);")); + Assert.assertEquals(2.0, engine.execute("return ln(exp(2));")); + Assert.assertEquals(7.3890560989306495, engine.execute("return exp(2);")); + Assert.assertEquals(29.999999999999996, engine.execute("return degrees(radians(30));")); + Assert.assertEquals(-1.1682333052318372, engine.execute("return cot(15);")); + Assert.assertEquals(0.7853981633974483, engine.execute("return atan2(5,5);")); + Assert.assertEquals(3, engine.execute("return percentile([1..5],0.5);")); + } +} diff --git a/org.tinygroup.tinyscript/src/test/resources/example/tableau.ts b/org.tinygroup.tinyscript/src/test/resources/example/tableau.ts new file mode 100644 index 0000000000000000000000000000000000000000..8422e1bdf6dcab4eb44b13b4b7223372c2a552c5 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/example/tableau.ts @@ -0,0 +1,23 @@ +println(sign(-1.1));//返回数字的符号 +println(radians(30));//角度转弧度 +println(log(100,10));//对数(10为底,100的对数) +println(ln(exp(2)));//自然对数 +println(exp(2));//自然指数 +println(degrees(radians(30)));//弧度转角度 +println(cot(15));//余切 +println(atan2(5,5));//反正切,弧度表示 +list=[1..5]; +println(sampStdevp(list));//标准差(样本) +println(sampVarp(list));//方差(样本) +println(percentile(list,0.5));//百分位 + +dataSet = readTxt("/example/history.txt").group("code2"); +println(dataSet.countAll("firstdt"));//统计个数 +println(dataSet.sampStdevp("firstdt")); +println(dataSet.sampVarp("firstdt")); +println(dataSet.percentile("firstdt",0.5)); + +println(dataSet.countAllGroup("firstdt"));//统计个数 +println(dataSet.sampStdevpGroup("firstdt")); +println(dataSet.sampVarpGroup("firstdt")); +println(dataSet.percentileGroup("firstdt",0.5)); \ No newline at end of file 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 4a5cd57805150cd987e3a485efc098458c97aa7b..bff5eda7c53476f2f4c150ee9a604d1dafa5a5bb 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 @@ -21,6 +21,7 @@ import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; /** * 表达式工具类 + * * @author yancheng11334 * */ @@ -33,163 +34,166 @@ public final class ExpressionUtil { private static Map operationMap = new HashMap(); private static Map operationWithContextMap = new HashMap(); - + private static Converter[][] converters = new Converter[8][8]; private static Map typeMap = new HashMap(); - + private static List booleanConverters = new ArrayList(); private static List iteratorConverters = new ArrayList(); - private static Map numberCalculatorMap = new HashMap(); + private static Map numberCalculatorMap = new HashMap(); private static List rangeOperators = new ArrayList(); - + static { - typeMap.put(Byte.class, 0); - typeMap.put(Character.class, 1); - typeMap.put(Integer.class, 2); - typeMap.put(Long.class, 3); - typeMap.put(Float.class, 4); - typeMap.put(Double.class, 5); - typeMap.put(BigDecimal.class, 6); - typeMap.put(String.class, 7); - - addConverter(new ByteCharacter()); - addConverter(new ByteInteger()); - addConverter(new ByteFloat()); - addConverter(new ByteDouble()); - addConverter(new ByteBigDecimal()); - - addConverter(new CharacterInteger()); - addConverter(new CharacterFloat()); - addConverter(new CharacterDouble()); - addConverter(new CharacterBigDecimal()); - - addConverter(new IntegerLong()); - addConverter(new IntegerFloat()); - addConverter(new IntegerDouble()); - addConverter(new IntegerBigDecimal()); - - addConverter(new LongFloat()); - addConverter(new LongDouble()); - addConverter(new LongInteger()); - addConverter(new LongBigDecimal()); - - addConverter(new FloatDouble()); - addConverter(new FloatInteger()); - addConverter(new FloatLong()); - addConverter(new FloatBigDecimal()); - - addConverter(new DoubleBigDecimal()); - addConverter(new DoubleInteger()); - addConverter(new DoubleLong()); - addConverter(new DoubleFloat()); - - addConverter(new StringBigDecimal()); - addConverter(new StringInteger()); - addConverter(new StringLong()); - addConverter(new StringFloat()); - addConverter(new StringDouble()); - - //数学操作 - addOperator(new AddOperator()); - addOperator(new SubtractOperator()); - addOperator(new MultiplyOperator()); - addOperator(new DevideOperator()); - addOperator(new XorOperator()); - addOperator(new AdOperator()); - addOperator(new OrOperator()); - addOperator(new ModOperator()); - //简化三元操作符 - addOperator(new SimpleConditionOperator()); - //一元操作符 - addOperator(new LeftAddOperator()); - addOperator(new LeftSubtractOperator()); - addOperator(new LeftPlusPlusOperator()); - addOperator(new LeftSubtractSubtractOperator()); - addOperator(new RightPlusPlusOperator()); - addOperator(new RightSubtractSubtractOperator()); - addOperator(new LeftLiteralOperator()); - addOperator(new ComplementOperator()); - addOperator(new LeftNotOperator()); - - //逻辑比较符 - addOperator(new AndLogicOperator()); - addOperator(new OrLogicOperator()); - addOperator(new EqualsOperator()); - addOperator(new NotEqualsOperator()); - addOperator(new LessEqualsOperator()); - addOperator(new LessOperator()); - addOperator(new BigOperator()); - addOperator(new BigEqualsOperator()); - //移位运算符 - addOperator(new ShlOperator()); - addOperator(new ShrOperator()); - addOperator(new Shr2Operator()); - - //添加boolean表达式转换器 - addBooleanConverter(new StringBooleanConverter()); - addBooleanConverter(new CollectionBooleanConverter()); - addBooleanConverter(new ArrayBooleanConverter()); - addBooleanConverter(new IteratorBooleanConverter()); - addBooleanConverter(new EnumeratorBooleanConverter()); - addBooleanConverter(new MapBooleanConverter()); - - //添加Iterator转换器 - addIteratorConverter(new StringIteratorConverter()); - addIteratorConverter(new CollectionIteratorConverter()); - addIteratorConverter(new MapIteratorConverter()); - addIteratorConverter(new ArrayIteratorConverter()); - - //添加计算器 - addNumberCalculator(new AvgCalculator()); - addNumberCalculator(new MaxCalculator()); - addNumberCalculator(new MinCalculator()); - addNumberCalculator(new MedianCalculator()); - addNumberCalculator(new RangeCalculator()); - addNumberCalculator(new StandardDeviationCalculator()); - addNumberCalculator(new SumCalculator()); - addNumberCalculator(new VarianceCalculator()); - addNumberCalculator(new CountCalculator()); - addNumberCalculator(new DistinctCalculator()); - - //添加range处理器 - addRangeOperator(new IntegerRangeOperator()); - addRangeOperator(new LongRangeOperator()); - addRangeOperator(new NumberRangeOperator()); - addRangeOperator(new CharRangeOperator()); - } - + typeMap.put(Byte.class, 0); + typeMap.put(Character.class, 1); + typeMap.put(Integer.class, 2); + typeMap.put(Long.class, 3); + typeMap.put(Float.class, 4); + typeMap.put(Double.class, 5); + typeMap.put(BigDecimal.class, 6); + typeMap.put(String.class, 7); + + addConverter(new ByteCharacter()); + addConverter(new ByteInteger()); + addConverter(new ByteFloat()); + addConverter(new ByteDouble()); + addConverter(new ByteBigDecimal()); + + addConverter(new CharacterInteger()); + addConverter(new CharacterFloat()); + addConverter(new CharacterDouble()); + addConverter(new CharacterBigDecimal()); + + addConverter(new IntegerLong()); + addConverter(new IntegerFloat()); + addConverter(new IntegerDouble()); + addConverter(new IntegerBigDecimal()); + + addConverter(new LongFloat()); + addConverter(new LongDouble()); + addConverter(new LongInteger()); + addConverter(new LongBigDecimal()); + + addConverter(new FloatDouble()); + addConverter(new FloatInteger()); + addConverter(new FloatLong()); + addConverter(new FloatBigDecimal()); + + addConverter(new DoubleBigDecimal()); + addConverter(new DoubleInteger()); + addConverter(new DoubleLong()); + addConverter(new DoubleFloat()); + + addConverter(new StringBigDecimal()); + addConverter(new StringInteger()); + addConverter(new StringLong()); + addConverter(new StringFloat()); + addConverter(new StringDouble()); + + // 数学操作 + addOperator(new AddOperator()); + addOperator(new SubtractOperator()); + addOperator(new MultiplyOperator()); + addOperator(new DevideOperator()); + addOperator(new XorOperator()); + addOperator(new AdOperator()); + addOperator(new OrOperator()); + addOperator(new ModOperator()); + // 简化三元操作符 + addOperator(new SimpleConditionOperator()); + // 一元操作符 + addOperator(new LeftAddOperator()); + addOperator(new LeftSubtractOperator()); + addOperator(new LeftPlusPlusOperator()); + addOperator(new LeftSubtractSubtractOperator()); + addOperator(new RightPlusPlusOperator()); + addOperator(new RightSubtractSubtractOperator()); + addOperator(new LeftLiteralOperator()); + addOperator(new ComplementOperator()); + addOperator(new LeftNotOperator()); + + // 逻辑比较符 + addOperator(new AndLogicOperator()); + addOperator(new OrLogicOperator()); + addOperator(new EqualsOperator()); + addOperator(new NotEqualsOperator()); + addOperator(new LessEqualsOperator()); + addOperator(new LessOperator()); + addOperator(new BigOperator()); + addOperator(new BigEqualsOperator()); + // 移位运算符 + addOperator(new ShlOperator()); + addOperator(new ShrOperator()); + addOperator(new Shr2Operator()); + + // 添加boolean表达式转换器 + addBooleanConverter(new StringBooleanConverter()); + addBooleanConverter(new CollectionBooleanConverter()); + addBooleanConverter(new ArrayBooleanConverter()); + addBooleanConverter(new IteratorBooleanConverter()); + addBooleanConverter(new EnumeratorBooleanConverter()); + addBooleanConverter(new MapBooleanConverter()); + + // 添加Iterator转换器 + addIteratorConverter(new StringIteratorConverter()); + addIteratorConverter(new CollectionIteratorConverter()); + addIteratorConverter(new MapIteratorConverter()); + addIteratorConverter(new ArrayIteratorConverter()); + + // 添加计算器 + addNumberCalculator(new AvgCalculator()); + addNumberCalculator(new MaxCalculator()); + addNumberCalculator(new MinCalculator()); + addNumberCalculator(new MedianCalculator()); + addNumberCalculator(new RangeCalculator()); + addNumberCalculator(new StandardDeviationCalculator()); + addNumberCalculator(new SumCalculator()); + addNumberCalculator(new VarianceCalculator()); + addNumberCalculator(new CountCalculator()); + addNumberCalculator(new DistinctCalculator()); + addNumberCalculator(new SampleVarianceCalculator()); + addNumberCalculator(new SampleStdevpCalculator()); + addNumberCalculator(new PercentileCalculator()); + addNumberCalculator(new CountAllCalculator()); + + // 添加range处理器 + addRangeOperator(new IntegerRangeOperator()); + addRangeOperator(new LongRangeOperator()); + addRangeOperator(new NumberRangeOperator()); + addRangeOperator(new CharRangeOperator()); + } + @SuppressWarnings("unchecked") - public static Object convert(Object object, Class sourceType, - Class destType) { - return converters[typeMap.get(sourceType)][typeMap.get(destType)] - .convert(object); + public static Object convert(Object object, Class sourceType, Class destType) { + return converters[typeMap.get(sourceType)][typeMap.get(destType)].convert(object); } - - public static Object convert(Object value,Class destType) throws ScriptException{ - try{ - if(value==null || value.getClass()==destType){ - return value; + + public static Object convert(Object value, Class destType) throws ScriptException { + try { + if (value == null || value.getClass() == destType) { + return value; } return convert(value, value.getClass(), destType); - }catch(Exception e){ - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("number.convert.error", value.getClass().getName(),destType.getName()),e); + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("number.convert.error", + value.getClass().getName(), destType.getName()), e); } } - + public static Double convertDouble(Object value) throws ScriptException { - return (Double) convert(value,Double.class); + return (Double) convert(value, Double.class); } - + public static Long convertLong(Object value) throws ScriptException { - return (Long) convert(value,Long.class); + return (Long) convert(value, Long.class); } - + public static Float convertFloat(Object value) throws ScriptException { - return (Float) convert(value,Float.class); + return (Float) convert(value, Float.class); } - + public static Integer convertInteger(Object value) throws ScriptException { - return (Integer) convert(value,Integer.class); + return (Integer) convert(value, Integer.class); } public static int compare(Class type1, Class type2) { @@ -206,49 +210,47 @@ public final class ExpressionUtil { } public static boolean isNumber(Class type) { - return typeMap.containsKey(type) && type!=String.class; + return typeMap.containsKey(type) && type != String.class; } public static void addConverter(Converter converter) { - converters[typeMap.get(converter.getSourceType())][typeMap - .get(converter.getDestType())] = converter; + converters[typeMap.get(converter.getSourceType())][typeMap.get(converter.getDestType())] = converter; } public static void addOperator(Operator operator) { ComplexOperator complexOperator = operationMap.get(operator.getOperation()); - if(complexOperator!=null){ - complexOperator.addOperator(operator); - }else{ - complexOperator = new ComplexOperator(operator); - operationMap.put(complexOperator.getOperation(), complexOperator); + if (complexOperator != null) { + complexOperator.addOperator(operator); + } else { + complexOperator = new ComplexOperator(operator); + operationMap.put(complexOperator.getOperation(), complexOperator); } - + } public static void addOperator(OperatorWithContext operator) { operationWithContextMap.put(operator.getOperation(), operator); } - - public static void addBooleanConverter(BooleanConverter converter){ - for(BooleanConverter oldBooleanConverter:booleanConverters){ - if(oldBooleanConverter.equals(converter) || oldBooleanConverter.getClass().isInstance(converter)){ - return; + + public static void addBooleanConverter(BooleanConverter converter) { + for (BooleanConverter oldBooleanConverter : booleanConverters) { + if (oldBooleanConverter.equals(converter) || oldBooleanConverter.getClass().isInstance(converter)) { + return; } } booleanConverters.add(converter); } - - public static void addIteratorConverter(IteratorConverter converter){ - for(IteratorConverter oldIteratorConverter:iteratorConverters){ - if(oldIteratorConverter.equals(converter) || oldIteratorConverter.getClass().isInstance(converter)){ - return ; + + public static void addIteratorConverter(IteratorConverter converter) { + for (IteratorConverter oldIteratorConverter : iteratorConverters) { + if (oldIteratorConverter.equals(converter) || oldIteratorConverter.getClass().isInstance(converter)) { + return; } } iteratorConverters.add(converter); } - public static Object executeOperation(String op, Object... parameters) - throws ScriptException { + public static Object executeOperation(String op, Object... parameters) throws ScriptException { Operator operator = operationMap.get(op); if (operator == null) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("op.notfound.error", op)); @@ -256,242 +258,251 @@ public final class ExpressionUtil { return operator.operation(parameters); } - public static Object executeOperationWithContext(ScriptContext context, - String op, String name, Object value) throws ScriptException { + public static Object executeOperationWithContext(ScriptContext context, String op, String name, Object value) + throws ScriptException { OperatorWithContext operator = operationWithContextMap.get(op); if (operator == null) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("op.notfound.error", op)); } return operator.operation(context, name, value); } - + /** - * 判断布尔值是否成立 - * - * @param object - * @return - */ - public static boolean getBooleanValue(Object object) { - if (object == null) { - return false; - } - if (object instanceof Boolean){ - return (Boolean) object; - } - for(BooleanConverter converter:booleanConverters){ - if(converter.isMatch(object)){ - return converter.convert(object); - } - } - return true; - } - - /** - * 得到Iterator - * @param object - * @return - */ - public static Iterator getIterator(Object object){ - if(object!=null){ - if(object instanceof Iterator){ - return (Iterator) object; - } - for(IteratorConverter converter:iteratorConverters){ - if(converter.isMatch(object)){ - return converter.convert(object); - } - } - } - return null; - } - - @SuppressWarnings({ "unchecked" }) - public static int compareNumber(Comparable c1,Comparable c2){ + * 判断布尔值是否成立 + * + * @param object + * @return + */ + public static boolean getBooleanValue(Object object) { + if (object == null) { + return false; + } + if (object instanceof Boolean) { + return (Boolean) object; + } + for (BooleanConverter converter : booleanConverters) { + if (converter.isMatch(object)) { + return converter.convert(object); + } + } + return true; + } + + /** + * 得到Iterator + * + * @param object + * @return + */ + public static Iterator getIterator(Object object) { + if (object != null) { + if (object instanceof Iterator) { + return (Iterator) object; + } + for (IteratorConverter converter : iteratorConverters) { + if (converter.isMatch(object)) { + return converter.convert(object); + } + } + } + return null; + } + + @SuppressWarnings({ "unchecked" }) + public static int compareNumber(Comparable c1, Comparable c2) { Class t1 = c1.getClass(); Class t2 = c2.getClass(); - - if (!t1.equals(t2)) { - Comparable leftObject = c1; - Comparable rightObject = c2; - if(ExpressionUtil.compare(t1, t2)>0){ - rightObject =(Comparable) ExpressionUtil.convert(rightObject, t2, t1); - }else{ - leftObject = (Comparable) ExpressionUtil.convert(leftObject, t1, t2); - } - return leftObject.compareTo(rightObject); - } + + if (!t1.equals(t2)) { + Comparable leftObject = c1; + Comparable rightObject = c2; + if (ExpressionUtil.compare(t1, t2) > 0) { + rightObject = (Comparable) ExpressionUtil.convert(rightObject, t2, t1); + } else { + leftObject = (Comparable) ExpressionUtil.convert(leftObject, t1, t2); + } + return leftObject.compareTo(rightObject); + } return c1.compareTo(c2); } - - public static void addNumberCalculator(NumberCalculator numberCalculator){ - numberCalculatorMap.put(numberCalculator.getName(), numberCalculator); - } - - /** - * 查询计算器 - * @param name - * @return - */ - public static NumberCalculator getNumberCalculator(String name){ - return numberCalculatorMap.get(name); - } - - /** - * 获得计算器名称列表 - * @return - */ - public static List getCalculatorNames(){ - return new ArrayList(numberCalculatorMap.keySet()); - } - - /** - * 执行计算 - * @param name - * @param numbers - * @return - * @throws ScriptException - */ - public static Object compute(String name,List numbers) throws ScriptException { - NumberCalculator numberCalculator = numberCalculatorMap.get(name); - if(numberCalculator==null){ - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("calculator.notfound.error", name)); - } - if(numbers==null || numbers.isEmpty()){ - return numberCalculator.getEmptyValue(); - } - return numberCalculator.compute(numbers); - } - - /** - * 判断序列是否包含集合元素 - * @param numbers - * @return - */ - public static boolean containsCollection(List numbers){ - for(Object number:numbers){ - if(isCollection(number)){ - return true; - } - } - return false; - } - - /** - * 判断是否集合元素 - * @param object - * @return - */ - public static boolean isCollection(Object object){ - if(object.getClass().isArray()){ - return true; - }else if(object instanceof Collection){ - return true; - }else if(object instanceof Map){ - return true; - } - return false; - } - - /** - * 转换集合元素为序列 - * @param object - * @return - */ - @SuppressWarnings({ "unchecked" }) - public static List convertCollection(Object object){ - List parameterList = new ArrayList(); - if(object.getClass().isArray()){ - //数组 - int length = Array.getLength(object); - for(int i=0;i> splitCollection(List numbers){ - List> result = new ArrayList>(); - List tempList = null; - for(Object number:numbers){ - if(isCollection(number)){ - if(tempList!=null){ - result.add(tempList); - tempList = null; - } - result.add(convertCollection(number)); - }else{ - if(tempList==null){ - tempList = new ArrayList(); - } - tempList.add(number); - } - } - if(tempList!=null){ - result.add(tempList); - } - return result; - } - - public static void addRangeOperator(RangeOperator operator){ - for(RangeOperator rangeOperator:rangeOperators){ - if(rangeOperator.equals(operator) || rangeOperator.getClass().isInstance(operator)){ - return; - } - } - rangeOperators.add(operator); - } - - public static List createRange(Object start,Object end) throws ScriptException{ - if(start==null || end==null ){ - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("range.empty.error")); - } - for(RangeOperator rangeOperator:rangeOperators){ - if(rangeOperator.isMatch(start,end)){ - return rangeOperator.createRange(start, end); - } - } - return null; - } - - /** - * 判断是否包含某元素 - * @param collection - * @param item - * @return - */ - 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 getCalculatorNames() { + return new ArrayList(numberCalculatorMap.keySet()); + } + + /** + * 执行计算 + * + * @param name + * @param numbers + * @return + * @throws ScriptException + */ + public static Object compute(String name, List numbers, Object... params) throws ScriptException { + NumberCalculator numberCalculator = numberCalculatorMap.get(name); + if (numberCalculator == null) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("calculator.notfound.error", name)); + } + if (numbers == null || numbers.isEmpty()) { + return numberCalculator.getEmptyValue(); + } + return numberCalculator.compute(numbers, params); + } + + /** + * 判断序列是否包含集合元素 + * + * @param numbers + * @return + */ + public static boolean containsCollection(List numbers) { + for (Object number : numbers) { + if (isCollection(number)) { + return true; + } + } + return false; + } + + /** + * 判断是否集合元素 + * + * @param object + * @return + */ + public static boolean isCollection(Object object) { + if (object.getClass().isArray()) { + return true; + } else if (object instanceof Collection) { + return true; + } else if (object instanceof Map) { + return true; + } + return false; + } + + /** + * 转换集合元素为序列 + * + * @param object + * @return + */ + @SuppressWarnings({ "unchecked" }) + public static List convertCollection(Object object) { + List parameterList = new ArrayList(); + if (object.getClass().isArray()) { + // 数组 + int length = Array.getLength(object); + for (int i = 0; i < length; i++) { + Object v = Array.get(object, i); + if (v != null) { + parameterList.add(v); + } + } + } else if (object instanceof Collection) { + // 集合 + parameterList.addAll((Collection) object); + } else if (object instanceof Map) { + // Map + Map map = (Map) object; + parameterList.addAll(map.values()); + } + return parameterList; + } + + /** + * 拆分序列 + * + * @param numbers + * @return + */ + public static List> splitCollection(List numbers) { + List> result = new ArrayList>(); + List tempList = null; + for (Object number : numbers) { + if (isCollection(number)) { + if (tempList != null) { + result.add(tempList); + tempList = null; + } + result.add(convertCollection(number)); + } else { + if (tempList == null) { + tempList = new ArrayList(); + } + tempList.add(number); + } + } + if (tempList != null) { + result.add(tempList); + } + return result; + } + + public static void addRangeOperator(RangeOperator operator) { + for (RangeOperator rangeOperator : rangeOperators) { + if (rangeOperator.equals(operator) || rangeOperator.getClass().isInstance(operator)) { + return; + } + } + rangeOperators.add(operator); + } + + public static List createRange(Object start, Object end) throws ScriptException { + if (start == null || end == null) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("range.empty.error")); + } + for (RangeOperator rangeOperator : rangeOperators) { + if (rangeOperator.isMatch(start, end)) { + return rangeOperator.createRange(start, end); + } + } + return null; + } + + /** + * 判断是否包含某元素 + * + * @param collection + * @param item + * @return + */ + 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; + } + } + } 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; - } + } } diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/NumberCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/NumberCalculator.java index e72ed38005c79d2e9faee00d8d3ba622b6a6bfaf..0904f2ceb0ddb73702345f340667af0f2b02bc6b 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/NumberCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/NumberCalculator.java @@ -6,6 +6,7 @@ import org.tinygroup.tinyscript.ScriptException; /** * 数值计算器 + * * @author yancheng11334 * */ @@ -13,22 +14,25 @@ public interface NumberCalculator { /** * 处理器名 + * * @return */ String getName(); - + /** * 执行计算 + * * @param numbers * @return * @throws ScriptException */ - Object compute(List numbers) throws ScriptException; - + Object compute(List numbers, Object... param) throws ScriptException; + /** * 返回empty的处理值 + * * @return */ Object getEmptyValue(); - + } diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/AvgCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/AvgCalculator.java index 000412e72d8b6ad259229c52229b16fcfe2baf86..3dd77b620086e48b7d637d0220c21f134b199d91 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/AvgCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/AvgCalculator.java @@ -16,7 +16,7 @@ public class AvgCalculator extends CollectionNumberCalculator{ return "avg"; } - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { double total = 0.0d; for(Object obj:numbers){ total += ExpressionUtil.convertDouble(obj); diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CollectionNumberCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CollectionNumberCalculator.java index f94b41874fa3ccddc674810c7f14e9ca0e917970..40bc2869b35649a0c48a37e0fecfe084a3ff332d 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CollectionNumberCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CollectionNumberCalculator.java @@ -9,45 +9,47 @@ import org.tinygroup.tinyscript.expression.NumberCalculator; /** * 支持集合运算 + * * @author yancheng11334 * */ -public abstract class CollectionNumberCalculator implements NumberCalculator{ +public abstract class CollectionNumberCalculator implements NumberCalculator { - public List computeCollection(List...collections) throws ScriptException { + public List computeCollection(List... collections) throws ScriptException { List list = new ArrayList(); return list; } - - public Object compute(List numbers) throws ScriptException { - //判断当前序列是否包含集合元素 - if(ExpressionUtil.containsCollection(numbers)){ - List list = new ArrayList(); - //将序列拆分成序列组 - List> newNumberLists = ExpressionUtil.splitCollection(numbers); - for(List newNumberList:newNumberLists){ - //递归执行compute - list.add(compute(newNumberList)); - } - return list; - }else{ - //不包含集合元素则执行具体的计算逻辑 - return computeItem(numbers); + + public Object compute(List numbers, Object... param) throws ScriptException { + // 判断当前序列是否包含集合元素 + if (ExpressionUtil.containsCollection(numbers)) { + List list = new ArrayList(); + // 将序列拆分成序列组 + List> newNumberLists = ExpressionUtil.splitCollection(numbers); + for (List newNumberList : newNumberLists) { + // 递归执行compute + list.add(compute(newNumberList, param)); + } + return list; + } else { + // 不包含集合元素则执行具体的计算逻辑 + return computeItem(numbers, param); } } - + /** * 计算非集合元素 + * * @param numbers * @return * @throws ScriptException */ - public abstract Object computeItem(List numbers) throws ScriptException ; - + public abstract Object computeItem(List numbers, Object... param) throws ScriptException; + /** * 默认返回null,如果有需要覆盖具体实现 */ - public Object getEmptyValue(){ + public Object getEmptyValue() { return null; } } diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CountAllCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CountAllCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..941a239aa6e6ba21ec1b5e288c38613e5a1479bc --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CountAllCalculator.java @@ -0,0 +1,19 @@ +package org.tinygroup.tinyscript.expression.calculator; + +import java.util.List; + +import org.tinygroup.tinyscript.ScriptException; + +public class CountAllCalculator extends CollectionNumberCalculator{ + + @Override + public String getName() { + return "countAll"; + } + + @Override + public Object computeItem(List numbers, Object... param) throws ScriptException { + return numbers.size(); + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CountCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CountCalculator.java index 8e8bc89e96b4f58719ecf3e0c5c3aec8d5fbb93a..a9ea56ece055bbf0150dc2ff9a11700a7750d025 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CountCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/CountCalculator.java @@ -15,7 +15,7 @@ public class CountCalculator extends CollectionNumberCalculator { return "count"; } - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... param) throws ScriptException { int num=0; for(Object object:numbers){ if(object!=null){ diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/DistinctCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/DistinctCalculator.java index 7807e5ede99384ed38dade8bc11cd7346d644b27..dd0d64d466d2268e6776435ca1bb9eb1807d9d5b 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/DistinctCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/DistinctCalculator.java @@ -18,7 +18,7 @@ public class DistinctCalculator extends CollectionNumberCalculator { return "distinct"; } - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { Set sets = new HashSet(); for(Object object:numbers){ if(object!=null){ diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MaxCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MaxCalculator.java index 86dda1d79e5e39d03a0a39f03dea2247b0613fbc..a6ca733a5dc235b9ef47ea7a4b53edf7bd96d980 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MaxCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MaxCalculator.java @@ -17,7 +17,7 @@ public class MaxCalculator extends CollectionNumberCalculator { } @SuppressWarnings("rawtypes") - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { if (numbers.size() == 1) { return numbers.get(0); } else { diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MedianCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MedianCalculator.java index 81266efe988918e947b5601af2272928b0242af9..f28b28c9b09d1d6e14b49a623028f2e61920f76e 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MedianCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MedianCalculator.java @@ -19,7 +19,7 @@ public class MedianCalculator extends CollectionNumberCalculator { } @SuppressWarnings({ "rawtypes", "unchecked" }) - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { // 先对参数进行排序 List list = (List) numbers; Collections.sort(list); diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MinCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MinCalculator.java index 346bf6edba1f05d876de9e064e07f8d4b0fd8086..7ec67dbbd90211354aaa81b655684563df6692c4 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MinCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/MinCalculator.java @@ -17,7 +17,7 @@ public class MinCalculator extends CollectionNumberCalculator { } @SuppressWarnings("rawtypes") - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { if (numbers.size() == 1) { return numbers.get(0); } else { diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/PercentileCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/PercentileCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..b1a5f942f5bf7b5c9c1a884c35b71984b3de1740 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/PercentileCalculator.java @@ -0,0 +1,30 @@ +package org.tinygroup.tinyscript.expression.calculator; + +import java.util.Collections; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class PercentileCalculator extends CollectionNumberCalculator { + + @Override + public String getName() { + return "percentile"; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public Object computeItem(List numbers, Object... params) throws ScriptException { + List list = (List) numbers; + Collections.sort(list); + double percent = Double.parseDouble(params[0] + "") * (numbers.size() - 1); + int pos = (int) Math.floor(percent); + if (pos - percent == 0) { + return numbers.get(pos); + } + return (1 - (percent - pos)) * ExpressionUtil.convertDouble(numbers.get(pos)) + + (percent - pos) * ExpressionUtil.convertDouble(numbers.get(pos + 1)); + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/RangeCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/RangeCalculator.java index d84f089839ad4c87b864d677c861285818feeec3..f1f80a7830c7a61df68c8d6a0231f8abf15e0a56 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/RangeCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/RangeCalculator.java @@ -18,7 +18,7 @@ public class RangeCalculator extends CollectionNumberCalculator { } @SuppressWarnings("rawtypes") - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { if (numbers.size() == 1) { return ExpressionUtil.executeOperation("-", numbers.get(0), numbers.get(0)); diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SampleStdevpCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SampleStdevpCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..ffb081be133d715d258d3a5afc6f5a0e40bc1b29 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SampleStdevpCalculator.java @@ -0,0 +1,32 @@ +package org.tinygroup.tinyscript.expression.calculator; + +import java.util.List; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class SampleStdevpCalculator extends CollectionNumberCalculator { + + public String getName() { + return "sampStdevp"; + } + + public Object computeItem(List numbers, Object... params) throws ScriptException { + if (numbers.size() == 1) { + return 0d; + } else { + double total = 0.0d; + for (Object obj : numbers) { + total += ExpressionUtil.convertDouble(obj); + } + double avg = total / numbers.size(); + total = 0.0d; + for (Object obj : numbers) { + double temp = ExpressionUtil.convertDouble(obj) - avg; + total += temp * temp; + } + return Math.sqrt(total / (numbers.size() - 1)); + } + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SampleVarianceCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SampleVarianceCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..d9bfdbeb812ac5f40e2e41b5f6a1ea2acab13431 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SampleVarianceCalculator.java @@ -0,0 +1,31 @@ +package org.tinygroup.tinyscript.expression.calculator; + +import java.util.List; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class SampleVarianceCalculator extends CollectionNumberCalculator { + public String getName() { + return "sampVarp"; + } + + public Object computeItem(List numbers, Object... params) throws ScriptException { + if (numbers.size() == 1) { + return 0d; + } else { + double total = 0.0d; + for (Object obj : numbers) { + total += ExpressionUtil.convertDouble(obj); + } + double avg = total / numbers.size(); + total = 0.0d; + for (Object obj : numbers) { + double temp = ExpressionUtil.convertDouble(obj) - avg; + total += temp * temp; + } + return total / (numbers.size() - 1); + } + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/StandardDeviationCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/StandardDeviationCalculator.java index f6f21369b5e6650d53455b5109c6b1e09101241e..ef28592cb492d318da03de78db6a2ba043636663 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/StandardDeviationCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/StandardDeviationCalculator.java @@ -17,7 +17,7 @@ public class StandardDeviationCalculator extends CollectionNumberCalculator { return "stdevp"; } - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { if (numbers.size() == 1) { return 0d; } else { diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SumCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SumCalculator.java index df4c8fdce0dde07c3f5fd6c50acadeff81c8a1b4..30e8df5e769a9b39927784fe23bf2dc5229e3d0f 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SumCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/SumCalculator.java @@ -16,7 +16,7 @@ public class SumCalculator extends CollectionNumberCalculator { return "sum"; } - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { if (numbers.size() == 1) { return numbers.get(0); } else { diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/VarianceCalculator.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/VarianceCalculator.java index ebe4ae32e4d82df8a03ff5a3d4afa862eda22adf..3bcb4bd72d5e7bd10fc80d0386e280888058a135 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/VarianceCalculator.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/expression/calculator/VarianceCalculator.java @@ -17,7 +17,7 @@ public class VarianceCalculator extends CollectionNumberCalculator { return "varp"; } - public Object computeItem(List numbers) throws ScriptException { + public Object computeItem(List numbers, Object... params) throws ScriptException { if (numbers.size() == 1) { return 0d; } else { diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/DynamicNameScriptFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/DynamicNameScriptFunction.java index 349a3f63bd5241219d39d5d1329ec128eca04a41..a91af731cd38a1c8289abc8133f9bc94d782a935 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/DynamicNameScriptFunction.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/DynamicNameScriptFunction.java @@ -8,10 +8,11 @@ import org.tinygroup.tinyscript.config.ScriptFunctionConfig; /** * 动态名称函数(支持一组业务行为相同,但名称不同的函数) + * * @author yancheng11334 * */ -public abstract class DynamicNameScriptFunction extends AbstractScriptFunction{ +public abstract class DynamicNameScriptFunction extends AbstractScriptFunction { /** * 没有固定名称,所以返回null @@ -19,28 +20,44 @@ public abstract class DynamicNameScriptFunction extends AbstractScriptFunction{ public String getNames() { return null; } - + /** * 动态函数是否包含某名称业务行为 + * * @param name * @return */ public abstract boolean exsitFunctionName(String name); - + /** * 返回动态函数的包含的业务信息 + * * @return */ public abstract List getFunctionNames(); - - public List getFunctionConfigs(){ - //如果需要返回详细描述、字段等特征,需要的函数自行覆盖实现 - List configs = new ArrayList(); - List names = getFunctionNames(); - for(String name:names){ - configs.add(new ScriptFunctionConfig(name)); - } - return configs; + + /** + * 截取参数数组 + * @param oldParams + * @return + * @throws Exception + */ + protected Object[] subArray(Object[] oldParams, int start) throws Exception { + Object[] newParams = new Object[oldParams.length - start]; + for (int i = start; i < oldParams.length; i++) { + newParams[i - start] = getValue(oldParams[i]); + } + return newParams; + } + + public List getFunctionConfigs() { + // 如果需要返回详细描述、字段等特征,需要的函数自行覆盖实现 + List configs = new ArrayList(); + List names = getFunctionNames(); + for (String name : names) { + configs.add(new ScriptFunctionConfig(name)); + } + return configs; } } diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathAggregateFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathAggregateFunction.java index d2af72ac7d90675562045fafbdb1436fcf875cf7..8684ac9c9947a5d77043b6ed66dc1125d2235f64 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathAggregateFunction.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathAggregateFunction.java @@ -13,49 +13,55 @@ import org.tinygroup.tinyscript.interpret.ScriptContextUtil; /** * 实现math的聚合函数 + * * @author yancheng11334 * */ -public class MathAggregateFunction extends DynamicNameScriptFunction{ - - public boolean enableExpressionParameter(){ +public class MathAggregateFunction extends DynamicNameScriptFunction { + + public boolean enableExpressionParameter() { return true; } - - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { + + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { String functionName = ScriptContextUtil.getDynamicFunctionName(context); - try{ + try { if (parameters == null || parameters.length == 0) { - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", functionName)); - }else if(checkParameters(parameters, 1)){ + throw new ScriptException( + ResourceBundleUtil.getDefaultMessage("function.parameter.empty", functionName)); + } else if (checkParameters(parameters, 1)) { Object p = getValue(parameters[0]); List parameterList = new ArrayList(); - if(ExpressionUtil.isCollection(p)){ - parameterList = ExpressionUtil.convertCollection(p); - }else{ - parameterList.add(p); + if (ExpressionUtil.isCollection(p)) { + parameterList = ExpressionUtil.convertCollection(p); + } else { + parameterList.add(p); } return ExpressionUtil.compute(functionName, parameterList); - }else { + } else if (parameters.length > 1 && ExpressionUtil.isCollection(getValue(parameters[0]))) { + Object[] newParams = subArray(parameters, 1); + return ExpressionUtil.compute(functionName, ExpressionUtil.convertCollection(getValue(parameters[0])), + newParams); + } else { List parameterList = new ArrayList(); - for(Object parameter:parameters){ + for (Object parameter : parameters) { Object v = getValue(parameter); - if(v!=null){ - parameterList.add(v); + if (v != null) { + parameterList.add(v); } } return ExpressionUtil.compute(functionName, parameterList); } - }catch (ScriptException e) { + } catch (ScriptException e) { throw e; } catch (Exception e) { - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", functionName),e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", functionName), + e); } } public boolean exsitFunctionName(String name) { - return ExpressionUtil.getNumberCalculator(name)!=null; + return ExpressionUtil.getNumberCalculator(name) != null; } public List getFunctionNames() { diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathAtan2Function.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathAtan2Function.java new file mode 100644 index 0000000000000000000000000000000000000000..38333712eadb80f8718d0641996c130d3666f709 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathAtan2Function.java @@ -0,0 +1,18 @@ +package org.tinygroup.tinyscript.function.math; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class MathAtan2Function extends AbstractMathCollectionFunction { + public String getNames() { + return "atan2"; + } + + protected int getParameterCount() { + return 2; + } + + protected Object computeItem(Object... parameters) throws ScriptException { + return Math.atan2(ExpressionUtil.convertDouble(parameters[0]), ExpressionUtil.convertDouble(parameters[1])); + } +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathCotFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathCotFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..dfbb773e38c680f61309fc8125331246be7c24ef --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathCotFunction.java @@ -0,0 +1,24 @@ +package org.tinygroup.tinyscript.function.math; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class MathCotFunction extends AbstractMathCollectionFunction { + + @Override + public String getNames() { + return "cot"; + } + + @Override + protected int getParameterCount() { + return 1; + } + + @Override + protected Object computeItem(Object... parameters) throws ScriptException { + double num = ExpressionUtil.convertDouble(parameters[0]); + return 1 / Math.tan(num); + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathDegreesFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathDegreesFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..5d2bfcf11e55fe061ba9de28402029460397bfb8 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathDegreesFunction.java @@ -0,0 +1,24 @@ +package org.tinygroup.tinyscript.function.math; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class MathDegreesFunction extends AbstractMathCollectionFunction { + + @Override + public String getNames() { + return "degrees"; + } + + @Override + protected int getParameterCount() { + return 1; + } + + @Override + protected Object computeItem(Object... parameters) throws ScriptException { + double num = ExpressionUtil.convertDouble(parameters[0]); + return num * 180 / Math.PI; + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathExpFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathExpFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..f97d1d9e55d1480d53edc570d2c63d60c06cdd36 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathExpFunction.java @@ -0,0 +1,24 @@ +package org.tinygroup.tinyscript.function.math; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class MathExpFunction extends AbstractMathCollectionFunction{ + + @Override + public String getNames() { + return "exp"; + } + + @Override + protected int getParameterCount() { + return 1; + } + + @Override + protected Object computeItem(Object... parameters) throws ScriptException { + double num = ExpressionUtil.convertDouble(parameters[0]); + return Math.pow(Math.E, num); + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathLnFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathLnFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..38bc1081d26249e1f86a323ad269539843fcfa37 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathLnFunction.java @@ -0,0 +1,24 @@ +package org.tinygroup.tinyscript.function.math; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class MathLnFunction extends AbstractMathCollectionFunction { + + @Override + public String getNames() { + return "ln"; + } + + @Override + protected int getParameterCount() { + return 1; + } + + @Override + protected Object computeItem(Object... parameters) throws ScriptException { + double num = ExpressionUtil.convertDouble(parameters[0]); + return Math.log(num); + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathLogFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathLogFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..a6685f7f2211a157cc8ee147d28b96f36b6f4105 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathLogFunction.java @@ -0,0 +1,25 @@ +package org.tinygroup.tinyscript.function.math; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class MathLogFunction extends AbstractMathCollectionFunction { + + @Override + public String getNames() { + return "log"; + } + + @Override + protected int getParameterCount() { + return 2; + } + + @Override + protected Object computeItem(Object... parameters) throws ScriptException { + double x = ExpressionUtil.convertDouble(parameters[0]); + double y = ExpressionUtil.convertDouble(parameters[1]); + return Math.log(x) / Math.log(y); + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathRadiansFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathRadiansFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..97fca693f7368691bc6984733e04218de1e752b6 --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathRadiansFunction.java @@ -0,0 +1,24 @@ +package org.tinygroup.tinyscript.function.math; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class MathRadiansFunction extends AbstractMathCollectionFunction { + + @Override + public String getNames() { + return "radians"; + } + + @Override + protected int getParameterCount() { + return 1; + } + + @Override + protected Object computeItem(Object... parameters) throws ScriptException { + double num = ExpressionUtil.convertDouble(parameters[0]); + return Math.PI * num / 180; + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathSignFunction.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathSignFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..3dc7ebfc2f17cba4643ddc0d7215cc7e830bf9be --- /dev/null +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/function/math/MathSignFunction.java @@ -0,0 +1,24 @@ +package org.tinygroup.tinyscript.function.math; + +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.expression.ExpressionUtil; + +public class MathSignFunction extends AbstractMathCollectionFunction { + + @Override + public String getNames() { + return "sign"; + } + + @Override + protected int getParameterCount() { + return 1; + } + + @Override + protected Object computeItem(Object... parameters) throws ScriptException { + double num = ExpressionUtil.convertDouble(parameters[0]); + return num < 0 ? -1 : num == 0 ? 0 : 1; + } + +} diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngine.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngine.java index a2ee0cde52dfc3759deb910181c5edebc5b0079c..727a3936ac8ea916c5f15f648c7fbc953959dea2 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngine.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/impl/DefaultScriptEngine.java @@ -66,7 +66,14 @@ public class DefaultScriptEngine extends AbstractScriptEngine { addScriptFunction(new MathRoundFunction()); addScriptFunction(new MathCeilFunction()); addScriptFunction(new MathFloorFunction()); - + addScriptFunction(new MathSignFunction()); + addScriptFunction(new MathLogFunction()); + addScriptFunction(new MathRadiansFunction()); + addScriptFunction(new MathLnFunction()); + addScriptFunction(new MathExpFunction()); + addScriptFunction(new MathDegreesFunction()); + addScriptFunction(new MathCotFunction()); + addScriptFunction(new MathAtan2Function()); addScriptFunction(new MathAggregateFunction()); addScriptFunction(new ClearTimeFunction());