基于JEP并结合可配置公式实现用户自定义字段的解决方案

随着 IT 技术的普及和发展,用户的信息化水平越来越高,软件产品除了满足用户的基本需求之外,还必须越来越照顾到用户的个性化需求,为用户提供深层次的">个性化服务。以一个包含报表展示功能的产品为例,默认呈现给所有用户完全相同的报表,即同一个报表的字段内容和标签对所有用户完全相同。而在实际中,我们常常会遇到不同的用户由于其业务需求的不同,对于同一张报表,除基本数据字段之外,还要求额外增加符合该用户特定业务含义的字段,我们称之为用户自定义字段(Custom Metric)。这类需求在财务报表,数据分析报表中是比较常见。对于用户自定义字段,不同的用户给定不同的计算公式,甚至对于同一个用户的同一个字段,其计算公式也可能会随着时间推移而改变。一种直观的方法就是将所有用户有可能用到的字段都存储起来,然后再对不同的用户实现不同的字段,这样不仅会造成存储空间的浪费,而且后期的维护成本也十分高昂。本文将介绍一种基于 JEP 和可配置公式的解决方案,在不增加额外存储空间的情况下,灵活快速的解决用户的该类需求,并且具有良好的维护性和扩展性。

JEP 介绍

考虑到很多人对 JEP 还比较陌生,在介绍整个实现方案之前,有必要先让您对 JEP 有一个初步的了解。

JEP(Java Math Expression Parser)是一个第三方的 Java 工具包,提供了一套用于解析和计算数学表达式的类库,其核心功能就是计算公式的解析和结果的计算。在 JEP2.4.1 版本之前为符合 GPLv3 协议的开源免费包,你可以在 sourceforge 网站上下载和使用。使用 JEP 提供的 API,可以根据用户给定的公式来即时计算结果。JEP 支持用户自定义变量、常量和函数。在 JEP 中,已经预先包含大量的可使用的通用数学函数和常量,可满足日常的绝大部分数学计算需求。其官方网站是 http://www.singularsys.com/jep/,大家可以在该网站上下载试用版本和相关文档。

JEP 具有如下的特性:

文件小巧(jar archive 文件
大小在 300k 以下) 快速求值 精度高,计算中使用 BigDecimal 包含常见的数学函数和运算符 支持布尔型表达式 良好的可扩展和可配置性 支持字符串,向量和
复杂数值 支持隐式乘法 允许声明的或者未声明的变量 兼容 JAVA1.5 支持 Unicode 字符 大量的开发文档供参考 包含 JAVACC 语法分析生成器可自动生成 main class

JEP 对一个表达式的计算分为两个步骤。JEP 首先会对表达式进行解析,解析后会生成一个树形结构,接下来会基于这个树形结构进行快速求值。其工作流程图如下:

图 1. JEP 工作流程图

从上图可以看出,JEP 的工作过程十分简单。下面举一个简单的例子进行进一步说明,让您对 JEP 有一个更加直观的了解。

清单 1. JEP 简单示例 Jep jep = new Jep(); try { int x = 10; //1. 设置变量的值 jep.addVariable("x", x); //2. 载入并解析公式 jep.parse("x+1"); //3. 计算结果 Object result = jep.evaluate(); //4. 输出显示 System.out.println("x + 1 = " + result + " (When x="+x+")"); } catch (Exception e) { System.out.println("An error occured: " + e.getMessage()); } 输出结果:x + 1 = 11.0 (When x=10)

经过以上的介绍,想必您已经对 JEP 有一个初步的认识,那么接下来就可以开始进入本文的主题了。

时间: 2024-09-20 06:05:09

基于JEP并结合可配置公式实现用户自定义字段的解决方案的相关文章

一种基于 JEP 和可配置公式实现用户自定义字段的解决方案

背景 随着 IT 技术的普及和发展,用户的信息化水平越来越高,软件产品除了满足用户的基本需求 之外,还必须越来越照顾到用户的个性化需求,为用户提供深层次的个性化服务.以一个包含报表展示功能的 产品为例,默认呈现给所有用户完全相同的报表,即同一个报表的字段内容和标签对所有用户完全相同.而在 实际中,我们常常会遇到不同的用户由于其业务需求的不同,对于同一张报表,除基本数据字段之外,还要求 额外增加符合该用户特定业务含义的字段,我们称之为用户自定义字段(Custom Metric).这类需求在财务 报

基于端口的VLAN典型配置指导

VLAN典型配置全过程 如下:组网图498)this.w idth=498;' onmousewheel = 'javascript:return big(this)' height="320" alt="基于端口的VLAN典型配置指导" width="402" border="0" src="http://images.51cto.com/files/uploadimg/20110308/1129090.jpg&q

