You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by hb...@apache.org on 2016/09/06 17:08:39 UTC

[44/63] [abbrv] incubator-quickstep git commit: Separate Date type from Datetime type.

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/1d104229/types/operations/unary_operations/tests/DateExtractOperation_unittest.cpp
----------------------------------------------------------------------
diff --git a/types/operations/unary_operations/tests/DateExtractOperation_unittest.cpp b/types/operations/unary_operations/tests/DateExtractOperation_unittest.cpp
index ec14408..8f4dfc4 100644
--- a/types/operations/unary_operations/tests/DateExtractOperation_unittest.cpp
+++ b/types/operations/unary_operations/tests/DateExtractOperation_unittest.cpp
@@ -31,6 +31,7 @@
 #include "types/operations/unary_operations/DateExtractOperation.hpp"
 #include "types/operations/unary_operations/UnaryOperation.hpp"
 #include "types/operations/unary_operations/UnaryOperationFactory.hpp"
+#include "utility/EqualsAnyConstant.hpp"
 
 #include "gtest/gtest.h"
 
@@ -44,10 +45,13 @@ namespace quickstep {
 class DateExtractOperationTest : public ::testing::Test {
  protected:
   virtual void SetUp() {
-    dt_literal_.ticks = 1431359664 * DatetimeLit::kTicksPerSecond;  // Mon, 11 May 2015 15:54:24 GMT.
-    datetime_.reset(new TypedValue(dt_literal_));
-
+    datetime_literal_.ticks = 1431359664 * DatetimeLit::kTicksPerSecond;  // Mon, 11 May 2015 15:54:24 GMT.
+    datetime_.reset(new TypedValue(datetime_literal_));
     datetime_null_.reset(new TypedValue(kDatetime));
+
+    date_literal_ = DateLit::Create(2015, 05, 11);  // 11 May 2015.
+    date_.reset(new TypedValue(date_literal_));
+    date_null_.reset(new TypedValue(kDate));
   }
 
   void checkDateExtractOperationSerialization(const DateExtractOperation &operation) {
@@ -57,7 +61,7 @@ class DateExtractOperationTest : public ::testing::Test {
     EXPECT_TRUE(operation.equals(UnaryOperationFactory::ReconstructFromProto(proto)));
   }
 
-  void checkDateExtract(int64_t expected, const DateExtractUnit unit) {
+  void checkDatetimeExtract(int64_t expected, const DateExtractUnit unit) {
     const DateExtractOperation &operation = DateExtractOperation::Instance(unit);
     checkDateExtractOperationSerialization(operation);
 
@@ -74,22 +78,42 @@ class DateExtractOperationTest : public ::testing::Test {
     EXPECT_TRUE(unchecked_operator_->applyToTypedValue(*datetime_null_).isNull());
   }
 
+  void checkDateExtract(int32_t expected, const DateExtractUnit unit) {
+    const DateExtractOperation &operation = DateExtractOperation::Instance(unit);
+    checkDateExtractOperationSerialization(operation);
+
+    EXPECT_EQ(expected,
+              operation.applyToChecked(*date_,
+                                       TypeFactory::GetType(kDate, true)).getLiteral<int32_t>());
+    EXPECT_TRUE(operation.applyToChecked(*date_null_,
+                                         TypeFactory::GetType(kDate, true)).isNull());
+
+    unchecked_operator_.reset(
+        operation.makeUncheckedUnaryOperatorForType(TypeFactory::GetType(kDate, true)));
+    EXPECT_EQ(expected, unchecked_operator_->applyToTypedValue(*date_).getLiteral<int32_t>());
+
+    EXPECT_TRUE(unchecked_operator_->applyToTypedValue(*date_null_).isNull());
+  }
+
   static void CheckFixedNullableResultTypeForField(const DateExtractUnit field) {
     const Type *fixed_result_type
         = DateExtractOperation::Instance(field).fixedNullableResultType();
-    ASSERT_NE(fixed_result_type, nullptr);
-    EXPECT_TRUE(TypeFactory::GetType(kLong, true).equals(*fixed_result_type));
+    ASSERT_EQ(fixed_result_type, nullptr);
   }
 
   static void CheckResultTypeIsPlausibleForField(const DateExtractUnit field) {
-    // Only Long is plausible.
+    // Long and Int are plausible.
     EXPECT_TRUE(DateExtractOperation::Instance(field).resultTypeIsPlausible(
         TypeFactory::GetType(kLong, false)));
     EXPECT_TRUE(DateExtractOperation::Instance(field).resultTypeIsPlausible(
         TypeFactory::GetType(kLong, true)));
+    EXPECT_TRUE(DateExtractOperation::Instance(field).resultTypeIsPlausible(
+        TypeFactory::GetType(kInt, false)));
+    EXPECT_TRUE(DateExtractOperation::Instance(field).resultTypeIsPlausible(
+        TypeFactory::GetType(kInt, true)));
 
     for (const TypeID type_id
-         : {kInt, kFloat, kDouble, kDatetime, kDatetimeInterval, kYearMonthInterval}) {
+         : {kFloat, kDouble, kDatetime, kDatetimeInterval, kYearMonthInterval}) {
       EXPECT_FALSE(DateExtractOperation::Instance(field).resultTypeIsPlausible(
           TypeFactory::GetType(type_id, false)));
       EXPECT_FALSE(DateExtractOperation::Instance(field).resultTypeIsPlausible(
@@ -109,16 +133,34 @@ class DateExtractOperationTest : public ::testing::Test {
   static void CheckPushDownTypeHintForField(const DateExtractUnit field) {
     const UnaryOperation &op = DateExtractOperation::Instance(field);
 
-    // If hint is Long, then the argument is a Datetime with the same
-    // nullability.
+    // For nullable types.
     const Type *argument_hint
         = op.pushDownTypeHint(&TypeFactory::GetType(kLong, true));
-    ASSERT_NE(argument_hint, nullptr);
-    EXPECT_TRUE(TypeFactory::GetType(kDatetime, true).equals(*argument_hint));
+    if ((field == DateExtractUnit::kMonth) || (field == DateExtractUnit::kYear)) {
+      // If field is either Year or Month, the argument is NULL.
+      ASSERT_EQ(argument_hint, nullptr);
+    } else if (QUICKSTEP_EQUALS_ANY_CONSTANT(field,
+                                             DateExtractUnit::kDay,
+                                             DateExtractUnit::kHour,
+                                             DateExtractUnit::kMinute,
+                                             DateExtractUnit::kSecond)) {
+      // Otherwise, if hint is Long, then the argument is a Datetime with the
+      // same nullability.
+      ASSERT_NE(argument_hint, nullptr);
+      EXPECT_TRUE(TypeFactory::GetType(kDatetime, true).equals(*argument_hint));
+    }
 
+    // For non-nullable types.
     argument_hint = op.pushDownTypeHint(&TypeFactory::GetType(kLong, false));
-    ASSERT_NE(argument_hint, nullptr);
-    EXPECT_TRUE(TypeFactory::GetType(kDatetime, false).equals(*argument_hint));
+    if ((field == DateExtractUnit::kMonth) || (field == DateExtractUnit::kYear)) {
+      // If field is either Year or Month, the argument is NULL.
+      ASSERT_EQ(argument_hint, nullptr);
+    } else {
+      // Otherwise, if hint is Long, then the argument is a Datetime with the
+      // same nullability.
+      ASSERT_NE(argument_hint, nullptr);
+      EXPECT_TRUE(TypeFactory::GetType(kDatetime, false).equals(*argument_hint));
+    }
 
     // Anything else can't be returned, so there is no hint for argument type.
     EXPECT_EQ(nullptr, op.pushDownTypeHint(nullptr));
@@ -135,19 +177,26 @@ class DateExtractOperationTest : public ::testing::Test {
     EXPECT_EQ(nullptr, op.pushDownTypeHint(&TypeFactory::GetType(kVarChar, 10, true)));
   }
 
-  DatetimeLit dt_literal_;
+  DatetimeLit datetime_literal_;
+  DateLit date_literal_;
   unique_ptr<TypedValue> datetime_, datetime_null_;
+  unique_ptr<TypedValue> date_, date_null_;
 
   unique_ptr<UncheckedUnaryOperator> unchecked_operator_;
 };
 
-TEST_F(DateExtractOperationTest, DateExtratUnaryOperationTest) {
-  checkDateExtract(dt_literal_.yearField(), DateExtractUnit::kYear);
-  checkDateExtract(dt_literal_.monthField(), DateExtractUnit::kMonth);
-  checkDateExtract(dt_literal_.dayField(), DateExtractUnit::kDay);
-  checkDateExtract(dt_literal_.hourField(), DateExtractUnit::kHour);
-  checkDateExtract(dt_literal_.minuteField(), DateExtractUnit::kMinute);
-  checkDateExtract(dt_literal_.secondField(), DateExtractUnit::kSecond);
+TEST_F(DateExtractOperationTest, DateTimeExtractUnaryOperationTest) {
+  checkDatetimeExtract(datetime_literal_.yearField(), DateExtractUnit::kYear);
+  checkDatetimeExtract(datetime_literal_.monthField(), DateExtractUnit::kMonth);
+  checkDatetimeExtract(datetime_literal_.dayField(), DateExtractUnit::kDay);
+  checkDatetimeExtract(datetime_literal_.hourField(), DateExtractUnit::kHour);
+  checkDatetimeExtract(datetime_literal_.minuteField(), DateExtractUnit::kMinute);
+  checkDatetimeExtract(datetime_literal_.secondField(), DateExtractUnit::kSecond);
+}
+
+TEST_F(DateExtractOperationTest, DateExtractUnaryOperationTest) {
+  checkDateExtract(date_literal_.yearField(), DateExtractUnit::kYear);
+  checkDateExtract(date_literal_.monthField(), DateExtractUnit::kMonth);
 }
 
 TEST_F(DateExtractOperationTest, FixedNullableResultTypeTest) {