Skip to content

Commit de66849

Browse files
authored
Add m alias for minute duration literal (#136448)
1 parent 6257be7 commit de66849

File tree

8 files changed

+28
-13
lines changed

8 files changed

+28
-13
lines changed

docs/changelog/136448.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 136448
2+
summary: Add `m` alias for `minute` duration literal
3+
area: ES|QL
4+
type: enhancement
5+
issues:
6+
- 135552

docs/reference/query-languages/esql/esql-time-spans.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ POST /_query
120120
| week | w, weeks |
121121
| day | d, days |
122122
| hour | h, hours |
123-
| minute | min, minutes |
123+
| minute | m, min, minutes |
124124
| second | s, sec, seconds |
125125
| millisecond | ms, milliseconds |
126126

x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/RestEsqlTestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ public void testErrorMessageForInvalidIntervalParams() throws IOException {
666666
error,
667667
containsString(
668668
"Invalid interval value in [?n2::time_duration], expected integer followed by one of "
669-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [3 days]"
669+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [3 days]"
670670
)
671671
);
672672

x-pack/plugin/esql/qa/testFixtures/src/main/resources/tbucket.csv-spec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,12 @@ errors:long | day:datetime | message:keyword
255255
keepWildcardBeforeStats
256256
required_capability: implicit_casting_string_literal_to_temporal_amount
257257
required_capability: tbucket
258+
required_capability: temporal_amount_m
258259

259260
FROM sample_data
260261
| WHERE client_ip IS NOT NULL
261262
| KEEP *stamp*, client_ip, event_duration
262-
| STATS p95 = PERCENTILE(event_duration, 95) BY ten_min = TBUCKET(10min), client_ip
263+
| STATS p95 = PERCENTILE(event_duration, 95) BY ten_min = TBUCKET(10m), client_ip
263264
;
264265
ignoreOrder:true
265266

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1499,7 +1499,12 @@ public enum Cap {
14991499
/**
15001500
* Support for dots in FUSE attributes
15011501
*/
1502-
DOTS_IN_FUSE;
1502+
DOTS_IN_FUSE,
1503+
1504+
/**
1505+
* Support for the literal {@code m} suffix as an alias for {@code minute} in temporal amounts.
1506+
*/
1507+
TEMPORAL_AMOUNT_M;
15031508

15041509
private final boolean enabled;
15051510

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/type/EsqlDataTypeConverter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ public enum INTERVALS {
175175
MINUTE,
176176
MINUTES,
177177
MIN,
178+
M,
178179
HOUR,
179180
HOURS,
180181
H,
@@ -208,6 +209,7 @@ public enum INTERVALS {
208209
INTERVALS.MINUTE,
209210
INTERVALS.MINUTES,
210211
INTERVALS.MIN,
212+
INTERVALS.M,
211213
INTERVALS.HOUR,
212214
INTERVALS.HOURS,
213215
INTERVALS.H
@@ -488,7 +490,7 @@ public static TemporalAmount parseTemporalAmount(Number value, String temporalUn
488490
return switch (INTERVALS.valueOf(temporalUnit.toUpperCase(Locale.ROOT))) {
489491
case MILLISECOND, MILLISECONDS, MS -> Duration.ofMillis(safeToLong(value));
490492
case SECOND, SECONDS, SEC, S -> Duration.ofSeconds(safeToLong(value));
491-
case MINUTE, MINUTES, MIN -> Duration.ofMinutes(safeToLong(value));
493+
case MINUTE, MINUTES, MIN, M -> Duration.ofMinutes(safeToLong(value));
492494
case HOUR, HOURS, H -> Duration.ofHours(safeToLong(value));
493495

494496
case DAY, DAYS, D -> Period.ofDays(safeToInt(safeToLong(value)));

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7973,39 +7973,39 @@ public void testToDatePeriodTimeDurationInvalidIntervals() {
79737973
from types | EVAL interval = "3 ours", x = date + interval::time_duration"""));
79747974
assertEquals(
79757975
"Invalid interval value in [interval::time_duration], expected integer followed by one of "
7976-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [3 ours]",
7976+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [3 ours]",
79777977
e.getMessage()
79787978
);
79797979

79807980
e = expectThrows(IllegalArgumentException.class, () -> planTypes("""
79817981
from types | EVAL interval = "- 3 hours", x = date + interval::time_duration"""));
79827982
assertEquals(
79837983
"Invalid interval value in [interval::time_duration], expected integer followed by one of "
7984-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [- 3 hours]",
7984+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [- 3 hours]",
79857985
e.getMessage()
79867986
);
79877987

79887988
e = expectThrows(IllegalArgumentException.class, () -> planTypes("""
79897989
from types | EVAL interval = "3 ours", x = date - to_timeduration(interval)"""));
79907990
assertEquals(
79917991
"Invalid interval value in [to_timeduration(interval)], expected integer followed by one of "
7992-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [3 ours]",
7992+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [3 ours]",
79937993
e.getMessage()
79947994
);
79957995

79967996
e = expectThrows(IllegalArgumentException.class, () -> planTypes("""
79977997
from types | EVAL interval = "- 3 hours", x = date - to_timeduration(interval)"""));
79987998
assertEquals(
79997999
"Invalid interval value in [to_timeduration(interval)], expected integer followed by one of "
8000-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [- 3 hours]",
8000+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [- 3 hours]",
80018001
e.getMessage()
80028002
);
80038003

80048004
e = expectThrows(IllegalArgumentException.class, () -> planTypes("""
80058005
from types | EVAL interval = "3.5 hours", x = date - to_timeduration(interval)"""));
80068006
assertEquals(
80078007
"Invalid interval value in [to_timeduration(interval)], expected integer followed by one of "
8008-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [3.5 hours]",
8008+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [3.5 hours]",
80098009
e.getMessage()
80108010
);
80118011

@@ -8029,23 +8029,23 @@ public void testToDatePeriodTimeDurationInvalidIntervals() {
80298029
row x = "2024-01-01"::datetime | eval y = x + "3 ours"::time_duration"""));
80308030
assertEquals(
80318031
"Invalid interval value in [\"3 ours\"::time_duration], expected integer followed by one of "
8032-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [3 ours]",
8032+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [3 ours]",
80338033
e.getMessage()
80348034
);
80358035

80368036
e = expectThrows(IllegalArgumentException.class, () -> planTypes("""
80378037
row x = "2024-01-01"::datetime | eval y = x - to_timeduration("3 ours")"""));
80388038
assertEquals(
80398039
"Invalid interval value in [to_timeduration(\"3 ours\")], expected integer followed by one of "
8040-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [3 ours]",
8040+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [3 ours]",
80418041
e.getMessage()
80428042
);
80438043

80448044
e = expectThrows(IllegalArgumentException.class, () -> planTypes("""
80458045
row x = "2024-01-01"::datetime | eval y = x - to_timeduration("3.5 hours")"""));
80468046
assertEquals(
80478047
"Invalid interval value in [to_timeduration(\"3.5 hours\")], expected integer followed by one of "
8048-
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, HOUR, HOURS, H] but got [3.5 hours]",
8048+
+ "[MILLISECOND, MILLISECONDS, MS, SECOND, SECONDS, SEC, S, MINUTE, MINUTES, MIN, M, HOUR, HOURS, H] but got [3.5 hours]",
80498049
e.getMessage()
80508050
);
80518051
}

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/ExpressionTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ public void testDurationLiterals() {
392392
assertEquals(l(Duration.ofMinutes(value), TIME_DURATION), whereExpression(value + "minute"));
393393
assertEquals(l(Duration.ofMinutes(value), TIME_DURATION), whereExpression(value + " minutes"));
394394
assertEquals(l(Duration.ofMinutes(value), TIME_DURATION), whereExpression(value + " min"));
395+
assertEquals(l(Duration.ofMinutes(value), TIME_DURATION), whereExpression(value + " m"));
395396

396397
assertEquals(l(Duration.ZERO, TIME_DURATION), whereExpression("0 hour"));
397398
assertEquals(l(Duration.ofHours(value), TIME_DURATION), whereExpression(value + "hour"));

0 commit comments

Comments
 (0)