XML布尔判定[1]——生成条件组合

本文介绍了一种使用XML配置文件来定义过滤条件的方法,通过生成布尔表达式的各种组合来筛选从Oracle导出的数据。文章详细展示了如何利用Java编程语言实现这一过程,包括生成所有可能的布尔组合。

最近在写毕设,用到MyBatis,发现里面有个动态SQL的XML判定

但是,这里不是关于MyBatis后台实现的,呵呵,那个有机会再去看看后台实现

翻出去年实习写的一个半成品

需求:

有一系列从Oracle中导出多个txt数据文件,但是新的项目需要的是这几张表中某几个字段的组合,我写了个SQL语句生成器,半成品一直放着没时间完善。即使用XML进行配置,根据配置信息提取对应项的对应值,并过滤,最后组成插入新表的SQL语句

过滤这个环节用到了在XML中配置布尔表达式

例如:[这个是我当时定义的SW代表startsWith EW代表endWith EQ代表equals]

<Filter> <!-- fieldName唯一标识一个字段 --> <reserver value="("/> <field fieldName="BRH_ID" operation="SW" value="50"/> <reserver value="and"/> <field fieldName="BRH_ID" operation="EW" value="901"/> <reserver value=") or"/> <field fieldName="BRH_ID" operation="EQ" value="99999999"/> </Filter>

因为数据量是十分大的

我实现的思想是

1.根据配置文件信息生成布尔表达式组合

2.写一个解析判定组合true/false的算法

3.一个组合字符串对应一个布尔值

在文件输入时,根据判定拿到每个配置项的true/false

找到这种组合下是否通过过滤

通过,数据放入,否则,数据丢弃

首先,生成布尔情况组合

需求:输入XML中配置布尔判定的个数

输出:布尔组合

例如,输入2

输出 00

01

10

11

实现思想,

循环整数[0-pow(2,i)) 左闭右开 i为个数,例如输入2,有两个布尔

则循环 0 1 2 3

四个数的二进制组合刚好对应

00

01

10

11

以下是代码:

package filter; /** * 布尔组合生成器 * * @author ken * */ public class StatementConstructor { /** * 生成长度为i的所有boolean组合数组,存储于String二维数组中 * @param i 存在boolean * @return */ public static String[][] getAll(int i) { int row = new Double(Math.pow(2, i)).intValue(); String[][] result = new String[row][i]; for (int j = 0; j < row; j++) { //System.out.println( j+" "+fillWith(Integer.toBinaryString(j), '0', i) ); result[j] = toStringArray(fillWith(Integer.toBinaryString(j), '0', i).toCharArray()); } return result; } /** * 将字符数组转为字符串数组 * @param array * @return */ private static String[] toStringArray(char[] array) { String[] str = new String[array.length]; for (int i = 0; i < array.length; i++) { str[i] = array[i]+""; } return str; } /** * 长度补足为length,补足前面补相应个字符c * @param value 原来字符串 * @param c 填充字符 * @param length 目标字符串长度 * @return */ private static String fillWith(String value,char c,int length) { StringBuffer str = new StringBuffer(value); int valueLength = str.length(); for (int i = 0; i < length-valueLength; i++) { str.insert(0, c); } return str.toString(); } public static void main(String[] args) { //System.out.println(Integer.toBinaryString(2)); String[][] result = StatementConstructor.getAll(4); for (int i = 0; i < result.length; i++) { //System.out.println(result[i]); for (int j = 0; j < result[i].length; j++) { System.out.print(result[i][j]+" "); } System.out.println(); } } }

好了

生成各种组合之后,我们接下来需要写一个计算布尔表达式最终结果的算法

下一篇整理出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值