基于 groovy 实现公式库
formula
基于 groovy 实现的公式库
项目地址
语法
公式名(参数)
比如:
ECHO(大侠王波波)
支持公式嵌套:
公式名1(公式名2(参数), 参数)
比如:
ECHO(UUID())
快速开始
- 创建 Formula 对象 formula
- 运行 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 实现公式库的更多相关文章
- muParser公式库使用简介( 转)
muParser是一个跨平台的公式解析库,它可以自定义多参数函数,自定义常量.变量及一元前缀.后缀操作符,二元操作符等,它将公式编译成字节码,所以计算起来非常快. 当前版本V1.28,官方网址http ...
- 基于 Groovy 的自动化构建工具 Gradle 入门(转)
本人工作之初没有使用自动化构建,后来敏捷了,开始使用 Ant - 完全面向过程的定义步骤,不进行依赖管理.再发展到 Maven,面向对象的方式管理工程,有了依赖的管理,JAR 包统一从中央仓库获得,保 ...
- 基于Qt的第三方库和控件
====================== 基于Qt的第三方库和控件 ====================== libQxt -------- http://dev.libqxt.o ...
- 利用cocoapods创建基于git的私有库
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- 基于Groovy应用程序的spring boot
spring boot CLI 它是使用Spring Boot的最简单的和快速的的方法.他是一个基于Groovy脚本的命令工具.可以按照以下步骤安装次工具: 1.去spring官网下载 http:// ...
- 基于Groovy+HttpRestful的超轻量级的接口测试用例配置的设计方案及DEMO实现
目标 设计一个轻量级测试用例框架,接口测试编写者只需要编写测试用例相关的内容(入参及结果校验),不需要理会系统的实现,不需要写跟测试校验无关的内容. 思路 测试用例分析 一个用例由以下部分组成: (1 ...
- Axios 是一个基于 promise 的 HTTP 库
Axios 是一个基于 promise 的 HTTP 库 vue项目中关于axios的简单使用 axios介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.j ...
- 利用cocoapods创建基于git的私有库Spec Repo
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调
github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调.仅支持一个server和一个client交互. 地址:https://github.com/rocket049/ ...
随机推荐
- B - Bash and a Tough Math Puzzle CodeForces - 914D (线段树的巧妙应用)
题目大意:当输入2时,将p处的点的值修改为x, 当输入1时,判断区间[L,R]的gcd是否几乎正确,几乎正确的定义是最多修改一个数,使得区间[L,R]的gcd为x. 题解:用线段树维护一个gcd数组, ...
- Python - 调用接口合并文件夹下多个Excel表
在工作中经常遇到需要打开许多个excel表格,然后合并的需求,合并的同时要求格式必须原汁原味的保留.利用VBA代码可以比较轻松的解决,现在我们来看Python中如何实现. 上代码: from open ...
- [PHP] 文件创建、写入、读取
创建$p = fopen('text.txt','a+b'); 写入第一种方式//var_export方式存储数组到文件中 //这中方式存浮点型数据,存储后会多很多数字!只适合简单的存储吧!我感觉! ...
- Canvas(3)---绘制饼状图
Canvas(3)---绘制饼状图 有关canvas之前有写过两篇文章 1.Canvas(1)---概述+简单示例 2.Canvas(2)---绘制折线图 在绘制饼状图之前,我们先要理解什么是圆弧,如 ...
- MySQL笔记总结-DDL语言
DDL语言 数据类型 一.数值型 1.整型 tinyint.smallint.mediumint.int/integer.bigint 1 2 3 4 8 特点: ①都可以设置无符号和有符号,默认有符 ...
- VIM 批量缩进4个空格
vim /etc/vimrc 或 vim ~/.vimrc set smartindent set shiftwidth= 按v选中多行,回车 然后shifit + >
- 梁国辉获Yes评分表系统3.0计算机软件著作权
梁国辉获Yes评分表系统3.0计算机软件著作权 Liang Guohui won the Yes score system 3 computer software copyright 登记证书如下 R ...
- SpringBoot 集成Swagger2自动生成文档和导出成静态文件
目录 1. 简介 2. 集成Swagger2 2.1 导入Swagger库 2.2 配置Swagger基本信息 2.3 使用Swagger注解 2.4 文档效果图 3. 常用注解介绍 4. Swagg ...
- CentOS7虚拟机安装vmtools
直接开始: 在安装vmtools之前,需要先安装两个小部件,否则将安装失败. 下面是步骤: 1.切换为root模式,需要输入root密码,但是不显示. 命令为: su 2.安装gcc 命令为: yum ...
- Linux 软链接和硬链接
系统链接文件 文件有文件名和数据,在Linux上被分成两个部分:用户数据(user data)与元数据(metadata) 用户数据:文件数据块(data block),数据块是记录文件真实内容的地方 ...