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. E - Roaming Atcoder

    题解:https://blog.csdn.net/qq_40655981/article/details/104459253 题目大意:n个房间,,每个房间都有一个人,一共k天,在一天,一个人可以到任 ...

  2. mac上安装htop

    对于经常在mac上使用top命令的童鞋来说,htop会是一个更加好看和更加好用的命令,下面就是在mac上安装htop的步骤 1.首先去htop官网去下载,我下的是最新的2.2.0版本,网址是https ...

  3. samba 客户端工具 smbclient和samba挂载到本地

    smbclient命令属于samba套件,它提供一种命令行使用交互式方式访问samba服务器的共享资源. 安装 yum install -y samba-client 常用参数 -c<命令> ...

  4. PHP pcntl

    来源:https://www.jianshu.com/p/de0b74f58f50 pcntl是一个可以利用操作系统的fork系统调用在PHP中实现多线程的进程控制扩展,当使用fork系统调用后执行的 ...

  5. HTML H5响应式,表格,表单等

    HTML杂项 响应式图片 <img srcset="elva-fairy-320w.jpg 320w, elva-fairy-480w.jpg 480w, elva-fairy-800 ...

  6. NPM采用Rust以消除性能瓶颈

    Npam的指数级增长促使npm工程团队从Node.js切换到Rust,以处理那些将成为性能瓶颈的CPU绑定任务.最近的一份白皮书概述了在Rust中开发这个新服务,以及将其投入生产一年多的经验. 大部分 ...

  7. Linux / mac OS Shell常用命令

    一.文件.目录操作命令 1.ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可 ...

  8. 数学--数论--POJ281(线性同余方程)

    埃琳娜(Elina)正在阅读刘如家(Rujia Liu)写的书,其中介绍了一种表达非负整数的奇怪方法.方式描述如下: 选择k个不同的正整数a 1,a 2,-,a k.对于一些非负米,把它由每一个我(1 ...

  9. VMware的安装与部署Linux系统

            首先我们需要准备好我们将会用到的东西:VMware12.RHEL7.0         网址我就不放了,大家自行百度哟. 一.安装VMware         我们需要安装VMware ...

  10. MySQL 子查询——查询最大值

    子查询指将一个查询语句嵌套在另一个查询语句中.子查询可以在 SELECT.UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套.在实际开发时,子查询经常出现在 WHERE 子句中.子查询在 ...