formula

基于 groovy 实现的公式库

项目地址

Github

语法

公式名(参数)

比如:

ECHO(大侠王波波)

支持公式嵌套:

公式名1(公式名2(参数), 参数)

比如:

ECHO(UUID())

快速开始

  1. 创建 Formula 对象 formula
  2. 运行 formula.run("script")

下面是例子:

package tk.fishfish.formula;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; /**
* 公式测试
*
* @author 奔波儿灞
* @since 1.0
*/
public class FormulaTest { private Formula formula; @Before
public void setup() {
formula = new Formula();
} @Test
public void lower() {
Object result = formula.run("LOWER(ABC)");
Assert.assertEquals("abc", result);
} }

默认公式

这里只是抛砖引玉,实现了如下文本公式:

  • UUID() 返回uuid
  • LOWER(xxx) 转小写
  • UPPER(xxx) 转大写

这里未实现丰富文本、时间、数学、逻辑等公式,只是提供一个扩展机制,方便大家定制自己的公式库。

开发自己的公式

  • 继承 Plugin 接口

    package tk.fishfish.formula.plugin;
    
    import tk.fishfish.formula.annotation.FormulaMapping;
    
    /**
    * 自定义公式
    *
    * @author 奔波儿灞
    * @since 1.0
    */
    public class CustomPlugin implements Plugin { /**
    * 实现自己的公式
    *
    * @param name 参数
    * @return 结果
    */
    @FormulaMapping("ECHO")
    public String echo(String name) {
    return "echo: " + name;
    } }
  • 自定义方法,增加 @FormulaMapping 注解 映射公式名称

  • 安装插件类,FormulaScript.installPlugin(CustomPlugin.class)

    package tk.fishfish.formula;
    
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import tk.fishfish.formula.plugin.CustomPlugin;
    import tk.fishfish.formula.script.FormulaScript; import java.math.BigDecimal; /**
    * 公式测试
    *
    * @author 奔波儿灞
    * @since 1.0
    */
    public class FormulaTest { private Formula formula; @BeforeClass
    public static void init() {
    // 安装自己的公式插件
    FormulaScript.installPlugin(CustomPlugin.class);
    } @Before
    public void setup() {
    formula = new Formula();
    } @Test
    public void plugin() {
    Object result = formula.run("ECHO(xxx)");
    System.out.println(result);
    } }

注意:

  • 先安装自己的公式,再创建 Formula 对象
  • 公式名全局不可重复

SPI扩展

除了可以手动 FormulaScript.installPlugin(CustomPlugin.class) 安装自定义公式以外,还能通过 SPI 注册。

在 src/main/resources/META-INF/services 目录下创建名称为 tk.fishfish.formula.plugin.Plugin 的文件,里面是实现类的全类名:

# custom plugin
tk.fishfish.formula.plugin.CustomPlugin

此时,会自动通过 SPI 机制发现实现类,自动安装,实现解偶。

关于

变量

大部分情况下,业务定制的公式都会含有变量,比如:

公式名(变量)

一般地,都会在运行时,替换变量。

package tk.fishfish.formula;

import groovy.lang.Binding;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tk.fishfish.formula.plugin.CustomPlugin;
import tk.fishfish.formula.script.FormulaScript; /**
* 公式测试
*
* @author 奔波儿灞
* @since 1.0
*/
public class FormulaTest { private Formula formula; @Before
public void setup() {
formula = new Formula();
} @Test
public void variable() {
Binding binding = new Binding();
binding.setVariable("xxx", "ABC");
// 传入 Binding 上下文
Object result = formula.run("LOWER(xxx)", binding);
Assert.assertEquals("abc", result);
} }

依赖

更有甚者,存在依赖关系,比如:

  • 值 A 的公式为:公式1(xxx)
  • 值 B 的公式为:公式2(A),注意 B 依赖 A 的结果

此时,就存在依赖关系了,即 B 依赖 A

这里未提供代码解决该场景,这里可以给予提示,依赖关系可转化为 DAG(有向无环图)计算。

该部分代码暂不开源。

数据库公式

这个也是业务必备,这里仍不开源。

大家可采用 groovy-sql 或者 JdbcTemplate 实现即可。

