You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2018/07/19 07:18:06 UTC
[kylin] 02/02: KYLIN-3186 expand partition-date-column format
This is an automated email from the ASF dual-hosted git repository.
shaofengshi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 7f2aa5ad3cbdac59763b7539f1d31bf099d51cb5
Author: chao long <wa...@qq.com>
AuthorDate: Tue Jul 17 19:11:40 2018 +0800
KYLIN-3186 expand partition-date-column format
---
.../org/apache/kylin/common/util/DateFormat.java | 30 +++++++++++++++++++---
.../apache/kylin/metadata/model/PartitionDesc.java | 8 +++---
2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/core-common/src/main/java/org/apache/kylin/common/util/DateFormat.java b/core-common/src/main/java/org/apache/kylin/common/util/DateFormat.java
index 29858f1..5035e03 100644
--- a/core-common/src/main/java/org/apache/kylin/common/util/DateFormat.java
+++ b/core-common/src/main/java/org/apache/kylin/common/util/DateFormat.java
@@ -32,6 +32,11 @@ public class DateFormat {
public static final String DEFAULT_TIME_PATTERN = "HH:mm:ss";
public static final String DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_DATETIME_PATTERN_WITH_MILLISECONDS = "yyyy-MM-dd HH:mm:ss.SSS";
+ public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
+ public static final String YYYY_MM_DD_HH = "yyyy-MM-dd HH";
+ public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+ public static final String YYYYMMDDHHMM = "yyyyMMddHHmm";
+ public static final String YYYYMMDDHH = "yyyyMMddHH";
public static final String[] SUPPORTED_DATETIME_PATTERN = { //
DEFAULT_DATE_PATTERN, //
DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS, //
@@ -48,7 +53,7 @@ public class DateFormat {
}
return r;
}
-
+
public static String formatToCompactDateStr(long millis) {
return formatToDateStr(millis, COMPACT_DATE_PATTERN);
}
@@ -94,13 +99,23 @@ public class DateFormat {
public static long stringToMillis(String str) {
// try to be smart and guess the date format
if (isAllDigits(str)) {
- if (str.length() == 8)
+ if (str.length() == 8 && isInputFormatDate(str, COMPACT_DATE_PATTERN))
//TODO: might be prolematic if an actual ts happends to be 8 digits, e.g. 1970-01-01 10:00:01.123
return stringToDate(str, COMPACT_DATE_PATTERN).getTime();
+ else if (str.length() == 10 && isInputFormatDate(str, YYYYMMDDHH))
+ return stringToDate(str, YYYYMMDDHH).getTime();
+ else if (str.length() == 12 && isInputFormatDate(str, YYYYMMDDHHMM))
+ return stringToDate(str, YYYYMMDDHHMM).getTime();
+ else if (str.length() == 14 && isInputFormatDate(str, YYYYMMDDHHMMSS))
+ return stringToDate(str, YYYYMMDDHHMMSS).getTime();
else
return Long.parseLong(str);
} else if (str.length() == 10) {
return stringToDate(str, DEFAULT_DATE_PATTERN).getTime();
+ } else if (str.length() == 13) {
+ return stringToDate(str, YYYY_MM_DD_HH).getTime();
+ } else if (str.length() == 16) {
+ return stringToDate(str, YYYY_MM_DD_HH_MM).getTime();
} else if (str.length() == 19) {
return stringToDate(str, DEFAULT_DATETIME_PATTERN_WITHOUT_MILLISECONDS).getTime();
} else if (str.length() > 19) {
@@ -137,7 +152,16 @@ public class DateFormat {
return false;
}
+ public static boolean isInputFormatDate(String dateStr, String formatStr) {
+ try {
+ return dateStr.equals(dateToString(stringToDate(dateStr, formatStr), formatStr));
+ } catch (Exception ex) {
+ return false;
+ }
+ }
+
public static boolean isDatePattern(String ptn) {
- return COMPACT_DATE_PATTERN.equals(ptn) || DEFAULT_DATE_PATTERN.equals(ptn);
+ return COMPACT_DATE_PATTERN.equals(ptn) || YYYYMMDDHH.equals(ptn) || YYYYMMDDHHMM.equals(ptn)
+ || YYYYMMDDHHMMSS.equals(ptn);
}
}
diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/PartitionDesc.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/PartitionDesc.java
index 2f23bdc..b3bf6cc 100644
--- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/PartitionDesc.java
+++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/PartitionDesc.java
@@ -199,7 +199,7 @@ public class PartitionDesc implements Serializable {
StringBuilder builder = new StringBuilder();
if (partDesc.partitionColumnIsYmdInt()) {
- buildSingleColumnRangeCondAsYmdInt(builder, partitionDateColumn, startInclusive, endExclusive);
+ buildSingleColumnRangeCondAsYmdInt(builder, partitionDateColumn, startInclusive, endExclusive, partDesc.getPartitionDateFormat());
} else if (partDesc.partitionColumnIsTimeMillis()) {
buildSingleColumnRangeCondAsTimeMillis(builder, partitionDateColumn, startInclusive, endExclusive);
} else if (partitionDateColumn != null && partitionTimeColumn == null) {
@@ -225,13 +225,13 @@ public class PartitionDesc implements Serializable {
}
private static void buildSingleColumnRangeCondAsYmdInt(StringBuilder builder, TblColRef partitionColumn,
- long startInclusive, long endExclusive) {
+ long startInclusive, long endExclusive, String partitionColumnDateFormat) {
String partitionColumnName = partitionColumn.getIdentity();
builder.append(partitionColumnName + " >= "
- + DateFormat.formatToDateStr(startInclusive, DateFormat.COMPACT_DATE_PATTERN));
+ + DateFormat.formatToDateStr(startInclusive, partitionColumnDateFormat));
builder.append(" AND ");
builder.append(partitionColumnName + " < "
- + DateFormat.formatToDateStr(endExclusive, DateFormat.COMPACT_DATE_PATTERN));
+ + DateFormat.formatToDateStr(endExclusive, partitionColumnDateFormat));
}
private static void buildSingleColumnRangeCondition(StringBuilder builder, TblColRef partitionColumn,