You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2014/01/08 11:16:22 UTC

git commit: TAJO-438: Date literal support. (Jae Young Lee via jihoon)

Updated Branches:
  refs/heads/master 285c4a485 -> 7d85f3ae9


TAJO-438: Date literal support. (Jae Young Lee via jihoon)


Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/7d85f3ae
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/7d85f3ae
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/7d85f3ae

Branch: refs/heads/master
Commit: 7d85f3ae9b26a2f096f793b93a21f5606873a0b3
Parents: 285c4a4
Author: Jihoon Son <ji...@apache.org>
Authored: Wed Jan 8 19:15:54 2014 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Wed Jan 8 19:15:54 2014 +0900

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 .../org/apache/tajo/algebra/DateLiteral.java    | 51 ++++++++++++++++++++
 .../java/org/apache/tajo/algebra/OpType.java    |  1 +
 .../java/org/apache/tajo/datum/DateDatum.java   |  5 ++
 .../org/apache/tajo/datum/DatumFactory.java     |  4 +-
 .../org/apache/tajo/engine/parser/SQLParser.g4  |  5 ++
 .../apache/tajo/engine/parser/SQLAnalyzer.java  | 10 +++-
 .../tajo/engine/planner/AlgebraVisitor.java     |  2 +
 .../tajo/engine/planner/BaseAlgebraVisitor.java |  5 ++
 .../tajo/engine/planner/LogicalPlanner.java     | 13 +++++
 .../tajo/engine/eval/TestSQLDateTimeTypes.java  |  7 +++
 11 files changed, 103 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 5016ef1..3c71e57 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,8 @@ Release 0.8.0 - unreleased
 
   NEW FEATURES
 
