Skip to content

Commit 6eb7729

Browse files
authored
KQL update tests (#116483)
1 parent cd2433d commit 6eb7729

File tree

3 files changed

+161
-100
lines changed

3 files changed

+161
-100
lines changed

x-pack/plugin/kql/src/test/java/org/elasticsearch/xpack/kql/parser/AbstractKqlParserTestCase.java

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77

88
package org.elasticsearch.xpack.kql.parser;
99

10+
import org.elasticsearch.common.Strings;
11+
import org.elasticsearch.common.compress.CompressedXContent;
1012
import org.elasticsearch.common.regex.Regex;
1113
import org.elasticsearch.core.Predicates;
1214
import org.elasticsearch.core.SuppressForbidden;
15+
import org.elasticsearch.index.mapper.MapperService;
1316
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
1417
import org.elasticsearch.index.query.MatchQueryBuilder;
1518
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
@@ -19,6 +22,7 @@
1922
import org.elasticsearch.index.query.TermQueryBuilder;
2023
import org.elasticsearch.index.query.WildcardQueryBuilder;
2124
import org.elasticsearch.test.AbstractBuilderTestCase;
25+
import org.elasticsearch.xcontent.XContentBuilder;
2226

2327
import java.io.BufferedReader;
2428
import java.io.IOException;
@@ -36,6 +40,7 @@
3640
import java.util.stream.Collectors;
3741
import java.util.stream.Stream;
3842

43+
import static org.elasticsearch.xcontent.XContentFactory.jsonBuilder;
3944
import static org.hamcrest.Matchers.anEmptyMap;
4045
import static org.hamcrest.Matchers.contains;
4146
import static org.hamcrest.Matchers.equalTo;
@@ -46,6 +51,43 @@ public abstract class AbstractKqlParserTestCase extends AbstractBuilderTestCase
4651
protected static final String UNSUPPORTED_QUERY_FILE_PATH = "/unsupported-queries";
4752
protected static final Predicate<String> BOOLEAN_QUERY_FILTER = (q) -> q.matches("(?i)[^{]*[^\\\\]*(NOT|AND|OR)[^}]*");
4853

54+
protected static final String NESTED_FIELD_NAME = "mapped_nested";
55+
56+
@Override
57+
protected void initializeAdditionalMappings(MapperService mapperService) throws IOException {
58+
XContentBuilder mapping = jsonBuilder().startObject().startObject("_doc").startObject("properties");
59+
60+
mapping.startObject(TEXT_FIELD_NAME).field("type", "text").endObject();
61+
mapping.startObject(NESTED_FIELD_NAME);
62+
{
63+
mapping.field("type", "nested");
64+
mapping.startObject("properties");
65+
{
66+
mapping.startObject(TEXT_FIELD_NAME).field("type", "text").endObject();
67+
mapping.startObject(KEYWORD_FIELD_NAME).field("type", "keyword").endObject();
68+
mapping.startObject(INT_FIELD_NAME).field("type", "integer").endObject();
69+
mapping.startObject(NESTED_FIELD_NAME);
70+
{
71+
mapping.field("type", "nested");
72+
mapping.startObject("properties");
73+
{
74+
mapping.startObject(TEXT_FIELD_NAME).field("type", "text").endObject();
75+
mapping.startObject(KEYWORD_FIELD_NAME).field("type", "keyword").endObject();
76+
mapping.startObject(INT_FIELD_NAME).field("type", "integer").endObject();
77+
}
78+
mapping.endObject();
79+
}
80+
mapping.endObject();
81+
}
82+
mapping.endObject();
83+
}
84+
mapping.endObject();
85+
86+
mapping.endObject().endObject().endObject();
87+
88+
mapperService.merge("_doc", new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE);
89+
}
90+
4991
protected static String wrapWithRandomWhitespaces(String input) {
5092
return String.join("", randomWhitespaces(), input, randomWhitespaces());
5193
}
@@ -93,7 +135,18 @@ private static InputStream readFromJarUrl(URL source) throws IOException {
93135
protected List<String> mappedLeafFields() {
94136
return Stream.concat(
95137
Arrays.stream(MAPPED_LEAF_FIELD_NAMES),
96-
List.of(DATE_FIELD_NAME, INT_FIELD_NAME).stream().map(subfieldName -> OBJECT_FIELD_NAME + "." + subfieldName)
138+
Stream.of(
139+
// Adding mapped_object subfields
140+
Strings.format("%s.%s", OBJECT_FIELD_NAME, INT_FIELD_NAME),
141+
Strings.format("%s.%s", OBJECT_FIELD_NAME, DATE_FIELD_NAME),
142+
// Adding mapped_nested subfields
143+
Strings.format("%s.%s", NESTED_FIELD_NAME, TEXT_FIELD_NAME),
144+
Strings.format("%s.%s", NESTED_FIELD_NAME, KEYWORD_FIELD_NAME),
145+
Strings.format("%s.%s", NESTED_FIELD_NAME, INT_FIELD_NAME),
146+
Strings.format("%s.%s.%s", NESTED_FIELD_NAME, NESTED_FIELD_NAME, TEXT_FIELD_NAME),
147+
Strings.format("%s.%s.%s", NESTED_FIELD_NAME, NESTED_FIELD_NAME, KEYWORD_FIELD_NAME),
148+
Strings.format("%s.%s.%s", NESTED_FIELD_NAME, NESTED_FIELD_NAME, INT_FIELD_NAME)
149+
)
97150
).toList();
98151
}
99152

x-pack/plugin/kql/src/test/resources/supported-queries

Lines changed: 86 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -23,54 +23,54 @@ f*oo
2323
*:"foo bar"
2424

2525
// Querying a field
26-
foo_field:200
27-
foo_field:foo
28-
foo_field:foo bar
29-
foo_field:(foo bar)
30-
foo_field:foo*
31-
foo_field: f*oo
32-
foo_field: *foo
33-
foo_field:"foo bar"
34-
foo_field.subfield:foo
35-
foo_*_field:foo
36-
foo_field:*
37-
foo_*:*
26+
mapped_int:200
27+
mapped_string_2:foo
28+
mapped_string:foo bar
29+
mapped_string:(foo bar)
30+
mapped_string:foo*
31+
mapped_string_2: f*oo
32+
mapped_string: *foo
33+
mapped_string:"foo bar"
34+
mapped_object.subfield:foo
35+
mapped_str*:foo
36+
mapped_string:*
37+
mapped_str_*:*
3838

3939
// Range queries
40-
foo_field<200
41-
foo_field<foo
42-
foo_field<"foo bar"
43-
foo_field>=200
44-
foo_field>=foo
45-
foo_field>"foo bar"
46-
foo_field<=foo
47-
foo_field>=foo
40+
mapped_int<200
41+
mapped_string_2<foo
42+
mapped_string<"foo bar"
43+
mapped_double>=200
44+
mapped_string_alias>=foo
45+
mapped_string>"foo bar"
46+
mapped_string<=foo
47+
mapped_string_2>=foo
4848

4949
// Boolean queries
5050
NOT foo
5151
NOT foo bar
52-
NOT foo_field:foo
53-
NOT foo_field<foo
54-
foo_field:foo AND foo_field:foo bar
55-
foo_field<foo AND foo_field>bar
56-
(foo_field:foo) AND (foo_field:foo bar)
57-
foo_field:foo OR foo_field:foo bar
58-
NOT(foo_field:foo OR foo_field:foo bar)
59-
NOT(foo_field:foo AND foo_field:foo bar)
60-
NOT foo_field:foo AND NOT foo_field:foo bar
61-
(NOT foo_field:foo) AND (NOT foo_field:foo bar)
62-
NOT(foo_field:foo) AND NOT(foo_field:foo bar)
63-
foo_field:foo AND foo_field:foo bar AND foo bar
64-
foo_field:foo AND foo_field:foo bar OR foo bar
65-
foo_field:foo OR foo_field:foo bar OR foo bar
66-
foo_field:foo OR foo_field:foo bar AND foo bar
67-
foo_field:foo AND (foo_field:foo bar OR foo bar)
68-
foo_field:foo AND (foo_field:foo bar OR foo bar)
69-
foo_field:foo OR (foo_field:foo bar OR foo bar)
52+
NOT mapped_string:foo
53+
NOT mapped_string_2<foo
54+
mapped_string:foo AND mapped_string_2:foo bar
55+
mapped_string<foo AND mapped_string>bar
56+
(mapped_string:foo) AND (mapped_string:foo bar)
57+
mapped_string:foo OR mapped_string_2:foo bar
58+
NOT(mapped_string:foo OR mapped_string:foo bar)
59+
NOT(mapped_string:foo AND mapped_string:foo bar)
60+
NOT mapped_string:foo AND NOT mapped_string_2:foo bar
61+
(NOT mapped_string_alias:foo) AND (NOT mapped_string:foo bar)
62+
NOT(mapped_string:foo) AND NOT(mapped_string:foo bar)
63+
mapped_string:foo AND mapped_string_2:foo bar AND foo bar
64+
mapped_string:foo AND mapped_string_2:foo bar OR foo bar
65+
mapped_string:foo OR mapped_string_2:foo bar OR foo bar
66+
mapped_string:foo OR mapped_string:foo bar AND foo bar
67+
mapped_string:foo AND (mapped_string_2:foo bar OR foo bar)
68+
mapped_string:foo AND (mapped_string_2:foo bar OR foo bar)
69+
mapped_string:foo OR (mapped_string_2:foo bar OR foo bar)
7070

71-
foo:AND
72-
foo:OR
73-
foo:NOT
71+
mapped_string:AND
72+
mapped_string:OR
73+
mapped_string:NOT
7474
foo AND
7575
foo OR
7676
foo NOT
@@ -79,43 +79,51 @@ OR foo
7979
NOT
8080

8181
// Nested queries
82-
nested_field: { NOT foo }
83-
nested_field: { NOT foo bar }
84-
nested_field: { NOT foo_field:foo }
85-
nested_field: { foo_field:foo AND foo_field:foo bar }
86-
nested_field: { foo_field<foo AND foo_field>bar }
87-
nested_field: { (foo_field:foo) AND (foo_field:foo bar) }
88-
nested_field: { foo_field:foo OR foo_field:foo bar }
89-
nested_field: { NOT(foo_field:foo OR foo_field:foo bar) }
90-
nested_field: { NOT(foo_field:foo AND foo_field:foo bar) }
91-
nested_field: { NOT foo_field:foo AND NOT foo_field:foo bar }
92-
nested_field: { (NOT foo_field:foo) AND (NOT foo_field:foo bar) }
93-
nested_field: { NOT(foo_field:foo) AND NOT(foo_field:foo bar) }
94-
nested_field: { foo_field:foo AND foo_field:foo bar AND foo bar }
95-
nested_field: { foo_field:foo AND foo_field:foo bar OR foo bar }
96-
nested_field: { foo_field:foo OR foo_field:foo bar OR foo bar }
97-
nested_field: { foo_field:foo OR foo_field:foo bar AND foo bar }
98-
nested_field: { foo_field:foo AND (foo_field:foo bar OR foo bar) }
99-
nested_field: { foo_field:foo AND (foo_field:foo bar OR foo bar) }
100-
nested_field: { foo_field:foo OR (foo_field:foo bar OR foo bar) }
101-
nested_field: { sub_nested_field : { foo_field:foo } AND foo_field:foo bar }
82+
mapped_nested: { NOT foo }
83+
mapped_nested: { NOT foo bar }
84+
mapped_nested: { NOT mapped_string:foo }
85+
mapped_nested: { mapped_string:foo AND mapped_string_2:foo bar }
86+
mapped_nested: { mapped_string<foo AND mapped_int>2 }
87+
mapped_nested: { (mapped_string:foo) AND (mapped_string_2:foo bar) }
88+
mapped_nested: { mapped_string:foo OR mapped_string_2:foo bar }
89+
mapped_nested: { NOT(mapped_string:foo OR mapped_string_2:foo bar) }
90+
mapped_nested: { NOT(mapped_string:foo AND mapped_string_2:foo bar) }
91+
mapped_nested: { NOT mapped_string:foo AND NOT mapped_string_2:foo bar }
92+
mapped_nested: { (NOT mapped_string:foo) AND (NOT mapped_string_2:foo bar) }
93+
mapped_nested: { NOT(mapped_string:foo) AND NOT(mapped_string_2:foo bar) }
94+
mapped_nested: { mapped_string:foo AND mapped_string_2:foo bar AND foo bar }
95+
mapped_nested: { mapped_string:foo AND mapped_string_2:foo bar OR foo bar }
96+
mapped_nested: { mapped_string:foo OR mapped_string_2:foo bar OR foo bar }
97+
mapped_nested: { mapped_string:foo OR mapped_string_2:foo bar AND foo bar }
98+
mapped_nested: { mapped_string:foo AND (mapped_string_2:foo bar OR foo bar) }
99+
mapped_nested: { mapped_string:foo AND (mapped_string_2:foo bar OR foo bar) }
100+
mapped_nested: { mapped_string:foo OR (mapped_string_2:foo bar OR foo bar) }
101+
mapped_nested: { mapped_str*:foo }
102+
mapped_nested: { mapped_nested : { mapped_string:foo AND mapped_int < 3 } AND mapped_string_2:foo bar }
103+
mapped_nested: { mapped_nested.mapped_string:foo AND mapped_string_2:foo bar }
104+
105+
// Inline nested queries
106+
mapped_nested.mapped_string:foo AND mapped_nested.mapped_int < 2
107+
mapped_nested.mapped_nested.mapped_string:foo AND mapped_nested.mapped_int < 2
108+
mapped_nested.mapped_str*: foo
109+
102110

103111
// Queries with escape sequences
104-
foo_field : (foo\(bar\))
105-
foo_field : foo\:bar
106-
foo_field : (foo \\and bar)
107-
foo_field : (foo \\or bar)
108-
foo_field : foo \\not bar
109-
foo_field : foo \{bar\}
110-
foo_field : foo \(bar\)
111-
foo_field : foo \\ bar
112-
foo_field : foo \"bar\"
112+
mapped_string:(foo\(bar\))
113+
mapped_string:foo\:bar
114+
mapped_string:(foo \\and bar)
115+
mapped_string:(foo \\or bar)
116+
mapped_string:foo \\not bar
117+
mapped_string:foo \{bar\}
118+
mapped_string:foo \(bar\)
119+
mapped_string:foo \\ bar
120+
mapped_string:foo \"bar\"
113121

114-
foo_field : "foo and bar"
115-
foo_field : "foo not bar"
116-
foo_field : "foo or bar"
117-
foo_field : "foo : bar"
118-
foo_field : "foo { bar }"
119-
foo_field : "foo (bar)"
120-
foo_field : "foo \\ bar"
121-
foo_field : "foo \"bar\""
122+
mapped_string:"foo and bar"
123+
mapped_string:"foo not bar"
124+
mapped_string:"foo or bar"
125+
mapped_string:"foo : bar"
126+
mapped_string:"foo { bar }"
127+
mapped_string:"foo (bar)"
128+
mapped_string:"foo \\ bar"
129+
mapped_string:"foo \"bar\""
Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
11

22
// Incomplete expressions
3-
foo_field :
4-
foo_field <
5-
foo_field >
6-
foo_field >=
7-
foo_field <=
3+
mapped_string :
4+
mapped_string <
5+
mapped_string >
6+
mapped_string >=
7+
mapped_string <=
88
>= foo
99
: "foo"
1010
: foo
1111

1212
// Parentheses mismatch
13-
foo_field: (foo bar
14-
foo_field: foo bar)
15-
NOT foo_field:foo OR foo_field:foo bar)
16-
NOT (foo_field:foo AND) foo_field:foo bar
13+
mapped_string: (foo bar
14+
mapped_string: foo bar)
15+
NOT mapped_string:foo OR mapped_string_2:foo bar)
16+
NOT (mapped_string:foo AND) mapped_string_2:foo bar
1717

1818
// Quotes mismatch
19-
foo_field: "foo bar
20-
foo_field: foo bar"
19+
mapped_string: "foo bar
20+
mapped_string: foo bar"
2121

2222
// Can't nest grouping terms parentheses
23-
foo_field:(foo (bar))
23+
mapped_string:(foo (bar))
2424

2525
// Bad syntax for nested fields:
26-
nested_field { foo: bar }
26+
mapped_nested { mapped_string: bar }
2727

2828
// Missing escape sequences:
29-
foo_field: foo:bar
30-
foo_field: (foo and bar)
31-
foo_field: (foo or bar)
32-
foo_field: foo not bar
33-
foo_field: foo { bar }
34-
foo_field: foo (bar)
35-
foo_field: foo "bar"
36-
foo_field: "foo "bar""
29+
mapped_string: foo:bar
30+
mapped_string: (foo and bar)
31+
mapped_string: (foo or bar)
32+
mapped_string: foo not bar
33+
mapped_string: foo { bar }
34+
mapped_string: foo (bar)
35+
mapped_string: foo "bar"
36+
mapped_string: "foo "bar""

0 commit comments

Comments
 (0)