[email protected] has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/3169

Change subject: [NO ISSUE][RT] add support for different date time separators
......................................................................

[NO ISSUE][RT] add support for different date time separators

- user model changes: no
- storage format changes: no
- interface changes: no

Details: Changed interface for dateTime input and output
to keep track of user specified dateTime separator.
By default the separator 'T' is used.

Change-Id: Ic05814c24ecacf5c4e8c2bcfb90808a0ab81110b
---
M 
asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
1 file changed, 26 insertions(+), 13 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/69/3169/1

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 5e8ee90..70f9da4 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
@@ -274,14 +274,14 @@
     public boolean parseDateTime(AMutableInt64 outChronon, byte[] data, int 
dataStart, int dataLength, byte[] format,
             int formatStart, int formatLength, DateTimeParseMode parseMode, 
boolean raiseParseDataError)
             throws AsterixTemporalTypeParseException {
-        return parseDateTime(outChronon, null, null, data, dataStart, 
dataLength, format, formatStart, formatLength,
-                parseMode, raiseParseDataError, (byte) '\0');
+        return parseDateTime(outChronon, null, null, null, data, dataStart, 
dataLength, format, formatStart,
+                formatLength, parseMode, raiseParseDataError, '\0');
     }
 
     public boolean parseDateTime(AMutableInt64 outChronon, Mutable<Boolean> 
outTimeZoneExists,
-            AMutableInt32 outTimeZone, byte[] data, int dataStart, int 
dataLength, byte[] format, int formatStart,
-            int formatLength, DateTimeParseMode parseMode, boolean 
raiseParseDataError, byte altSeparatorChar)
-            throws AsterixTemporalTypeParseException {
+            AMutableInt32 outTimeZone, Mutable<Character> 
dateTimeSeparatorOut, byte[] data, int dataStart,
+            int dataLength, byte[] format, int formatStart, int formatLength, 
DateTimeParseMode parseMode,
+            boolean raiseParseDataError, char altSeparatorChar) throws 
AsterixTemporalTypeParseException {
         int year = 0, month = 0, day = 0, hour = 0, min = 0, sec = 0, ms = 0, 
timezone = 0;
         boolean timezoneExists = false;
 
@@ -290,7 +290,11 @@
 
         int dataStringPointer = 0, formatPointer = 0;
 
-        byte separatorChar = '\0';
+        char separatorChar = '\0';
+
+        char lastSeparatorChar = '\0';
+
+        char dateTimeSeparatorChar = 'T'; //default dateTimeSeparator
 
         DateTimeProcessState processState;
 
@@ -386,11 +390,12 @@
                 case COMMA_CHAR:
                 case T_CHAR:
                     // separator
-                    separatorChar = format[formatStart + formatPointer];
+                    separatorChar = (char) format[formatStart + formatPointer];
                     processState = DateTimeProcessState.SEPARATOR;
                     formatPointer++;
                     formatCharCopies++;
-                    while (formatPointer < formatLength && format[formatStart 
+ formatPointer] == separatorChar) {
+                    while (formatPointer < formatLength
+                            && (char) (format[formatStart + formatPointer]) == 
separatorChar) {
                         formatPointer++;
                         formatCharCopies++;
                     }
@@ -541,6 +546,7 @@
                     dataStringPointer += processedWeekdayFieldsCount;
                     break;
                 case HOUR:
+                    dateTimeSeparatorChar = lastSeparatorChar;
                 case MINUTE:
                 case SECOND:
                 case MILLISECOND:
@@ -755,7 +761,8 @@
                 case SEPARATOR:
                     for (int i = 0; i < formatCharCopies; i++) {
                         byte b = data[dataStart + dataStringPointer];
-                        boolean match = b == separatorChar || 
(altSeparatorChar != '\0' && b == altSeparatorChar);
+                        boolean match =
+                                (char) b == separatorChar || (altSeparatorChar 
!= '\0' && (char) b == altSeparatorChar);
                         if (!match) {
                             if (raiseParseDataError) {
                                 throw new AsterixTemporalTypeParseException(
@@ -764,6 +771,7 @@
                                 return false;
                             }
                         }
+                        lastSeparatorChar = (char) b;
                         dataStringPointer++;
                     }
                     break;
@@ -793,7 +801,11 @@
 
         long chronon = parseMode == DateTimeParseMode.TIME_ONLY ? 
CAL.getChronon(hour, min, sec, ms, timezone)
                 : CAL.getChronon(year, month, day, hour, min, sec, ms, 
timezone);
+
         outChronon.setValue(chronon);
+        if (dateTimeSeparatorOut != null) {
+            dateTimeSeparatorOut.setValue(dateTimeSeparatorChar);
+        }
         if (outTimeZoneExists != null) {
             outTimeZoneExists.setValue(timezoneExists);
         }
@@ -817,7 +829,7 @@
 
         int formatPointer = 0;
 
-        byte separatorChar = '\0';
+        char separatorChar = '\0';
 
         DateTimeProcessState processState;
 
@@ -912,11 +924,12 @@
                 case COMMA_CHAR:
                 case T_CHAR:
                     // separator
-                    separatorChar = format[formatStart + formatPointer];
+                    separatorChar = (char) format[formatStart + formatPointer];
                     processState = DateTimeProcessState.SEPARATOR;
                     formatPointer++;
                     formatCharCopies++;
-                    while (formatPointer < formatLength && format[formatStart 
+ formatPointer] == separatorChar) {
+                    while (formatPointer < formatLength
+                            && format[formatStart + formatPointer] == (byte) 
separatorChar) {
                         formatPointer++;
                         formatCharCopies++;
                     }
@@ -1061,7 +1074,7 @@
                                     "Incorrect separator: separator char is 
not initialized properly!");
                         }
                         for (int i = 0; i < formatCharCopies; i++) {
-                            appender.append((char) separatorChar);
+                            appender.append(separatorChar);
                         }
                         break;
                     default:

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/3169
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic05814c24ecacf5c4e8c2bcfb90808a0ab81110b
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: [email protected]

Reply via email to