Skip to content

Commit 045c805

Browse files
authored
Support optional function score variant (#880)
* Support optional function score variant This commit supports function score functions with an optional function variant. The function is optional as it is perfectly valid to have a function with only a weight e.g. a function score query with multiple functions and a score mode of "first", where the last weight function acts as some default value. Closes #820 Signed-off-by: Russ Cam <[email protected]> * Address CI build issues Signed-off-by: Russ Cam <[email protected]> * remove changelog entry for 3.0 Signed-off-by: Russ Cam <[email protected]> --------- Signed-off-by: Russ Cam <[email protected]>
1 parent 0c88a6a commit 045c805

File tree

3 files changed

+58
-14
lines changed

3 files changed

+58
-14
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ This section is for maintaining a changelog for all breaking changes for the cli
4343

4444
### Fixed
4545
- Fix integer overflow for variables in indices stats response ([#877](https://github.com/opensearch-project/opensearch-java/pull/877))
46+
- Support weight function in function score query ([#880](https://github.com/opensearch-project/opensearch-java/pull/880))
4647

4748
### Security
4849

java-client/src/main/java/org/opensearch/client/opensearch/_types/query_dsl/FunctionScore.java

+26-14
Original file line numberDiff line numberDiff line change
@@ -106,20 +106,28 @@ public final Object _get() {
106106
@Nullable
107107
private final Double weight;
108108

109-
public FunctionScore(FunctionScoreVariant value) {
110-
111-
this._kind = ApiTypeHelper.requireNonNull(value._functionScoreKind(), this, "<variant kind>");
112-
this._value = ApiTypeHelper.requireNonNull(value, this, "<variant value>");
109+
public FunctionScore(@Nullable FunctionScoreVariant value) {
110+
if (value != null) {
111+
this._kind = ApiTypeHelper.requireNonNull(value._functionScoreKind(), this, "<variant kind>");
112+
this._value = ApiTypeHelper.requireNonNull(value, this, "<variant value>");
113+
} else {
114+
this._kind = null;
115+
this._value = null;
116+
}
113117

114118
this.filter = null;
115119
this.weight = null;
116120

117121
}
118122

119123
private FunctionScore(Builder builder) {
120-
121-
this._kind = ApiTypeHelper.requireNonNull(builder._kind, builder, "<variant kind>");
122-
this._value = ApiTypeHelper.requireNonNull(builder._value, builder, "<variant value>");
124+
if (builder._value != null) {
125+
this._kind = ApiTypeHelper.requireNonNull(builder._kind, builder, "<variant kind>");
126+
this._value = ApiTypeHelper.requireNonNull(builder._value, builder, "<variant value>");
127+
} else {
128+
this._kind = null;
129+
this._value = null;
130+
}
123131

124132
this.filter = builder.filter;
125133
this.weight = builder.weight;
@@ -266,9 +274,11 @@ public void serialize(JsonGenerator generator, JsonpMapper mapper) {
266274

267275
}
268276

269-
generator.writeKey(_kind.jsonValue());
270-
if (_value instanceof JsonpSerializable) {
271-
((JsonpSerializable) _value).serialize(generator, mapper);
277+
if (_value != null) {
278+
generator.writeKey(_kind.jsonValue());
279+
if (_value instanceof JsonpSerializable) {
280+
((JsonpSerializable) _value).serialize(generator, mapper);
281+
}
272282
}
273283

274284
generator.writeEnd();
@@ -279,8 +289,10 @@ public Builder toBuilder() {
279289
return new Builder()._kind(_kind)._value(_value).filter(filter).weight(weight);
280290
}
281291

282-
public static class Builder extends ObjectBuilderBase {
292+
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<FunctionScore> {
293+
@Nullable
283294
private Kind _kind;
295+
@Nullable
284296
private Object _value;
285297

286298
@Nullable
@@ -289,12 +301,12 @@ public static class Builder extends ObjectBuilderBase {
289301
@Nullable
290302
private Double weight;
291303

292-
protected final Builder _kind(Kind v) {
304+
protected final Builder _kind(@Nullable Kind v) {
293305
this._kind = v;
294306
return this;
295307
}
296308

297-
protected final Builder _value(Object v) {
309+
protected final Builder _value(@Nullable Object v) {
298310
this._value = v;
299311
return this;
300312
}
@@ -384,7 +396,7 @@ public ContainerBuilder scriptScore(Function<ScriptScoreFunction.Builder, Object
384396
return this.scriptScore(fn.apply(new ScriptScoreFunction.Builder()).build());
385397
}
386398

387-
protected FunctionScore build() {
399+
public FunctionScore build() {
388400
_checkSingleUse();
389401
return new FunctionScore(this);
390402
}

java-client/src/test/java/org/opensearch/client/opensearch/_types/query_dsl/FunctionScoreQueryTest.java

+31
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,35 @@ public void toBuilder() {
1111

1212
assertEquals(toJson(copied), toJson(origin));
1313
}
14+
15+
@Test
16+
public void canSupportWeightFunction() {
17+
Query functionScoreQuery = FunctionScoreQuery.of(fs -> fs.functions(f -> f.weight(5d)))._toQuery();
18+
19+
String json = "{\"function_score\":{\"functions\":[{\"weight\":5.0}]}}";
20+
21+
assertEquals(json, toJson(functionScoreQuery));
22+
23+
Query roundtripQuery = checkJsonRoundtrip(functionScoreQuery, json);
24+
25+
assertNull(roundtripQuery.functionScore().functions().get(0)._kind());
26+
assertEquals(5.0, roundtripQuery.functionScore().functions().get(0).weight(), 0.001);
27+
}
28+
29+
@Test
30+
public void canSupportFunctionVariant() {
31+
Query functionScoreQuery = FunctionScoreQuery.of(
32+
fs -> fs.functions(f -> f.weight(3d).linear(l -> l.field("field").placement(p -> p.decay(8.0))))
33+
)._toQuery();
34+
35+
String json = "{\"function_score\":{\"functions\":[{\"weight\":3.0,\"linear\":{\"field\":{\"decay\":8.0}}}]}}";
36+
37+
assertEquals(json, toJson(functionScoreQuery));
38+
39+
Query roundtripQuery = checkJsonRoundtrip(functionScoreQuery, json);
40+
41+
assertEquals(FunctionScore.Kind.Linear, roundtripQuery.functionScore().functions().get(0)._kind());
42+
assertEquals(3.0, roundtripQuery.functionScore().functions().get(0).weight(), 0.001);
43+
assertEquals(8.0, roundtripQuery.functionScore().functions().get(0).linear().placement().decay(), 0.001);
44+
}
1445
}

0 commit comments

Comments
 (0)