Skip to content

Commit 0660cf7

Browse files
lktsomricohenn
authored andcommitted
Use FallbackSyntheticSourceBlockLoader for shape and geo_shape (elastic#124927)
1 parent 658b548 commit 0660cf7

File tree

59 files changed

+952
-95
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+952
-95
lines changed

docs/changelog/124927.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 124927
2+
summary: Use `FallbackSyntheticSourceBlockLoader` for `shape` and `geo_shape`
3+
area: Mapping
4+
type: enhancement
5+
issues: []

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ public Builder builder(BlockFactory factory, int expectedCount) {
343343
private FallbackSyntheticSourceBlockLoader.Reader<?> fallbackSyntheticSourceBlockLoaderReader() {
344344
var nullValueAdjusted = nullValue != null ? adjustSourceValue(nullValue, scalingFactor) : null;
345345

346-
return new FallbackSyntheticSourceBlockLoader.ReaderWithNullValueSupport<Double>(nullValue) {
346+
return new FallbackSyntheticSourceBlockLoader.SingleValueReader<Double>(nullValue) {
347347
@Override
348348
public void convertValue(Object value, List<Double> accumulator) {
349349
if (coerce && value.equals("")) {

server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
package org.elasticsearch.index.mapper;
1010

1111
import org.apache.lucene.search.Query;
12+
import org.apache.lucene.util.BytesRef;
1213
import org.elasticsearch.common.CheckedBiConsumer;
1314
import org.elasticsearch.common.Explicit;
1415
import org.elasticsearch.common.geo.GeometryFormatterFactory;
@@ -67,12 +68,16 @@ public abstract void parse(XContentParser parser, CheckedConsumer<T, IOException
6768

6869
private void fetchFromSource(Object sourceMap, Consumer<T> consumer) {
6970
try (XContentParser parser = wrapObject(sourceMap)) {
70-
parse(parser, v -> consumer.accept(normalizeFromSource(v)), NoopMalformedValueHandler.INSTANCE);
71+
parseFromSource(parser, consumer);
7172
} catch (IOException e) {
7273
throw new UncheckedIOException(e);
7374
}
7475
}
7576

77+
private void parseFromSource(XContentParser parser, Consumer<T> consumer) throws IOException {
78+
parse(parser, v -> consumer.accept(normalizeFromSource(v)), NoopMalformedValueHandler.INSTANCE);
79+
}
80+
7681
/**
7782
* Normalize a geometry when reading from source. When reading from source we can skip
7883
* some expensive steps as the geometry has already been indexed.
@@ -187,6 +192,80 @@ protected BlockLoader blockLoaderFromSource(BlockLoaderContext blContext) {
187192
}
188193

189194
protected abstract Object nullValueAsSource(T nullValue);
195+
196+
protected BlockLoader blockLoaderFromFallbackSyntheticSource(BlockLoaderContext blContext) {
197+
return new FallbackSyntheticSourceBlockLoader(new GeometriesFallbackSyntheticSourceReader(), name()) {
198+
@Override
199+
public Builder builder(BlockFactory factory, int expectedCount) {
200+
return factory.bytesRefs(expectedCount);
201+
}
202+
};
203+
}
204+
205+
private class GeometriesFallbackSyntheticSourceReader implements FallbackSyntheticSourceBlockLoader.Reader<BytesRef> {
206+
private final Function<List<T>, List<Object>> formatter;
207+
208+
private GeometriesFallbackSyntheticSourceReader() {
209+
this.formatter = getFormatter(GeometryFormatterFactory.WKB);
210+
}
211+
212+
@Override
213+
public void convertValue(Object value, List<BytesRef> accumulator) {
214+
final List<T> values = new ArrayList<>();
215+
216+
geometryParser.fetchFromSource(value, v -> {
217+
if (v != null) {
218+
values.add(v);
219+
} else if (nullValue != null) {
220+
values.add(nullValue);
221+
}
222+
});
223+
var formatted = formatter.apply(values);
224+
225+
for (var formattedValue : formatted) {
226+
if (formattedValue instanceof byte[] wkb) {
227+
accumulator.add(new BytesRef(wkb));
228+
} else {
229+
throw new IllegalArgumentException(
230+
"Unsupported source type for spatial geometry: " + formattedValue.getClass().getSimpleName()
231+
);
232+
}
233+
}
234+
}
235+
236+
@Override
237+
public void parse(XContentParser parser, List<BytesRef> accumulator) throws IOException {
238+
final List<T> values = new ArrayList<>();
239+
240+
geometryParser.parseFromSource(parser, v -> {
241+
if (v != null) {
242+
values.add(v);
243+
} else if (nullValue != null) {
244+
values.add(nullValue);
245+
}
246+
});
247+
var formatted = formatter.apply(values);
248+
249+
for (var formattedValue : formatted) {
250+
if (formattedValue instanceof byte[] wkb) {
251+
accumulator.add(new BytesRef(wkb));
252+
} else {
253+
throw new IllegalArgumentException(
254+
"Unsupported source type for spatial geometry: " + formattedValue.getClass().getSimpleName()
255+
);
256+
}
257+
}
258+
}
259+
260+
@Override
261+
public void writeToBlock(List<BytesRef> values, BlockLoader.Builder blockBuilder) {
262+
var bytesRefBuilder = (BlockLoader.BytesRefBuilder) blockBuilder;
263+
264+
for (var value : values) {
265+
bytesRefBuilder.appendBytesRef(value);
266+
}
267+
}
268+
}
190269
}
191270

192271
private final Explicit<Boolean> ignoreMalformed;

server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ public Builder builder(BlockFactory factory, int expectedCount) {
331331
}
332332

333333
private FallbackSyntheticSourceBlockLoader.Reader<?> fallbackSyntheticSourceBlockLoaderReader() {
334-
return new FallbackSyntheticSourceBlockLoader.ReaderWithNullValueSupport<Boolean>(nullValue) {
334+
return new FallbackSyntheticSourceBlockLoader.SingleValueReader<Boolean>(nullValue) {
335335
@Override
336336
public void convertValue(Object value, List<Boolean> accumulator) {
337337
try {
@@ -360,10 +360,10 @@ protected void parseNonNullValue(XContentParser parser, List<Boolean> accumulato
360360

361361
@Override
362362
public void writeToBlock(List<Boolean> values, BlockLoader.Builder blockBuilder) {
363-
var longBuilder = (BlockLoader.BooleanBuilder) blockBuilder;
363+
var booleanBuilder = (BlockLoader.BooleanBuilder) blockBuilder;
364364

365365
for (var value : values) {
366-
longBuilder.appendBoolean(value);
366+
booleanBuilder.appendBoolean(value);
367367
}
368368
}
369369
};

server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -963,7 +963,7 @@ public Builder builder(BlockFactory factory, int expectedCount) {
963963
private FallbackSyntheticSourceBlockLoader.Reader<?> fallbackSyntheticSourceBlockLoaderReader() {
964964
Function<String, Long> dateParser = this::parse;
965965

966-
return new FallbackSyntheticSourceBlockLoader.ReaderWithNullValueSupport<Long>(nullValue) {
966+
return new FallbackSyntheticSourceBlockLoader.SingleValueReader<Long>(nullValue) {
967967
@Override
968968
public void convertValue(Object value, List<Long> accumulator) {
969969
try {

server/src/main/java/org/elasticsearch/index/mapper/FallbackSyntheticSourceBlockLoader.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,6 @@ private void parseFieldFromParent(IgnoredSourceFieldMapper.NameValue nameValue,
235235
}
236236

237237
private void parseWithReader(XContentParser parser, List<T> blockValues) throws IOException {
238-
if (parser.currentToken() == XContentParser.Token.START_ARRAY) {
239-
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
240-
reader.parse(parser, blockValues);
241-
}
242-
return;
243-
}
244-
245238
reader.parse(parser, blockValues);
246239
}
247240

@@ -274,10 +267,15 @@ public interface Reader<T> {
274267
void writeToBlock(List<T> values, Builder blockBuilder);
275268
}
276269

277-
public abstract static class ReaderWithNullValueSupport<T> implements Reader<T> {
270+
/**
271+
* Reader for field types that don't parse arrays (arrays are always treated as multiple values)
272+
* as opposed to field types that treat arrays as special cases (for example point).
273+
* @param <T>
274+
*/
275+
public abstract static class SingleValueReader<T> implements Reader<T> {
278276
private final Object nullValue;
279277

280-
public ReaderWithNullValueSupport(Object nullValue) {
278+
public SingleValueReader(Object nullValue) {
281279
this.nullValue = nullValue;
282280
}
283281

@@ -289,6 +287,18 @@ public void parse(XContentParser parser, List<T> accumulator) throws IOException
289287
}
290288
return;
291289
}
290+
if (parser.currentToken() == XContentParser.Token.START_ARRAY) {
291+
while (parser.nextToken() != XContentParser.Token.END_ARRAY) {
292+
if (parser.currentToken() == XContentParser.Token.VALUE_NULL) {
293+
if (nullValue != null) {
294+
convertValue(nullValue, accumulator);
295+
}
296+
} else {
297+
parseNonNullValue(parser, accumulator);
298+
}
299+
}
300+
return;
301+
}
292302

293303
parseNonNullValue(parser, accumulator);
294304
}

server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ public Builder builder(BlockFactory factory, int expectedCount) {
770770

771771
private FallbackSyntheticSourceBlockLoader.Reader<?> fallbackSyntheticSourceBlockLoaderReader() {
772772
var nullValueBytes = nullValue != null ? new BytesRef(nullValue) : null;
773-
return new FallbackSyntheticSourceBlockLoader.ReaderWithNullValueSupport<BytesRef>(nullValueBytes) {
773+
return new FallbackSyntheticSourceBlockLoader.SingleValueReader<BytesRef>(nullValueBytes) {
774774
@Override
775775
public void convertValue(Object value, List<BytesRef> accumulator) {
776776
String stringValue = ((BytesRef) value).utf8ToString();

server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1729,8 +1729,7 @@ public Builder builder(BlockFactory factory, int expectedCount) {
17291729
};
17301730
}
17311731

1732-
abstract static class NumberFallbackSyntheticSourceReader extends FallbackSyntheticSourceBlockLoader.ReaderWithNullValueSupport<
1733-
Number> {
1732+
abstract static class NumberFallbackSyntheticSourceReader extends FallbackSyntheticSourceBlockLoader.SingleValueReader<Number> {
17341733
private final NumberType type;
17351734
private final Number nullValue;
17361735
private final boolean coerce;

server/src/test/java/org/elasticsearch/index/mapper/blockloader/BooleanFieldBlockLoaderTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
public class BooleanFieldBlockLoaderTests extends BlockLoaderTestCase {
2020
public BooleanFieldBlockLoaderTests(Params params) {
21-
super(FieldType.BOOLEAN, params);
21+
super(FieldType.BOOLEAN.toString(), params);
2222
}
2323

2424
@Override

server/src/test/java/org/elasticsearch/index/mapper/blockloader/DateFieldBlockLoaderTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
public class DateFieldBlockLoaderTests extends BlockLoaderTestCase {
2626
public DateFieldBlockLoaderTests(Params params) {
27-
super(FieldType.DATE, params);
27+
super(FieldType.DATE.toString(), params);
2828
}
2929

3030
@Override

0 commit comments

Comments
 (0)