问题描述:
编译器现在的表合并只允许两张表,客户提出需要增加多表间的合并。
处理过程:
1、首先是对多表合并的验证部分进行了修改,原代码如下:
tableUnion
: ("t_union"^|"表合并"^) table_name COMMA! table_name
;
修改后代码如下:
tableUnion
: ("t_union"^|"表合并"^) table_lists
;
table_lists
: table_name (COMMA^ table_name)+
;
(COMMA^ table_name)+ 表示至少需一个table_name的正闭包子规则,在语法定义中第一次用到,原来的都是( ...)*闭包子规则。
2、
修改抽象语法树遍历代码,并将表合并模型对象TableUnionModel原来的addTableModel1(TableModel tableModel)、addTableModel2(TableModel tableModel)方法去掉,增加addTableListModel(TableListModel tableListModel)方法,所有的表模型对象TableModel 先存储在表列表模型对象中 TableListModel ,再将TableListModel 增加到TableUnionModel中。
: #("表合并" tableModel1 = table_name tableModel2 = table_name)
{
union.addTableModel1(tableModel1);
union.addTableModel2(tableModel2);
model = union;
}
改成
: #("表合并" t1 = tableUnionList)
{
union.addTableListModel(t1);
model = union;
}
tableUnionList的抽象语法树遍历代码如下:
tableUnionList returns [TableListModel model]
{
model = new TableListModel();
TableModel t;
TableListModel m1, m2;
}
: #(COMMA m1=tableUnionList m2=tableUnionList)
{model.addChild(m1); model.addChild(m2);}
| t = table_name
{model.addTable(t);}
;
3、修改了TableUnionModel代码,获取中英文SQL语句均可对多张表操作,代码如下:
1/** *//**
2 * 获取格式化后的中文SQL语句
3 */
4 public String getChString() {
5 QueryModel[] tableModelArr = getModelsFromAllChildrenByClass(TableModel.class);
6
7 String ret = UNION_CN_NAME;
8 for (int i = 0; i < tableModelArr.length; i++){
9 ret += ((TableModel) tableModelArr[i]).getTableName();
10 if (i < tableModelArr.length - 1)
11 ret += ", ";
12 }
13 return ret;
14 }
1/** *//**
2 * 获取可执行的英文SQL语句(如果要插入的表名不为空,则可进行插入记录操作)
3 * @param intoTableName 要插入的表名
4 * @return String 可执行的英文SQL语句
5 */
6 public String getExecuteEnString(String intoTableName) {
7 String rValue = "";
8 QueryModel[] tableModelArr = getModelsFromAllChildrenByClass(TableModel.class);
9 for (int i = 0; i < tableModelArr.length; i++){
10 DbTableModel _dbTableModel = getDbTableModel();
11 TableModel tableModel = (TableModel) tableModelArr[i];
12 String enFieldStr = _dbTableModel.getFieldsEnStr(tableModel.getChString());
13 if (intoTableName == null || intoTableName.equals("") || intoTableName.length() == 0){
14 //如果合并的表名为第二张及之后,则需增加"UNION ALL"
15 if (i > 0)
16 rValue += unionAll;
17
18 //将SQL语句替换成当前的表名/字段名
19 rValue += StringUtil.replace(unionStr,
20 new String[]{"_FIELDS_", "_FROM_TABLE_NAME_"},
21 new String[]{enFieldStr, tableModel.getEnString()}
22 );
23 }else{
24 //获取要插入的临时表英文SQL语句
25 if (i == 0){
26 rValue = StringUtil.replace(unionIntoStr,
27 new String[]{"_INTO_TABLE_NAME_", "_FIELDS_"},
28 new String[]{intoTableName, enFieldStr}
29 );
30 }
31
32 //如果合并的表名为第二张及之后,则需增加"UNION ALL"
33 if (i > 0)
34 rValue += unionAll;
35
36 //将SQL语句替换成当前的表名/字段名
37 rValue += StringUtil.replace(unionStr,
38 new String[]{"_FIELDS_", "_FROM_TABLE_NAME_"},
39 new String[]{enFieldStr, tableModel.getEnString()}
40 );
41
42 }
43 }
44 return rValue;
45 }
posted on 2007-05-16 14:49
LORD BLOG 阅读(225)
评论(0) 编辑 收藏 所属分类:
工作日志