Skip to content

Commit cd2f9aa

Browse files
committed
Fixes to fielddata and valuefetcher
1 parent 8efac46 commit cd2f9aa

File tree

5 files changed

+27
-141
lines changed

5 files changed

+27
-141
lines changed

test/framework/src/main/java/org/elasticsearch/index/mapper/FieldTypeTestCase.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,14 @@
88
*/
99
package org.elasticsearch.index.mapper;
1010

11-
import org.apache.lucene.document.Document;
12-
import org.apache.lucene.index.DirectoryReader;
1311
import org.apache.lucene.index.DocValuesSkipIndexType;
1412
import org.apache.lucene.index.DocValuesType;
1513
import org.apache.lucene.index.FieldInfo;
1614
import org.apache.lucene.index.FieldInfos;
1715
import org.apache.lucene.index.IndexOptions;
18-
import org.apache.lucene.index.IndexWriterConfig;
19-
import org.apache.lucene.index.LeafReaderContext;
2016
import org.apache.lucene.index.VectorEncoding;
2117
import org.apache.lucene.index.VectorSimilarityFunction;
22-
import org.apache.lucene.search.IndexSearcher;
2318
import org.apache.lucene.search.Query;
24-
import org.apache.lucene.store.Directory;
25-
import org.apache.lucene.tests.index.RandomIndexWriter;
2619
import org.elasticsearch.index.IndexVersion;
2720
import org.elasticsearch.index.query.SearchExecutionContext;
2821
import org.elasticsearch.search.lookup.FieldLookup;
@@ -39,7 +32,6 @@
3932
import java.util.HashMap;
4033
import java.util.List;
4134
import java.util.Set;
42-
import java.util.function.Supplier;
4335

4436
import static org.mockito.Mockito.mock;
4537
import static org.mockito.Mockito.when;
@@ -79,24 +71,6 @@ public static List<?> fetchSourceValue(MappedFieldType fieldType, Object sourceV
7971
return fetcher.fetchValues(source, -1, new ArrayList<>());
8072
}
8173

