Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] Support jodatime_format function to partition pruning #52620

Merged
merged 19 commits into from
Nov 14, 2024
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
16dedb1
Support jodatime_fata function to partition pruning
renzhimin7 Nov 5, 2024
2ecbdb8
Support jodatime_fata function to partition pruning
renzhimin7 Nov 5, 2024
5d21686
Support jodatime_fata function to partition pruning
renzhimin7 Nov 5, 2024
fc91bff
Support jodatime_fata function to partition pruning
renzhimin7 Nov 7, 2024
f0cd76f
Support jodatime_format function to partition pruning
renzhimin7 Nov 7, 2024
ef9b875
Support jodatime_format function to partition pruning
renzhimin7 Nov 7, 2024
2ecf4c1
Merge remote-tracking branch 'renzhimin7/renzhimin7-main' into renzhi…
renzhimin7 Nov 7, 2024
90fc56c
Support jodatime_format function to partition pruning
renzhimin7 Nov 7, 2024
08a9538
Support jodatime_format function to partition pruning
renzhimin7 Nov 8, 2024
da5caec
Support jodatime_format function to partition pruning
renzhimin7 Nov 8, 2024
3b90ee7
Support jodatime_format function to partition pruning
renzhimin7 Nov 8, 2024
68ae47f
Support jodatime_format function to partition pruning
renzhimin7 Nov 8, 2024
f28884b
Support jodatime_format function to partition pruning
renzhimin7 Nov 8, 2024
8f68eb5
Support jodatime_format function to partition pruning
renzhimin7 Nov 9, 2024
87743af
Support jodatime_format function to partition pruning
renzhimin7 Nov 9, 2024
199c8a8
Support jodatime_format function to partition pruning
renzhimin7 Nov 9, 2024
b3239e4
Support jodatime_format function to partition pruning
renzhimin7 Nov 9, 2024
dee396c
Support jodatime_format function to partition pruning
renzhimin7 Nov 9, 2024
ce1c6b7
Support jodatime_format function to partition pruning
renzhimin7 Nov 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
import org.apache.commons.lang.StringUtils;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;

import java.math.BigDecimal;
import java.math.BigInteger;
Expand Down Expand Up @@ -380,6 +382,26 @@ public static ConstantOperator dateFormat(ConstantOperator date, ConstantOperato
}
}

@ConstantFunction.List(list = {
@ConstantFunction(name = "jodatime_format", argTypes = {DATETIME, VARCHAR},
returnType = VARCHAR, isMonotonic = true),
@ConstantFunction(name = "jodatime_format", argTypes = {DATE, VARCHAR},
returnType = VARCHAR, isMonotonic = true)
})
public static ConstantOperator jodatimeFormat(ConstantOperator date, ConstantOperator fmtLiteral) {
String format = fmtLiteral.getVarchar();
if (format.isEmpty()) {
return ConstantOperator.createNull(Type.VARCHAR);
}
org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern(format);
DateTime jodaDateTime = new DateTime(date.getDatetime()
.atZone(ZoneId.systemDefault()) // 将 LocalDateTime 与系统默认时区关联
renzhimin7 marked this conversation as resolved.
Show resolved Hide resolved
.toInstant() // 转换为 Instant
.toEpochMilli());
return ConstantOperator.createVarchar(jodaDateTime.toString(formatter));
}


