content: package com.alibaba.datax.plugin.rdbms.reader.util;
  
  import com.alibaba.datax.common.util.Configuration;
  import com.alibaba.datax.plugin.rdbms.reader.Constant;
  import com.alibaba.datax.plugin.rdbms.reader.Key;
  import com.alibaba.datax.plugin.rdbms.util.DBUtil;
  import com.alibaba.datax.plugin.rdbms.util.DataBaseType;
  import org.apache.commons.lang3.StringUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  /**
   * Created by liuyi on 15/9/18.
   */
  public class HintUtil {
      private static final Logger LOG = LoggerFactory.getLogger(ReaderSplitUtil.class);
  
      private static DataBaseType dataBaseType;
      private static String username;
      private static String password;
      private static Pattern tablePattern;
      private static String hintExpression;
  
      public static void initHintConf(DataBaseType type, Configuration configuration){
          dataBaseType = type;
          username = configuration.getString(Key.USERNAME);
          password = configuration.getString(Key.PASSWORD);
          String hint = configuration.getString(Key.HINT);
          if(StringUtils.isNotBlank(hint)){
              String[] tablePatternAndHint = hint.split("#");
              if(tablePatternAndHint.length==1){
                  tablePattern = Pattern.compile(".*");
                  hintExpression = tablePatternAndHint[0];
              }else{
                  tablePattern = Pattern.compile(tablePatternAndHint[0]);
                  hintExpression = tablePatternAndHint[1];
              }
          }
      }
  
      public static String buildQueryColumn(String jdbcUrl, String table, String column){
          try{
              if(tablePattern != null && DataBaseType.Oracle.equals(dataBaseType)) {
                  Matcher m = tablePattern.matcher(table);
                  if(m.find()){
                      String[] tableStr = table.split("\\.");
                      String tableWithoutSchema = tableStr[tableStr.length-1];
                      String finalHint = hintExpression.replaceAll(Constant.TABLE_NAME_PLACEHOLDER, tableWithoutSchema);
                      //主库不并发读取
                      if(finalHint.indexOf("parallel") > 0 && DBUtil.isOracleMaster(jdbcUrl, username, password)){
                          LOG.info("master:{} will not use hint:{}", jdbcUrl, finalHint);
                      }else{
                          LOG.info("table:{} use hint:{}.", table, finalHint);
                          return finalHint + column;
                      }
                  }
              }
          } catch (Exception e){
              LOG.warn("match hint exception, will not use hint", e);
          }
          return column;
      }
  
  }
  