82-
public static List<?> fetchDocValues(MappedFieldType fieldType, Supplier<Document> documentSupplier) throws IOException {
83-
IndexWriterConfig iwc = new IndexWriterConfig(null);
84-
try (Directory dir = newDirectory(); RandomIndexWriter iw = new RandomIndexWriter(random(), dir, iwc)) {
85-
iw.addDocument(documentSupplier.get());
86-
try (DirectoryReader reader = iw.getReader()) {
87-
IndexSearcher searcher = newSearcher(reader);
88-
LeafReaderContext context = searcher.getIndexReader().leaves().get(0);
89-
SearchExecutionContext searchExecutionContext = mock(SearchExecutionContext.class);
90-
when(searchExecutionContext.getForField(fieldType, MappedFieldType.FielddataOperation.SEARCH)).thenReturn(
91-
fieldType.fielddataBuilder(null).build(null, null)
92-
);
93-
ValueFetcher valueFetcher = fieldType.valueFetcher(searchExecutionContext, null);
94-
valueFetcher.setNextReader(context);
95-
return valueFetcher.fetchValues(null, 0, new ArrayList<>());
96-
}
97-
}
98-
}
99-
10074
public static List<?> fetchSourceValues(MappedFieldType fieldType, Object... values) throws IOException {
10175
String field = fieldType.name();
10276
SearchExecutionContext searchExecutionContext = mock(SearchExecutionContext.class);

x-pack/plugin/mapper-patterned-text/src/main/java/org/elasticsearch/xpack/patternedtext/PatternedTextFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ private PatternedTextFieldMapper(
104104
) {
105105
super(simpleName, mappedFieldPatternedTextFieldType, builderParams);
106106
assert mappedFieldPatternedTextFieldType.getTextSearchInfo().isTokenized();
107-
assert mappedFieldPatternedTextFieldType.hasDocValues();
107+
assert mappedFieldPatternedTextFieldType.hasDocValues() == false;
108108
this.fieldType = Defaults.FIELD_TYPE;
109109
this.indexCreatedVersion = builder.indexCreatedVersion;
110110
this.indexAnalyzers = builder.analyzers.indexAnalyzers;

x-pack/plugin/mapper-patterned-text/src/main/java/org/elasticsearch/xpack/patternedtext/PatternedTextFieldType.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,12 @@
2727
import org.elasticsearch.common.CheckedIntFunction;
2828
import org.elasticsearch.common.lucene.Lucene;
2929
import org.elasticsearch.common.unit.Fuzziness;
30-
import org.elasticsearch.index.fielddata.FieldData;
3130
import org.elasticsearch.index.fielddata.FieldDataContext;
3231
import org.elasticsearch.index.fielddata.IndexFieldData;
33-
import org.elasticsearch.index.fielddata.plain.SortedSetOrdinalsIndexFieldData;
32+
import org.elasticsearch.index.fielddata.SourceValueFetcherSortedBinaryIndexFieldData;
3433
import org.elasticsearch.index.mapper.BlockDocValuesReader;
3534
import org.elasticsearch.index.mapper.BlockLoader;
36-
import org.elasticsearch.index.mapper.DocValueFetcher;
35+
import org.elasticsearch.index.mapper.SourceValueFetcher;
3736
import org.elasticsearch.index.mapper.StringFieldType;
3837
import org.elasticsearch.index.mapper.TextFieldMapper;
3938
import org.elasticsearch.index.mapper.TextSearchInfo;
@@ -42,6 +41,8 @@
4241
import org.elasticsearch.index.mapper.extras.SourceIntervalsSource;
4342
import org.elasticsearch.index.query.SearchExecutionContext;
4443
import org.elasticsearch.script.field.KeywordDocValuesField;
44+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
45+
import org.elasticsearch.search.lookup.SourceProvider;
4546

4647
import java.io.IOException;
4748
import java.io.UncheckedIOException;
@@ -51,8 +52,6 @@
5152
import java.util.Map;
5253
import java.util.Objects;
5354

54-
import static org.elasticsearch.search.aggregations.support.CoreValuesSourceType.KEYWORD;
55-
5655
public class PatternedTextFieldType extends StringFieldType {
5756

5857
private static final String TEMPLATE_SUFFIX = ".template";
@@ -93,18 +92,19 @@ public String familyTypeName() {
9392

9493
@Override
9594
public ValueFetcher valueFetcher(SearchExecutionContext context, String format) {
96-
return new DocValueFetcher(docValueFormat(format, null), context.getForField(this, FielddataOperation.SEARCH));
95+
return SourceValueFetcher.toString(name(), context, format);
9796
}
9897

9998
private IOFunction<LeafReaderContext, CheckedIntFunction<List<Object>, IOException>> getValueFetcherProvider(
10099
SearchExecutionContext searchExecutionContext
101100
) {
102101
return context -> {
103102
ValueFetcher valueFetcher = valueFetcher(searchExecutionContext, null);
103+
SourceProvider sourceProvider = searchExecutionContext.lookup();
104104
valueFetcher.setNextReader(context);
105105
return docID -> {
106106
try {
107-
return valueFetcher.fetchValues(null, docID, new ArrayList<>());
107+
return valueFetcher.fetchValues(sourceProvider.getSource(context, docID), docID, new ArrayList<>());
108108
} catch (IOException e) {
109109
throw new UncheckedIOException(e);
110110
}
@@ -243,17 +243,20 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
243243

244244
@Override
245245
public IndexFieldData.Builder fielddataBuilder(FieldDataContext fieldDataContext) {
246-
var templateDataBuilder = new SortedSetOrdinalsIndexFieldData.Builder(
247-
templateFieldName(),
248-
KEYWORD,
249-
(dv, n) -> new KeywordDocValuesField(FieldData.toString(dv), n)
250-
);
251-
var argsDataBuilder = new SortedSetOrdinalsIndexFieldData.Builder(
252-
argsFieldName(),
253-
KEYWORD,
254-
(dv, n) -> new KeywordDocValuesField(FieldData.toString(dv), n)
246+
if (fieldDataContext.fielddataOperation() != FielddataOperation.SCRIPT) {
247+
throw new IllegalArgumentException(CONTENT_TYPE + " fields do not support sorting and aggregations");
248+
}
249+
if (textFieldType.isSyntheticSource()) {
250+
return new PatternedTextIndexFieldData.Builder(this);
251+
}
252+
return new SourceValueFetcherSortedBinaryIndexFieldData.Builder(
253+
name(),
254+
CoreValuesSourceType.KEYWORD,
255+
SourceValueFetcher.toString(fieldDataContext.sourcePathsLookup().apply(name())),
256+
fieldDataContext.lookupSupplier().get(),
257+
KeywordDocValuesField::new
255258
);
256-
return new PatternedTextIndexFieldData.Builder(name(), templateDataBuilder, argsDataBuilder);
259+
257260
}
258261

259262
String templateFieldName() {

x-pack/plugin/mapper-patterned-text/src/test/java/org/elasticsearch/xpack/patternedtext/PatternedTextFieldTypeTests.java

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
package org.elasticsearch.xpack.patternedtext;
99

1010
import org.apache.lucene.analysis.TokenStream;
11-
import org.apache.lucene.document.Document;
12-
import org.apache.lucene.document.SortedSetDocValuesField;
1311
import org.apache.lucene.index.Term;
1412
import org.apache.lucene.queries.intervals.Intervals;
1513
import org.apache.lucene.queries.intervals.IntervalsSource;
@@ -40,7 +38,6 @@
4038
import java.util.ArrayList;
4139
import java.util.Arrays;
4240
import java.util.List;
43-
import java.util.function.Supplier;
4441

4542
public class PatternedTextFieldTypeTests extends FieldTypeTestCase {
4643

@@ -54,8 +51,8 @@ public void testTermsQuery() {
5451
MappedFieldType ft = new PatternedTextFieldType("field");
5552
List<BytesRef> terms = new ArrayList<>();
5653
terms.add(new BytesRef("foo"));
57-
terms.add(new BytesRef("bar"));
58-
assertEquals(new TermInSetQuery("field", terms), ft.termsQuery(Arrays.asList("foo", "bar"), null));
54+
terms.add(new BytesRef("123"));
55+
assertEquals(new TermInSetQuery("field", terms), ft.termsQuery(Arrays.asList("foo", "123"), null));
5956
}
6057

6158
public void testRangeQuery() {
@@ -107,37 +104,25 @@ public void testFuzzyQuery() {
107104
assertEquals("[fuzzy] queries cannot be executed when 'search.allow_expensive_queries' is set to false.", ee.getMessage());
108105
}
109106

110-
public void testFetchDocValue() throws IOException {
111-
Supplier<Document> documentSupplier = () -> {
112-
Document doc = new Document();
113-
doc.add(new SortedSetDocValuesField("field.template", new BytesRef("value %W")));
114-
doc.add(new SortedSetDocValuesField("field.args", new BytesRef("1")));
115-
return doc;
116-
};
117-
118-
MappedFieldType fieldType = new PatternedTextFieldType("field");
119-
assertEquals(List.of("value 1"), fetchDocValues(fieldType, documentSupplier));
120-
}
121-
122107
private Query unwrapPositionalQuery(Query query) {
123108
query = ((ConstantScoreQuery) query).getQuery();
124109
return query;
125110
}
126111

127112
public void testPhraseQuery() throws IOException {
128113
MappedFieldType ft = new PatternedTextFieldType("field");
129-
TokenStream ts = new CannedTokenStream(new Token("a", 0, 3), new Token("b", 4, 7));
114+
TokenStream ts = new CannedTokenStream(new Token("a", 0, 3), new Token("1", 4, 7));
130115
Query query = ft.phraseQuery(ts, 0, true, MOCK_CONTEXT);
131116
Query delegate = unwrapPositionalQuery(query);
132-
assertEquals(new PhraseQuery("field", "a", "b").toString(), delegate.toString());
117+
assertEquals(new PhraseQuery("field", "a", "1").toString(), delegate.toString());
133118
}
134119

135120
public void testMultiPhraseQuery() throws IOException {
136121
MappedFieldType ft = new PatternedTextFieldType("field");
137-
TokenStream ts = new CannedTokenStream(new Token("a", 0, 3), new Token("b", 0, 0, 3), new Token("c", 4, 7));
122+
TokenStream ts = new CannedTokenStream(new Token("a", 0, 3), new Token("2", 0, 0, 3), new Token("c", 4, 7));
138123
Query query = ft.multiPhraseQuery(ts, 0, true, MOCK_CONTEXT);
139124
Query delegate = unwrapPositionalQuery(query);
140-
Query expected = new MultiPhraseQuery.Builder().add(new Term[] { new Term("field", "a"), new Term("field", "b") })
125+
Query expected = new MultiPhraseQuery.Builder().add(new Term[] { new Term("field", "a"), new Term("field", "2") })
141126
.add(new Term("field", "c"))
142127
.build();
143128
assertEquals(expected.toString(), delegate.toString());

x-pack/plugin/mapper-patterned-text/src/yamlRestTest/resources/rest-api-spec/test/20_synthetic_source.yml

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)