134 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * Copyright (c) 2021 OceanBase
 | 
						|
 * OceanBase CE is licensed under Mulan PubL v2.
 | 
						|
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | 
						|
 * You may obtain a copy of Mulan PubL v2 at:
 | 
						|
 *          http://license.coscl.org.cn/MulanPubL-2.0
 | 
						|
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
 * See the Mulan PubL v2 for more details.
 | 
						|
 */
 | 
						|
 | 
						|
#define USING_LOG_PREFIX \
 | 
						|
  SQL:                   \
 | 
						|
  q
 | 
						|
#include "test_trans_utils.h"
 | 
						|
#include <sql/rewrite/ob_transformer_impl.h>
 | 
						|
#include <iostream>
 | 
						|
 | 
						|
namespace test {
 | 
						|
const int TestTransUtils::trans_type_[9] = {
 | 
						|
    SIMPLIFY,
 | 
						|
    ANYALL,
 | 
						|
    AGGR,
 | 
						|
    ELIMINATE_OJ,
 | 
						|
    VIEW_MERGE,
 | 
						|
    WHERE_SQ_PULL_UP,
 | 
						|
    SET_OP,
 | 
						|
};
 | 
						|
 | 
						|
bool TestTransUtils::parse_cmd(int argc, char* argv[], CmdLineParam& param)
 | 
						|
{
 | 
						|
  bool ret = true;
 | 
						|
 | 
						|
  int opt = 0;
 | 
						|
  const char* opt_string = "o:e:r:a:h";
 | 
						|
  struct option longopts[] = {{"all_rules", 1, NULL, 'a'},
 | 
						|
      {"only_rule", 1, NULL, 'o'},
 | 
						|
      {"except_rule", 1, NULL, 'e'},
 | 
						|
      {"rules", 1, NULL, 'r'},
 | 
						|
      {"help", 1, NULL, 'h'},
 | 
						|
      {0, 0, 0, 0}};
 | 
						|
 | 
						|
  while ((opt = getopt_long(argc, argv, opt_string, longopts, NULL)) != -1) {
 | 
						|
    param.use_it_ = true;
 | 
						|
    switch (opt) {
 | 
						|
      case 'a': {
 | 
						|
        // default rules is already all
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      case 'o': {
 | 
						|
        int tmp = static_cast<int>(strtol(optarg, NULL, 10));
 | 
						|
        if (tmp < 0 || tmp >= 9) {
 | 
						|
          return false;
 | 
						|
        }
 | 
						|
        std::cout << tmp << std::endl;
 | 
						|
        param.rules_ &= trans_type_[tmp];
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      case 'e': {
 | 
						|
        int tmp = static_cast<int>(strtol(optarg, NULL, 10));
 | 
						|
        if (tmp < 0 || tmp >= 9) {
 | 
						|
          return false;
 | 
						|
        }
 | 
						|
        std::cout << tmp << std::endl;
 | 
						|
        param.rules_ &= ~trans_type_[tmp];
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      case 'r': {
 | 
						|
        param.rules_ = INVALID_TRANSFORM_TYPE;
 | 
						|
        const char* split = ",";
 | 
						|
        char* c;
 | 
						|
        c = strtok(optarg, split);
 | 
						|
        while (c != NULL) {
 | 
						|
          if (*c < '0' || *c >= '9') {
 | 
						|
            return false;
 | 
						|
          }
 | 
						|
          int tmp = static_cast<int>(*c - '0');
 | 
						|
          std::cout << tmp << std::endl;
 | 
						|
          param.rules_ |= static_cast<TRANSFORM_TYPE>(trans_type_[tmp]);
 | 
						|
          c = strtok(NULL, split);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      case 'h': {
 | 
						|
        print_help();
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      default: {
 | 
						|
        ret = false;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ret;
 | 
						|
}
 | 
						|
 | 
						|
void TestTransUtils::print_help()
 | 
						|
{
 | 
						|
  const char* options[] = {
 | 
						|
      "-a :    apply all rules",
 | 
						|
      "-o :    apply just rule x",
 | 
						|
      "-e :    apply all rules except x",
 | 
						|
      "-r :    apply rules(-r x,y,z...)",
 | 
						|
      NULL,
 | 
						|
  };
 | 
						|
  std::cout << "================ options begin =====================\n";
 | 
						|
  for (int i = 0; options[i] != NULL; ++i) {
 | 
						|
    std::cout << options[i] << "\n";
 | 
						|
  }
 | 
						|
  std::cout << "================ options end ======================\n";
 | 
						|
 | 
						|
  std::cout << "\n";
 | 
						|
  const char* rules[] = {
 | 
						|
      "SIMPLIFY :         0",
 | 
						|
      "ANYALL :           1",
 | 
						|
      "AGGR :             2",
 | 
						|
      "ELIMINATE_OJ :     3",
 | 
						|
      "VIEW_MERGE :       4",
 | 
						|
      "WHERE_SQ_PULL_UP : 5",
 | 
						|
      "EQ_COND_PULL_UP :  6",
 | 
						|
      "PREDICATE_DEDUCE :   7",
 | 
						|
      NULL,
 | 
						|
  };
 | 
						|
  std::cout << "=============== rules number begin ========================\n";
 | 
						|
  for (int i = 0; rules[i] != NULL; ++i) {
 | 
						|
    std::cout << rules[i] << "\n";
 | 
						|
  }
 | 
						|
  std::cout << "=============== rules number end ========================\n";
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace test
 |