You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by pr...@apache.org on 2016/10/17 19:55:19 UTC
[29/50] [abbrv] asterixdb git commit: ASTERIXDB-1635 Fix for
overlap-bins start for dates.
ASTERIXDB-1635 Fix for overlap-bins start for dates.
Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/d4cbcb2f
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/d4cbcb2f
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/d4cbcb2f
Branch: refs/heads/ecarm002/interval_join_merge
Commit: d4cbcb2fe05649d02f12a0196eaa508cb5f7c623
Parents: 1df9a9c
Author: Preston Carman <pr...@apache.org>
Authored: Tue Sep 6 16:10:24 2016 -0700
Committer: Preston Carman <pr...@apache.org>
Committed: Tue Sep 6 16:10:24 2016 -0700
----------------------------------------------------------------------
.../overlap_bins/overlap_bins.1.query.aql | 2 +-
.../overlap_bins/overlap_bins.3.query.sqlpp | 2 +-
.../temporal/overlap_bins/overlap_bins.1.adm | 2 +-
.../temporal/overlap_bins/overlap_bins.3.ast | 2 +-
.../src/site/markdown/aql/functions.md | 9 +-
.../om/base/temporal/DateTimeFormatUtils.java | 200 ++++++++++---------
.../temporal/DurationArithmeticOperations.java | 32 +--
.../temporal/OverlapBinsDescriptor.java | 25 ++-
8 files changed, 146 insertions(+), 128 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d4cbcb2f/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/overlap_bins/overlap_bins.1.query.aql
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/overlap_bins/overlap_bins.1.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/overlap_bins/overlap_bins.1.query.aql
index 8011ad6..bfb5527 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/overlap_bins/overlap_bins.1.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temporal/overlap_bins/overlap_bins.1.query.aql
@@ -25,5 +25,5 @@ let $itv1 := interval(time("17:23:37"), time("18:30:21"))
let $itv2 := interval(date("1984-03-17"), date("2013-08-22"))
let $itv3 := interval(datetime("1800-01-01T23:59:48.938"), datetime("2015-07-26T13:28:30.218"))
return { "timebins": overlap-bins($itv1, time("00:00:00"), day-time-duration("PT30M")),
- "datebins": overlap-bins($itv2, date("1990-01-01"), year-month-duration("P20Y")),
+ "datebins": overlap-bins($itv2, date("1990-01-01"), year-month-duration("P10Y")),
"datetimebins": overlap-bins($itv3, datetime("1900-01-01T00:00:00.000"), year-month-duration("P100Y")) }
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d4cbcb2f/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins/overlap_bins.3.query.sqlpp
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins/overlap_bins.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins/overlap_bins.3.query.sqlpp
index e42707f..90cd95e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins/overlap_bins.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins/overlap_bins.3.query.sqlpp
@@ -22,6 +22,6 @@
**/
{ 'timebins':`overlap-bins`(interval(time('17:23:37'),time('18:30:21')),time('00:00:00'),`day-time-duration`('PT30M')),
- 'datebins':`overlap-bins`(interval(date('1984-03-17'),date('2013-08-22')),date('1990-01-01'),`year-month-duration`('P20Y')),
+ 'datebins':`overlap-bins`(interval(date('1984-03-17'),date('2013-08-22')),date('1990-01-01'),`year-month-duration`('P10Y')),
'datetimebins':`overlap-bins`(interval(datetime('1800-01-01T23:59:48.938'),datetime('2015-07-26T13:28:30.218')),datetime('1900-01-01T00:00:00.000'),
`year-month-duration`('P100Y'))};
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d4cbcb2f/asterixdb/asterix-app/src/test/resources/runtimets/results/temporal/overlap_bins/overlap_bins.1.adm
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temporal/overlap_bins/overlap_bins.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temporal/overlap_bins/overlap_bins.1.adm
index 493a1ca..14f6aae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temporal/overlap_bins/overlap_bins.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/temporal/overlap_bins/overlap_bins.1.adm
@@ -1 +1 @@
-{ "timebins": [ interval(time("17:00:00.000Z"), time("17:30:00.000Z")), interval(time("17:30:00.000Z"), time("18:00:00.000Z")), interval(time("18:00:00.000Z"), time("18:30:00.000Z")), interval(time("18:30:00.000Z"), time("19:00:00.000Z")) ], "datebins": [ interval(date("1970-01-01"), date("1990-01-01")), interval(date("1990-01-01"), date("2010-01-01")), interval(date("2010-01-01"), date("2030-01-01")) ], "datetimebins": [ interval(datetime("1800-01-01T00:00:00.000Z"), datetime("1900-01-01T00:00:00.000Z")), interval(datetime("1900-01-01T00:00:00.000Z"), datetime("2000-01-01T00:00:00.000Z")), interval(datetime("2000-01-01T00:00:00.000Z"), datetime("2100-01-01T00:00:00.000Z")) ] }
+{ "timebins": [ interval(time("17:00:00.000Z"), time("17:30:00.000Z")), interval(time("17:30:00.000Z"), time("18:00:00.000Z")), interval(time("18:00:00.000Z"), time("18:30:00.000Z")), interval(time("18:30:00.000Z"), time("19:00:00.000Z")) ], "datebins": [ interval(date("1980-01-01"), date("1990-01-01")), interval(date("1990-01-01"), date("2000-01-01")), interval(date("2000-01-01"), date("2010-01-01")), interval(date("2010-01-01"), date("2020-01-01")) ], "datetimebins": [ interval(datetime("1800-01-01T00:00:00.000Z"), datetime("1900-01-01T00:00:00.000Z")), interval(datetime("1900-01-01T00:00:00.000Z"), datetime("2000-01-01T00:00:00.000Z")), interval(datetime("2000-01-01T00:00:00.000Z"), datetime("2100-01-01T00:00:00.000Z")) ] }
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d4cbcb2f/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins/overlap_bins.3.ast
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins/overlap_bins.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins/overlap_bins.3.ast
index 962d9ff..01cd805 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins/overlap_bins.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins/overlap_bins.3.ast
@@ -36,7 +36,7 @@ RecordConstructor [
LiteralExpr [STRING] [1990-01-01]
]
FunctionCall null.year-month-duration@1[
- LiteralExpr [STRING] [P20Y]
+ LiteralExpr [STRING] [P10Y]
]
]
)
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d4cbcb2f/asterixdb/asterix-doc/src/site/markdown/aql/functions.md
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-doc/src/site/markdown/aql/functions.md b/asterixdb/asterix-doc/src/site/markdown/aql/functions.md
index b6f5538..81ef9c7 100644
--- a/asterixdb/asterix-doc/src/site/markdown/aql/functions.md
+++ b/asterixdb/asterix-doc/src/site/markdown/aql/functions.md
@@ -2310,7 +2310,7 @@ See the [Allen's Relations](allens.html).
let $itv2 := interval(date("1984-03-17"), date("2013-08-22"))
let $itv3 := interval(datetime("1800-01-01T23:59:48.938"), datetime("2015-07-26T13:28:30.218"))
return { "timebins": overlap-bins($itv1, time("00:00:00"), day-time-duration("PT30M")),
- "datebins": overlap-bins($itv2, date("1990-01-01"), year-month-duration("P20Y")),
+ "datebins": overlap-bins($itv2, date("1990-01-01"), year-month-duration("P10Y")),
"datetimebins": overlap-bins($itv3, datetime("1900-01-01T00:00:00.000"), year-month-duration("P100Y")) }
* The expected result is:
@@ -2319,9 +2319,10 @@ See the [Allen's Relations](allens.html).
interval(time("17:30:00.000Z"), time("18:00:00.000Z")),
interval(time("18:00:00.000Z"), time("18:30:00.000Z")),
interval(time("18:30:00.000Z"), time("19:00:00.000Z")) ],
- "datebins": [ interval(date("1970-01-01"), date("1990-01-01")),
- interval(date("1990-01-01"), date("2010-01-01")),
- interval(date("2010-01-01"), date("2030-01-01")) ],
+ "datebins": [ interval(date("1980-01-01"), date("1990-01-01")),
+ interval(date("1990-01-01"), date("2000-01-01")),
+ interval(date("2000-01-01"), date("2010-01-01")),
+ interval(date("2010-01-01"), date("2020-01-01")) ],
"datetimebins": [ interval(datetime("1800-01-01T00:00:00.000Z"), datetime("1900-01-01T00:00:00.000Z")),
interval(datetime("1900-01-01T00:00:00.000Z"), datetime("2000-01-01T00:00:00.000Z")),
interval(datetime("2000-01-01T00:00:00.000Z"), datetime("2100-01-01T00:00:00.000Z")) ] }
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d4cbcb2f/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
index 8e33d44..1051458 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
@@ -51,24 +51,24 @@ import org.apache.hyracks.api.exceptions.HyracksDataException;
*/
public class DateTimeFormatUtils {
- private final GregorianCalendarSystem CAL = GregorianCalendarSystem.getInstance();
+ private static final GregorianCalendarSystem CAL = GregorianCalendarSystem.getInstance();
- private final Charset ENCODING = Charset.forName("UTF-8");
+ private static final Charset ENCODING = Charset.forName("UTF-8");
// For time
- private final char HOUR_CHAR = 'h';
- private final char MINUTE_CHAR = 'm';
- private final char SECOND_CHAR = 's';
- private final char MILLISECOND_CHAR = 'n';
- private final char AMPM_CHAR = 'a';
- private final char TIMEZONE_CHAR = 'z';
-
- private final int MAX_HOUR_CHARS = 2;
- private final int MAX_MINUTE_CHARS = 2;
- private final int MAX_SECOND_CHARS = 2;
- private final int MAX_MILLISECOND_CHARS = 3;
- private final int MAX_AMPM_CHARS = 1;
- private final int MAX_TIMEZONE_CHARS = 1;
+ private static final char HOUR_CHAR = 'h';
+ private static final char MINUTE_CHAR = 'm';
+ private static final char SECOND_CHAR = 's';
+ private static final char MILLISECOND_CHAR = 'n';
+ private static final char AMPM_CHAR = 'a';
+ private static final char TIMEZONE_CHAR = 'z';
+
+ private static final int MAX_HOUR_CHARS = 2;
+ private static final int MAX_MINUTE_CHARS = 2;
+ private static final int MAX_SECOND_CHARS = 2;
+ private static final int MAX_MILLISECOND_CHARS = 3;
+ private static final int MAX_AMPM_CHARS = 1;
+ private static final int MAX_TIMEZONE_CHARS = 1;
private enum DateTimeProcessState {
INIT,
@@ -87,52 +87,51 @@ public class DateTimeFormatUtils {
}
// For date
- private final char YEAR_CHAR = 'Y';
- private final char MONTH_CHAR = 'M';
- private final char DAY_CHAR = 'D';
- private final char WEEKDAY_CHAR = 'W';
+ private static final char YEAR_CHAR = 'Y';
+ private static final char MONTH_CHAR = 'M';
+ private static final char DAY_CHAR = 'D';
+ private static final char WEEKDAY_CHAR = 'W';
- private final int MAX_YEAR_CHARS = 4;
- private final int MAX_MONTH_CHARS = 3;
- private final int MAX_DAY_CHARS = 2;
- private final int MAX_WEEKDAY_CHAR = 1;
+ private static final int MAX_YEAR_CHARS = 4;
+ private static final int MAX_MONTH_CHARS = 3;
+ private static final int MAX_DAY_CHARS = 2;
+ private static final int MAX_WEEKDAY_CHAR = 1;
- private final byte[][] MONTH_NAMES = new byte[][] { "jan".getBytes(ENCODING), "feb".getBytes(ENCODING),
+ private static final byte[][] MONTH_NAMES = new byte[][] { "jan".getBytes(ENCODING), "feb".getBytes(ENCODING),
"mar".getBytes(ENCODING), "apr".getBytes(ENCODING), "may".getBytes(ENCODING), "jun".getBytes(ENCODING),
"jul".getBytes(ENCODING), "aug".getBytes(ENCODING), "sep".getBytes(ENCODING), "oct".getBytes(ENCODING),
"nov".getBytes(ENCODING), "dec".getBytes(ENCODING) };
- private final byte[][] WEEKDAY_FULL_NAMES = new byte[][] { "monday".getBytes(ENCODING),
+ private static final byte[][] WEEKDAY_FULL_NAMES = new byte[][] { "monday".getBytes(ENCODING),
"tuesday".getBytes(ENCODING), "wednesday".getBytes(ENCODING), "thursday".getBytes(ENCODING),
"friday".getBytes(ENCODING), "saturday".getBytes(ENCODING), "sunday".getBytes(ENCODING) };
- private final byte[] UTC_BYTEARRAY = "utc".getBytes(ENCODING);
- private final byte[] GMT_BYTEARRAY = "gmt".getBytes(ENCODING);
+ private static final byte[] UTC_BYTEARRAY = "utc".getBytes(ENCODING);
+ private static final byte[] GMT_BYTEARRAY = "gmt".getBytes(ENCODING);
- private final byte[] AM_BYTEARRAY = "am".getBytes(ENCODING);
- private final byte[] PM_BYTEARRAY = "pm".getBytes(ENCODING);
+ private static final byte[] AM_BYTEARRAY = "am".getBytes(ENCODING);
+ private static final byte[] PM_BYTEARRAY = "pm".getBytes(ENCODING);
// Separators, for both time and date
- private final char HYPHEN_CHAR = '-';
- private final char COLON_CHAR = ':';
- private final char SOLIDUS_CHAR = '/';
- private final char PERIOD_CHAR = '.';
- private final char COMMA_CHAR = ',';
- private final char T_CHAR = 'T';
+ private static final char HYPHEN_CHAR = '-';
+ private static final char COLON_CHAR = ':';
+ private static final char SOLIDUS_CHAR = '/';
+ private static final char PERIOD_CHAR = '.';
+ private static final char COMMA_CHAR = ',';
+ private static final char T_CHAR = 'T';
// Skipper, representing a field with characters and numbers that to be skipped
- private final char SKIPPER_CHAR = 'O';
- private final int MAX_SKIPPER_CHAR = 1;
+ private static final char SKIPPER_CHAR = 'O';
+ private static final int MAX_SKIPPER_CHAR = 1;
- private final int MS_PER_MINUTE = 60 * 1000;
- private final int MS_PER_HOUR = 60 * MS_PER_MINUTE;
+ private static final int MS_PER_MINUTE = 60 * 1000;
+ private static final int MS_PER_HOUR = 60 * MS_PER_MINUTE;
- private final byte TO_LOWER_OFFSET = 'A' - 'a';
+ private static final byte TO_LOWER_OFFSET = 'A' - 'a';
- private final String[] TZ_IDS = TimeZone.getAvailableIDs();
+ private static final String[] TZ_IDS = TimeZone.getAvailableIDs();
-
- private Comparator<byte[]> byteArrayComparator = new Comparator<byte[]>() {
+ private static Comparator<byte[]> byteArrayComparator = new Comparator<byte[]>() {
@Override
public int compare(byte[] o1, byte[] o2) {
int i = 0;
@@ -150,32 +149,35 @@ public class DateTimeFormatUtils {
}
};
- private final byte[][] TIMEZONE_IDS = new byte[TZ_IDS.length][];
- {
+ private static final byte[][] TIMEZONE_IDS = new byte[TZ_IDS.length][];
+ static {
for (int i = 0; i < TIMEZONE_IDS.length; i++) {
TIMEZONE_IDS[i] = TZ_IDS[i].getBytes(ENCODING);
}
Arrays.sort(TIMEZONE_IDS, byteArrayComparator);
}
- private final int[] TIMEZONE_OFFSETS = new int[TIMEZONE_IDS.length];
- {
+ private static final int[] TIMEZONE_OFFSETS = new int[TIMEZONE_IDS.length];
+ static {
for (int i = 0; i < TIMEZONE_IDS.length; i++) {
TIMEZONE_OFFSETS[i] = TimeZone.getTimeZone(new String(TIMEZONE_IDS[i], ENCODING)).getRawOffset();
}
}
+ private DateTimeFormatUtils() {
+ }
+
private static class DateTimeFormatUtilsHolder {
private static final DateTimeFormatUtils INSTANCE = new DateTimeFormatUtils();
+
+ private DateTimeFormatUtilsHolder() {
+ }
}
public static DateTimeFormatUtils getInstance() {
return DateTimeFormatUtilsHolder.INSTANCE;
}
- private DateTimeFormatUtils() {
- }
-
private int parseFormatField(byte[] format, int formatStart, int formatLength, int formatPointer, char formatChar,
int maxAllowedFormatCharCopied) {
@@ -188,9 +190,9 @@ public class DateTimeFormatUtils {
formatCharCopies++;
}
if (formatCharCopies > maxAllowedFormatCharCopied) {
- throw new IllegalStateException("The format string for " + formatChar
- + " is too long: expected no more than " + maxAllowedFormatCharCopied + " but got "
- + formatCharCopies);
+ throw new IllegalStateException(
+ "The format string for " + formatChar + " is too long: expected no more than "
+ + maxAllowedFormatCharCopied + " but got " + formatCharCopies);
}
return formatCharCopies;
@@ -442,7 +444,8 @@ public class DateTimeFormatUtils {
}
// for more digits
while (processedFieldsCount < maxAllowedFormatCharCopies && dataStringPointer < dataLength
- && data[dataStart + dataStringPointer] >= '0' && data[dataStart + dataStringPointer] <= '9') {
+ && data[dataStart + dataStringPointer] >= '0'
+ && data[dataStart + dataStringPointer] <= '9') {
parsedValue = parsedValue * 10 + (data[dataStart + dataStringPointer] - '0');
dataStringPointer++;
processedFieldsCount++;
@@ -464,15 +467,16 @@ public class DateTimeFormatUtils {
month = monthNameMatch + 1;
dataStringPointer += 3;
} else {
- throw new AsterixTemporalTypeParseException("Unrecognizable month string "
- + (char) data[dataStart + dataStringPointer] + " "
- + (char) data[dataStart + dataStringPointer + 1] + " "
- + (char) data[dataStart + dataStringPointer + 2]);
+ throw new AsterixTemporalTypeParseException(
+ "Unrecognizable month string " + (char) data[dataStart + dataStringPointer] + " "
+ + (char) data[dataStart + dataStringPointer + 1] + " "
+ + (char) data[dataStart + dataStringPointer + 2]);
}
} else {
int processedMonthFieldsCount = 0;
for (int i = 0; i < formatCharCopies; i++) {
- if (data[dataStart + dataStringPointer] < '0' || data[dataStart + dataStringPointer] > '9') {
+ if (data[dataStart + dataStringPointer] < '0'
+ || data[dataStart + dataStringPointer] > '9') {
throw new AsterixTemporalTypeParseException("Unexpected char for month field at "
+ (dataStart + dataStringPointer) + ": " + data[dataStart + dataStringPointer]);
}
@@ -495,17 +499,17 @@ public class DateTimeFormatUtils {
break;
case WEEKDAY:
int processedWeekdayFieldsCount = 0;
- while ((data[dataStart + dataStringPointer + processedWeekdayFieldsCount] >= 'a' && data[dataStart
- + dataStringPointer + processedWeekdayFieldsCount] <= 'z')
- || (data[dataStart + dataStringPointer + processedWeekdayFieldsCount] >= 'A' && data[dataStart
- + dataStringPointer + processedWeekdayFieldsCount] <= 'Z')) {
+ while ((data[dataStart + dataStringPointer + processedWeekdayFieldsCount] >= 'a'
+ && data[dataStart + dataStringPointer + processedWeekdayFieldsCount] <= 'z')
+ || (data[dataStart + dataStringPointer + processedWeekdayFieldsCount] >= 'A'
+ && data[dataStart + dataStringPointer + processedWeekdayFieldsCount] <= 'Z')) {
processedWeekdayFieldsCount++;
}
// match the weekday name
if (weekdayIDSearch(data, dataStart + dataStringPointer, processedWeekdayFieldsCount) < 0) {
throw new AsterixTemporalTypeParseException("Unexpected string for day-of-week: "
- + (new String(Arrays.copyOfRange(data, dataStart + dataStringPointer, dataStart
- + dataStringPointer + processedWeekdayFieldsCount))));
+ + (new String(Arrays.copyOfRange(data, dataStart + dataStringPointer,
+ dataStart + dataStringPointer + processedWeekdayFieldsCount))));
}
dataStringPointer += processedWeekdayFieldsCount;
break;
@@ -531,7 +535,8 @@ public class DateTimeFormatUtils {
}
// if there are more than formatCharCopies digits for the hour string
while (processFieldsCount < expectedMaxCount && dataStringPointer < dataLength
- && data[dataStart + dataStringPointer] >= '0' && data[dataStart + dataStringPointer] <= '9') {
+ && data[dataStart + dataStringPointer] >= '0'
+ && data[dataStart + dataStringPointer] <= '9') {
parsedValue = parsedValue * 10 + (data[dataStart + dataStringPointer] - '0');
dataStringPointer++;
processFieldsCount++;
@@ -553,18 +558,19 @@ public class DateTimeFormatUtils {
if (data[dataStart + dataStringPointer] == 'Z'
&& ((dataStringPointer + 1 >= dataLength) || (data[dataStart + dataStringPointer + 1] < 'A'
&& data[dataStart + dataStringPointer + 1] > 'Z'
- && data[dataStart + dataStringPointer + 1] < 'a' && data[dataStart
- + dataStringPointer + 1] > 'z'))) {
+ && data[dataStart + dataStringPointer + 1] < 'a'
+ && data[dataStart + dataStringPointer + 1] > 'z'))) {
// UTC as Z
timezone = 0;
dataStringPointer++;
- } else if ((data[dataStart + dataStringPointer] == '+' || data[dataStart + dataStringPointer] == '-')
- || (dataStringPointer + 3 < dataLength && (data[dataStart + dataStringPointer + 3] == '+' || data[dataStart
- + dataStringPointer + 3] == '-'))) {
+ } else if ((data[dataStart + dataStringPointer] == '+'
+ || data[dataStart + dataStringPointer] == '-')
+ || (dataStringPointer + 3 < dataLength && (data[dataStart + dataStringPointer + 3] == '+'
+ || data[dataStart + dataStringPointer + 3] == '-'))) {
// UTC+ or GMT+ format
- if (dataStringPointer + 3 < dataLength
- && (byteArrayEqualToString(data, dataStart + dataStringPointer, 3, UTC_BYTEARRAY) || byteArrayEqualToString(
- data, dataStart + dataStringPointer, 3, GMT_BYTEARRAY))) {
+ if (dataStringPointer + 3 < dataLength && (byteArrayEqualToString(data,
+ dataStart + dataStringPointer, 3, UTC_BYTEARRAY)
+ || byteArrayEqualToString(data, dataStart + dataStringPointer, 3, GMT_BYTEARRAY))) {
dataStringPointer += 3;
}
// parse timezone as +zz:zz or +zzzz
@@ -615,24 +621,24 @@ public class DateTimeFormatUtils {
} else {
// do lookup from the zoneinfor database
int timezoneEndField = dataStringPointer;
- while (timezoneEndField < dataLength
- && ((data[dataStart + timezoneEndField] >= '0' && data[dataStart + timezoneEndField] <= '9')
- || (data[dataStart + timezoneEndField] >= 'a' && data[dataStart
- + timezoneEndField] <= 'z')
- || (data[dataStart + timezoneEndField] >= 'A' && data[dataStart
- + timezoneEndField] <= 'Z')
- || data[dataStart + timezoneEndField] == '/' || data[dataStart
- + timezoneEndField] == '_')) {
+ while (timezoneEndField < dataLength && ((data[dataStart + timezoneEndField] >= '0'
+ && data[dataStart + timezoneEndField] <= '9')
+ || (data[dataStart + timezoneEndField] >= 'a'
+ && data[dataStart + timezoneEndField] <= 'z')
+ || (data[dataStart + timezoneEndField] >= 'A'
+ && data[dataStart + timezoneEndField] <= 'Z')
+ || data[dataStart + timezoneEndField] == '/'
+ || data[dataStart + timezoneEndField] == '_')) {
timezoneEndField++;
}
- int searchIdx = binaryTimezoneIDSearch(data, dataStart + dataStringPointer, timezoneEndField
- - dataStringPointer);
+ int searchIdx = binaryTimezoneIDSearch(data, dataStart + dataStringPointer,
+ timezoneEndField - dataStringPointer);
if (searchIdx >= 0) {
timezone = TIMEZONE_OFFSETS[searchIdx];
} else {
- throw new AsterixTemporalTypeParseException("Unexpected timezone string: "
- + new String(Arrays.copyOfRange(data, dataStart + dataStringPointer, dataStart
- + timezoneEndField)));
+ throw new AsterixTemporalTypeParseException(
+ "Unexpected timezone string: " + new String(Arrays.copyOfRange(data,
+ dataStart + dataStringPointer, dataStart + timezoneEndField)));
}
dataStringPointer = timezoneEndField;
}
@@ -650,9 +656,9 @@ public class DateTimeFormatUtils {
hour = 0;
}
} else {
- throw new AsterixTemporalTypeParseException("Unexpected string for AM/PM marker "
- + new String(Arrays.copyOfRange(data, dataStart + dataStringPointer, dataStart
- + dataStringPointer + 2)));
+ throw new AsterixTemporalTypeParseException(
+ "Unexpected string for AM/PM marker " + new String(Arrays.copyOfRange(data,
+ dataStart + dataStringPointer, dataStart + dataStringPointer + 2)));
}
dataStringPointer += 2;
} else {
@@ -662,15 +668,17 @@ public class DateTimeFormatUtils {
case SKIPPER:
// just skip all continuous character and numbers
while ((data[dataStart + dataStringPointer] >= 'a' && data[dataStart + dataStringPointer] <= 'z')
- || (data[dataStart + dataStringPointer] >= 'A' && data[dataStart + dataStringPointer] <= 'Z')
- || (data[dataStart + dataStringPointer] >= '0' && data[dataStart + dataStringPointer] <= '9')) {
+ || (data[dataStart + dataStringPointer] >= 'A'
+ && data[dataStart + dataStringPointer] <= 'Z')
+ || (data[dataStart + dataStringPointer] >= '0'
+ && data[dataStart + dataStringPointer] <= '9')) {
dataStringPointer++;
}
break;
case SEPARATOR:
if (separatorChar == '\0') {
- throw new AsterixTemporalTypeParseException("Incorrect separator char in date string as "
- + data[dataStart + dataStringPointer]);
+ throw new AsterixTemporalTypeParseException(
+ "Incorrect separator char in date string as " + data[dataStart + dataStringPointer]);
}
for (int i = 0; i < formatCharCopies; i++) {
if (data[dataStart + dataStringPointer] != separatorChar) {
@@ -822,8 +830,8 @@ public class DateTimeFormatUtils {
break;
default:
- throw new HyracksDataException("Unexpected format string at " + (formatStart + formatPointer)
- + ": " + format[formatStart + formatPointer]);
+ throw new HyracksDataException("Unexpected format string at " + (formatStart + formatPointer) + ": "
+ + format[formatStart + formatPointer]);
}
// check whether the process state is valid for the parse mode
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d4cbcb2f/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DurationArithmeticOperations.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DurationArithmeticOperations.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DurationArithmeticOperations.java
index 404bf42..2e32378 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DurationArithmeticOperations.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DurationArithmeticOperations.java
@@ -23,18 +23,24 @@ package org.apache.asterix.om.base.temporal;
*/
public class DurationArithmeticOperations {
- private final static GregorianCalendarSystem calSystem = GregorianCalendarSystem.getInstance();
+ private static final GregorianCalendarSystem GREG_CAL = GregorianCalendarSystem.getInstance();
+
+ private DurationArithmeticOperations() {
+ }
/**
* Add a duration (with yearMonth and dayTime) onto a time point. The algorithm works as described in
* <a
* href="http://www.w3.org/TR/xmlschema-2/#adding-durations-to-dateTimes">"XML: adding durations to dateTimes"</a>.
* <p/>
- * The basic algorithm is like this: duration is applied to the time point as two separated fields: year-month field and day-time field. Year-month field is applied firstly by reserving the correct day within the month's range (for example add 1M to 03-31 will return 04-30). Then day-time field is applied.
+ * The basic algorithm is like this: duration is applied to the time point as two separated fields: year-month
+ * field and day-time field. Year-month field is applied firstly by reserving the correct day within the month's
+ * range (for example add 1M to 03-31 will return 04-30). Then day-time field is applied.
* <p/>
*
* @param pointChronon
- * The time instance where the duration will be added, represented as the milliseconds since the anchored time (00:00:00 for time type, 1970-01-01T00:00:00Z for datetime and date types).
+ * The time instance where the duration will be added, represented as the milliseconds since the
+ * anchored time (00:00:00 for time type, 1970-01-01T00:00:00Z for datetime and date types).
* @param yearMonthDuration
* The year-month-duration to be added
* @param dayTimeDuration
@@ -54,19 +60,19 @@ public class DurationArithmeticOperations {
return rtnChronon;
}
- int year = calSystem.getYear(pointChronon);
- int month = calSystem.getMonthOfYear(pointChronon, year);
- int day = calSystem.getDayOfMonthYear(pointChronon, year, month);
- int hour = calSystem.getHourOfDay(pointChronon);
- int min = calSystem.getMinOfHour(pointChronon);
- int sec = calSystem.getSecOfMin(pointChronon);
- int ms = calSystem.getMillisOfSec(pointChronon);
+ int year = GREG_CAL.getYear(pointChronon);
+ int month = GREG_CAL.getMonthOfYear(pointChronon, year);
+ int day = GREG_CAL.getDayOfMonthYear(pointChronon, year, month);
+ int hour = GREG_CAL.getHourOfDay(pointChronon);
+ int min = GREG_CAL.getMinOfHour(pointChronon);
+ int sec = GREG_CAL.getSecOfMin(pointChronon);
+ int ms = GREG_CAL.getMillisOfSec(pointChronon);
// Apply the year-month duration
int carry = yearMonthDuration / 12;
month += (yearMonthDuration % 12);
- if (month < 0) {
+ if (month < 1) {
month += 12;
carry -= 1;
} else if (month > 12) {
@@ -76,7 +82,7 @@ public class DurationArithmeticOperations {
year += carry;
- boolean isLeapYear = calSystem.isLeapYear(year);
+ boolean isLeapYear = GREG_CAL.isLeapYear(year);
if (isLeapYear) {
if (day > GregorianCalendarSystem.DAYS_OF_MONTH_ORDI[month - 1]) {
@@ -88,7 +94,7 @@ public class DurationArithmeticOperations {
}
}
- return calSystem.getChronon(year, month, day, hour, min, sec, ms, 0) + dayTimeDuration;
+ return GREG_CAL.getChronon(year, month, day, hour, min, sec, ms, 0) + dayTimeDuration;
}
}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/d4cbcb2f/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
index 836408d..15229e2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
@@ -36,6 +36,7 @@ import org.apache.asterix.om.base.temporal.GregorianCalendarSystem;
import org.apache.asterix.om.functions.AsterixBuiltinFunctions;
import org.apache.asterix.om.functions.IFunctionDescriptor;
import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.typecomputer.impl.ADateTypeComputer;
import org.apache.asterix.om.types.AOrderedListType;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.BuiltinType;
@@ -95,7 +96,7 @@ public class OverlapBinsDescriptor extends AbstractScalarFunctionDynamicDescript
private final ISerializerDeserializer<AInterval> intervalSerde = AqlSerializerDeserializerProvider.INSTANCE
.getSerializerDeserializer(BuiltinType.AINTERVAL);
- private final GregorianCalendarSystem GREG_CAL = GregorianCalendarSystem.getInstance();
+ private final GregorianCalendarSystem gregCalSys = GregorianCalendarSystem.getInstance();
@Override
public void evaluate(IFrameTupleReference tuple, IPointable result) throws AlgebricksException {
@@ -109,13 +110,17 @@ public class OverlapBinsDescriptor extends AbstractScalarFunctionDynamicDescript
ATypeTag type0 = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes0[offset0]);
- long intervalStart = 0, intervalEnd = 0;
+ long intervalStart;
+ long intervalEnd;
byte intervalTypeTag;
if (type0 == ATypeTag.INTERVAL) {
intervalStart = AIntervalSerializerDeserializer.getIntervalStart(bytes0, offset0 + 1);
intervalEnd = AIntervalSerializerDeserializer.getIntervalEnd(bytes0, offset0 + 1);
intervalTypeTag = AIntervalSerializerDeserializer.getIntervalTimeType(bytes0, offset0 + 1);
+ if (intervalTypeTag == ATypeTag.SERIALIZED_DATE_TYPE_TAG) {
+ intervalStart = intervalStart * GregorianCalendarSystem.CHRONON_OF_DAY;
+ }
} else {
throw new AlgebricksException(getIdentifier().getName()
+ ": the first argument should be INTERVAL/NULL/MISSING but got " + type0);
@@ -130,7 +135,7 @@ public class OverlapBinsDescriptor extends AbstractScalarFunctionDynamicDescript
+ type0 + "(" + intervalTypeTag + ") for the second argument but got " + type1);
}
- long anchorTime = 0;
+ long anchorTime;
switch (type1) {
case DATE:
anchorTime = ADateSerializerDeserializer.getChronon(bytes1, offset1 + 1)
@@ -160,10 +165,10 @@ public class OverlapBinsDescriptor extends AbstractScalarFunctionDynamicDescript
case YEARMONTHDURATION:
yearMonth = AYearMonthDurationSerializerDeserializer.getYearMonth(bytes2, offset2 + 1);
- int yearStart = GREG_CAL.getYear(anchorTime);
- int monthStart = GREG_CAL.getMonthOfYear(anchorTime, yearStart);
- int yearToBin = GREG_CAL.getYear(intervalStart);
- int monthToBin = GREG_CAL.getMonthOfYear(intervalStart, yearToBin);
+ int yearStart = gregCalSys.getYear(anchorTime);
+ int monthStart = gregCalSys.getMonthOfYear(anchorTime, yearStart);
+ int yearToBin = gregCalSys.getYear(intervalStart);
+ int monthToBin = gregCalSys.getMonthOfYear(intervalStart, yearToBin);
int totalMonths = (yearToBin - yearStart) * 12 + (monthToBin - monthStart);
@@ -195,7 +200,8 @@ public class OverlapBinsDescriptor extends AbstractScalarFunctionDynamicDescript
+ type2);
}
- long binStartChronon, binEndChronon;
+ long binStartChronon;
+ long binEndChronon;
int binOffset;
listBuilder.reset(intListType);
@@ -302,9 +308,6 @@ public class OverlapBinsDescriptor extends AbstractScalarFunctionDynamicDescript
};
}
- /* (non-Javadoc)
- * @see org.apache.asterix.om.functions.AbstractFunctionDescriptor#getIdentifier()
- */
@Override
public FunctionIdentifier getIdentifier() {
return AsterixBuiltinFunctions.OVERLAP_BINS;