Skip to content

Commit cd6492f

Browse files
author
Hendrik Muhs
committed
[Transform] fix regression of date histogram optimization (#60591)
fixes mix up of input and output field name for date histogram optimization. minimal fix, more tests to be added with #60469 fixes #60590
1 parent bffe824 commit cd6492f

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/transforms/pivot/CompositeBucketsChangeCollector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ static Map<String, FieldCollector> createFieldCollectors(Map<String, SingleGroup
565565
entry.getKey(),
566566
entry.getValue().getMissingBucket(),
567567
((DateHistogramGroupSource) entry.getValue()).getRounding(),
568-
entry.getKey().equals(synchronizationField)
568+
entry.getValue().getField().equals(synchronizationField)
569569
)
570570
);
571571
break;

x-pack/plugin/transform/src/test/java/org/elasticsearch/xpack/transform/transforms/pivot/CompositeBucketsChangeCollectorTests.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
import org.elasticsearch.common.xcontent.XContentBuilder;
1616
import org.elasticsearch.common.xcontent.XContentParser;
1717
import org.elasticsearch.index.query.QueryBuilder;
18+
import org.elasticsearch.index.query.RangeQueryBuilder;
1819
import org.elasticsearch.index.query.TermsQueryBuilder;
1920
import org.elasticsearch.search.aggregations.Aggregations;
2021
import org.elasticsearch.search.aggregations.bucket.composite.CompositeAggregation;
2122
import org.elasticsearch.search.aggregations.bucket.composite.CompositeAggregationBuilder;
23+
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
2224
import org.elasticsearch.search.builder.SearchSourceBuilder;
2325
import org.elasticsearch.test.ESTestCase;
26+
import org.elasticsearch.xpack.core.transform.transforms.pivot.DateHistogramGroupSource;
2427
import org.elasticsearch.xpack.core.transform.transforms.pivot.GeoTileGroupSourceTests;
2528
import org.elasticsearch.xpack.core.transform.transforms.pivot.GroupConfig;
2629
import org.elasticsearch.xpack.core.transform.transforms.pivot.GroupConfigTests;
@@ -43,6 +46,7 @@
4346
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
4447
import static org.hamcrest.CoreMatchers.instanceOf;
4548
import static org.hamcrest.Matchers.containsInAnyOrder;
49+
import static org.hamcrest.Matchers.equalTo;
4650
import static org.mockito.Mockito.mock;
4751
import static org.mockito.Mockito.when;
4852

@@ -138,6 +142,60 @@ public void testTermsFieldCollector() throws IOException {
138142
assertThat(((TermsQueryBuilder) queryBuilder).values(), containsInAnyOrder("id1", "id2", "id3"));
139143
}
140144

145+
public void testDateHistogramFieldCollector() throws IOException {
146+
Map<String, SingleGroupSource> groups = new LinkedHashMap<>();
147+
148+
SingleGroupSource groupBy = new DateHistogramGroupSource(
149+
"timestamp",
150+
null,
151+
false,
152+
new DateHistogramGroupSource.FixedInterval(DateHistogramInterval.MINUTE),
153+
null
154+
);
155+
groups.put("output_timestamp", groupBy);
156+
157+
ChangeCollector collector = CompositeBucketsChangeCollector.buildChangeCollector(
158+
getCompositeAggregation(groups),
159+
groups,
160+
"timestamp"
161+
);
162+
163+
QueryBuilder queryBuilder = collector.buildFilterQuery(66_666, 200_222);
164+
assertNotNull(queryBuilder);
165+
assertThat(queryBuilder, instanceOf(RangeQueryBuilder.class));
166+
// rounded down
167+
assertThat(((RangeQueryBuilder) queryBuilder).from(), equalTo(Long.valueOf(60_000)));
168+
assertTrue(((RangeQueryBuilder) queryBuilder).includeLower());
169+
assertThat(((RangeQueryBuilder) queryBuilder).fieldName(), equalTo("timestamp"));
170+
171+
// timestamp field does not match
172+
collector = CompositeBucketsChangeCollector.buildChangeCollector(getCompositeAggregation(groups), groups, "sync_timestamp");
173+
174+
queryBuilder = collector.buildFilterQuery(66_666, 200_222);
175+
assertNull(queryBuilder);
176+
177+
// field does not match, but output field equals sync field
178+
collector = CompositeBucketsChangeCollector.buildChangeCollector(getCompositeAggregation(groups), groups, "output_timestamp");
179+
180+
queryBuilder = collector.buildFilterQuery(66_666, 200_222);
181+
assertNull(queryBuilder);
182+
183+
// missing bucket disables optimization
184+
groupBy = new DateHistogramGroupSource(
185+
"timestamp",
186+
null,
187+
true,
188+
new DateHistogramGroupSource.FixedInterval(DateHistogramInterval.MINUTE),
189+
null
190+
);
191+
groups.put("output_timestamp", groupBy);
192+
193+
collector = CompositeBucketsChangeCollector.buildChangeCollector(getCompositeAggregation(groups), groups, "timestamp");
194+
195+
queryBuilder = collector.buildFilterQuery(66_666, 200_222);
196+
assertNull(queryBuilder);
197+
}
198+
141199
private static CompositeAggregationBuilder getCompositeAggregation(Map<String, SingleGroupSource> groups) throws IOException {
142200
CompositeAggregationBuilder compositeAggregation;
143201
try (XContentBuilder builder = jsonBuilder()) {

0 commit comments

Comments
 (0)