You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by za...@apache.org on 2022/10/23 18:03:06 UTC

[calcite-avatica] branch main updated: [CALCITE-3078] Move public lastDay method from Calcite to Avatica

This is an automated email from the ASF dual-hosted git repository.

zabetak pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite-avatica.git


The following commit(s) were added to refs/heads/main by this push:
     new 0ea5d4f40 [CALCITE-3078] Move public lastDay method from Calcite to Avatica
0ea5d4f40 is described below

commit 0ea5d4f400afc15141076805afdc4a81d0375fc7
Author: Stamatis Zampetakis <za...@gmail.com>
AuthorDate: Sun Oct 23 18:51:17 2022 +0200

    [CALCITE-3078] Move public lastDay method from Calcite to Avatica
    
    Close apache/calcite-avatica#185
---
 .../apache/calcite/avatica/util/DateTimeUtils.java | 13 ++++
 .../apache/calcite/avatica/util/LastDayTest.java   | 77 ++++++++++++++++++++++
 2 files changed, 90 insertions(+)

diff --git a/core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java b/core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java
index 5995d22dc..a4fdb7f0a 100644
--- a/core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java
+++ b/core/src/main/java/org/apache/calcite/avatica/util/DateTimeUtils.java
@@ -1045,6 +1045,19 @@ public class DateTimeUtils {
     return DateTimeUtils.ymdToUnixDate(y0, m0, d0);
   }
 
+  /**
+   * SQL {@code LAST_DAY} function.
+   *
+   * @param date days since epoch
+   * @return days of the last day of the month since epoch
+   */
+  public static int lastDay(int date) {
+    int y0 = (int) DateTimeUtils.unixDateExtract(TimeUnitRange.YEAR, date);
+    int m0 = (int) DateTimeUtils.unixDateExtract(TimeUnitRange.MONTH, date);
+    int last = lastDay(y0, m0);
+    return DateTimeUtils.ymdToUnixDate(y0, m0, last);
+  }
+
   private static int lastDay(int y, int m) {
     switch (m) {
     case 2:
diff --git a/core/src/test/java/org/apache/calcite/avatica/util/LastDayTest.java b/core/src/test/java/org/apache/calcite/avatica/util/LastDayTest.java
new file mode 100644
index 000000000..0ce6a009b
--- /dev/null
+++ b/core/src/test/java/org/apache/calcite/avatica/util/LastDayTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.calcite.avatica.util;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import static org.apache.calcite.avatica.util.DateTimeUtils.dateStringToUnixDate;
+import static org.apache.calcite.avatica.util.DateTimeUtils.lastDay;
+import static org.apache.calcite.avatica.util.DateTimeUtils.unixDateToString;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests for {@code lastDay} methods in {@link DateTimeUtils}.
+ */
+@RunWith(Parameterized.class)
+public class LastDayTest {
+
+  @Parameterized.Parameters(name = "{0}")
+  public static Collection<Object[]> data() {
+    return Arrays.asList(new Object[][]{
+        {"2019-02-10", "2019-02-28"},
+        {"2019-06-10", "2019-06-30"},
+        {"2019-07-10", "2019-07-31"},
+        {"2019-09-10", "2019-09-30"},
+        {"2019-12-10", "2019-12-31"},
+        {"9999-12-10", "9999-12-31"},
+        {"1900-01-01", "1900-01-31"},
+        {"1935-02-01", "1935-02-28"},
+        {"1965-09-01", "1965-09-30"},
+        {"1970-01-01", "1970-01-31"},
+        {"2019-02-28", "2019-02-28"},
+        {"2019-12-31", "2019-12-31"},
+        {"2019-01-01", "2019-01-31"},
+        {"2019-06-30", "2019-06-30"},
+        {"2020-02-20", "2020-02-29"},
+        {"2020-02-29", "2020-02-29"},
+        {"9999-12-31", "9999-12-31"}
+    });
+  }
+
+
+  private final String inputDate;
+  private final String expectedDay;
+
+  public LastDayTest(String inputDate, String expectedDay) {
+    this.inputDate = inputDate;
+    this.expectedDay = expectedDay;
+  }
+
+  @Test
+  public void testLastDayFromDateReturnsExpectedDay() {
+    int lastDayFromDate = lastDay(dateStringToUnixDate(inputDate));
+    assertEquals(expectedDay, unixDateToString(lastDayFromDate));
+  }
+
+}
+// End LastDayTest.java