《CCNP安全VPN 642-648认证考试指南(第2版)》——8.5节配置第一个AnyConnect IKEv2 VPN解决方案

8.5配置第一个AnyConnect IKEv2 VPN解决方案CCNP安全VPN 642-648认证考试指南(第2版)建立IKEv2 AnyConnect连接的过程类似于建立SSL连接的过程,我们需要下面的步骤来成功地建立一个IKEv2的连接. 关键步骤1配置ASA接口的IP地址. 步骤2输入主机名和域名. 步骤3向CA登记并成为PKI的成员(只有基于证书的验证才需要这样做) 步骤4为IKEv2和AnyConnect客户端的访问启动相关的接口.在IKEv2和AnyConnect客户端的访问能够

solrcloud solr core-solrcloud怎么配置每个core的字段

问题描述 solrcloud怎么配置每个core的字段 solrcloud怎么配置每个core的字段,有点不明白怎么操作

.NET下基于组件的分布式系统动态配置

动态|分布式 摘要 动态配置为基于组件的分布式系统提供了一种在线演化的强大机制.本文提出了一种在MS Dot Net环境下建立一个可动态配置的分布式应用系统的策略. 关键字 组件.AOP.动态配置 引言 随着分布式系统在各个关键业务中起到越来越多的作用,如银行系统.基础通信系统,而这些业务是需要长时间不间断运行的,因此对系统的演化必需是在线进行的.本文提出了一种在MS Dot Net Framework环境下实现基于组件的分布式系统的动态配置策略. 对分布式系统描述 基于组件技术的分布式系统可以

Spring3.2中Bean定义之基于Annotation和Java Code配置方式的源码解析

基于 Annotation 配置 Bean Definition 的源码解读 本系列文章第一部分分析了 Spring 解析 XML 配置文件中 <bean /> 元素的源码,这是 Spring 最原始的一种配置方式,同时也使 XML 中的节点具有命名空间特性.参考 Spring 相关文档,如果有如下的配置方式: <context:component-scan base-package="com.colorcc.spring.sample" /> 则可知:其一,该

基于报文地址的策略路由配置示例

[实验拓扑] 本文实验采用的交换机是H3C模拟器,下载地址如下: http://forum.h3c.com/forum.php? mod=viewthread&tid=109740&highlight=H3C%E6%A8%A1%E6% 8B%9F%E5%99%A8 有兴趣的朋 友可以在论坛上去下载 [组网需求] 普通的报文转发是依据报文的目的地址查询转发表来实现的.策略路由支持基于acl包过滤.地址长度等信息,灵活地指定路由.而acl报文过滤则可以根据报文的源ip.目的ip.协议.端口号.

基于openwrt的shadowsocks智能代理配置

配置环境 openwrt12.09稳定版 基于ar71xx 安装shadowsocks 因为shadowsocks的aes-256加密需要高版本的libpolarssl,但是12.09源中的libpolarssl不是最新的,虽说做个软链接也能够"骗过"shadowsocks,但是对于一个重度强迫症患者来说一定要装最新的!! 经测试,trunk源中的libpolarssl可以在12.09中使用,ssh到路由器上并安装: cd /tmp wget http://downloads.open

基于Annotation和Java Code配置方式的源码解析

本系列文章第一部分分析了 Spring 解析 XML 配置文件中 <bean /> 元素的源码,这是 Spring 最原始的一种配置方式,同时也使 XML 中的节点具有命名空间特性.参考 Spring 相关文档,如果有如下的配置方式: <context:component-scan base-package="com.colorcc.spring.sample"/> 则可知:其一,该元素采用了"http://www.springframework.or