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 閱讀(235) 評論(0)  編輯  收藏 所屬分類: 工作日志
          主站蜘蛛池模板: 南陵县| 和硕县| 石城县| 大庆市| 郧西县| 泸西县| 泰宁县| 砀山县| 澄江县| 丰宁| 济源市| 秀山| 温泉县| 盘山县| 城口县| 布尔津县| 晋江市| 秦安县| 保亭| 柞水县| 沙洋县| 射洪县| 伽师县| 巫溪县| 和平县| 河曲县| 青海省| 长岛县| 临夏县| 雅安市| 呼和浩特市| 郑州市| 兴隆县| 兖州市| 孝义市| 延津县| 平昌县| 巴中市| 富锦市| 繁昌县| 启东市|