diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 51e42bd62..a7c4357e6 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -31,7 +31,7 @@ 3.8.0 5.1.1 4.0.1 - 2.7.2 + 2.7.4 3.3.0 @@ -430,7 +430,7 @@ com.googlecode.aviator aviator - 5.3.1 + 5.3.2 compile true @@ -465,7 +465,7 @@ org.springframework spring-expression - 5.3.22 + 5.3.23 compile true @@ -476,6 +476,13 @@ compile true + + com.alibaba + QLExpress + 3.3.0 + compile + true + org.apache.commons diff --git a/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java new file mode 100755 index 000000000..d941685d1 --- /dev/null +++ b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/QLExpressEngine.java @@ -0,0 +1,38 @@ +package cn.hutool.extra.expression.engine.qlexpress; + +import cn.hutool.extra.expression.ExpressionEngine; +import cn.hutool.extra.expression.ExpressionException; +import com.ql.util.express.DefaultContext; +import com.ql.util.express.ExpressRunner; + +import java.util.Map; + +/** + * QLExpress引擎封装
+ * 见:https://github.com/alibaba/QLExpress + * + * @author looly + * @since 5.8.9 + */ +public class QLExpressEngine implements ExpressionEngine { + + private final ExpressRunner engine; + + /** + * 构造 + */ + public QLExpressEngine() { + engine = new ExpressRunner(); + } + + @Override + public Object eval(final String expression, final Map context) { + final DefaultContext defaultContext = new DefaultContext<>(); + defaultContext.putAll(context); + try { + return engine.execute(expression, defaultContext, null, true, false); + } catch (final Exception e) { + throw new ExpressionException(e); + } + } +} diff --git a/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/package-info.java b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/package-info.java new file mode 100755 index 000000000..f3c4cf1e5 --- /dev/null +++ b/hutool-extra/src/main/java/cn/hutool/extra/expression/engine/qlexpress/package-info.java @@ -0,0 +1,7 @@ +/** + * QLExpress引擎封装
+ * 见:https://github.com/alibaba/QLExpress + * + * @author looly + */ +package cn.hutool.extra.expression.engine.qlexpress; diff --git a/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine b/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine index df7e3a18c..33aa4f4b6 100644 --- a/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine +++ b/hutool-extra/src/main/resources/META-INF/services/cn.hutool.extra.expression.ExpressionEngine @@ -3,4 +3,5 @@ cn.hutool.extra.expression.engine.jexl.JexlEngine cn.hutool.extra.expression.engine.mvel.MvelEngine cn.hutool.extra.expression.engine.jfireel.JfireELEngine cn.hutool.extra.expression.engine.spel.SpELEngine -cn.hutool.extra.expression.engine.rhino.RhinoEngine \ No newline at end of file +cn.hutool.extra.expression.engine.rhino.RhinoEngine +cn.hutool.extra.expression.engine.qlexpress.QLExpressEngine diff --git a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java index 3499e9dad..fc169d55e 100755 --- a/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/expression/ExpressionUtilTest.java @@ -4,6 +4,7 @@ import cn.hutool.core.map.Dict; import cn.hutool.extra.expression.engine.jexl.JexlEngine; import cn.hutool.extra.expression.engine.jfireel.JfireELEngine; import cn.hutool.extra.expression.engine.mvel.MvelEngine; +import cn.hutool.extra.expression.engine.qlexpress.QLExpressEngine; import cn.hutool.extra.expression.engine.rhino.RhinoEngine; import cn.hutool.extra.expression.engine.spel.SpELEngine; import org.junit.Assert; @@ -95,4 +96,16 @@ public class ExpressionUtilTest { Assert.assertEquals(-143.8, (double)eval, 0); } + @Test + public void qlExpressTest(){ + final ExpressionEngine engine = new QLExpressEngine(); + + final Dict dict = Dict.of() + .set("a", 100.3) + .set("b", 45) + .set("c", -199.100); + final Object eval = engine.eval("a-(b-c)", dict); + Assert.assertEquals(-143.8, (double)eval, 0); + } + }