問題描述:
編譯器現(xiàn)在的表合并只允許兩張表,客戶提出需要增加多表間的合并。
處理過程:
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的正閉包子規(guī)則,在語法定義中第一次用到,原來的都是( ...)*閉包子規(guī)則。
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
* 獲取可執(zhí)行的英文SQL語句(如果要插入的表名不為空,則可進行插入記錄操作)
3
* @param intoTableName 要插入的表名
4
* @return String 可執(zhí)行的英文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語句替換成當(dāng)前的表名/字段名
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語句替換成當(dāng)前的表名/字段名
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 閱讀(229)
評論(0) 編輯 收藏 所屬分類:
工作日志