Skip to content

Commit b516ddb

Browse files
committed
Convert parent-join mappers to parametrized form (#63878)
This converts the three parent-join mapper implementations to parametrized form; MetaJoinFieldMapper and ParentIdFieldMapper have no builders or merging logic as they are always created directly by the ParentJoinFieldMapper. Relates to #62988
1 parent 34284b1 commit b516ddb

File tree

9 files changed

+112
-170
lines changed

9 files changed

+112
-170
lines changed

modules/parent-join/src/main/java/org/elasticsearch/join/ParentJoinPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,6 @@ public List<AggregationSpec> getAggregations() {
6363

6464
@Override
6565
public Map<String, Mapper.TypeParser> getMappers() {
66-
return Collections.singletonMap(ParentJoinFieldMapper.CONTENT_TYPE, new ParentJoinFieldMapper.TypeParser());
66+
return Collections.singletonMap(ParentJoinFieldMapper.CONTENT_TYPE, ParentJoinFieldMapper.PARSER);
6767
}
6868
}

modules/parent-join/src/main/java/org/elasticsearch/join/mapper/MetaJoinFieldMapper.java

Lines changed: 8 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,19 @@
1919

2020
package org.elasticsearch.join.mapper;
2121

22-
import org.apache.lucene.document.FieldType;
23-
import org.apache.lucene.index.IndexOptions;
2422
import org.apache.lucene.search.Query;
25-
import org.apache.lucene.util.BytesRef;
2623
import org.elasticsearch.index.fielddata.IndexFieldData;
27-
import org.elasticsearch.index.fielddata.plain.SortedSetOrdinalsIndexFieldData;
28-
import org.elasticsearch.index.mapper.FieldMapper;
2924
import org.elasticsearch.index.mapper.MapperService;
25+
import org.elasticsearch.index.mapper.MetadataFieldMapper;
3026
import org.elasticsearch.index.mapper.ParseContext;
3127
import org.elasticsearch.index.mapper.StringFieldType;
3228
import org.elasticsearch.index.mapper.TextSearchInfo;
3329
import org.elasticsearch.index.mapper.ValueFetcher;
3430
import org.elasticsearch.index.query.QueryShardContext;
35-
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
3631
import org.elasticsearch.search.lookup.SearchLookup;
3732

3833
import java.io.IOException;
3934
import java.util.Collections;
40-
import java.util.List;
4135
import java.util.function.Supplier;
4236

4337
/**
@@ -47,35 +41,11 @@
4741
* This class is also used to quickly retrieve the parent-join field defined in a mapping without
4842
* specifying the name of the field.
4943
*/
50-
public class MetaJoinFieldMapper extends FieldMapper {
44+
public class MetaJoinFieldMapper extends MetadataFieldMapper {
45+
5146
static final String NAME = "_parent_join";
5247
static final String CONTENT_TYPE = "parent_join";
5348

54-
static class Defaults {
55-
public static final FieldType FIELD_TYPE = new FieldType();
56-
57-
static {
58-
FIELD_TYPE.setStored(false);
59-
FIELD_TYPE.setIndexOptions(IndexOptions.NONE);
60-
FIELD_TYPE.freeze();
61-
}
62-
}
63-
64-
static class Builder extends FieldMapper.Builder {
65-
66-
final String joinField;
67-
68-
Builder(String joinField) {
69-
super(NAME, Defaults.FIELD_TYPE);
70-
this.joinField = joinField;
71-
}
72-
73-
@Override
74-
public MetaJoinFieldMapper build(BuilderContext context) {
75-
return new MetaJoinFieldMapper(name, joinField);
76-
}
77-
}
78-
7949
public static class MetaJoinFieldType extends StringFieldType {
8050

8151
private final String joinField;
@@ -92,22 +62,17 @@ public String typeName() {
9262

9363
@Override
9464
public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName, Supplier<SearchLookup> searchLookup) {
95-
failIfNoDocValues();
96-
return new SortedSetOrdinalsIndexFieldData.Builder(name(), CoreValuesSourceType.BYTES);
65+
throw new UnsupportedOperationException("Cannot load field data for metadata field [" + NAME + "]");
9766
}
9867

9968
@Override
10069
public ValueFetcher valueFetcher(MapperService mapperService, SearchLookup searchLookup, String format) {
101-
throw new UnsupportedOperationException("Cannot fetch values for metadata field [" + typeName() + "].");
70+
throw new UnsupportedOperationException("Cannot fetch values for metadata field [" + NAME + "].");
10271
}
10372

10473
@Override
10574
public Object valueForDisplay(Object value) {
106-
if (value == null) {
107-
return null;
108-
}
109-
BytesRef binaryValue = (BytesRef) value;
110-
return binaryValue.utf8ToString();
75+
throw new UnsupportedOperationException();
11176
}
11277

11378
public String getJoinField() {
@@ -120,8 +85,8 @@ public Query existsQuery(QueryShardContext context) {
12085
}
12186
}
12287

123-
MetaJoinFieldMapper(String name, String joinField) {
124-
super(name, Defaults.FIELD_TYPE, new MetaJoinFieldType(joinField), MultiFields.empty(), CopyTo.empty());
88+
MetaJoinFieldMapper(String joinField) {
89+
super(new MetaJoinFieldType(joinField));
12590
}
12691

12792
@Override
@@ -134,10 +99,6 @@ protected MetaJoinFieldMapper clone() {
13499
return (MetaJoinFieldMapper) super.clone();
135100
}
136101

137-
@Override
138-
protected void mergeOptions(FieldMapper other, List<String> conflicts) {
139-
}
140-
141102
@Override
142103
protected void parseCreateField(ParseContext context) throws IOException {
143104
throw new IllegalStateException("Should never be called");

modules/parent-join/src/main/java/org/elasticsearch/join/mapper/ParentIdFieldMapper.java

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@
2727
import org.elasticsearch.common.lucene.Lucene;
2828
import org.elasticsearch.index.fielddata.IndexFieldData;
2929
import org.elasticsearch.index.fielddata.plain.SortedSetOrdinalsIndexFieldData;
30-
import org.elasticsearch.index.mapper.FieldMapper;
31-
import org.elasticsearch.index.mapper.MappedFieldType;
3230
import org.elasticsearch.index.mapper.MapperService;
31+
import org.elasticsearch.index.mapper.ParametrizedFieldMapper;
3332
import org.elasticsearch.index.mapper.ParseContext;
3433
import org.elasticsearch.index.mapper.StringFieldType;
3534
import org.elasticsearch.index.mapper.TextSearchInfo;
@@ -38,14 +37,13 @@
3837
import org.elasticsearch.search.lookup.SearchLookup;
3938

4039
import java.util.Collections;
41-
import java.util.List;
4240
import java.util.function.Supplier;
4341

4442
/**
4543
* A field mapper used internally by the {@link ParentJoinFieldMapper} to index
4644
* the value that link documents in the index (parent _id or _id if the document is a parent).
4745
*/
48-
public final class ParentIdFieldMapper extends FieldMapper {
46+
public final class ParentIdFieldMapper extends ParametrizedFieldMapper {
4947
static final String CONTENT_TYPE = "parent";
5048

5149
static class Defaults {
@@ -59,24 +57,6 @@ static class Defaults {
5957
}
6058
}
6159

62-
static class Builder extends FieldMapper.Builder {
63-
64-
Builder(String name) {
65-
super(name, Defaults.FIELD_TYPE);
66-
}
67-
68-
public Builder eagerGlobalOrdinals(boolean eagerGlobalOrdinals) {
69-
this.eagerGlobalOrdinals = eagerGlobalOrdinals;
70-
return this;
71-
}
72-
73-
@Override
74-
public ParentIdFieldMapper build(BuilderContext context) {
75-
return new ParentIdFieldMapper(name, fieldType,
76-
new ParentIdFieldType(buildFullName(context), eagerGlobalOrdinals));
77-
}
78-
}
79-
8060
public static final class ParentIdFieldType extends StringFieldType {
8161
public ParentIdFieldType(String name, boolean eagerGlobalOrdinals) {
8262
super(name, true, false, true, TextSearchInfo.SIMPLE_MATCH_ONLY, Collections.emptyMap());
@@ -110,10 +90,8 @@ public Object valueForDisplay(Object value) {
11090
}
11191
}
11292

113-
protected ParentIdFieldMapper(String simpleName,
114-
FieldType fieldType,
115-
MappedFieldType mappedFieldType) {
116-
super(simpleName, fieldType, mappedFieldType, MultiFields.empty(), CopyTo.empty());
93+
protected ParentIdFieldMapper(String name, boolean eagerGlobalOrdinals) {
94+
super(name, new ParentIdFieldType(name, eagerGlobalOrdinals), MultiFields.empty(), CopyTo.empty());
11795
}
11896

11997
@Override
@@ -128,18 +106,18 @@ protected void parseCreateField(ParseContext context) {
128106
}
129107
String refId = (String) context.externalValue();
130108
BytesRef binaryValue = new BytesRef(refId);
131-
Field field = new Field(fieldType().name(), binaryValue, fieldType);
109+
Field field = new Field(fieldType().name(), binaryValue, Defaults.FIELD_TYPE);
132110
context.doc().add(field);
133111
context.doc().add(new SortedDocValuesField(fieldType().name(), binaryValue));
134112
}
135113

136114
@Override
137-
protected void mergeOptions(FieldMapper other, List<String> conflicts) {
138-
115+
protected String contentType() {
116+
return CONTENT_TYPE;
139117
}
140118

141119
@Override
142-
protected String contentType() {
143-
return CONTENT_TYPE;
120+
public Builder getMergeBuilder() {
121+
return null; // always constructed by ParentJoinFieldMapper, not through type parsers
144122
}
145123
}

0 commit comments

Comments
 (0)