posts - 18,  comments - 0,  trackbacks - 0
问题描述:
      编译器现在的表合并只允许两张表,客户提出需要增加多表间的合并。
处理过程:
      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)  编辑  收藏 所属分类: 工作日志

只有注册用户登录后才能发表评论。


网站导航: