package com.taobao.tddl.group.utils; import com.taobao.tddl.common.utils.TStringUtil; import com.taobao.tddl.group.config.GroupIndex; import com.taobao.tddl.common.utils.logger.Logger; import com.taobao.tddl.common.utils.logger.LoggerFactory; /** * @author <a href="junyu@taobao.com">junyu</a> * @version 1.0 * @since 1.6 * @date 2010-12-24上午10:32:16 */ public class GroupHintParser { public static Logger log = LoggerFactory.getLogger(GroupHintParser.class); public static GroupIndex convertHint2Index(String sql) { String groupIndexHint = extractTDDLGroupHint(sql); if (null != groupIndexHint && !groupIndexHint.equals("")) { String[] hintWithRetry = groupIndexHint.split(","); if (hintWithRetry.length == 1) { int index = GroupHintParser.getIndexFromHintPiece(hintWithRetry[0]); return new GroupIndex(index, false); } else if (hintWithRetry.length == 2) { int index = GroupHintParser.getIndexFromHintPiece(hintWithRetry[0]); boolean retry = GroupHintParser.getFailRetryFromHintPiece(hintWithRetry[1]); return new GroupIndex(index, retry); } else { throw new IllegalArgumentException("the standard group hint is:'groupIndex:12[,failRetry:true]'" + ",current hint is:" + groupIndexHint); } } else { return null; } } private static int getIndexFromHintPiece(String indexPiece) { String[] piece = indexPiece.split(":"); if (piece[0].trim().equalsIgnoreCase("groupIndex")) { return Integer.valueOf(piece[1]); } else { throw new IllegalArgumentException("the standard group hint is:'groupIndex:12[,failRetry:true]'" + ",current index hint is:" + indexPiece); } } private static boolean getFailRetryFromHintPiece(String retryPiece) { String[] piece = retryPiece.split(":"); if (piece[0].trim().equalsIgnoreCase("failRetry")) { return Boolean.valueOf(piece[1]); } else { throw new IllegalArgumentException("the standard group hint is:'groupIndex:12[,failRetry:true]'" + ",current retry hint is:" + retryPiece); } } public static String extractTDDLGroupHint(String sql) { return TStringUtil.getBetween(sql, "/*+TDDL_GROUP({", "})*/"); } public static String removeTddlGroupHint(String sql) { String tddlHint = extractTDDLGroupHint(sql); if (null == tddlHint || "".equals(tddlHint)) { return sql; } sql = TStringUtil.removeBetweenWithSplitor(sql, "/*+TDDL_GROUP({", "})*/"); return sql; } public static String buildTddlGroupHint(String groupHint) { return "/*+TDDL_GROUP({" + groupHint + "})*/"; } public static void main(String[] args) { String sql = "/*+TDDL_GROUP({groupIndex:12})*/select * from tab"; System.out.println(convertHint2Index(sql)); System.out.println(removeTddlGroupHint(sql)); } }