Skip to content

Commit a13d521

Browse files
DaveCTurnerkcm
authored andcommitted
Handle pre-6.x time fields (#34373)
In ccb9ab5 we changed how we deal with time fields to support the `DateTime`-format fields added in 6.0, but dropped support for pre-6.x `Long`-format fields. This change reinstates this support for cases where pre-6.x data is made available to ML (e.g. in a mixed-version CCS setup or after an upgrade).
1 parent 7c4df00 commit a13d521

File tree

3 files changed

+43
-7
lines changed

3 files changed

+43
-7
lines changed

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ExtractedField.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public Object[] value(SearchHit hit) {
107107
value[0] = Long.parseLong((String) value[0]);
108108
} else if (value[0] instanceof BaseDateTime) { // script field
109109
value[0] = ((BaseDateTime) value[0]).getMillis();
110-
} else {
110+
} else if (value[0] instanceof Long == false) { // pre-6.0 field
111111
throw new IllegalStateException("Unexpected value for a time field: " + value[0].getClass());
112112
}
113113
return value;

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ExtractedFieldTests.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.Arrays;
1414

1515
import static org.hamcrest.Matchers.equalTo;
16+
import static org.hamcrest.Matchers.startsWith;
1617

1718
public class ExtractedFieldTests extends ESTestCase {
1819

@@ -96,11 +97,32 @@ public void testNewTimeFieldGivenSource() {
9697
}
9798

9899
public void testValueGivenTimeField() {
99-
SearchHit hit = new SearchHitBuilder(42).addField("time", new DateTime(123456789L)).build();
100+
final long millis = randomLong();
101+
final SearchHit hit = new SearchHitBuilder(randomInt()).addField("time", new DateTime(millis)).build();
102+
final ExtractedField timeField = ExtractedField.newTimeField("time", ExtractedField.ExtractionMethod.DOC_VALUE);
103+
assertThat(timeField.value(hit), equalTo(new Object[] { millis }));
104+
}
105+
106+
public void testValueGivenStringTimeField() {
107+
final long millis = randomLong();
108+
final SearchHit hit = new SearchHitBuilder(randomInt()).addField("time", Long.toString(millis)).build();
109+
final ExtractedField timeField = ExtractedField.newTimeField("time", ExtractedField.ExtractionMethod.DOC_VALUE);
110+
assertThat(timeField.value(hit), equalTo(new Object[] { millis }));
111+
}
100112

101-
ExtractedField timeField = ExtractedField.newTimeField("time", ExtractedField.ExtractionMethod.DOC_VALUE);
113+
public void testValueGivenPre6xTimeField() {
114+
// Prior to 6.x, timestamps were simply `long` milliseconds-past-the-epoch values
115+
final long millis = randomLong();
116+
final SearchHit hit = new SearchHitBuilder(randomInt()).addField("time", millis).build();
117+
final ExtractedField timeField = ExtractedField.newTimeField("time", ExtractedField.ExtractionMethod.DOC_VALUE);
118+
assertThat(timeField.value(hit), equalTo(new Object[] { millis }));
119+
}
102120

103-
assertThat(timeField.value(hit), equalTo(new Object[] { 123456789L }));
121+
public void testValueGivenUnknownFormatTimeField() {
122+
final SearchHit hit = new SearchHitBuilder(randomInt()).addField("time", new Object()).build();
123+
final ExtractedField timeField = ExtractedField.newTimeField("time", ExtractedField.ExtractionMethod.DOC_VALUE);
124+
assertThat(expectThrows(IllegalStateException.class, () -> timeField.value(hit)).getMessage(),
125+
startsWith("Unexpected value for a time field"));
104126
}
105127

106128
public void testAliasVersusName() {

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/datafeed/extractor/scroll/ExtractedFieldsTests.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,25 @@ public void testAllTypesOfFields() {
6464
}
6565

6666
public void testTimeFieldValue() {
67-
SearchHit hit = new SearchHitBuilder(1).addField("time", new DateTime(1000L)).build();
67+
final long millis = randomLong();
68+
final SearchHit hit = new SearchHitBuilder(randomInt()).addField("time", new DateTime(millis)).build();
69+
final ExtractedFields extractedFields = new ExtractedFields(timeField, Collections.singletonList(timeField));
70+
assertThat(extractedFields.timeFieldValue(hit), equalTo(millis));
71+
}
6872

69-
ExtractedFields extractedFields = new ExtractedFields(timeField, Arrays.asList(timeField));
73+
public void testStringTimeFieldValue() {
74+
final long millis = randomLong();
75+
final SearchHit hit = new SearchHitBuilder(randomInt()).addField("time", Long.toString(millis)).build();
76+
final ExtractedFields extractedFields = new ExtractedFields(timeField, Collections.singletonList(timeField));
77+
assertThat(extractedFields.timeFieldValue(hit), equalTo(millis));
78+
}
7079

71-
assertThat(extractedFields.timeFieldValue(hit), equalTo(1000L));
80+
public void testPre6xTimeFieldValue() {
81+
// Prior to 6.x, timestamps were simply `long` milliseconds-past-the-epoch values
82+
final long millis = randomLong();
83+
final SearchHit hit = new SearchHitBuilder(randomInt()).addField("time", millis).build();
84+
final ExtractedFields extractedFields = new ExtractedFields(timeField, Collections.singletonList(timeField));
85+
assertThat(extractedFields.timeFieldValue(hit), equalTo(millis));
7286
}
7387

7488
public void testTimeFieldValueGivenEmptyArray() {

0 commit comments

Comments
 (0)