Skip to content

Commit ccb9ab5

Browse files
Fix time field extraction after upstream change (elastic#873)
Elasticsearch changed doc_values of date fields to return a joda DateTime object. Thus, we need to call getMillis() to extract the epoch millis value. Original commit: elastic/x-pack-elasticsearch@b992882af525e1043f5a7858dd9f07934a0649d2
1 parent 0b71e01 commit ccb9ab5

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed

elasticsearch/src/main/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ExtractedField.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import org.elasticsearch.search.SearchHit;
99
import org.elasticsearch.search.SearchHitField;
10+
import org.joda.time.base.BaseDateTime;
1011

1112
import java.util.List;
1213
import java.util.Map;
@@ -36,6 +37,13 @@ public ExtractionMethod getExtractionMethod() {
3637

3738
public abstract Object[] value(SearchHit hit);
3839

40+
public static ExtractedField newTimeField(String name, ExtractionMethod extractionMethod) {
41+
if (extractionMethod == ExtractionMethod.SOURCE) {
42+
throw new IllegalArgumentException("time field cannot be extracted from source");
43+
}
44+
return new TimeField(name, extractionMethod);
45+
}
46+
3947
public static ExtractedField newField(String name, ExtractionMethod extractionMethod) {
4048
switch (extractionMethod) {
4149
case DOC_VALUE:
@@ -65,6 +73,23 @@ public Object[] value(SearchHit hit) {
6573
}
6674
}
6775

76+
private static class TimeField extends FromFields {
77+
78+
TimeField(String name, ExtractionMethod extractionMethod) {
79+
super(name, extractionMethod);
80+
}
81+
82+
@Override
83+
public Object[] value(SearchHit hit) {
84+
Object[] value = super.value(hit);
85+
if (value.length != 1) {
86+
return value;
87+
}
88+
value[0] = ((BaseDateTime) value[0]).getMillis();
89+
return value;
90+
}
91+
}
92+
6893
private static class FromSource extends ExtractedField {
6994

7095
private String[] namePath;

elasticsearch/src/main/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ExtractedFields.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public Long timeFieldValue(SearchHit hit) {
7171
public static ExtractedFields build(Job job, DatafeedConfig datafeedConfig) {
7272
Set<String> scriptFields = datafeedConfig.getScriptFields().stream().map(sf -> sf.fieldName()).collect(Collectors.toSet());
7373
String timeField = job.getDataDescription().getTimeField();
74-
ExtractedField timeExtractedField = ExtractedField.newField(timeField, scriptFields.contains(timeField) ?
74+
ExtractedField timeExtractedField = ExtractedField.newTimeField(timeField, scriptFields.contains(timeField) ?
7575
ExtractedField.ExtractionMethod.SCRIPT_FIELD : ExtractedField.ExtractionMethod.DOC_VALUE);
7676
List<String> remainingFields = job.allFields().stream().filter(f -> !f.equals(timeField)).collect(Collectors.toList());
7777
List<ExtractedField> allExtractedFields = new ArrayList<>(remainingFields.size());

elasticsearch/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ExtractedFieldTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.elasticsearch.search.internal.InternalSearchHit;
1212
import org.elasticsearch.search.internal.InternalSearchHitField;
1313
import org.elasticsearch.test.ESTestCase;
14+
import org.joda.time.DateTime;
1415

1516
import java.util.Arrays;
1617
import java.util.HashMap;
@@ -96,6 +97,18 @@ public void testValueGivenEmptyHit() {
9697
assertThat(sourceField.value(hit), equalTo(new Object[0]));
9798
}
9899

100+
public void testNewTimeFieldGivenSource() {
101+
expectThrows(IllegalArgumentException.class, () -> ExtractedField.newTimeField("time", ExtractedField.ExtractionMethod.SOURCE));
102+
}
103+
104+
public void testValueGivenTimeField() {
105+
SearchHit hit = new SearchHitBuilder(42).addField("time", new DateTime(123456789L)).build();
106+
107+
ExtractedField timeField = ExtractedField.newTimeField("time", ExtractedField.ExtractionMethod.DOC_VALUE);
108+
109+
assertThat(timeField.value(hit), equalTo(new Object[] { 123456789L }));
110+
}
111+
99112
static class SearchHitBuilder {
100113

101114
private final InternalSearchHit hit;

elasticsearch/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ExtractedFieldsTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import org.elasticsearch.search.SearchHit;
99
import org.elasticsearch.test.ESTestCase;
10+
import org.joda.time.DateTime;
1011

1112
import java.util.Arrays;
1213
import java.util.Collections;
@@ -15,7 +16,7 @@
1516

1617
public class ExtractedFieldsTests extends ESTestCase {
1718

18-
private ExtractedField timeField = ExtractedField.newField("time", ExtractedField.ExtractionMethod.DOC_VALUE);
19+
private ExtractedField timeField = ExtractedField.newTimeField("time", ExtractedField.ExtractionMethod.DOC_VALUE);
1920

2021
public void testInvalidConstruction() {
2122
expectThrows(IllegalArgumentException.class, () -> new ExtractedFields(timeField, Collections.emptyList()));
@@ -47,7 +48,7 @@ public void testAllTypesOfFields() {
4748
}
4849

4950
public void testTimeFieldValue() {
50-
SearchHit hit = new ExtractedFieldTests.SearchHitBuilder(1).addField("time", 1000L).build();
51+
SearchHit hit = new ExtractedFieldTests.SearchHitBuilder(1).addField("time", new DateTime(1000L)).build();
5152

5253
ExtractedFields extractedFields = new ExtractedFields(timeField, Arrays.asList(timeField));
5354

0 commit comments

Comments
 (0)