This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new be297d04d7 [CALCITE-6179] Support weekofmonth function format and add
test
be297d04d7 is described below
commit be297d04d79c4f7cf0099f2e761ba30e49a3c640
Author: caicancai <[email protected]>
AuthorDate: Tue Dec 26 22:42:32 2023 +0800
[CALCITE-6179] Support weekofmonth function format and add test
---
.../calcite/util/format/FormatElementEnum.java | 8 ++
.../apache/calcite/util/format/FormatModels.java | 2 +
.../calcite/util/format/FormatElementEnumTest.java | 143 ++++++++++++++++++++-
3 files changed, 152 insertions(+), 1 deletion(-)
diff --git
a/core/src/main/java/org/apache/calcite/util/format/FormatElementEnum.java
b/core/src/main/java/org/apache/calcite/util/format/FormatElementEnum.java
index 8c6ac03607..ea35aa9a2d 100644
--- a/core/src/main/java/org/apache/calcite/util/format/FormatElementEnum.java
+++ b/core/src/main/java/org/apache/calcite/util/format/FormatElementEnum.java
@@ -201,6 +201,14 @@ public enum FormatElementEnum implements FormatElement {
// TODO: how to support timezones?
}
},
+ W("W", "The week number of the month (Sunday as the first day of the week)
as a decimal "
+ + "number (1-5)") {
+ @Override public void format(StringBuilder sb, Date date) {
+ final Calendar calendar = Work.get().calendar;
+ calendar.setTime(date);
+ sb.append(String.format(Locale.ROOT, "%d",
calendar.get(Calendar.WEEK_OF_MONTH)));
+ }
+ },
WW("w", "The week number of the year (Sunday as the first day of the week)
as a decimal "
+ "number (00-53)") {
@Override public void format(StringBuilder sb, Date date) {
diff --git
a/core/src/main/java/org/apache/calcite/util/format/FormatModels.java
b/core/src/main/java/org/apache/calcite/util/format/FormatModels.java
index 2839e661b7..6cd8db3068 100644
--- a/core/src/main/java/org/apache/calcite/util/format/FormatModels.java
+++ b/core/src/main/java/org/apache/calcite/util/format/FormatModels.java
@@ -51,6 +51,7 @@ import static
org.apache.calcite.util.format.FormatElementEnum.PM;
import static org.apache.calcite.util.format.FormatElementEnum.Q;
import static org.apache.calcite.util.format.FormatElementEnum.SS;
import static org.apache.calcite.util.format.FormatElementEnum.TZR;
+import static org.apache.calcite.util.format.FormatElementEnum.W;
import static org.apache.calcite.util.format.FormatElementEnum.WW;
import static org.apache.calcite.util.format.FormatElementEnum.YY;
import static org.apache.calcite.util.format.FormatElementEnum.YYYY;
@@ -163,6 +164,7 @@ public class FormatModels {
map.put("DDD", DDD);
map.put("DD", DD);
map.put("D", D);
+ map.put("W", W);
map.put("WW", WW);
map.put("IW", IW);
map.put("Q", Q);
diff --git
a/core/src/test/java/org/apache/calcite/util/format/FormatElementEnumTest.java
b/core/src/test/java/org/apache/calcite/util/format/FormatElementEnumTest.java
index 20aa61337b..5924c5f4fb 100644
---
a/core/src/test/java/org/apache/calcite/util/format/FormatElementEnumTest.java
+++
b/core/src/test/java/org/apache/calcite/util/format/FormatElementEnumTest.java
@@ -29,8 +29,149 @@ import static org.hamcrest.Matchers.hasToString;
*/
class FormatElementEnumTest {
@Test void testDay() {
+ final String date = "2014-09-30T10:00:00Z";
StringBuilder ts = new StringBuilder();
- FormatElementEnum.DAY.format(ts,
Date.from(Instant.parse("2014-09-30T10:00:00Z")));
+ FormatElementEnum.DAY.format(ts, Date.from(Instant.parse(date)));
assertThat(ts, hasToString("Tuesday"));
}
+
+ @Test void testD() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.D.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("3"));
+ }
+
+ @Test void testDD() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.DD.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("30"));
+ }
+
+ @Test void testDDD() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.DDD.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("273"));
+ }
+
+ @Test void testDY() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.DY.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("Tue"));
+ }
+
+ @Test void testFF1() {
+ final String date = "2014-09-30T10:00:00.123456Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.FF1.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("123"));
+ }
+
+ @Test void testFF2() {
+ final String date = "2014-09-30T10:00:00.123456Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.FF2.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("123"));
+ }
+
+ @Test void testFF3() {
+ final String date = "2014-09-30T10:00:00.123456Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.FF3.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("123"));
+ }
+
+ @Test void testFF4() {
+ final String date = "2014-09-30T10:00:00.123456Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.FF4.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("0123"));
+ }
+
+ @Test void testFF5() {
+ final String date = "2014-09-30T10:00:00.123456Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.FF5.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("00123"));
+ }
+
+ @Test void testFF6() {
+ final String date = "2014-09-30T10:00:00.123456Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.FF6.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("000123"));
+ }
+
+ @Test void testIW() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.IW.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("40"));
+ }
+
+ @Test void testMM() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.MM.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("09"));
+ }
+
+ @Test void testMON() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.MON.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("Sep"));
+ }
+
+ @Test void testQ() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.Q.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("3"));
+ }
+
+ @Test void testMS() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.MS.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("000"));
+ }
+
+ @Test void testSS() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.SS.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("00"));
+ }
+
+ @Test void testWM() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.W.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("5"));
+ }
+
+ @Test void testWW() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.WW.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("40"));
+ }
+
+ @Test void testYY() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.YY.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("14"));
+ }
+
+ @Test void testYYYY() {
+ final String date = "2014-09-30T10:00:00Z";
+ StringBuilder ts = new StringBuilder();
+ FormatElementEnum.YYYY.format(ts, Date.from(Instant.parse(date)));
+ assertThat(ts, hasToString("2014"));
+ }
}