@ConstantFunction.List(list = {
@ConstantFunction(name = "to_iso8601", argTypes = {DATETIME}, returnType = VARCHAR, isMonotonic = true),
@ConstantFunction(name = "to_iso8601", argTypes = {DATE}, returnType = VARCHAR, isMonotonic = true)
renzhimin7 marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,13 +171,13 @@ public void testDateFnTransform() throws Exception {
assertPlanContains(sql, "week_iso('2023-01-01 00:00:00')");

sql = "select format_datetime(TIMESTAMP '2023-06-25 11:10:20', 'yyyyMMdd HH:mm:ss')";
assertPlanContains(sql, "jodatime_format('2023-06-25 11:10:20', 'yyyyMMdd HH:mm:ss')");
assertPlanContains(sql, "20230625 11:10:20");

sql = "select format_datetime(date '2023-06-25', 'yyyyMMdd HH:mm:ss');";
assertPlanContains(sql, "jodatime_format('2023-06-25', 'yyyyMMdd HH:mm:ss')");
assertPlanContains(sql, "20230625 00:00:00");

sql = "select to_char(TIMESTAMP '2023-06-25 11:10:20', 'yyyyMMdd HH:mm:ss');";
assertPlanContains(sql, "jodatime_format('2023-06-25 11:10:20', 'yyyyMMdd HH:mm:ss')");
assertPlanContains(sql, "20230625 11:10:20");

sql = "select parse_datetime('2023-08-02 14:37:02', 'yyyy-MM-dd HH:mm:ss')";
assertPlanContains(sql, "str_to_jodatime('2023-08-02 14:37:02', 'yyyy-MM-dd HH:mm:ss')");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1462,6 +1462,18 @@ public void testReplace() {
).getVarchar());
}

@Test
public void testJodatimeFormat() {
assertEquals("", ScalarOperatorFunctions.jodatimeFormat(
new ConstantOperator("2024-08-06", Type.DATE),
new ConstantOperator("", Type.VARCHAR)).getVarchar());

assertEquals("20241109", ScalarOperatorFunctions.jodatimeFormat(
new ConstantOperator(LocalDateTime.of(2024, 11, 9, 15, 30, 45),
Type.DATE),
new ConstantOperator("yyyyMMdd", Type.VARCHAR)).getVarchar());
}

/*
test cases are generated by the following SQL by capturing:
1. leap year
Expand Down
30 changes: 15 additions & 15 deletions test/sql/test_datetime/R/test_jodatime_format
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ select jodatime_format('2023-04-15', 'yyyy-MM-dd');
-- !result
select jodatime_format('2023-04-15 23:45:12', "yyyy-MM-dd'T'HH:mm:ssZZ");
-- result:
2023-04-15T23:45:12
2023-04-15T23:45:12+08:00
-- !result
select jodatime_format('2023-04-15 15:30:00', 'yyyy-MM-dd hh:mm:ssa');
-- result:
Expand Down Expand Up @@ -93,57 +93,57 @@ select jodatime_format('2023-06-25 00:00:00', "012345678901234567890123456789012
-- !result
select jodatime_format('2023-06-25 00:00:00', "yyyyMMdd--'012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456'");
-- result:
None
20230625--012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
-- !result
select jodatime_format('2023-06-25 00:00:00', "yyyyMMdd--'012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456");
-- result:
None
20230625--012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
-- !result
select jodatime_format('2023-06-25 00:00:00', "yyyyMMdd--012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456");
-- result:
None
20230625--012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
-- !result
select jodatime_format('2023-06-25 00:00:00', "'012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456'--yyyyMMdd");
-- result:
None
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456--20230625
-- !result
select jodatime_format('2023-06-25 00:00:00', "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456--yyyyMMdd");
-- result:
None
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456--20230625
-- !result
select jodatime_format('2023-06-25 00:00:00', "'0123456789012345678901234567890123456789'--yyyyMMdd--'234567890123456789012345678901234567890123456789012345678901234567890123456'");
-- result:
None
0123456789012345678901234567890123456789--20230625--234567890123456789012345678901234567890123456789012345678901234567890123456
-- !result
select jodatime_format('2023-06-25 00:00:00', "0123456789012345678901234567890123456789--yyyyMMdd--234567890123456789012345678901234567890123456789012345678901234567890123456");
-- result:
None
0123456789012345678901234567890123456789--20230625--234567890123456789012345678901234567890123456789012345678901234567890123456
-- !result
select jodatime_format('2023-06-25 00:00:00', "yyyyMMdd--'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567'");
-- result:
None
20230625--0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
-- !result
select jodatime_format('2023-06-25 00:00:00', "yyyyMMdd--'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567");
-- result:
None
20230625--0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
-- !result
select jodatime_format('2023-06-25 00:00:00', "yyyyMMdd--0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567");
-- result:
None
20230625--0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
-- !result
select jodatime_format('2023-06-25 00:00:00', "'0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567'--yyyyMMdd");
-- result:
None
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567--20230625
-- !result
select jodatime_format('2023-06-25 00:00:00', "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567--yyyyMMdd");
-- result:
None
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567--20230625
-- !result
select jodatime_format('2023-06-25 00:00:00', "'0123456789012345678901234567890123456789'--yyyyMMdd--'2345678901234567890123456789012345678901234567890123456789012345678901234567'");
-- result:
None
0123456789012345678901234567890123456789--20230625--2345678901234567890123456789012345678901234567890123456789012345678901234567
-- !result
select jodatime_format('2023-06-25 00:00:00', "0123456789012345678901234567890123456789--yyyyMMdd--2345678901234567890123456789012345678901234567890123456789012345678901234567");
-- result:
None
0123456789012345678901234567890123456789--20230625--2345678901234567890123456789012345678901234567890123456789012345678901234567
-- !result
Loading