Skip to content

Commit 5c8cd16

Browse files
authored
TermsLookup uses ObjectParser for x-content parsing (#53733)
This commit refactors the fromXContent method in TermsLookup to use an ObjectParser and adds an explicit parsing test. Related to #53731
1 parent 55535b6 commit 5c8cd16

File tree

2 files changed

+33
-34
lines changed

2 files changed

+33
-34
lines changed

server/src/main/java/org/elasticsearch/indices/TermsLookup.java

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@
2020
package org.elasticsearch.indices;
2121

2222
import org.elasticsearch.Version;
23-
import org.elasticsearch.common.ParsingException;
23+
import org.elasticsearch.common.ParseField;
2424
import org.elasticsearch.common.io.stream.StreamInput;
2525
import org.elasticsearch.common.io.stream.StreamOutput;
2626
import org.elasticsearch.common.io.stream.Writeable;
27+
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
2728
import org.elasticsearch.common.xcontent.ToXContentFragment;
2829
import org.elasticsearch.common.xcontent.XContentBuilder;
2930
import org.elasticsearch.common.xcontent.XContentParser;
@@ -33,10 +34,13 @@
3334
import java.io.IOException;
3435
import java.util.Objects;
3536

37+
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
38+
3639
/**
3740
* Encapsulates the parameters needed to fetch terms.
3841
*/
3942
public class TermsLookup implements Writeable, ToXContentFragment {
43+
4044
private final String index;
4145
private final String id;
4246
private final String path;
@@ -102,40 +106,22 @@ public TermsLookup routing(String routing) {
102106
return this;
103107
}
104108

109+
private static final ConstructingObjectParser<TermsLookup, Void> PARSER = new ConstructingObjectParser<>("terms_lookup",
110+
args -> {
111+
String index = (String) args[0];
112+
String id = (String) args[1];
113+
String path = (String) args[2];
114+
return new TermsLookup(index, id, path);
115+
});
116+
static {
117+
PARSER.declareString(constructorArg(), new ParseField("index"));
118+
PARSER.declareString(constructorArg(), new ParseField("id"));
119+
PARSER.declareString(constructorArg(), new ParseField("path"));
120+
PARSER.declareString(TermsLookup::routing, new ParseField("routing"));
121+
}
122+
105123
public static TermsLookup parseTermsLookup(XContentParser parser) throws IOException {
106-
String index = null;
107-
String id = null;
108-
String path = null;
109-
String routing = null;
110-
XContentParser.Token token;
111-
String currentFieldName = "";
112-
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
113-
if (token == XContentParser.Token.FIELD_NAME) {
114-
currentFieldName = parser.currentName();
115-
} else if (token.isValue()) {
116-
switch (currentFieldName) {
117-
case "index":
118-
index = parser.text();
119-
break;
120-
case "id":
121-
id = parser.text();
122-
break;
123-
case "routing":
124-
routing = parser.textOrNull();
125-
break;
126-
case "path":
127-
path = parser.text();
128-
break;
129-
default:
130-
throw new ParsingException(parser.getTokenLocation(), "[" + TermsQueryBuilder.NAME +
131-
"] query does not support [" + currentFieldName + "] within lookup element");
132-
}
133-
} else {
134-
throw new ParsingException(parser.getTokenLocation(), "[" + TermsQueryBuilder.NAME + "] unknown token ["
135-
+ token + "] after [" + currentFieldName + "]");
136-
}
137-
}
138-
return new TermsLookup(index, id, path).routing(routing);
124+
return PARSER.parse(parser, null);
139125
}
140126

141127
@Override

server/src/test/java/org/elasticsearch/indices/TermsLookupTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
import org.elasticsearch.common.io.stream.BytesStreamOutput;
2323
import org.elasticsearch.common.io.stream.StreamInput;
24+
import org.elasticsearch.common.xcontent.XContentParser;
25+
import org.elasticsearch.common.xcontent.json.JsonXContent;
2426
import org.elasticsearch.test.ESTestCase;
2527

2628
import java.io.IOException;
@@ -78,6 +80,17 @@ public void testSerialization() throws IOException {
7880
}
7981
}
8082

83+
public void testXContentParsing() throws IOException {
84+
XContentParser parser = createParser(JsonXContent.jsonXContent,
85+
"{ \"index\" : \"index\", \"id\" : \"id\", \"path\" : \"path\", \"routing\" : \"routing\" }");
86+
87+
TermsLookup tl = TermsLookup.parseTermsLookup(parser);
88+
assertEquals("index", tl.index());
89+
assertEquals("id", tl.id());
90+
assertEquals("path", tl.path());
91+
assertEquals("routing", tl.routing());
92+
}
93+
8194
public static TermsLookup randomTermsLookup() {
8295
return new TermsLookup(
8396
randomAlphaOfLength(10),

0 commit comments

Comments
 (0)