Skip to content

Commit b410903

Browse files
committed
Address comments pt1
1 parent 95a0990 commit b410903

File tree

14 files changed

+61
-58
lines changed

14 files changed

+61
-58
lines changed

x-pack/plugin/sql/qa/src/main/resources/date.csv-spec

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,21 @@ DAY_OF_WEEK(CAST(birth_date AS DATE)) dw,
1010
DAY_OF_YEAR(CAST(birth_date AS DATE)) dy,
1111
ISO_DAY_OF_WEEK(CAST(birth_date AS DATE)) iso_dw,
1212
WEEK(CAST(birth_date AS DATE)) w,
13-
QUARTER(CAST(hire_date AS DATE)) q,
13+
IW(CAST(birth_date AS DATE)) iso_w,
14+
QUARTER(CAST(birth_date AS DATE)) q,
1415
YEAR(CAST(birth_date AS DATE)) y,
1516
birth_date, last_name l FROM "test_emp" WHERE emp_no < 10010 ORDER BY emp_no;
1617

17-
d:i | dm:i | dw:i | dy:i | iso_dw:i | w:i | q:i | y:i | birth_date:ts | l:s
18-
2 |2 |4 |245 |3 |36 |2 |1953 |1953-09-02T00:00:00Z |Facello
19-
2 |2 |3 |154 |2 |23 |4 |1964 |1964-06-02T00:00:00Z |Simmel
20-
3 |3 |5 |337 |4 |49 |3 |1959 |1959-12-03T00:00:00Z |Bamford
21-
1 |1 |7 |121 |6 |18 |4 |1954 |1954-05-01T00:00:00Z |Koblick
22-
21 |21 |6 |21 |5 |4 |3 |1955 |1955-01-21T00:00:00Z |Maliniak
23-
20 |20 |2 |110 |1 |17 |2 |1953 |1953-04-20T00:00:00Z |Preusig
24-
23 |23 |5 |143 |4 |21 |1 |1957 |1957-05-23T00:00:00Z |Zielinski
25-
19 |19 |4 |50 |3 |8 |3 |1958 |1958-02-19T00:00:00Z |Kalloufi
26-
19 |19 |7 |110 |6 |16 |1 |1952 |1952-04-19T00:00:00Z |Peac
18+
d:i | dm:i | dw:i | dy:i | iso_dw:i | w:i |iso_w:i | q:i | y:i | birth_date:ts | l:s
19+
2 |2 |4 |245 |3 |36 |35 |3 |1953 |1953-09-02T00:00:00Z |Facello
20+
2 |2 |3 |154 |2 |23 |22 |2 |1964 |1964-06-02T00:00:00Z |Simmel
21+
3 |3 |5 |337 |4 |49 |49 |4 |1959 |1959-12-03T00:00:00Z |Bamford
22+
1 |1 |7 |121 |6 |18 |18 |2 |1954 |1954-05-01T00:00:00Z |Koblick
23+
21 |21 |6 |21 |5 |4 |3 |1 |1955 |1955-01-21T00:00:00Z |Maliniak
24+
20 |20 |2 |110 |1 |17 |16 |2 |1953 |1953-04-20T00:00:00Z |Preusig
25+
23 |23 |5 |143 |4 |21 |21 |2 |1957 |1957-05-23T00:00:00Z |Zielinski
26+
19 |19 |4 |50 |3 |8 |8 |1 |1958 |1958-02-19T00:00:00Z |Kalloufi
27+
19 |19 |7 |110 |6 |16 |16 |2 |1952 |1952-04-19T00:00:00Z |Peac
2728
;
2829

2930

@@ -82,7 +83,7 @@ null |100445
8283
;
8384

8485
dateAndInterval
85-
SELECT YEAR(CAST('2019-01-21' AS DATE) + INTERVAL '1-2' YEAR TO MONTH) AS y, MONTH(CAST('2019-01-21' AS DATE) + INTERVAL '1-2' YEAR TO MONTH) AS m;
86+
SELECT YEAR(CAST('2019-01-21' AS DATE) + INTERVAL '1-2' YEAR TO MONTH) AS y, MONTH(INTERVAL '1-2' YEAR TO MONTH + CAST('2019-01-21' AS DATE)) AS m;
8687

