package com.alibaba.datax.plugin.rdbms.util; import com.alibaba.datax.common.util.RangeSplitUtil; import org.apache.commons.lang3.StringUtils; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; public final class RdbmsRangeSplitWrap { public static List<String> splitAndWrap(String left, String right, int expectSliceNumber, String columnName, String quote, DataBaseType dataBaseType) { String[] tempResult = RangeSplitUtil.doAsciiStringSplit(left, right, expectSliceNumber); return RdbmsRangeSplitWrap.wrapRange(tempResult, columnName, quote, dataBaseType); } // warn: do not use this method long->BigInteger public static List<String> splitAndWrap(long left, long right, int expectSliceNumber, String columnName) { long[] tempResult = RangeSplitUtil.doLongSplit(left, right, expectSliceNumber); return RdbmsRangeSplitWrap.wrapRange(tempResult, columnName); } public static List<String> splitAndWrap(BigInteger left, BigInteger right, int expectSliceNumber, String columnName) { BigInteger[] tempResult = RangeSplitUtil.doBigIntegerSplit(left, right, expectSliceNumber); return RdbmsRangeSplitWrap.wrapRange(tempResult, columnName); } public static List<String> wrapRange(long[] rangeResult, String columnName) { String[] rangeStr = new String[rangeResult.length]; for (int i = 0, len = rangeResult.length; i < len; i++) { rangeStr[i] = String.valueOf(rangeResult[i]); } return wrapRange(rangeStr, columnName, "", null); } public static List<String> wrapRange(BigInteger[] rangeResult, String columnName) { String[] rangeStr = new String[rangeResult.length]; for (int i = 0, len = rangeResult.length; i < len; i++) { rangeStr[i] = rangeResult[i].toString(); } return wrapRange(rangeStr, columnName, "", null); } public static List<String> wrapRange(String[] rangeResult, String columnName, String quote, DataBaseType dataBaseType) { if (null == rangeResult || rangeResult.length < 2) { throw new IllegalArgumentException(String.format( "Parameter rangeResult can not be null and its length can not <2. detail:rangeResult=[%s].", StringUtils.join(rangeResult, ","))); } List<String> result = new ArrayList<String>(); //TODO change to stringbuilder.append(..) if (2 == rangeResult.length) { result.add(String.format(" (%s%s%s <= %s AND %s <= %s%s%s) ", quote, quoteConstantValue(rangeResult[0], dataBaseType), quote, columnName, columnName, quote, quoteConstantValue(rangeResult[1], dataBaseType), quote)); return result; } else { for (int i = 0, len = rangeResult.length - 2; i < len; i++) { result.add(String.format(" (%s%s%s <= %s AND %s < %s%s%s) ", quote, quoteConstantValue(rangeResult[i], dataBaseType), quote, columnName, columnName, quote, quoteConstantValue(rangeResult[i + 1], dataBaseType), quote)); } result.add(String.format(" (%s%s%s <= %s AND %s <= %s%s%s) ", quote, quoteConstantValue(rangeResult[rangeResult.length - 2], dataBaseType), quote, columnName, columnName, quote, quoteConstantValue(rangeResult[rangeResult.length - 1], dataBaseType), quote)); return result; } } public static String wrapFirstLastPoint(String firstPoint, String lastPoint, String columnName, String quote, DataBaseType dataBaseType) { return String.format(" ((%s < %s%s%s) OR (%s%s%s < %s)) ", columnName, quote, quoteConstantValue(firstPoint, dataBaseType), quote, quote, quoteConstantValue(lastPoint, dataBaseType), quote, columnName); } public static String wrapFirstLastPoint(Long firstPoint, Long lastPoint, String columnName) { return wrapFirstLastPoint(firstPoint.toString(), lastPoint.toString(), columnName, "", null); } public static String wrapFirstLastPoint(BigInteger firstPoint, BigInteger lastPoint, String columnName) { return wrapFirstLastPoint(firstPoint.toString(), lastPoint.toString(), columnName, "", null); } private static String quoteConstantValue(String aString, DataBaseType dataBaseType) { if (null == dataBaseType) { return aString; } if (dataBaseType.equals(DataBaseType.MySql)) { return aString.replace("'", "''").replace("\\", "\\\\"); } else if (dataBaseType.equals(DataBaseType.Oracle) || dataBaseType.equals(DataBaseType.SQLServer)) { return aString.replace("'", "''"); } else { //TODO other type supported return aString; } } }