Skip to content

Commit ff65d27

Browse files
committed
WIP
1 parent 0872925 commit ff65d27

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/LinearRetrieverBuilder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,17 @@ public ActionRequestValidationException validate(
271271
),
272272
validationException
273273
);
274+
} else if (innerRetrievers.isEmpty() == false && normalizer != null) {
275+
validationException = addValidationError(
276+
String.format(
277+
Locale.ROOT,
278+
"[%s] [%s] cannot be provided when [%s] is specified",
279+
getName(),
280+
NORMALIZER_FIELD.getPreferredName(),
281+
RETRIEVERS_FIELD.getPreferredName()
282+
),
283+
validationException
284+
);
274285
}
275286

276287
return validationException;

x-pack/plugin/rank-rrf/src/test/java/org/elasticsearch/xpack/rank/linear/LinearRetrieverBuilderParsingTests.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,32 @@ protected LinearRetrieverBuilder createTestInstance() {
6262
List<CompoundRetrieverBuilder.RetrieverSource> innerRetrievers = new ArrayList<>();
6363
float[] weights = new float[num];
6464
ScoreNormalizer[] normalizers = new ScoreNormalizer[num];
65-
for (int i = 0; i < num; i++) {
66-
innerRetrievers.add(
67-
new CompoundRetrieverBuilder.RetrieverSource(TestRetrieverBuilder.createRandomTestRetrieverBuilder(), null)
68-
);
69-
weights[i] = randomFloat();
70-
normalizers[i] = randomScoreNormalizer();
65+
// Create normalizer combinations that follow the API design rules
66+
if (normalizer != null) {
67+
// When top-level normalizer is specified, per-retriever normalizers must either:
68+
// 1. Be null/default (will be propagated), or
69+
// 2. Exactly match the top-level normalizer
70+
boolean useMatchingNormalizers = randomBoolean();
71+
for (int i = 0; i < num; i++) {
72+
innerRetrievers.add(
73+
new CompoundRetrieverBuilder.RetrieverSource(TestRetrieverBuilder.createRandomTestRetrieverBuilder(), null)
74+
);
75+
weights[i] = randomFloat();
76+
if (useMatchingNormalizers) {
77+
normalizers[i] = normalizer; // Exactly match top-level
78+
} else {
79+
normalizers[i] = randomBoolean() ? null : IdentityScoreNormalizer.INSTANCE; // Will be propagated
80+
}
81+
}
82+
} else {
83+
// No top-level normalizer: per-retriever normalizers can be anything
84+
for (int i = 0; i < num; i++) {
85+
innerRetrievers.add(
86+
new CompoundRetrieverBuilder.RetrieverSource(TestRetrieverBuilder.createRandomTestRetrieverBuilder(), null)
87+
);
88+
weights[i] = randomFloat();
89+
normalizers[i] = randomScoreNormalizer();
90+
}
7191
}
7292

7393
return new LinearRetrieverBuilder(innerRetrievers, fields, query, normalizer, rankWindowSize, weights, normalizers);

0 commit comments

Comments
 (0)