8788
y:i | m:i
8889
2020 | 3

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Expressions.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66
package org.elasticsearch.xpack.sql.expression;
77

8-
import org.elasticsearch.common.Strings;
98
import org.elasticsearch.xpack.sql.SqlIllegalArgumentException;
109
import org.elasticsearch.xpack.sql.expression.Expression.TypeResolution;
1110
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
@@ -16,6 +15,7 @@
1615
import java.util.Collection;
1716
import java.util.List;
1817
import java.util.Locale;
18+
import java.util.StringJoiner;
1919
import java.util.function.Predicate;
2020

2121
import static java.lang.String.format;
@@ -173,11 +173,11 @@ public static TypeResolution typeMustBeString(Expression e, String operationName
173173
return typeMustBe(e, DataType::isString, operationName, paramOrd, "string");
174174
}
175175

176-
public static TypeResolution typeMustBeDateOrDateTime(Expression e, String operationName, ParamOrdinal paramOrd) {
176+
public static TypeResolution typeMustBeDate(Expression e, String operationName, ParamOrdinal paramOrd) {
177177
return typeMustBe(e, dt -> dt == DATETIME || dt == DATE, operationName, paramOrd, "datetime, date");
178178
}
179179

180-
public static TypeResolution typeMustBeNumericOrDateTimeOrDate(Expression e, String operationName, ParamOrdinal paramOrd) {
180+
public static TypeResolution typeMustBeNumericOrDate(Expression e, String operationName, ParamOrdinal paramOrd) {
181181
return typeMustBe(e, dt -> dt.isNumeric() || dt == DATETIME, operationName, paramOrd, "numeric", "datetime", "date");
182182
}
183183

@@ -191,8 +191,20 @@ public static TypeResolution typeMustBe(Expression e,
191191
new TypeResolution(format(Locale.ROOT, "[%s]%s argument must be [%s], found value [%s] type [%s]",
192192
operationName,
193193
paramOrd == null || paramOrd == ParamOrdinal.DEFAULT ? "" : " " + paramOrd.name().toLowerCase(Locale.ROOT),
194-
Strings.arrayToDelimitedString(acceptedTypes, " or "),
194+
acceptedTypesForErrorMsg(acceptedTypes),
195195
Expressions.name(e),
196196
e.dataType().esType));
197197
}
198+
199+
private static String acceptedTypesForErrorMsg(String... acceptedTypes) {
200+
StringJoiner sj = new StringJoiner(", ");
201+
for (int i = 0; i < acceptedTypes.length - 1; i++) {
202+
sj.add(acceptedTypes[i]);
203+
}
204+
if (acceptedTypes.length > 1) {
205+
return sj.toString() + " or " + acceptedTypes[acceptedTypes.length - 1];
206+
} else {
207+
return acceptedTypes[0];
208+
}
209+
}
198210
}

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/Literal.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,7 @@ public Literal(Source source, Object value, DataType dataType) {
3838
public Literal(Source source, String name, Object value, DataType dataType) {
3939
super(source, name == null ? source.text() : name, emptyList(), null);
4040
this.dataType = dataType;
41-
// if (dataType == DATE) {
42-
// this.value = value;
43-
// } else {
44-
this.value = DataTypeConversion.convert(value, dataType);
45-
// }
41+
this.value = DataTypeConversion.convert(value, dataType);
4642
}
4743

4844
@Override

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Max.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@ public String innerName() {
4545

4646
@Override
4747
protected TypeResolution resolveType() {
48-
return Expressions.typeMustBeNumericOrDateTimeOrDate(field(), sourceText(), ParamOrdinal.DEFAULT);
48+
return Expressions.typeMustBeNumericOrDate(field(), sourceText(), ParamOrdinal.DEFAULT);
4949
}
5050
}

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/aggregate/Min.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,6 @@ public String innerName() {
4848

4949
@Override
5050
protected TypeResolution resolveType() {
51-
return Expressions.typeMustBeNumericOrDateTimeOrDate(field(), sourceText(), ParamOrdinal.DEFAULT);
51+
return Expressions.typeMustBeNumericOrDate(field(), sourceText(), ParamOrdinal.DEFAULT);
5252
}
5353
}

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/grouping/Histogram.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public ZoneId zoneId() {
3939

4040
@Override
4141
protected TypeResolution resolveType() {
42-
TypeResolution resolution = Expressions.typeMustBeNumericOrDateTimeOrDate(field(), "HISTOGRAM", ParamOrdinal.FIRST);
42+
TypeResolution resolution = Expressions.typeMustBeNumericOrDate(field(), "HISTOGRAM", ParamOrdinal.FIRST);
4343
if (resolution == TypeResolution.TYPE_RESOLVED) {
4444
// interval must be Literal interval
4545
if (field().dataType() == DataType.DATETIME) {

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/BaseDateTimeFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ protected final NodeInfo<BaseDateTimeFunction> info() {
3535

3636
@Override
3737
protected TypeResolution resolveType() {
38-
return Expressions.typeMustBeDateOrDateTime(field(), sourceText(), ParamOrdinal.DEFAULT);
38+
return Expressions.typeMustBeDate(field(), sourceText(), ParamOrdinal.DEFAULT);
3939
}
4040

4141
public ZoneId zoneId() {

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ public Literal visitDateEscapedLiteral(DateEscapedLiteralContext ctx) {
795795
} catch(IllegalArgumentException ex) {
796796
throw new ParsingException(source, "Invalid date received; {}", ex.getMessage());
797797
}
798-
return new Literal(source, DateUtils.asDate(dt), DataType.DATE);
798+
return new Literal(source, DateUtils.asDateOnly(dt), DataType.DATE);
799799
}
800800

801801
@Override

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataTypeConversion.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,23 +76,23 @@ public static DataType commonType(DataType left, DataType right) {
7676
}
7777

7878
// interval and dates
79-
if (left == DATETIME) {
80-
if (right == DATE || DataTypes.isInterval(right)) {
79+
if (left == DATE) {
80+
if (DataTypes.isInterval(right)) {
8181
return left;
8282
}
8383
}
84-
if (right == DATETIME) {
85-
if (left == DATE || DataTypes.isInterval(left)) {
84+
if (right == DATE) {
85+
if (DataTypes.isInterval(left)) {
8686
return right;
8787
}
8888
}
89-
if (left == DATE) {
90-
if (DataTypes.isInterval(right)) {
89+
if (left == DATETIME) {
90+
if (right == DATE || DataTypes.isInterval(right)) {
9191
return left;
9292
}
9393
}
94-
if (right == DATE) {
95-
if (DataTypes.isInterval(left)) {
94+
if (right == DATETIME) {
95+
if (left == DATE || DataTypes.isInterval(left)) {
9696
return right;
9797
}
9898
}
@@ -497,7 +497,7 @@ public enum Conversion {
497497
RATIONAL_TO_DATE(toDate(RATIONAL_TO_LONG)),
498498
INTEGER_TO_DATE(toDate(INTEGER_TO_LONG)),
499499
BOOL_TO_DATE(toDate(BOOL_TO_INT)),
500-
STRING_TO_DATE(fromString(DateUtils::asDate, "date")),
500+
STRING_TO_DATE(fromString(DateUtils::asDateOnly, "date")),
501501
DATETIME_TO_DATE(fromDatetimeToDate()),
502502

503503
RATIONAL_TO_DATETIME(toDateTime(RATIONAL_TO_LONG)),
@@ -559,11 +559,11 @@ private static Function<Object, Object> toDateTime(Conversion conversion) {
559559
}
560560

561561
private static Function<Object, Object> toDate(Conversion conversion) {
562-
return l -> DateUtils.asDate(((Number) conversion.convert(l)).longValue());
562+
return l -> DateUtils.asDateOnly(((Number) conversion.convert(l)).longValue());
563563
}
564564

565565
private static Function<Object, Object> fromDatetimeToDate() {
566-
return l -> DateUtils.asDate((ZonedDateTime) l);
566+
return l -> DateUtils.asDateOnly((ZonedDateTime) l);
567567
}
568568

569569
public Object convert(Object l) {

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/DataTypes.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@
88
import org.elasticsearch.xpack.sql.SqlIllegalArgumentException;
99
import org.elasticsearch.xpack.sql.expression.literal.Interval;
1010

11-
import java.time.LocalDateTime;
1211
import java.time.ZonedDateTime;
1312

1413
import static org.elasticsearch.xpack.sql.type.DataType.BOOLEAN;
1514
import static org.elasticsearch.xpack.sql.type.DataType.BYTE;
16-
import static org.elasticsearch.xpack.sql.type.DataType.DATE;
1715
import static org.elasticsearch.xpack.sql.type.DataType.DATETIME;
1816
import static org.elasticsearch.xpack.sql.type.DataType.DOUBLE;
1917
import static org.elasticsearch.xpack.sql.type.DataType.FLOAT;
@@ -69,9 +67,6 @@ public static DataType fromJava(Object value) {
6967
if (value instanceof Short) {
7068
return SHORT;
7169
}
72-
if (value instanceof LocalDateTime) {
73-
return DATE;
74-
}
7570
if (value instanceof ZonedDateTime) {
7671
return DATETIME;
7772
}

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/util/DateUtils.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ private DateUtils() {}
3838
/**
3939
* Creates an date for SQL DATE type from the millis since epoch.
4040
*/
41-
public static ZonedDateTime asDate(long millis) {
41+
public static ZonedDateTime asDateOnly(long millis) {
4242
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(millis), UTC)
4343
.withHour(0)
4444
.withMinute(0)
@@ -63,11 +63,11 @@ public static ZonedDateTime asDateTime(long millis, ZoneId id) {
6363
/**
6464
* Parses the given string into a Date (SQL DATE type) using UTC as a default timezone.
6565
*/
66-
public static ZonedDateTime asDate(String dateFormat) {
67-
return asDate(UTC_DATE_FORMATTER.parseDateTime(dateFormat));
66+
public static ZonedDateTime asDateOnly(String dateFormat) {
67+
return asDateOnly(UTC_DATE_FORMATTER.parseDateTime(dateFormat));
6868
}
6969

70-
public static ZonedDateTime asDate(DateTime dateTime) {
70+
public static ZonedDateTime asDateOnly(DateTime dateTime) {
7171
LocalDateTime ldt = LocalDateTime.of(
7272
dateTime.getYear(),
7373
dateTime.getMonthOfYear(),
@@ -82,7 +82,7 @@ public static ZonedDateTime asDate(DateTime dateTime) {
8282
org.elasticsearch.common.time.DateUtils.dateTimeZoneToZoneId(dateTime.getZone()));
8383
}
8484

85-
public static ZonedDateTime asDate(ZonedDateTime zdt) {
85+
public static ZonedDateTime asDateOnly(ZonedDateTime zdt) {
8686
return zdt
8787
.withHour(0)
8888
.withMinute(0)

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/VerifierErrorMessagesTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ public void testNotSupportedAggregateOnDate() {
378378
}
379379

380380
public void testNotSupportedAggregateOnString() {
381-
assertEquals("1:8: [MAX(keyword)] argument must be [numeric or datetime or date], found value [keyword] type [keyword]",
381+
assertEquals("1:8: [MAX(keyword)] argument must be [numeric, datetime or date], found value [keyword] type [keyword]",
382382
error("SELECT MAX(keyword) FROM test"));
383383
}
384384

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateTimeTestUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ public static ZonedDateTime dateTime(long millisSinceEpoch) {
3030
}
3131

3232
public static ZonedDateTime date(long millisSinceEpoch) {
33-
return DateUtils.asDate(millisSinceEpoch);
33+
return DateUtils.asDateOnly(millisSinceEpoch);
3434
}
3535
}

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/DataTypeConversionTests.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import static org.elasticsearch.xpack.sql.type.DataType.values;
4545
import static org.elasticsearch.xpack.sql.type.DataTypeConversion.commonType;
4646
import static org.elasticsearch.xpack.sql.type.DataTypeConversion.conversionFor;
47-
import static org.elasticsearch.xpack.sql.util.DateUtils.asDate;
4847
import static org.elasticsearch.xpack.sql.util.DateUtils.asDateTime;
4948

5049

@@ -60,7 +59,7 @@ public void testConversionToString() {
6059
{
6160
Conversion conversion = conversionFor(DATE, to);
6261
assertNull(conversion.convert(null));
63-
assertEquals("1973-11-29", conversion.convert(asDate(123456789101L)));
62+
assertEquals("1973-11-29", conversion.convert(DateUtils.asDateOnly(123456789101L)));
6463
}
6564
{
6665
Conversion conversion = conversionFor(DATETIME, to);
@@ -98,7 +97,7 @@ public void testConversionToLong() {
9897
{
9998
Conversion conversion = conversionFor(DATE, to);
10099
assertNull(conversion.convert(null));
101-
assertEquals(123379200L, conversion.convert(asDate(123456789101L)));
100+
assertEquals(123379200L, conversion.convert(DateUtils.asDateOnly(123456789101L)));
102101
}
103102
{
104103
Conversion conversion = conversionFor(DATETIME, to);
@@ -155,7 +154,7 @@ public void testConversionToDate() {
155154
ZonedDateTime zdt = TestUtils.now();
156155
Conversion forward = conversionFor(DATE, KEYWORD);
157156
Conversion back = conversionFor(KEYWORD, DATE);
158-
assertEquals(DateUtils.asDate(zdt), back.convert(forward.convert(zdt)));
157+
assertEquals(DateUtils.asDateOnly(zdt), back.convert(forward.convert(zdt)));
159158
Exception e = expectThrows(SqlIllegalArgumentException.class, () -> conversion.convert("0xff"));
160159
assertEquals("cannot cast [0xff] to [date]:Invalid format: \"0xff\" is malformed at \"xff\"", e.getMessage());
161160
}
@@ -187,7 +186,7 @@ public void testConversionToDateTime() {
187186
{
188187
Conversion conversion = conversionFor(DATE, to);
189188
assertNull(conversion.convert(null));
190-
assertEquals(dateTime(123379200000L), conversion.convert(asDate(123456789101L)));
189+
assertEquals(dateTime(123379200000L), conversion.convert(DateUtils.asDateOnly(123456789101L)));
191190
}
192191
{
193192
Conversion conversion = conversionFor(KEYWORD, to);
@@ -231,7 +230,7 @@ public void testConversionToDouble() {
231230
{
232231
Conversion conversion = conversionFor(DATE, to);
233232
assertNull(conversion.convert(null));
234-
assertEquals(1.233792E8, (double) conversion.convert(asDate(123456789101L)), 0);
233+
assertEquals(1.233792E8, (double) conversion.convert(DateUtils.asDateOnly(123456789101L)), 0);
235234
}
236235
{
237236
Conversion conversion = conversionFor(DATETIME, to);
@@ -282,8 +281,8 @@ public void testConversionToBoolean() {
282281
{
283282
Conversion conversion = conversionFor(DATE, to);
284283
assertNull(conversion.convert(null));
285-
assertEquals(true, conversion.convert(asDate(123456789101L)));
286-
assertEquals(false, conversion.convert(asDate(0L)));
284+
assertEquals(true, conversion.convert(DateUtils.asDateOnly(123456789101L)));
285+
assertEquals(false, conversion.convert(DateUtils.asDateOnly(0L)));
287286
}
288287
{
289288
Conversion conversion = conversionFor(DATETIME, to);
@@ -329,7 +328,7 @@ public void testConversionToInt() {
329328
{
330329
Conversion conversion = conversionFor(DATE, to);
331330
assertNull(conversion.convert(null));
332-
assertEquals(123379200, conversion.convert(asDate(123456789101L)));
331+
assertEquals(123379200, conversion.convert(DateUtils.asDateOnly(123456789101L)));
333332
}
334333
{
335334
Conversion conversion = conversionFor(DATETIME, to);

0 commit comments

Comments
 (0)