+    TAJO-438: Date literal support. (Jae Young Lee via jihoon)
+
     TAJO-474: Add query admin utility. (DaeMyung Kang via hyunsik)
 
     TAJO-460: CTAS statement should support partitioned table.

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java
new file mode 100644
index 0000000..54b2b20
--- /dev/null
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/DateLiteral.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.algebra;
+
+import com.google.common.base.Objects;
+
+public class DateLiteral extends Expr {
+  private DateValue date;
+
+  public DateLiteral(DateValue date) {
+    super(OpType.DateLiteral);
+    this.date = date;
+  }
+
+  public DateValue getDate() {
+    return date;
+  }
+
+  public String toString() {
+    return date.toString();
+  }
+
+  public int hashCode() {
+    return Objects.hashCode(date);
+  }
+
+  @Override
+  boolean equalsTo(Expr expr) {
+    if (expr instanceof DateLiteral) {
+      DateLiteral another = (DateLiteral) expr;
+      return date.equals(another.date);
+    }
+    return false;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
index 3022ea1..ec6be1c 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/OpType.java
@@ -98,6 +98,7 @@ public enum OpType {
   Literal(LiteralValue.class),
   NullLiteral(NullLiteral.class),
   TimeLiteral(TimeLiteral.class),
+  DateLiteral(DateLiteral.class),
   TimestampLiteral(TimestampLiteral.class);
 
   private Class baseClass;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
index 7029b97..a7f3072 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
@@ -38,6 +38,11 @@ public class DateDatum extends Datum {
     date = decode(value);
   }
 
+  public DateDatum(int year, int month, int day) {
+    super(TajoDataTypes.Type.DATE);
+    date = new LocalDate(year, month, day);
+  }
+
   public DateDatum(String dateStr) {
     super(TajoDataTypes.Type.DATE);
     this.date = LocalDate.parse(dateStr, DEFAULT_FORMATTER);

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
index 7520423..784c039 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
@@ -290,8 +290,10 @@ public class DatumFactory {
       return new DateDatum(datum.asInt4());
     case TEXT:
       return new DateDatum(datum.asChars());
+    case DATE:
+      return (DateDatum) datum;
     default:
-      throw new InvalidCastException(datum.type() + " cannot be casted to TIMESTAMP type");
+      throw new InvalidCastException(datum.type() + " cannot be casted to DATE type");
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4 b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
index fbae175..4b5eea4 100644
--- a/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
+++ b/tajo-core/tajo-core-backend/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
@@ -191,6 +191,7 @@ general_literal
 datetime_literal
   : timestamp_literal
   | time_literal
+  | date_literal
   ;
 
 time_literal
@@ -201,6 +202,10 @@ timestamp_literal
   : TIMESTAMP timestamp_string=Character_String_Literal
   ;
 
+date_literal
+  : DATE date_string=Character_String_Literal
+  ;
+
 boolean_literal
   : TRUE | FALSE | UNKNOWN
   ;

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
index a096e7d..2555b9c 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
@@ -1265,7 +1265,9 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
   public Expr visitDatetime_literal(@NotNull SQLParser.Datetime_literalContext ctx) {
     if (checkIfExist(ctx.time_literal())) {
       return visitTime_literal(ctx.time_literal());
-    } else { 
+    } else if(checkIfExist(ctx.date_literal())) {
+      return visitDate_literal(ctx.date_literal());
+    } else {
       return visitTimestamp_literal(ctx.timestamp_literal());
     }
   }
@@ -1277,6 +1279,12 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
   }
 
   @Override
+  public Expr visitDate_literal(SQLParser.Date_literalContext ctx) {
+    String datePart = stripQuote(ctx.date_string.getText());
+    return new DateLiteral(parseDate(datePart));
+  }
+
+  @Override
   public Expr visitTimestamp_literal(SQLParser.Timestamp_literalContext ctx) {
     String timestampStr = stripQuote(ctx.timestamp_string.getText());
     String [] parts = timestampStr.split(" ");

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
index dcfc6fc..26a1ba4 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/AlgebraVisitor.java
@@ -100,5 +100,7 @@ public interface AlgebraVisitor<CONTEXT, RESULT> {
   RESULT visitNullLiteral(CONTEXT ctx, Stack<OpType> stack, NullLiteral expr) throws PlanningException;
   RESULT visitTimestampLiteral(CONTEXT ctx, Stack<OpType> stack, TimestampLiteral expr) throws PlanningException;
   RESULT visitTimeLiteral(CONTEXT ctx, Stack<OpType> stack, TimeLiteral expr) throws PlanningException;
+  RESULT visitDateLiteral(CONTEXT ctx, Stack<OpType> stack, DateLiteral expr) throws PlanningException;
+
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
index 8b13194..880a874 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/BaseAlgebraVisitor.java
@@ -645,4 +645,9 @@ public class BaseAlgebraVisitor<CONTEXT, RESULT> implements AlgebraVisitor<CONTE
   public RESULT visitTimeLiteral(CONTEXT ctx, Stack<OpType> stack, TimeLiteral expr) throws PlanningException {
     return null;
   }
+
+  @Override
+  public RESULT visitDateLiteral(CONTEXT ctx, Stack<OpType> stack, DateLiteral expr) throws PlanningException {
+    return null;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
index 7349c0d..be24112 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
@@ -40,6 +40,7 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.datum.TimeDatum;
+import org.apache.tajo.datum.DateDatum;
 import org.apache.tajo.engine.eval.*;
 import org.apache.tajo.engine.exception.InvalidQueryException;
 import org.apache.tajo.engine.exception.UndefinedFunctionException;
@@ -1185,6 +1186,18 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
         return new ConstEval(datum);
       }
 
+      case DateLiteral: {
+        DateLiteral dateLiteral = (DateLiteral) expr;
+        DateValue dateValue = dateLiteral.getDate();
+        int [] dates = LogicalPlanner.dateToIntArray(dateValue.getYears(),
+            dateValue.getMonths(),
+            dateValue.getDays());
+
+        DateDatum datum;
+        datum = new DateDatum(dates[0], dates[1], dates[2]);
+        return new ConstEval(datum);
+      }
+
       case TimestampLiteral: {
         TimestampLiteral timestampLiteral = (TimestampLiteral) expr;
         DateValue dateValue = timestampLiteral.getDate();

http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/7d85f3ae/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java
index cc38dea..6567b52 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java
@@ -43,4 +43,11 @@ public class TestSQLDateTimeTypes extends ExprTestBase {
     testSimpleEval("select TIME '10:09:37';",
         new String[]{"10:09:37"});
   }
+
+  @Test
+  public void testDateLiteral() throws IOException {
+    testSimpleEval("select DATE '1970-01-17';",
+        new String[]{"1970-01-17"});
+  }
+
 }