Skip to content

Commit 2dabf4a

Browse files
author
Hendrik Muhs
authored
default to match_all if query is not given (#38865)
add a default "match_all" query to make query support more visible
1 parent 3122884 commit 2dabf4a

File tree

4 files changed

+86
-5
lines changed

4 files changed

+86
-5
lines changed

x-pack/plugin/data-frame/src/main/java/org/elasticsearch/xpack/dataframe/transforms/DataFrameIndexer.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.elasticsearch.action.search.SearchRequest;
1313
import org.elasticsearch.action.search.SearchResponse;
1414
import org.elasticsearch.common.xcontent.XContentBuilder;
15-
import org.elasticsearch.index.query.MatchAllQueryBuilder;
1615
import org.elasticsearch.index.query.QueryBuilder;
1716
import org.elasticsearch.search.aggregations.bucket.composite.CompositeAggregation;
1817
import org.elasticsearch.xpack.core.dataframe.transform.DataFrameIndexerTransformStats;
@@ -46,8 +45,7 @@ public DataFrameIndexer(Executor executor, AtomicReference<IndexerState> initial
4645

4746
@Override
4847
protected void onStartJob(long now) {
49-
QueryConfig queryConfig = getConfig().getQueryConfig();
50-
QueryBuilder queryBuilder = queryConfig != null ? queryConfig.getQuery() : new MatchAllQueryBuilder();
48+
QueryBuilder queryBuilder = getConfig().getQueryConfig().getQuery();
5149

5250
pivot = new Pivot(getConfig().getSource(), queryBuilder, getConfig().getPivotConfig());
5351
}

x-pack/plugin/data-frame/src/main/java/org/elasticsearch/xpack/dataframe/transforms/DataFrameTransformConfig.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717
import org.elasticsearch.common.xcontent.ToXContentObject;
1818
import org.elasticsearch.common.xcontent.XContentBuilder;
1919
import org.elasticsearch.common.xcontent.XContentParser;
20+
import org.elasticsearch.index.query.MatchAllQueryBuilder;
2021
import org.elasticsearch.xpack.core.dataframe.DataFrameField;
2122
import org.elasticsearch.xpack.core.dataframe.DataFrameMessages;
2223
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
2324
import org.elasticsearch.xpack.dataframe.transforms.pivot.PivotConfig;
2425

2526
import java.io.IOException;
27+
import java.util.Collections;
2628
import java.util.Objects;
2729

2830
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
@@ -57,7 +59,16 @@ private static ConstructingObjectParser<DataFrameTransformConfig, String> create
5759
String id = args[0] != null ? (String) args[0] : optionalId;
5860
String source = (String) args[1];
5961
String dest = (String) args[2];
60-
QueryConfig queryConfig = (QueryConfig) args[3];
62+
63+
// default handling: if the user does not specify a query, we default to match_all
64+
QueryConfig queryConfig = null;
65+
if (args[3] == null) {
66+
queryConfig = new QueryConfig(Collections.singletonMap(MatchAllQueryBuilder.NAME, Collections.emptyMap()),
67+
new MatchAllQueryBuilder());
68+
} else {
69+
queryConfig = (QueryConfig) args[3];
70+
}
71+
6172
PivotConfig pivotConfig = (PivotConfig) args[4];
6273
return new DataFrameTransformConfig(id, source, dest, queryConfig, pivotConfig);
6374
});
@@ -83,7 +94,7 @@ public DataFrameTransformConfig(final String id,
8394
this.id = ExceptionsHelper.requireNonNull(id, DataFrameField.ID.getPreferredName());
8495
this.source = ExceptionsHelper.requireNonNull(source, SOURCE.getPreferredName());
8596
this.dest = ExceptionsHelper.requireNonNull(dest, DESTINATION.getPreferredName());
86-
this.queryConfig = queryConfig;
97+
this.queryConfig = ExceptionsHelper.requireNonNull(queryConfig, QUERY.getPreferredName());
8798
this.pivotConfig = pivotConfig;
8899

89100
// at least one function must be defined

x-pack/plugin/data-frame/src/test/java/org/elasticsearch/xpack/dataframe/transforms/DataFrameTransformConfigTests.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,21 @@
66

77
package org.elasticsearch.xpack.dataframe.transforms;
88

9+
import org.elasticsearch.common.Strings;
910
import org.elasticsearch.common.io.stream.Writeable.Reader;
11+
import org.elasticsearch.common.xcontent.DeprecationHandler;
12+
import org.elasticsearch.common.xcontent.ToXContent;
13+
import org.elasticsearch.common.xcontent.XContentBuilder;
14+
import org.elasticsearch.common.xcontent.XContentFactory;
1015
import org.elasticsearch.common.xcontent.XContentParser;
16+
import org.elasticsearch.common.xcontent.XContentType;
1117
import org.elasticsearch.xpack.dataframe.transforms.pivot.PivotConfigTests;
1218
import org.junit.Before;
1319

1420
import java.io.IOException;
1521

22+
import static org.elasticsearch.test.TestMatchers.matchesPattern;
23+
1624
public class DataFrameTransformConfigTests extends AbstractSerializingDataFrameTestCase<DataFrameTransformConfig> {
1725

1826
private String transformId;
@@ -54,4 +62,38 @@ protected DataFrameTransformConfig createTestInstance() {
5462
protected Reader<DataFrameTransformConfig> instanceReader() {
5563
return DataFrameTransformConfig::new;
5664
}
65+
66+
public void testDefaultMatchAll( ) throws IOException {
67+
String pivotTransform = "{"
68+
+ " \"source\" : \"src\","
69+
+ " \"dest\" : \"dest\","
70+
+ " \"pivot\" : {"
71+
+ " \"group_by\": [ {"
72+
+ " \"id\": {"
73+
+ " \"terms\": {"
74+
+ " \"field\": \"id\""
75+
+ "} } } ],"
76+
+ " \"aggs\": {"
77+
+ " \"avg\": {"
78+
+ " \"avg\": {"
79+
+ " \"field\": \"points\""
80+
+ "} } } } }";
81+
82+
DataFrameTransformConfig dataFrameTransformConfig = createDataFrameTransformConfigFromString(pivotTransform, "test_match_all");
83+
assertNotNull(dataFrameTransformConfig.getQueryConfig());
84+
assertTrue(dataFrameTransformConfig.getQueryConfig().isValid());
85+
86+
try (XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()) {
87+
XContentBuilder content = dataFrameTransformConfig.toXContent(xContentBuilder, ToXContent.EMPTY_PARAMS);
88+
String pivotTransformWithIdAndDefaults = Strings.toString(content);
89+
90+
assertThat(pivotTransformWithIdAndDefaults, matchesPattern(".*\"match_all\"\\s*:\\s*\\{\\}.*"));
91+
}
92+
}
93+
94+
private DataFrameTransformConfig createDataFrameTransformConfigFromString(String json, String id) throws IOException {
95+
final XContentParser parser = XContentType.JSON.xContent().createParser(xContentRegistry(),
96+
DeprecationHandler.THROW_UNSUPPORTED_OPERATION, json);
97+
return DataFrameTransformConfig.fromXContent(parser, id, false);
98+
}
5799
}

x-pack/plugin/data-frame/src/test/java/org/elasticsearch/xpack/dataframe/transforms/QueryConfigTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,36 @@ public void testFailOnStrictPassOnLenient() throws IOException {
101101
}
102102
}
103103

104+
public void testFailOnEmptyQuery() throws IOException {
105+
String source = "";
106+
107+
// lenient, passes but reports invalid
108+
try (XContentParser parser = createParser(JsonXContent.jsonXContent, source)) {
109+
QueryConfig query = QueryConfig.fromXContent(parser, true);
110+
assertFalse(query.isValid());
111+
}
112+
113+
// strict throws
114+
try (XContentParser parser = createParser(JsonXContent.jsonXContent, source)) {
115+
expectThrows(IllegalArgumentException.class, () -> QueryConfig.fromXContent(parser, false));
116+
}
117+
}
118+
119+
public void testFailOnEmptyQueryClause() throws IOException {
120+
String source = "{}";
121+
122+
// lenient, passes but reports invalid
123+
try (XContentParser parser = createParser(JsonXContent.jsonXContent, source)) {
124+
QueryConfig query = QueryConfig.fromXContent(parser, true);
125+
assertFalse(query.isValid());
126+
}
127+
128+
// strict throws
129+
try (XContentParser parser = createParser(JsonXContent.jsonXContent, source)) {
130+
expectThrows(IllegalArgumentException.class, () -> QueryConfig.fromXContent(parser, false));
131+
}
132+
}
133+
104134
public void testDeprecation() throws IOException {
105135
String source = "{\"" + MockDeprecatedQueryBuilder.NAME + "\" : {}}";
106136
try (XContentParser parser = createParser(JsonXContent.jsonXContent, source)) {

0 commit comments

Comments
 (0)