基于 groovy 实现公式库的更多相关文章

  1. muParser公式库使用简介( 转)

    muParser是一个跨平台的公式解析库,它可以自定义多参数函数,自定义常量.变量及一元前缀.后缀操作符,二元操作符等,它将公式编译成字节码,所以计算起来非常快. 当前版本V1.28,官方网址http ...

  2. 基于 Groovy 的自动化构建工具 Gradle 入门(转)

    本人工作之初没有使用自动化构建,后来敏捷了,开始使用 Ant - 完全面向过程的定义步骤,不进行依赖管理.再发展到 Maven,面向对象的方式管理工程,有了依赖的管理,JAR 包统一从中央仓库获得,保 ...

  3. 基于Qt的第三方库和控件

    ====================== 基于Qt的第三方库和控件 ======================     libQxt --------   http://dev.libqxt.o ...

  4. 利用cocoapods创建基于git的私有库

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  5. 基于Groovy应用程序的spring boot

    spring boot CLI 它是使用Spring Boot的最简单的和快速的的方法.他是一个基于Groovy脚本的命令工具.可以按照以下步骤安装次工具: 1.去spring官网下载 http:// ...

  6. 基于Groovy+HttpRestful的超轻量级的接口测试用例配置的设计方案及DEMO实现

    目标 设计一个轻量级测试用例框架,接口测试编写者只需要编写测试用例相关的内容(入参及结果校验),不需要理会系统的实现,不需要写跟测试校验无关的内容. 思路 测试用例分析 一个用例由以下部分组成: (1 ...

  7. Axios 是一个基于 promise 的 HTTP 库

    Axios 是一个基于 promise 的 HTTP 库 vue项目中关于axios的简单使用 axios介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.j ...

  8. 利用cocoapods创建基于git的私有库Spec Repo

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  9. github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调

    github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调.仅支持一个server和一个client交互. 地址:https://github.com/rocket049/ ...

随机推荐

  1. STL迭代器的使用

    STL的迭代器听起来怪吓人的,其实并不是什么高深的东西,说白了就是定义了一个指向STL的指针.. 对于没个STIL都可以定义 set,,vector ,,map,,,string 定义: set< ...

  2. Python - Python的基础知识结构,学习方法、难点和重点

    [原创]转载请注明作者Johnthegreat和本文链接. 相信大家都知道,Python很容易学,有编程基础的人,最多两个星期就可以很愉快的撸Python的代码了,那么具体涉及的知识有哪些,下面为大家 ...

  3. PHP Curl 请求https 60错误解决办法

      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 

  4. 基于scrapy框架输入关键字爬取有关贴吧帖子

    基于scrapy框架输入关键字爬取有关贴吧帖子 站点分析 首先进入一个贴吧,要想达到输入关键词爬取爬取指定贴吧,必然需要利用搜索引擎 点进看到有四种搜索方式,分别试一次,观察url变化 我们得知: 搜 ...

  5. Xss Game挑战

    前言 最新学习了下xss的更深入的东西,学习了一波浏览器解析机制和XSS向量编码的知识. 这里就些xss的练习题巩固知识 学习的话结合如下两篇文章看,从例子和基础原理层面都有: http://boba ...

  6. Jwt认识与攻击

    今天看到2018强网杯的题目,因此总结一下. Json Web Token Json Web Token简称jwt 那么怎么样可以让HTTP记住曾经发生的事情呢? 这里的选择可以很多:cookie,s ...

  7. 百度云BCH配置说明

    百度云虚拟空间(BCH)  来源:https://www.cnblogs.com/llll/p/7930029.html 参考资料:https://cloud.baidu.com/doc/BCH/Ge ...

  8. 共享文件夹下其他文件可以访问但php文件访问不了的原因

    刚开始的问题是在virtualbox里的共享文件夹下的项目运行不了,原因是宝塔下nginx的用户和用户组默认是www 和 www 需要改成www vboxsf(因为自动挂载的目录为/media/sf_ ...

  9. dns的抓包分析

    dns: 域名系统(服务)协议 dns的解析全过程: 1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束.同时域名被缓存的时间也可通过TTL属性来设置. 2. 如果浏 ...

  10. 【Inno Setup】查看是否安装了VC++ 2015 Redistributeable

    可能有必要先测一下注册表的这一项是否存在 if RegValueExists(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Ru ...