Skip to content

Commit a7ee93c

Browse files
committed
Split up fields into different field types for Painless Fields API (#77732)
This change refactors the inner fields classes and inner converter classes into field class split by type for the Painless Fields API. Each field class now contains the following: * it's own members * a converter that converts from other types of fields to its own type of field * conversion helper methods to go from its own type of field to other types of fields * conversion helper methods to go from its own type to other types
1 parent baf6606 commit a7ee93c

File tree

20 files changed

+542
-496
lines changed

20 files changed

+542
-496
lines changed

modules/lang-painless/src/main/resources/org/elasticsearch/painless/org.elasticsearch.script.fields.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
# API
1212
class org.elasticsearch.script.field.Field {
13-
org.elasticsearch.script.field.Converter BigInteger
14-
org.elasticsearch.script.field.Converter Long
13+
org.elasticsearch.script.field.Converter BigInteger @augmented[augmented_canonical_class_name="org.elasticsearch.script.field.BigIntegerField"]
14+
org.elasticsearch.script.field.Converter Long @augmented[augmented_canonical_class_name="org.elasticsearch.script.field.LongField"]
1515
String getName()
1616
boolean isEmpty()
1717
List getValues()

server/src/main/java/org/elasticsearch/index/fielddata/ScriptDocValues.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.elasticsearch.geometry.utils.Geohash;
2020
import org.elasticsearch.script.field.BooleanField;
2121
import org.elasticsearch.script.field.BytesRefField;
22-
import org.elasticsearch.script.field.Converters;
2322
import org.elasticsearch.script.field.DateMillisField;
2423
import org.elasticsearch.script.field.DateNanosField;
2524
import org.elasticsearch.script.field.DoubleField;
@@ -249,9 +248,9 @@ void refreshArray() throws IOException {
249248
public long getLongValue() {
250249
throwIfEmpty();
251250
if (isNanos) {
252-
return Converters.convertDateNanosToLong(dates[0]);
251+
return DateNanosField.toLong(dates[0]);
253252
}
254-
return Converters.convertDateMillisToLong(dates[0]);
253+
return DateMillisField.toLong(dates[0]);
255254
}
256255

257256
@Override
@@ -594,13 +593,13 @@ private static boolean[] grow(boolean[] array, int minSize) {
594593
@Override
595594
public long getLongValue() {
596595
throwIfEmpty();
597-
return Converters.convertBooleanToLong(values[0]);
596+
return BooleanField.toLong(values[0]);
598597
}
599598

600599
@Override
601600
public double getDoubleValue() {
602601
throwIfEmpty();
603-
return Converters.convertBooleanToDouble(values[0]);
602+
return BooleanField.toDouble(values[0]);
604603
}
605604

606605
@Override
@@ -682,12 +681,12 @@ public final String getValue() {
682681

683682
@Override
684683
public long getLongValue() {
685-
return Converters.convertStringToLong(get(0));
684+
return StringField.toLong(get(0));
686685
}
687686

688687
@Override
689688
public double getDoubleValue() {
690-
return Converters.convertStringToDouble(get(0));
689+
return StringField.toDouble(get(0));
691690
}
692691

693692
@Override

server/src/main/java/org/elasticsearch/script/field/BigIntegerField.java

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,102 @@
99
package org.elasticsearch.script.field;
1010

1111
import java.math.BigInteger;
12+
import java.util.List;
13+
import java.util.stream.Collectors;
1214

1315
public class BigIntegerField extends Field<java.math.BigInteger> {
1416

17+
/* ---- Conversion Class From Other Fields ----*/
18+
19+
/**
20+
* Convert to a {@link BigIntegerField} from Long, Double or String Fields.
21+
* Longs and Doubles are wrapped as BigIntegers.
22+
* Strings are parsed as either Longs or Doubles and wrapped in a BigInteger.
23+
*/
24+
public static final Converter<BigInteger, BigIntegerField> BigInteger;
25+
26+
static {
27+
BigInteger = new Converter<BigInteger, BigIntegerField>() {
28+
@Override
29+
public BigIntegerField convert(Field<?> sourceField) {
30+
if (sourceField instanceof LongField) {
31+
return LongField.toBigIntegerField((LongField) sourceField);
32+
}
33+
34+
if (sourceField instanceof DoubleField) {
35+
return DoubleField.toBigIntegerField((DoubleField) sourceField);
36+
}
37+
38+
if (sourceField instanceof StringField) {
39+
return StringField.toBigIntegerField((StringField) sourceField);
40+
}
41+
42+
if (sourceField instanceof DateMillisField) {
43+
return LongField.toBigIntegerField(DateMillisField.toLongField((DateMillisField) sourceField));
44+
}
45+
46+
if (sourceField instanceof DateNanosField) {
47+
return LongField.toBigIntegerField(DateNanosField.toLongField((DateNanosField) sourceField));
48+
}
49+
50+
if (sourceField instanceof BooleanField) {
51+
return LongField.toBigIntegerField(BooleanField.toLongField((BooleanField) sourceField));
52+
}
53+
54+
throw new InvalidConversion(sourceField.getClass(), getFieldClass());
55+
}
56+
57+
@Override
58+
public Class<BigIntegerField> getFieldClass() {
59+
return BigIntegerField.class;
60+
}
61+
62+
@Override
63+
public Class<BigInteger> getTargetClass() {
64+
return BigInteger.class;
65+
}
66+
};
67+
}
68+
69+
/* ---- Conversion Helpers To Other Fields ---- */
70+
71+
public static LongField toLongField(BigIntegerField sourceField) {
72+
FieldValues<BigInteger> fv = sourceField.getFieldValues();
73+
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, BigInteger>(fv) {
74+
@Override
75+
public List<Long> getValues() {
76+
return values.getValues().stream().map(BigIntegerField::toLong).collect(Collectors.toList());
77+
}
78+
79+
@Override
80+
public Long getNonPrimitiveValue() {
81+
return toLong(values.getNonPrimitiveValue());
82+
}
83+
84+
@Override
85+
public long getLongValue() {
86+
return toLong(values.getNonPrimitiveValue());
87+
}
88+
89+
@Override
90+
public double getDoubleValue() {
91+
return toDouble(values.getNonPrimitiveValue());
92+
}
93+
});
94+
}
95+
96+
/* ---- Conversion Helpers To Other Types ---- */
97+
98+
public static long toLong(BigInteger bigInteger) {
99+
return bigInteger.longValue();
100+
}
101+
102+
public static double toDouble(BigInteger bigInteger) {
103+
return bigInteger.doubleValue();
104+
}
105+
106+
/* ---- Big Integer Field Members ---- */
107+
15108
public BigIntegerField(String name, FieldValues<BigInteger> values) {
16109
super(name, values);
17110
}

server/src/main/java/org/elasticsearch/script/field/BooleanField.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,50 @@
88

99
package org.elasticsearch.script.field;
1010

11+
import java.util.List;
12+
import java.util.stream.Collectors;
13+
1114
public class BooleanField extends Field<Boolean> {
1215

16+
/* ---- Conversion Helpers To Other Fields ---- */
17+
18+
public static LongField toLongField(BooleanField sourceField) {
19+
FieldValues<Boolean> fv = sourceField.getFieldValues();
20+
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, Boolean>(fv) {
21+
@Override
22+
public List<Long> getValues() {
23+
return values.getValues().stream().map(bool -> bool ? 1L : 0L).collect(Collectors.toList());
24+
}
25+
26+
@Override
27+
public Long getNonPrimitiveValue() {
28+
return toLong(values.getNonPrimitiveValue());
29+
}
30+
31+
@Override
32+
public long getLongValue() {
33+
return toLong(values.getNonPrimitiveValue());
34+
}
35+
36+
@Override
37+
public double getDoubleValue() {
38+
return toLong(values.getNonPrimitiveValue());
39+
}
40+
});
41+
}
42+
43+
/* ---- Conversion Helpers To Other Types ---- */
44+
45+
public static long toLong(boolean bool) {
46+
return bool ? 1L : 0L;
47+
}
48+
49+
public static double toDouble(boolean bool) {
50+
return bool ? 1.0d : 0.0d;
51+
}
52+
53+
/* ---- Boolean Field Members ---- */
54+
1355
public BooleanField(String name, FieldValues<Boolean> values) {
1456
super(name, values);
1557
}

server/src/main/java/org/elasticsearch/script/field/BytesRefField.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
public class BytesRefField extends Field<BytesRef> {
1414

15+
/* ---- Bytes Ref Field Members ---- */
16+
1517
public BytesRefField(String name, FieldValues<BytesRef> values) {
1618
super(name, values);
1719
}

0 commit comments

Comments
 (0)