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
 | 
