Skip to content

Commit c0e1387

Browse files
Christoph Büscherkcm
Christoph Büscher
authored andcommitted
Use OptionalInt instead of Optional<Integer> (#34220)
Optionals containing boxed primitive types are prohibitively costly because they have two level of boxing. For Optional<Integer> the analogous OptionalInt can be used to avoid the boxing of the contained int value.
1 parent 7f21b17 commit c0e1387

File tree

13 files changed

+66
-58
lines changed

13 files changed

+66
-58
lines changed

client/rest-high-level/src/test/java/org/elasticsearch/client/RankEvalIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void testRankEvalRequest() throws IOException {
9090
if (id.equals("berlin") || id.equals("amsterdam5")) {
9191
assertFalse(hit.getRating().isPresent());
9292
} else {
93-
assertEquals(1, hit.getRating().get().intValue());
93+
assertEquals(1, hit.getRating().getAsInt());
9494
}
9595
}
9696
EvalQueryQuality berlinQueryQuality = partialResults.get("berlin_query");
@@ -100,7 +100,7 @@ public void testRankEvalRequest() throws IOException {
100100
for (RatedSearchHit hit : hitsAndRatings) {
101101
String id = hit.getSearchHit().getId();
102102
if (id.equals("berlin")) {
103-
assertEquals(1, hit.getRating().get().intValue());
103+
assertEquals(1, hit.getRating().getAsInt());
104104
} else {
105105
assertFalse(hit.getRating().isPresent());
106106
}

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/DiscountedCumulativeGain.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import java.util.Comparator;
3434
import java.util.List;
3535
import java.util.Objects;
36-
import java.util.Optional;
36+
import java.util.OptionalInt;
3737
import java.util.stream.Collectors;
3838

3939
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
@@ -119,8 +119,8 @@ public Integer getUnknownDocRating() {
119119

120120

121121
@Override
122-
public Optional<Integer> forcedSearchSize() {
123-
return Optional.of(k);
122+
public OptionalInt forcedSearchSize() {
123+
return OptionalInt.of(k);
124124
}
125125

126126
@Override
@@ -130,9 +130,13 @@ public EvalQueryQuality evaluate(String taskId, SearchHit[] hits,
130130
List<Integer> ratingsInSearchHits = new ArrayList<>(ratedHits.size());
131131
int unratedResults = 0;
132132
for (RatedSearchHit hit : ratedHits) {
133-
// unknownDocRating might be null, in which case unrated docs will be ignored in the dcg calculation.
134-
// we still need to add them as a placeholder so the rank of the subsequent ratings is correct
135-
ratingsInSearchHits.add(hit.getRating().orElse(unknownDocRating));
133+
if (hit.getRating().isPresent()) {
134+
ratingsInSearchHits.add(hit.getRating().getAsInt());
135+
} else {
136+
// unknownDocRating might be null, in which case unrated docs will be ignored in the dcg calculation.
137+
// we still need to add them as a placeholder so the rank of the subsequent ratings is correct
138+
ratingsInSearchHits.add(unknownDocRating);
139+
}
136140
if (hit.getRating().isPresent() == false) {
137141
unratedResults++;
138142
}

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/EvaluationMetric.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import java.util.Collection;
3030
import java.util.List;
3131
import java.util.Map;
32-
import java.util.Optional;
32+
import java.util.OptionalInt;
3333
import java.util.stream.Collectors;
3434

3535
/**
@@ -64,9 +64,9 @@ static List<RatedSearchHit> joinHitsWithRatings(SearchHit[] hits, List<RatedDocu
6464
DocumentKey key = new DocumentKey(hit.getIndex(), hit.getId());
6565
RatedDocument ratedDoc = ratedDocumentMap.get(key);
6666
if (ratedDoc != null) {
67-
ratedSearchHits.add(new RatedSearchHit(hit, Optional.of(ratedDoc.getRating())));
67+
ratedSearchHits.add(new RatedSearchHit(hit, OptionalInt.of(ratedDoc.getRating())));
6868
} else {
69-
ratedSearchHits.add(new RatedSearchHit(hit, Optional.empty()));
69+
ratedSearchHits.add(new RatedSearchHit(hit, OptionalInt.empty()));
7070
}
7171
}
7272
return ratedSearchHits;
@@ -93,7 +93,7 @@ default double combine(Collection<EvalQueryQuality> partialResults) {
9393
* this method. The default implementation returns an empty optional.
9494
* @return the number of search hits this metrics requests
9595
*/
96-
default Optional<Integer> forcedSearchSize() {
97-
return Optional.empty();
96+
default OptionalInt forcedSearchSize() {
97+
return OptionalInt.empty();
9898
}
9999
}

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/ExpectedReciprocalRank.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import java.util.ArrayList;
3333
import java.util.List;
3434
import java.util.Objects;
35-
import java.util.Optional;
35+
import java.util.OptionalInt;
3636

3737
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
3838
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.optionalConstructorArg;
@@ -126,8 +126,8 @@ public Integer getUnknownDocRating() {
126126

127127

128128
@Override
129-
public Optional<Integer> forcedSearchSize() {
130-
return Optional.of(k);
129+
public OptionalInt forcedSearchSize() {
130+
return OptionalInt.of(k);
131131
}
132132

133133
@Override
@@ -139,9 +139,13 @@ public EvalQueryQuality evaluate(String taskId, SearchHit[] hits, List<RatedDocu
139139
List<Integer> ratingsInSearchHits = new ArrayList<>(ratedHits.size());
140140
int unratedResults = 0;
141141
for (RatedSearchHit hit : ratedHits) {
142-
// unknownDocRating might be null, in which case unrated will be ignored in the calculation.
143-
// we still need to add them as a placeholder so the rank of the subsequent ratings is correct
144-
ratingsInSearchHits.add(hit.getRating().orElse(unknownDocRating));
142+
if (hit.getRating().isPresent()) {
143+
ratingsInSearchHits.add(hit.getRating().getAsInt());
144+
} else {
145+
// unknownDocRating might be null, in which case unrated docs will be ignored in the dcg calculation.
146+
// we still need to add them as a placeholder so the rank of the subsequent ratings is correct
147+
ratingsInSearchHits.add(unknownDocRating);
148+
}
145149
if (hit.getRating().isPresent() == false) {
146150
unratedResults++;
147151
}

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/MeanReciprocalRank.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import java.io.IOException;
3131
import java.util.List;
3232
import java.util.Objects;
33-
import java.util.Optional;
33+
import java.util.OptionalInt;
3434

3535
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
3636
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.optionalConstructorArg;
@@ -90,8 +90,8 @@ int getK() {
9090
}
9191

9292
@Override
93-
public Optional<Integer> forcedSearchSize() {
94-
return Optional.of(k);
93+
public OptionalInt forcedSearchSize() {
94+
return OptionalInt.of(k);
9595
}
9696

9797
@Override
@@ -115,9 +115,9 @@ public EvalQueryQuality evaluate(String taskId, SearchHit[] hits, List<RatedDocu
115115
int firstRelevant = -1;
116116
int rank = 1;
117117
for (RatedSearchHit hit : ratedHits) {
118-
Optional<Integer> rating = hit.getRating();
118+
OptionalInt rating = hit.getRating();
119119
if (rating.isPresent()) {
120-
if (rating.get() >= this.relevantRatingThreshhold) {
120+
if (rating.getAsInt() >= this.relevantRatingThreshhold) {
121121
firstRelevant = rank;
122122
break;
123123
}

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/PrecisionAtK.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import java.io.IOException;
3131
import java.util.List;
3232
import java.util.Objects;
33-
import java.util.Optional;
33+
import java.util.OptionalInt;
3434

3535
import javax.naming.directory.SearchResult;
3636

@@ -144,8 +144,8 @@ public boolean getIgnoreUnlabeled() {
144144
}
145145

146146
@Override
147-
public Optional<Integer> forcedSearchSize() {
148-
return Optional.of(k);
147+
public OptionalInt forcedSearchSize() {
148+
return OptionalInt.of(k);
149149
}
150150

151151
public static PrecisionAtK fromXContent(XContentParser parser) {
@@ -164,9 +164,9 @@ public EvalQueryQuality evaluate(String taskId, SearchHit[] hits,
164164
int falsePositives = 0;
165165
List<RatedSearchHit> ratedSearchHits = joinHitsWithRatings(hits, ratedDocs);
166166
for (RatedSearchHit hit : ratedSearchHits) {
167-
Optional<Integer> rating = hit.getRating();
167+
OptionalInt rating = hit.getRating();
168168
if (rating.isPresent()) {
169-
if (rating.get() >= this.relevantRatingThreshhold) {
169+
if (rating.getAsInt() >= this.relevantRatingThreshhold) {
170170
truePositives++;
171171
} else {
172172
falsePositives++;

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/RatedSearchHit.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,40 +33,40 @@
3333

3434
import java.io.IOException;
3535
import java.util.Objects;
36-
import java.util.Optional;
36+
import java.util.OptionalInt;
3737

3838
/**
3939
* Combines a {@link SearchHit} with a document rating.
4040
*/
4141
public class RatedSearchHit implements Writeable, ToXContentObject {
4242

4343
private final SearchHit searchHit;
44-
private final Optional<Integer> rating;
44+
private final OptionalInt rating;
4545

46-
public RatedSearchHit(SearchHit searchHit, Optional<Integer> rating) {
46+
public RatedSearchHit(SearchHit searchHit, OptionalInt rating) {
4747
this.searchHit = searchHit;
4848
this.rating = rating;
4949
}
5050

5151
RatedSearchHit(StreamInput in) throws IOException {
5252
this(SearchHit.readSearchHit(in),
53-
in.readBoolean() == true ? Optional.of(in.readVInt()) : Optional.empty());
53+
in.readBoolean() == true ? OptionalInt.of(in.readVInt()) : OptionalInt.empty());
5454
}
5555

5656
@Override
5757
public void writeTo(StreamOutput out) throws IOException {
5858
searchHit.writeTo(out);
5959
out.writeBoolean(rating.isPresent());
6060
if (rating.isPresent()) {
61-
out.writeVInt(rating.get());
61+
out.writeVInt(rating.getAsInt());
6262
}
6363
}
6464

6565
public SearchHit getSearchHit() {
6666
return this.searchHit;
6767
}
6868

69-
public Optional<Integer> getRating() {
69+
public OptionalInt getRating() {
7070
return this.rating;
7171
}
7272

@@ -75,22 +75,21 @@ public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params par
7575
throws IOException {
7676
builder.startObject();
7777
builder.field("hit", (ToXContent) searchHit);
78-
builder.field("rating", rating.orElse(null));
78+
builder.field("rating", rating.isPresent() ? rating.getAsInt() : null);
7979
builder.endObject();
8080
return builder;
8181
}
8282

8383
private static final ParseField HIT_FIELD = new ParseField("hit");
8484
private static final ParseField RATING_FIELD = new ParseField("rating");
85-
@SuppressWarnings("unchecked")
8685
private static final ConstructingObjectParser<RatedSearchHit, Void> PARSER = new ConstructingObjectParser<>("rated_hit", true,
87-
a -> new RatedSearchHit((SearchHit) a[0], (Optional<Integer>) a[1]));
86+
a -> new RatedSearchHit((SearchHit) a[0], (OptionalInt) a[1]));
8887

8988
static {
9089
PARSER.declareObject(ConstructingObjectParser.constructorArg(), (p, c) -> SearchHit.fromXContent(p), HIT_FIELD);
9190
PARSER.declareField(ConstructingObjectParser.constructorArg(),
92-
(p) -> p.currentToken() == XContentParser.Token.VALUE_NULL ? Optional.empty() : Optional.of(p.intValue()), RATING_FIELD,
93-
ValueType.INT_OR_NULL);
91+
(p) -> p.currentToken() == XContentParser.Token.VALUE_NULL ? OptionalInt.empty() : OptionalInt.of(p.intValue()),
92+
RATING_FIELD, ValueType.INT_OR_NULL);
9493
}
9594

9695
public static RatedSearchHit parse(XContentParser parser) throws IOException {

modules/rank-eval/src/main/java/org/elasticsearch/index/rankeval/TransportRankEvalAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ LoggingDeprecationHandler.INSTANCE, new BytesArray(resolvedRequest), XContentTyp
119119
}
120120

121121
if (metric.forcedSearchSize().isPresent()) {
122-
evaluationRequest.size(metric.forcedSearchSize().get());
122+
evaluationRequest.size(metric.forcedSearchSize().getAsInt());
123123
}
124124

125125
ratedRequestsInSearch.add(ratedRequest);

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/PrecisionAtKTests.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,23 +223,24 @@ public void testEqualsAndHash() throws IOException {
223223
}
224224

225225
private static PrecisionAtK copy(PrecisionAtK original) {
226-
return new PrecisionAtK(original.getRelevantRatingThreshold(), original.getIgnoreUnlabeled(), original.forcedSearchSize().get());
226+
return new PrecisionAtK(original.getRelevantRatingThreshold(), original.getIgnoreUnlabeled(),
227+
original.forcedSearchSize().getAsInt());
227228
}
228229

229230
private static PrecisionAtK mutate(PrecisionAtK original) {
230231
PrecisionAtK pAtK;
231232
switch (randomIntBetween(0, 2)) {
232233
case 0:
233234
pAtK = new PrecisionAtK(original.getRelevantRatingThreshold(), !original.getIgnoreUnlabeled(),
234-
original.forcedSearchSize().get());
235+
original.forcedSearchSize().getAsInt());
235236
break;
236237
case 1:
237238
pAtK = new PrecisionAtK(randomValueOtherThan(original.getRelevantRatingThreshold(), () -> randomIntBetween(0, 10)),
238-
original.getIgnoreUnlabeled(), original.forcedSearchSize().get());
239+
original.getIgnoreUnlabeled(), original.forcedSearchSize().getAsInt());
239240
break;
240241
case 2:
241242
pAtK = new PrecisionAtK(original.getRelevantRatingThreshold(),
242-
original.getIgnoreUnlabeled(), original.forcedSearchSize().get() + 1);
243+
original.getIgnoreUnlabeled(), original.forcedSearchSize().getAsInt() + 1);
243244
break;
244245
default:
245246
throw new IllegalStateException("The test should only allow three parameters mutated");

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RankEvalRequestIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public void testPrecisionAtRequest() {
128128
if (id.equals("1") || id.equals("6")) {
129129
assertFalse(hit.getRating().isPresent());
130130
} else {
131-
assertEquals(RELEVANT_RATING_1, hit.getRating().get().intValue());
131+
assertEquals(RELEVANT_RATING_1, hit.getRating().getAsInt());
132132
}
133133
}
134134
}
@@ -139,7 +139,7 @@ public void testPrecisionAtRequest() {
139139
for (RatedSearchHit hit : hitsAndRatings) {
140140
String id = hit.getSearchHit().getId();
141141
if (id.equals("1")) {
142-
assertEquals(RELEVANT_RATING_1, hit.getRating().get().intValue());
142+
assertEquals(RELEVANT_RATING_1, hit.getRating().getAsInt());
143143
} else {
144144
assertFalse(hit.getRating().isPresent());
145145
}

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RankEvalResponseTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
import java.util.HashMap;
5151
import java.util.List;
5252
import java.util.Map;
53-
import java.util.Optional;
53+
import java.util.OptionalInt;
5454
import java.util.function.Predicate;
5555

5656
import static java.util.Collections.singleton;
@@ -182,6 +182,6 @@ private static RatedSearchHit searchHit(String index, int docId, Integer rating)
182182
SearchHit hit = new SearchHit(docId, docId + "", new Text(""), Collections.emptyMap());
183183
hit.shard(new SearchShardTarget("testnode", new Index(index, "uuid"), 0, null));
184184
hit.score(1.0f);
185-
return new RatedSearchHit(hit, rating != null ? Optional.of(rating) : Optional.empty());
185+
return new RatedSearchHit(hit, rating != null ? OptionalInt.of(rating) : OptionalInt.empty());
186186
}
187187
}

modules/rank-eval/src/test/java/org/elasticsearch/index/rankeval/RatedSearchHitTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,28 @@
3030

3131
import java.io.IOException;
3232
import java.util.Collections;
33-
import java.util.Optional;
33+
import java.util.OptionalInt;
3434

3535
import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashCode;
3636
import static org.elasticsearch.test.XContentTestUtils.insertRandomFields;
3737

3838
public class RatedSearchHitTests extends ESTestCase {
3939

4040
public static RatedSearchHit randomRatedSearchHit() {
41-
Optional<Integer> rating = randomBoolean() ? Optional.empty()
42-
: Optional.of(randomIntBetween(0, 5));
41+
OptionalInt rating = randomBoolean() ? OptionalInt.empty()
42+
: OptionalInt.of(randomIntBetween(0, 5));
4343
SearchHit searchHit = new SearchHit(randomIntBetween(0, 10), randomAlphaOfLength(10),
4444
new Text(randomAlphaOfLength(10)), Collections.emptyMap());
4545
RatedSearchHit ratedSearchHit = new RatedSearchHit(searchHit, rating);
4646
return ratedSearchHit;
4747
}
4848

4949
private static RatedSearchHit mutateTestItem(RatedSearchHit original) {
50-
Optional<Integer> rating = original.getRating();
50+
OptionalInt rating = original.getRating();
5151
SearchHit hit = original.getSearchHit();
5252
switch (randomIntBetween(0, 1)) {
5353
case 0:
54-
rating = rating.isPresent() ? Optional.of(rating.get() + 1) : Optional.of(randomInt(5));
54+
rating = rating.isPresent() ? OptionalInt.of(rating.getAsInt() + 1) : OptionalInt.of(randomInt(5));
5555
break;
5656
case 1:
5757
hit = new SearchHit(hit.docId(), hit.getId() + randomAlphaOfLength(10),

server/src/main/java/org/elasticsearch/cluster/metadata/AutoExpandReplicas.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import java.util.HashMap;
2828
import java.util.List;
2929
import java.util.Map;
30-
import java.util.Optional;
30+
import java.util.OptionalInt;
3131

3232
/**
3333
* This class acts as a functional wrapper around the {@code index.auto_expand_replicas} setting.
@@ -93,7 +93,7 @@ int getMaxReplicas(int numDataNodes) {
9393
return Math.min(maxReplicas, numDataNodes-1);
9494
}
9595

96-
Optional<Integer> getDesiredNumberOfReplicas(int numDataNodes) {
96+
private OptionalInt getDesiredNumberOfReplicas(int numDataNodes) {
9797
if (enabled) {
9898
final int min = getMinReplicas();
9999
final int max = getMaxReplicas(numDataNodes);
@@ -105,10 +105,10 @@ Optional<Integer> getDesiredNumberOfReplicas(int numDataNodes) {
105105
}
106106

107107
if (numberOfReplicas >= min && numberOfReplicas <= max) {
108-
return Optional.of(numberOfReplicas);
108+
return OptionalInt.of(numberOfReplicas);
109109
}
110110
}
111-
return Optional.empty();
111+
return OptionalInt.empty();
112112
}
113113

114114
@Override

0 commit comments

Comments
 (0)