bug fixing and more test cases for date type.
git-svn-id: https://asterixdb.googlecode.com/svn/branches/asterix_stabilization_temp_missing_tests@1286 eaa15691-b419-025a-1212-ee371bd00084
diff --git a/asterix-app/data/temporal/temporalData.json b/asterix-app/data/temporal/temporalData.json
index 520fd4b..27a812e 100644
--- a/asterix-app/data/temporal/temporalData.json
+++ b/asterix-app/data/temporal/temporalData.json
@@ -1,3 +1,3 @@
-{"id": "001", "dateField": date("-2012-12-12"), "dateFieldPlus": date("0990-01-01"), "timeField": time("23:49:12.39Z"), "timeFieldPlus": time("03:23:12.2"), "datetimeField": datetime("2012-12-12T00:00:00.001"), "datetimeFieldPlus": datetime("-00130810T221015398"), "durationField": duration("P20Y19DT3H74M23.34S"), "durationFieldPlus": duration("-P2MT4M300.68S"), "intervalField": dtinterval("2012-12-12T00:00:00.001,20130810T221015398") }
+{"id": "001", "dateField": date("-2012-12-12"), "dateFieldPlus": date("0990-01-01"), "timeField": time("23:49:12.39Z"), "timeFieldPlus": time("03:23:12.2"), "datetimeField": datetime("2012-12-12T00:00:00.001"), "datetimeFieldPlus": datetime("-00130810T221015398"), "durationField": duration("P20Y19DT3H74M23.34S"), "durationFieldPlus": duration("-P2MT4M300.68S"), "intervalField": interval-datetime("2012-12-12T00:00:00.001,20130810T221015398") }
{"id": "002", "datetimeField": datetime("19201220T232918478") }
-{"id": "003", "intervalPlus": tinterval("19:23:32.328Z,23:20:20") }
\ No newline at end of file
+{"id": "003", "intervalPlus": interval-time("19:23:32.328Z,23:20:20") }
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/queries/constructor/date_01.aql b/asterix-app/src/test/resources/runtimets/queries/constructor/date_01.aql
index 9bbfb9d..821854c 100644
--- a/asterix-app/src/test/resources/runtimets/queries/constructor/date_01.aql
+++ b/asterix-app/src/test/resources/runtimets/queries/constructor/date_01.aql
@@ -12,6 +12,8 @@
let $c6 := date("-2043-11-19")
let $c7 := date("-19280329")
let $c8 := date("19280329")
+let $c9 := date("19000228")
+let $c10 := date("20000229")
-return {"date1": $c1, "date2": $c2, "date3": $c3, "date4": $c4, "date5": $c5, "date6": $c6, "date7": $c7, "date8": $c8}
+return {"date1": $c1, "date2": $c2, "date3": $c3, "date4": $c4, "date5": $c5, "date6": $c6, "date7": $c7, "date8": $c8, "date9": $c9, "date10": $c10}
diff --git a/asterix-app/src/test/resources/runtimets/results/constructor/date_01.adm b/asterix-app/src/test/resources/runtimets/results/constructor/date_01.adm
index 2a90c4d..8a08a03 100644
--- a/asterix-app/src/test/resources/runtimets/results/constructor/date_01.adm
+++ b/asterix-app/src/test/resources/runtimets/results/constructor/date_01.adm
@@ -1 +1 @@
-{ "date1": date("2010-10-30"), "date2": date("1987-11-19"), "date3": date("-1987-11-19"), "date4": date("0001-12-27"), "date5": date("-1951-12-27"), "date6": date("-2043-11-19"), "date7": date("-1928-03-29"), "date8": date("1928-03-29") }
\ No newline at end of file
+{ "date1": date("2010-10-30"), "date2": date("1987-11-19"), "date3": date("-1987-11-19"), "date4": date("0001-12-27"), "date5": date("-1951-12-27"), "date6": date("-2043-11-19"), "date7": date("-1928-03-29"), "date8": date("1928-03-29"), "date9": date("1900-02-28"), "date10": date("2000-02-29") }
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/results/temp/insert_from_ext_ds.adm b/asterix-app/src/test/resources/runtimets/results/temp/insert_from_ext_ds.adm
index afe2ccc..842d00c 100644
--- a/asterix-app/src/test/resources/runtimets/results/temp/insert_from_ext_ds.adm
+++ b/asterix-app/src/test/resources/runtimets/results/temp/insert_from_ext_ds.adm
@@ -1,3 +1,3 @@
-{ "date": date("-2012-12-12"), "time": time("23:49:12.390Z"), "datetime": datetime("2012-12-12T00:00:00.001Z"), "duration": duration("P20Y19DT4H14M23.34S"), "interval": interval("datetime("2012-12-12T00:00:00.001Z"), datetime("2013-08-10T22:10:15.398Z")") }
+{ "date": date("-2012-12-12"), "time": time("23:49:12.390Z"), "datetime": datetime("2012-12-12T00:00:00.001Z"), "duration": duration("P20Y19DT4H14M23.34S"), "interval": interval-datetime("2012-12-12T00:00:00.001Z, 2013-08-10T22:10:15.398Z") }
{ "date": null, "time": null, "datetime": datetime("1920-12-20T23:29:18.478Z"), "duration": null, "interval": null }
{ "date": null, "time": null, "datetime": null, "duration": null, "interval": null }
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/testsuite.xml b/asterix-app/src/test/resources/runtimets/testsuite.xml
index de694cd..480438d 100644
--- a/asterix-app/src/test/resources/runtimets/testsuite.xml
+++ b/asterix-app/src/test/resources/runtimets/testsuite.xml
@@ -3934,4 +3934,51 @@
</compilation-unit>
</test-case>
</test-group>
+ <test-group name="temp">
+ <test-case FilePath="temp">
+ <compilation-unit name="accessors">
+ <output-file compare="Text">accessors.adm</output-file>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="temp">
+ <compilation-unit name="adjust_timezone">
+ <output-file compare="Text">adjust_timezone.adm</output-file>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="temp">
+ <compilation-unit name="calendar_duration">
+ <output-file compare="Text">calendar_duration.adm</output-file>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="temp">
+ <compilation-unit name="date_functions">
+ <output-file compare="Text">date_functions.adm</output-file>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="temp">
+ <compilation-unit name="datetime_functions">
+ <output-file compare="Text">datetime_functions.adm</output-file>
+ </compilation-unit>
+ </test-case>
+<!-- <test-case FilePath="temp">
+ <compilation-unit name="insert_from_delimited_ds">
+ <output-file compare="Text">insert_from_delimited_ds.adm</output-file>
+ </compilation-unit>
+ </test-case> -->
+ <test-case FilePath="temp">
+ <compilation-unit name="insert_from_ext_ds">
+ <output-file compare="Text">insert_from_ext_ds.adm</output-file>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="temp">
+ <compilation-unit name="interval_functions">
+ <output-file compare="Text">interval_functions.adm</output-file>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="temp">
+ <compilation-unit name="time_functions">
+ <output-file compare="Text">time_functions.adm</output-file>
+ </compilation-unit>
+ </test-case>
+ </test-group>
</test-suite>
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADatePrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADatePrinter.java
index 918e286..327faf1 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADatePrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADatePrinter.java
@@ -30,4 +30,14 @@
.append("-").append(String.format("%02d", gCalInstance.getDayOfMonthYear(chrononTime, year, month)));
ps.print("\")");
}
+
+ public void printString(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException {
+ long chrononTime = AInt32SerializerDeserializer.getInt(b, s + 1) * CHRONON_OF_DAY;
+
+ int year = gCalInstance.getYear(chrononTime);
+ int month = gCalInstance.getMonthOfYear(chrononTime, year);
+
+ ps.append(String.format(year < 0 ? "%05d" : "%04d", year)).append("-").append(String.format("%02d", month))
+ .append("-").append(String.format("%02d", gCalInstance.getDayOfMonthYear(chrononTime, year, month)));
+ }
}
\ No newline at end of file
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADateTimePrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADateTimePrinter.java
index 96df767..7cf1478 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADateTimePrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADateTimePrinter.java
@@ -33,4 +33,18 @@
.append(String.format("%03d", gCalInstance.getMillisOfSec(chrononTime))).append("Z");
ps.print("\")");
}
+
+ public void printString(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException {
+ long chrononTime = AInt64SerializerDeserializer.getLong(b, s + 1);
+
+ int year = gCalInstance.getYear(chrononTime);
+ int month = gCalInstance.getMonthOfYear(chrononTime, year);
+
+ ps.append(String.format(year < 0 ? "%05d" : "%04d", year)).append("-").append(String.format("%02d", month))
+ .append("-").append(String.format("%02d", gCalInstance.getDayOfMonthYear(chrononTime, year, month)))
+ .append("T").append(String.format("%02d", gCalInstance.getHourOfDay(chrononTime))).append(":")
+ .append(String.format("%02d", gCalInstance.getMinOfHour(chrononTime))).append(":")
+ .append(String.format("%02d", gCalInstance.getSecOfMin(chrononTime))).append(".")
+ .append(String.format("%03d", gCalInstance.getMillisOfSec(chrononTime))).append("Z");
+ }
}
\ No newline at end of file
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/AIntervalPrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/AIntervalPrinter.java
index 99c40b2..b96feff 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/AIntervalPrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/AIntervalPrinter.java
@@ -23,8 +23,6 @@
public class AIntervalPrinter implements IPrinter {
- private static final long serialVersionUID = 1L;
-
public static final AIntervalPrinter INSTANCE = new AIntervalPrinter();
/* (non-Javadoc)
@@ -39,32 +37,34 @@
*/
@Override
public void print(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException {
- ps.print("interval(\"");
+ ps.print("interval");
short typetag = AInt8SerializerDeserializer.getByte(b, s + 1 + 8 * 2);
IPrinter timeInstancePrinter;
if (typetag == ATypeTag.DATE.serialize()) {
+ ps.print("-date(\"");
timeInstancePrinter = ADatePrinter.INSTANCE;
+ ((ADatePrinter)timeInstancePrinter).printString(b, s + 4, 4, ps);
+ ps.print(", ");
+ ((ADatePrinter)timeInstancePrinter).printString(b, s + 12, 4, ps);
} else if (typetag == ATypeTag.TIME.serialize()) {
+ ps.print("-time(\"");
timeInstancePrinter = ATimePrinter.INSTANCE;
+ ((ATimePrinter)timeInstancePrinter).printString(b, s + 4, 4, ps);
+ ps.print(", ");
+ ((ATimePrinter)timeInstancePrinter).printString(b, s + 12, 4, ps);
} else if (typetag == ATypeTag.DATETIME.serialize()) {
+ ps.print("-datetime(\"");
timeInstancePrinter = ADateTimePrinter.INSTANCE;
+ ((ADateTimePrinter)timeInstancePrinter).printString(b, s, 8, ps);
+ ps.print(", ");
+ ((ADateTimePrinter)timeInstancePrinter).printString(b, s + 8, 8, ps);
} else {
throw new AlgebricksException("Unsupport internal time types in interval: " + typetag);
}
- if (typetag == ATypeTag.TIME.serialize() || typetag == ATypeTag.DATE.serialize()) {
- timeInstancePrinter.print(b, s + 1 + 4 - 1, 8, ps);
- ps.print(", ");
- timeInstancePrinter.print(b, s + 1 + 8 + 4 - 1, 8, ps);
- } else {
- timeInstancePrinter.print(b, s, 8, ps);
- ps.print(", ");
- timeInstancePrinter.print(b, s + 1 + 8 - 1, 8, ps);
- }
-
ps.print("\")");
}
}
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ATimePrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ATimePrinter.java
index b77ee64..aba6a4b 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ATimePrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ATimePrinter.java
@@ -29,5 +29,14 @@
ps.print("\")");
}
+
+ public void printString(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException {
+ int time = AInt32SerializerDeserializer.getInt(b, s + 1);
+
+ ps.append(String.format("%02d", gCalInstance.getHourOfDay(time))).append(":")
+ .append(String.format("%02d", gCalInstance.getMinOfHour(time))).append(":")
+ .append(String.format("%02d", gCalInstance.getSecOfMin(time))).append(".")
+ .append(String.format("%03d", gCalInstance.getMillisOfSec(time))).append("Z");
+ }
}
\ No newline at end of file
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateSerializerDeserializer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateSerializerDeserializer.java
index 86a9a8d..d4ce0e5 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateSerializerDeserializer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateSerializerDeserializer.java
@@ -65,7 +65,7 @@
try {
StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
charAccessor.reset(date, 0, date.length());
- chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor, true);
+ chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor);
} catch (Exception e) {
throw new HyracksDataException(e);
}
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateTimeSerializerDeserializer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateTimeSerializerDeserializer.java
index cedfc8d..93825b9 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateTimeSerializerDeserializer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateTimeSerializerDeserializer.java
@@ -67,22 +67,25 @@
long chrononTimeInMs = 0;
try {
StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
+
charAccessor.reset(datetime, 0, datetime.length());
// +1 if it is negative (-)
short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
- if (charAccessor.getCharAt(timeOffset + 10) != 'T' && charAccessor.getCharAt(timeOffset + 8) != 'T') {
- throw new AlgebricksException(errorMessage + ": missing T");
+ timeOffset += 8;
+
+ if(charAccessor.getCharAt(timeOffset) != 'T'){
+ timeOffset += 2;
+ if(charAccessor.getCharAt(timeOffset) != 'T'){
+ throw new AlgebricksException(errorMessage + ": missing T");
+ }
}
- // if extended form 11, else 9
- timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11) : (short) (9);
+ charAccessor.reset(datetime, 0, timeOffset);
+ chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor);
- chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor, false);
-
- charAccessor.reset(datetime, timeOffset, datetime.length() - timeOffset);
-
+ charAccessor.reset(datetime, timeOffset + 1, datetime.length() - timeOffset - 1);
chrononTimeInMs += ATimeParserFactory.parseTimePart(charAccessor);
} catch (Exception e) {
throw new HyracksDataException(e);
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/AIntervalSerializerDeserializer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/AIntervalSerializerDeserializer.java
index 7c87dfa..f1dc57a 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/AIntervalSerializerDeserializer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/AIntervalSerializerDeserializer.java
@@ -95,60 +95,74 @@
StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
+ // the starting point for parsing (so for the accessor)
+ int startOffset = 0;
+ int endOffset, timeSeperatorOffsetInDatetimeString;
+
// Get the index for the comma
int commaIndex = interval.indexOf(',');
- if (commaIndex < 0) {
+ if (commaIndex < 1) {
throw new AlgebricksException("comma is missing for a string of interval");
}
- int nonSpaceIndex = commaIndex - 1;
- while (interval.charAt(nonSpaceIndex) == ' ') {
- nonSpaceIndex--;
+ endOffset = commaIndex - 1;
+
+ while (interval.charAt(endOffset) == ' ') {
+ endOffset--;
}
- // Interval Start
- charAccessor.reset(interval, 0, nonSpaceIndex + 1);
+ while (interval.charAt(startOffset) == '"' || interval.charAt(startOffset) == ' ') {
+ startOffset++;
+ }
+
+ charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
// +1 if it is negative (-)
- short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
+ timeSeperatorOffsetInDatetimeString = ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
- if (charAccessor.getCharAt(timeOffset + 10) != 'T' && charAccessor.getCharAt(timeOffset + 8) != 'T') {
- throw new AlgebricksException(errorMessage + ": missing T");
+ timeSeperatorOffsetInDatetimeString += 8;
+
+ if (charAccessor.getCharAt(timeSeperatorOffsetInDatetimeString) != 'T') {
+ timeSeperatorOffsetInDatetimeString += 2;
+ if (charAccessor.getCharAt(timeSeperatorOffsetInDatetimeString) != 'T') {
+ throw new AlgebricksException(errorMessage + ": missing T for a datetime value.");
+ }
}
-
- // if extended form 11, else 9
- timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11) : (short) (9);
-
- chrononTimeInMsStart = ADateParserFactory.parseDatePart(charAccessor, false);
-
- charAccessor.reset(interval, timeOffset, nonSpaceIndex - timeOffset + 1);
-
+ charAccessor.reset(interval, startOffset, timeSeperatorOffsetInDatetimeString);
+ chrononTimeInMsStart = ADateParserFactory.parseDatePart(charAccessor);
+ charAccessor.reset(interval, startOffset + timeSeperatorOffsetInDatetimeString + 1, endOffset
+ - (startOffset + timeSeperatorOffsetInDatetimeString + 1) + 1);
chrononTimeInMsStart += ATimeParserFactory.parseTimePart(charAccessor);
// Interval End
- nonSpaceIndex = commaIndex + 1;
- while (interval.charAt(nonSpaceIndex) == ' ') {
- nonSpaceIndex++;
+ startOffset = commaIndex + 1;
+ endOffset = interval.length() - 1;
+ while (interval.charAt(endOffset) == '"' || interval.charAt(endOffset) == ' ') {
+ endOffset--;
}
- charAccessor.reset(interval, nonSpaceIndex, interval.length() - nonSpaceIndex);
+ while (interval.charAt(startOffset) == ' ') {
+ startOffset++;
+ }
+
+ charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
// +1 if it is negative (-)
- timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
+ timeSeperatorOffsetInDatetimeString = ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
- if (charAccessor.getCharAt(timeOffset + 10) != 'T' && charAccessor.getCharAt(timeOffset + 8) != 'T') {
- throw new AlgebricksException(errorMessage + ": missing T");
+ timeSeperatorOffsetInDatetimeString += 8;
+
+ if (charAccessor.getCharAt(timeSeperatorOffsetInDatetimeString) != 'T') {
+ timeSeperatorOffsetInDatetimeString += 2;
+ if (charAccessor.getCharAt(timeSeperatorOffsetInDatetimeString) != 'T') {
+ throw new AlgebricksException(errorMessage + ": missing T for a datetime value.");
+ }
}
-
- // if extended form 11, else 9
- timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11) : (short) (9);
-
- chrononTimeInMsEnd = ADateParserFactory.parseDatePart(charAccessor, false);
-
- charAccessor.reset(interval, nonSpaceIndex + timeOffset, interval.length() - nonSpaceIndex - timeOffset);
-
+ charAccessor.reset(interval, startOffset, timeSeperatorOffsetInDatetimeString);
+ chrononTimeInMsEnd = ADateParserFactory.parseDatePart(charAccessor);
+ charAccessor.reset(interval, startOffset + timeSeperatorOffsetInDatetimeString + 1, endOffset
+ - (startOffset + timeSeperatorOffsetInDatetimeString + 1) + 1);
chrononTimeInMsEnd += ATimeParserFactory.parseTimePart(charAccessor);
-
} catch (Exception e) {
throw new HyracksDataException(e);
}
@@ -167,19 +181,27 @@
StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
+ int startOffset = 0;
+ int endOffset;
+
// Get the index for the comma
int commaIndex = interval.indexOf(',');
if (commaIndex < 0) {
throw new AlgebricksException("comma is missing for a string of interval");
}
- int nonSpaceIndex = commaIndex - 1;
- while (interval.charAt(nonSpaceIndex) == ' ') {
- nonSpaceIndex--;
+ endOffset = commaIndex - 1;
+
+ while (interval.charAt(endOffset) == ' ') {
+ endOffset--;
+ }
+
+ while (interval.charAt(startOffset) == '"' || interval.charAt(startOffset) == ' ') {
+ startOffset++;
}
// Interval Start
- charAccessor.reset(interval, 0, nonSpaceIndex + 1);
+ charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
chrononTimeInMsStart = ATimeParserFactory.parseTimePart(charAccessor);
if (chrononTimeInMsStart < 0) {
@@ -187,12 +209,18 @@
}
// Interval End
- nonSpaceIndex = commaIndex + 1;
- while (interval.charAt(nonSpaceIndex) == ' ') {
- nonSpaceIndex++;
+ startOffset = commaIndex + 1;
+ while (interval.charAt(startOffset) == ' ') {
+ startOffset++;
}
- charAccessor.reset(interval, nonSpaceIndex, interval.length() - nonSpaceIndex);
+ endOffset = interval.length() - 1;
+
+ while (interval.charAt(endOffset) == '"' || interval.charAt(endOffset) == ' ') {
+ endOffset--;
+ }
+
+ charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
chrononTimeInMsEnd = ATimeParserFactory.parseTimePart(charAccessor);
if (chrononTimeInMsEnd < 0) {
@@ -217,40 +245,43 @@
try {
StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
+ // the starting point for parsing (so for the accessor)
+ int startOffset = 0;
+ int endOffset;
+
// Get the index for the comma
int commaIndex = interval.indexOf(',');
- if (commaIndex < 0) {
+ if (commaIndex < 1) {
throw new AlgebricksException("comma is missing for a string of interval");
}
- int nonSpaceIndex = commaIndex - 1;
- while (interval.charAt(nonSpaceIndex) == ' ') {
- nonSpaceIndex--;
+ endOffset = commaIndex - 1;
+
+ while (interval.charAt(endOffset) == ' ') {
+ endOffset--;
}
- // Interval Start
- charAccessor.reset(interval, 0, nonSpaceIndex + 1);
-
- chrononTimeInMsStart = ADateParserFactory.parseDatePart(charAccessor, true);
-
- if (chrononTimeInMsStart < 0 && chrononTimeInMsStart % GregorianCalendarSystem.CHRONON_OF_DAY != 0) {
- tempStart = 1;
+ while (interval.charAt(startOffset) == '"' || interval.charAt(startOffset) == ' ') {
+ startOffset++;
}
+ charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
+ chrononTimeInMsStart = ADateParserFactory.parseDatePart(charAccessor);
+
// Interval End
- nonSpaceIndex = commaIndex + 1;
- while (interval.charAt(nonSpaceIndex) == ' ') {
- nonSpaceIndex++;
+ startOffset = commaIndex + 1;
+ endOffset = interval.length() - 1;
+ while (interval.charAt(startOffset) == '"' || interval.charAt(endOffset) == ' ') {
+ endOffset--;
}
- charAccessor.reset(interval, nonSpaceIndex, interval.length() - nonSpaceIndex);
-
- chrononTimeInMsEnd = ADateParserFactory.parseDatePart(charAccessor, true);
-
- if (chrononTimeInMsEnd < 0 && chrononTimeInMsEnd % GregorianCalendarSystem.CHRONON_OF_DAY != 0) {
- tempEnd = 1;
+ while (interval.charAt(startOffset) == ' ') {
+ startOffset++;
}
+ charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
+ chrononTimeInMsEnd += ATimeParserFactory.parseTimePart(charAccessor);
+
} catch (Exception e) {
throw new HyracksDataException(e);
}
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateParserFactory.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateParserFactory.java
index 8192919..7a335a7 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateParserFactory.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateParserFactory.java
@@ -44,7 +44,7 @@
public void parse(char[] buffer, int start, int length, DataOutput out) throws HyracksDataException {
charArrayAccessor.reset(buffer, start, length);
try {
- out.writeInt((int) (parseDatePart(charArrayAccessor, true) / GregorianCalendarSystem.CHRONON_OF_DAY));
+ out.writeInt((int) (parseDatePart(charArrayAccessor) / GregorianCalendarSystem.CHRONON_OF_DAY));
} catch (IOException ex) {
throw new HyracksDataException(ex);
}
@@ -63,7 +63,7 @@
* @return
* @throws Exception
*/
- public static <T> long parseDatePart(ICharSequenceAccessor<T> charAccessor, boolean isDateOnly)
+ public static <T> long parseDatePart(ICharSequenceAccessor<T> charAccessor)
throws HyracksDataException {
int length = charAccessor.getLength();
@@ -79,8 +79,7 @@
positive = false;
}
- if ((isDateOnly) && charAccessor.getCharAt(offset + 4) == '-' || (!isDateOnly)
- && charAccessor.getCharAt(offset + 13) == ':') {
+ if (charAccessor.getCharAt(offset + 4) == '-') {
isExtendedForm = true;
}
@@ -141,9 +140,14 @@
year *= -1;
}
- if (isDateOnly && length > offset) {
+ if (length > offset) {
throw new HyracksDataException("Too many chars for a date only value");
}
+
+ if (!GregorianCalendarSystem.getInstance().validate(year, month, day, 0, 0, 0, 0)){
+ throw new HyracksDataException(dateErrorMessage);
+ }
+
return GregorianCalendarSystem.getInstance().getChronon(year, month, day, 0, 0, 0, 0, 0);
}
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateTimeParserFactory.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateTimeParserFactory.java
index 2df3c3b..4c05d88 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateTimeParserFactory.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateTimeParserFactory.java
@@ -48,18 +48,19 @@
short timeOffset = (short) ((charArrayAccessor.getCharAt(0) == '-') ? 1 : 0);
- if (charArrayAccessor.getCharAt(timeOffset + 10) != 'T'
- && charArrayAccessor.getCharAt(timeOffset + 8) != 'T') {
- throw new HyracksDataException(dateTimeErrorMessage + ": missing T");
+ timeOffset += 8;
+
+ if (charArrayAccessor.getCharAt(timeOffset) != 'T') {
+ timeOffset += 2;
+ if (charArrayAccessor.getCharAt(timeOffset) != 'T') {
+ throw new HyracksDataException(dateTimeErrorMessage + ": missing T");
+ }
}
- // if extended form 11, else 9
- timeOffset += (charArrayAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11) : (short) (9);
-
- chrononTimeInMs = ADateParserFactory.parseDatePart(charArrayAccessor, false);
+ charArrayAccessor.reset(buffer, start, timeOffset);
+ chrononTimeInMs = ADateParserFactory.parseDatePart(charArrayAccessor);
charArrayAccessor.reset(buffer, start + timeOffset, length - timeOffset);
-
chrononTimeInMs += ATimeParserFactory.parseTimePart(charArrayAccessor);
try {
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/GregorianCalendarSystem.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/GregorianCalendarSystem.java
index d43f235..f74af9b 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/GregorianCalendarSystem.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/GregorianCalendarSystem.java
@@ -135,11 +135,11 @@
// Check whether leap month.
if (month == 2) {
if (isLeapYear(year)) {
- if (month > DAYS_OF_MONTH_LEAP[1]) {
+ if (day > DAYS_OF_MONTH_LEAP[1]) {
return false;
}
} else {
- if (month > DAYS_OF_MONTH_ORDI[1]) {
+ if (day > DAYS_OF_MONTH_ORDI[1]) {
return false;
}
}
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/functions/AsterixBuiltinFunctions.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/functions/AsterixBuiltinFunctions.java
index a547737..e8a9719 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/functions/AsterixBuiltinFunctions.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/functions/AsterixBuiltinFunctions.java
@@ -448,7 +448,7 @@
public static final FunctionIdentifier ACCESSOR_TEMPORAL_YEAR = new FunctionIdentifier(
FunctionConstants.ASTERIX_NS, "year", 1);
public static final FunctionIdentifier ACCESSOR_TEMPORAL_MONTH = new FunctionIdentifier(
- FunctionConstants.ASTERIX_NS, "month", 2);
+ FunctionConstants.ASTERIX_NS, "month", 1);
public static final FunctionIdentifier ACCESSOR_TEMPORAL_DAY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
"day", 1);
public static final FunctionIdentifier ACCESSOR_TEMPORAL_HOUR = new FunctionIdentifier(
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/APrintVisitor.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/APrintVisitor.java
index 3664804..b78308d 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/APrintVisitor.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/APrintVisitor.java
@@ -31,6 +31,7 @@
import edu.uci.ics.asterix.dataflow.data.nontagged.printers.AInt32Printer;
import edu.uci.ics.asterix.dataflow.data.nontagged.printers.AInt64Printer;
import edu.uci.ics.asterix.dataflow.data.nontagged.printers.AInt8Printer;
+import edu.uci.ics.asterix.dataflow.data.nontagged.printers.AIntervalPrinter;
import edu.uci.ics.asterix.dataflow.data.nontagged.printers.ALinePrinter;
import edu.uci.ics.asterix.dataflow.data.nontagged.printers.ANullPrinter;
import edu.uci.ics.asterix.dataflow.data.nontagged.printers.APoint3DPrinter;
@@ -173,6 +174,10 @@
AStringPrinter.INSTANCE.print(b, s, l, ps);
break;
}
+ case INTERVAL: {
+ AIntervalPrinter.INSTANCE.print(b, s, l, ps);
+ break;
+ }
default: {
throw new NotImplementedException("No printer for type " + typeTag);
}
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/types/ATypeTag.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/types/ATypeTag.java
index e69fbcd..a0ad3e1 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/types/ATypeTag.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/types/ATypeTag.java
@@ -42,9 +42,9 @@
LINE(30),
POLYGON(31),
CIRCLE(32),
- INTERVAL(34),
RECTANGLE(33),
- SYSTEM_NULL(34);
+ INTERVAL(34),
+ SYSTEM_NULL(35);
private byte value;
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
index 44fcf7c..d5d703d 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
@@ -86,8 +86,17 @@
int stringLength = (serString[1] & 0xff << 8) + (serString[2] & 0xff << 0);
- charAccessor.reset(serString, 3, stringLength);
- long chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor, true);
+ int startOffset = 3;
+ while (serString[startOffset] == ' ') {
+ startOffset++;
+ }
+ int endOffset = stringLength - 1 + 3;
+ while (serString[endOffset] == ' ') {
+ endOffset--;
+ }
+
+ charAccessor.reset(serString, startOffset, endOffset - startOffset + 1);
+ long chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor);
short temp = 0;
if (chrononTimeInMs < 0
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
index 6a5783b..104dc32 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
@@ -85,23 +85,39 @@
int stringLength = (serString[1] & 0xff << 8) + (serString[2] & 0xff << 0);
- charAccessor.reset(serString, 3, stringLength);
+ int startOffset = 3;
+ int endOffset = stringLength - 1 + 3;
+
+ // skip leading space
+ while (serString[startOffset] == ' ') {
+ startOffset++;
+ }
+
+ // skip tailing space
+ while (serString[endOffset] == ' ') {
+ endOffset--;
+ }
+
+ charAccessor.reset(serString, startOffset, endOffset - startOffset + 1);
// +1 if it is negative (-)
short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
- if (charAccessor.getCharAt(timeOffset + 10) != 'T'
- && charAccessor.getCharAt(timeOffset + 8) != 'T') {
- throw new AlgebricksException(errorMessage + ": missing T");
+ timeOffset += 8;
+
+ if (charAccessor.getCharAt(timeOffset) != 'T') {
+ timeOffset += 2;
+ if (charAccessor.getCharAt(timeOffset) != 'T') {
+ throw new AlgebricksException(errorMessage + ": missing T");
+ }
}
- // if extended form 11, else 9
- timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11)
- : (short) (9);
+ charAccessor.reset(serString, startOffset, timeOffset);
- long chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor, false);
+ long chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor);
- charAccessor.reset(serString, 3 + timeOffset, stringLength - timeOffset);
+ charAccessor.reset(serString, startOffset + timeOffset + 1, endOffset
+ - (startOffset + timeOffset + 1) + 1);
chrononTimeInMs += ATimeParserFactory.parseTimePart(charAccessor);
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateConstructorDescriptor.java
index e1a12f8..3ac64f3 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateConstructorDescriptor.java
@@ -101,15 +101,15 @@
// start date
charAccessor.reset(argOut0.getByteArray(), 3, stringLength);
- long intervalStart = ADateParserFactory.parseDatePart(charAccessor, true)
+ long intervalStart = ADateParserFactory.parseDatePart(charAccessor)
/ GregorianCalendarSystem.CHRONON_OF_DAY;
- // end date
+ // end date
stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
+ (argOut1.getByteArray()[2] & 0xff << 0);
charAccessor.reset(argOut1.getByteArray(), 3, stringLength);
- long intervalEnd = ADateParserFactory.parseDatePart(charAccessor, true)
+ long intervalEnd = ADateParserFactory.parseDatePart(charAccessor)
/ GregorianCalendarSystem.CHRONON_OF_DAY;
if (intervalEnd < intervalStart) {
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateTimeConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateTimeConstructorDescriptor.java
index 72a8e37..35d1a02 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateTimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateTimeConstructorDescriptor.java
@@ -95,46 +95,46 @@
nullSerde.serialize(ANull.NULL, out);
} else if (argOut0.getByteArray()[0] == SER_STRING_TYPE_TAG
&& argOut1.getByteArray()[0] == SER_STRING_TYPE_TAG) {
- // start date
-
+ // start datetime
int stringLength = (argOut0.getByteArray()[1] & 0xff << 8)
+ (argOut0.getByteArray()[2] & 0xff << 0);
charAccessor.reset(argOut0.getByteArray(), 3, stringLength);
// get offset for time part: +1 if it is negative (-)
short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
-
- if (charAccessor.getCharAt(timeOffset + 10) != 'T'
- && charAccessor.getCharAt(timeOffset + 8) != 'T') {
- throw new AlgebricksException(errorMessage + ": missing T");
+ timeOffset += 8;
+ if (charAccessor.getCharAt(timeOffset) != 'T') {
+ timeOffset += 2;
+ if (charAccessor.getCharAt(timeOffset) != 'T') {
+ throw new AlgebricksException(errorMessage + ": missing T");
+ }
}
- // if extended form 11, else 9
- timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11)
- : (short) (9);
- long intervalStart = ADateParserFactory.parseDatePart(charAccessor, false);
- charAccessor.reset(argOut0.getByteArray(), 3 + timeOffset, stringLength - timeOffset);
+ charAccessor.reset(argOut0.getByteArray(), 3, timeOffset);
+ long intervalStart = ADateParserFactory.parseDatePart(charAccessor);
+ charAccessor.reset(argOut0.getByteArray(), 3 + timeOffset + 1, stringLength
+ - timeOffset - 1);
intervalStart += ATimeParserFactory.parseTimePart(charAccessor);
- // end date
-
+ // end datetime
stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
+ (argOut1.getByteArray()[2] & 0xff << 0);
charAccessor.reset(argOut1.getByteArray(), 3, stringLength);
// get offset for time part: +1 if it is negative (-)
timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
-
- if (charAccessor.getCharAt(timeOffset + 10) != 'T'
- && charAccessor.getCharAt(timeOffset + 8) != 'T') {
- throw new AlgebricksException(errorMessage + ": missing T");
+ timeOffset += 8;
+ if (charAccessor.getCharAt(timeOffset) != 'T') {
+ timeOffset += 2;
+ if (charAccessor.getCharAt(timeOffset) != 'T') {
+ throw new AlgebricksException(errorMessage + ": missing T");
+ }
}
- // if extended form 11, else 9
- timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11)
- : (short) (9);
- long intervalEnd = ADateParserFactory.parseDatePart(charAccessor, false);
- charAccessor.reset(argOut1.getByteArray(), 3 + timeOffset, stringLength - timeOffset);
+ charAccessor.reset(argOut1.getByteArray(), 3, timeOffset);
+ long intervalEnd = ADateParserFactory.parseDatePart(charAccessor);
+ charAccessor.reset(argOut1.getByteArray(), 3 + timeOffset + 1, stringLength
+ - timeOffset - 1);
intervalEnd += ATimeParserFactory.parseTimePart(charAccessor);
if (intervalEnd < intervalStart) {
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromTimeConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromTimeConstructorDescriptor.java
index 3ce722a..73080c8 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromTimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromTimeConstructorDescriptor.java
@@ -96,7 +96,6 @@
} else if (argOut0.getByteArray()[0] == SER_STRING_TYPE_TAG
&& argOut1.getByteArray()[0] == SER_STRING_TYPE_TAG) {
// start date
-
int stringLength = (argOut0.getByteArray()[1] & 0xff << 8)
+ (argOut0.getByteArray()[2] & 0xff << 0);
@@ -107,7 +106,6 @@
}
// end date
-
stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
+ (argOut1.getByteArray()[2] & 0xff << 0);
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
index 23fdb07..6429daa 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
@@ -99,15 +99,15 @@
nullSerde.serialize(ANull.NULL, out);
} else if (argOut0.getByteArray()[0] == SER_STRING_TYPE_TAG
&& argOut1.getByteArray()[0] == SER_STRING_TYPE_TAG) {
- // start date
+ // start date
int stringLength = (argOut0.getByteArray()[1] & 0xff << 8)
+ (argOut0.getByteArray()[2] & 0xff << 0);
charAccessor.reset(argOut0.getByteArray(), 3, stringLength);
- long intervalStart = ADateParserFactory.parseDatePart(charAccessor, true);
- // duration
+ long intervalStart = ADateParserFactory.parseDatePart(charAccessor);
+ // duration
stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
+ (argOut1.getByteArray()[2] & 0xff << 0);
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
index 91c45df..92469f0 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
@@ -108,20 +108,20 @@
// get offset for time part: +1 if it is negative (-)
short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
- if (charAccessor.getCharAt(timeOffset + 10) != 'T'
- && charAccessor.getCharAt(timeOffset + 8) != 'T') {
- throw new AlgebricksException(errorMessage + ": missing T");
+ timeOffset += 8;
+
+ if (charAccessor.getCharAt(timeOffset) != 'T') {
+ timeOffset += 2;
+ if (charAccessor.getCharAt(timeOffset) != 'T') {
+ throw new AlgebricksException(errorMessage + ": missing T");
+ }
}
- // if extended form 11, else 9
- timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11)
- : (short) (9);
- long intervalStart = ADateParserFactory.parseDatePart(charAccessor, false);
- charAccessor.reset(argOut0.getByteArray(), 3 + timeOffset, stringLength - timeOffset);
+ long intervalStart = ADateParserFactory.parseDatePart(charAccessor);
+ charAccessor.reset(argOut0.getByteArray(), 3 + timeOffset + 1, stringLength - timeOffset - 1);
intervalStart += ATimeParserFactory.parseTimePart(charAccessor);
// duration
-
stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
+ (argOut1.getByteArray()[2] & 0xff << 0);
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
index 2e64ad4..b32110b 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
@@ -234,7 +234,7 @@
try {
if (checkType(ATypeTag.INTERVAL, objectType, out)) {
if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_OPEN) {
- if (admLexer.next() == AdmLexer.TOKEN_STRING_CONS) {
+ if (admLexer.next() == AdmLexer.TOKEN_STRING_LITERAL) {
AIntervalSerializerDeserializer.parseDate(admLexer.getLastTokenImage(), out);
if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_CLOSE) {
@@ -252,7 +252,7 @@
try {
if (checkType(ATypeTag.INTERVAL, objectType, out)) {
if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_OPEN) {
- if (admLexer.next() == AdmLexer.TOKEN_STRING_CONS) {
+ if (admLexer.next() == AdmLexer.TOKEN_STRING_LITERAL) {
AIntervalSerializerDeserializer.parseTime(admLexer.getLastTokenImage(), out);
if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_CLOSE) {
@@ -270,7 +270,7 @@
try {
if (checkType(ATypeTag.INTERVAL, objectType, out)) {
if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_OPEN) {
- if (admLexer.next() == AdmLexer.TOKEN_STRING_CONS) {
+ if (admLexer.next() == AdmLexer.TOKEN_STRING_LITERAL) {
AIntervalSerializerDeserializer.parseDatetime(admLexer.getLastTokenImage(), out);
if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_CLOSE) {
diff --git a/asterix-runtime/src/main/resources/adm.grammar b/asterix-runtime/src/main/resources/adm.grammar
index 56c7212..4d4158f 100644
--- a/asterix-runtime/src/main/resources/adm.grammar
+++ b/asterix-runtime/src/main/resources/adm.grammar
@@ -26,9 +26,9 @@
RECTANGLE_CONS = string(rectangle)
CIRCLE_CONS = string(circle)
TIME_CONS = string(time)
-INTERVAL_TIME_CONS = string(interval_time)
-INTERVAL_DATE_CONS = string(interval_date)
-INTERVAL_DATETIME_CONS = string(interval_datetime)
+INTERVAL_TIME_CONS = string(interval-time)
+INTERVAL_DATE_CONS = string(interval-date)
+INTERVAL_DATETIME_CONS = string(interval-datetime)
NULL_LITERAL = string(null)
TRUE_LITERAL = string(true)