7
7
8
8
package org .elasticsearch .xpack .rank .rrf ;
9
9
10
+ import org .elasticsearch .common .ParsingException ;
10
11
import org .elasticsearch .search .retriever .RetrieverBuilder ;
11
12
import org .elasticsearch .search .retriever .RetrieverParserContext ;
12
13
import org .elasticsearch .xcontent .ConstructingObjectParser ;
14
+ import org .elasticsearch .xcontent .CopyingXContentParser ;
15
+ import org .elasticsearch .xcontent .ObjectParser ;
13
16
import org .elasticsearch .xcontent .ParseField ;
14
17
import org .elasticsearch .xcontent .ToXContentObject ;
15
18
import org .elasticsearch .xcontent .XContentBuilder ;
19
+ import org .elasticsearch .xcontent .XContentFactory ;
20
+ import org .elasticsearch .xcontent .XContentParseException ;
16
21
import org .elasticsearch .xcontent .XContentParser ;
22
+ import org .elasticsearch .xcontent .XContentSubParser ;
23
+ import org .elasticsearch .xcontent .XContentType ;
17
24
18
25
import java .io .IOException ;
26
+ import java .util .HashMap ;
27
+ import java .util .Map ;
19
28
20
29
import static org .elasticsearch .xcontent .ConstructingObjectParser .constructorArg ;
21
30
import static org .elasticsearch .xcontent .ConstructingObjectParser .optionalConstructorArg ;
@@ -24,7 +33,6 @@ public class RRFRetrieverComponent implements ToXContentObject {
24
33
25
34
public static final ParseField RETRIEVER_FIELD = new ParseField ("retriever" );
26
35
public static final ParseField WEIGHT_FIELD = new ParseField ("weight" );
27
-
28
36
static final float DEFAULT_WEIGHT = 1f ;
29
37
30
38
final RetrieverBuilder retriever ;
@@ -75,6 +83,37 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContentObject.Para
75
83
}
76
84
77
85
public static RRFRetrieverComponent fromXContent (XContentParser parser , RetrieverParserContext context ) throws IOException {
78
- return PARSER .apply (parser , context );
86
+ RetrieverBuilder innerRetriever = null ;
87
+ float weight = DEFAULT_WEIGHT ;
88
+
89
+ if (parser .currentToken () != XContentParser .Token .START_OBJECT ) {
90
+ throw new ParsingException (parser .getTokenLocation (), "[{}] expected object" , parser .currentToken ());
91
+ }
92
+
93
+ while ((parser .nextToken ()) != XContentParser .Token .END_OBJECT ) {
94
+ var name = parser .currentName ();
95
+
96
+ if (name .equals (RETRIEVER_FIELD .getPreferredName ())) {
97
+ if (parser .nextToken () != XContentParser .Token .START_OBJECT ) {
98
+ throw new ParsingException (parser .getTokenLocation (), "[{}] expected object" , parser .currentToken ());
99
+ }
100
+ parser .nextToken ();
101
+
102
+ name = parser .currentName ();
103
+ innerRetriever = parser .namedObject (RetrieverBuilder .class , name , context );
104
+ parser .nextToken ();
105
+ } else if (name .equals (WEIGHT_FIELD .getPreferredName ())) {
106
+ if (parser .nextToken () != XContentParser .Token .VALUE_NUMBER ) {
107
+ throw new ParsingException (parser .getTokenLocation (), "[{}] expected number" , parser .currentToken ());
108
+ }
109
+
110
+ weight = parser .floatValue ();
111
+ } else {
112
+ innerRetriever = parser .namedObject (RetrieverBuilder .class , name , context );
113
+ parser .nextToken ();
114
+ break ;
115
+ }
116
+ }
117
+ return new RRFRetrieverComponent (innerRetriever , weight );
79
118
}
80
119
}
0 commit comments