Remote private SearchHits.Total class (#39556)
This is now possible as Lucene's `TotalHits` implements `equals`/`hashcode`, all the other methods can be in-lined in `SearchHits` instead, no need for a specific wrapper class.
This commit is contained in:
parent
b8659fcb83
commit
9ddaabba88
|
@ -55,7 +55,7 @@ public final class SearchHits implements Writeable, ToXContentFragment, Iterable
|
||||||
public static final SearchHit[] EMPTY = new SearchHit[0];
|
public static final SearchHit[] EMPTY = new SearchHit[0];
|
||||||
|
|
||||||
private final SearchHit[] hits;
|
private final SearchHit[] hits;
|
||||||
private final Total totalHits;
|
private final TotalHits totalHits;
|
||||||
private final float maxScore;
|
private final float maxScore;
|
||||||
@Nullable
|
@Nullable
|
||||||
private final SortField[] sortFields;
|
private final SortField[] sortFields;
|
||||||
|
@ -71,7 +71,7 @@ public final class SearchHits implements Writeable, ToXContentFragment, Iterable
|
||||||
public SearchHits(SearchHit[] hits, @Nullable TotalHits totalHits, float maxScore, @Nullable SortField[] sortFields,
|
public SearchHits(SearchHit[] hits, @Nullable TotalHits totalHits, float maxScore, @Nullable SortField[] sortFields,
|
||||||
@Nullable String collapseField, @Nullable Object[] collapseValues) {
|
@Nullable String collapseField, @Nullable Object[] collapseValues) {
|
||||||
this.hits = hits;
|
this.hits = hits;
|
||||||
this.totalHits = totalHits == null ? null : new Total(totalHits);
|
this.totalHits = totalHits;
|
||||||
this.maxScore = maxScore;
|
this.maxScore = maxScore;
|
||||||
this.sortFields = sortFields;
|
this.sortFields = sortFields;
|
||||||
this.collapseField = collapseField;
|
this.collapseField = collapseField;
|
||||||
|
@ -80,7 +80,7 @@ public final class SearchHits implements Writeable, ToXContentFragment, Iterable
|
||||||
|
|
||||||
public SearchHits(StreamInput in) throws IOException {
|
public SearchHits(StreamInput in) throws IOException {
|
||||||
if (in.readBoolean()) {
|
if (in.readBoolean()) {
|
||||||
totalHits = new Total(in);
|
totalHits = Lucene.readTotalHits(in);
|
||||||
} else {
|
} else {
|
||||||
// track_total_hits is false
|
// track_total_hits is false
|
||||||
totalHits = null;
|
totalHits = null;
|
||||||
|
@ -111,7 +111,7 @@ public final class SearchHits implements Writeable, ToXContentFragment, Iterable
|
||||||
final boolean hasTotalHits = totalHits != null;
|
final boolean hasTotalHits = totalHits != null;
|
||||||
out.writeBoolean(hasTotalHits);
|
out.writeBoolean(hasTotalHits);
|
||||||
if (hasTotalHits) {
|
if (hasTotalHits) {
|
||||||
totalHits.writeTo(out);
|
Lucene.writeTotalHits(out, totalHits);
|
||||||
}
|
}
|
||||||
out.writeFloat(maxScore);
|
out.writeFloat(maxScore);
|
||||||
out.writeVInt(hits.length);
|
out.writeVInt(hits.length);
|
||||||
|
@ -131,8 +131,9 @@ public final class SearchHits implements Writeable, ToXContentFragment, Iterable
|
||||||
* The total number of hits for the query or null if the tracking of total hits
|
* The total number of hits for the query or null if the tracking of total hits
|
||||||
* is disabled in the request.
|
* is disabled in the request.
|
||||||
*/
|
*/
|
||||||
|
@Nullable
|
||||||
public TotalHits getTotalHits() {
|
public TotalHits getTotalHits() {
|
||||||
return totalHits == null ? null : totalHits.in;
|
return totalHits;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -197,11 +198,12 @@ public final class SearchHits implements Writeable, ToXContentFragment, Iterable
|
||||||
builder.startObject(Fields.HITS);
|
builder.startObject(Fields.HITS);
|
||||||
boolean totalHitAsInt = params.paramAsBoolean(RestSearchAction.TOTAL_HITS_AS_INT_PARAM, false);
|
boolean totalHitAsInt = params.paramAsBoolean(RestSearchAction.TOTAL_HITS_AS_INT_PARAM, false);
|
||||||
if (totalHitAsInt) {
|
if (totalHitAsInt) {
|
||||||
long total = totalHits == null ? -1 : totalHits.in.value;
|
long total = totalHits == null ? -1 : totalHits.value;
|
||||||
builder.field(Fields.TOTAL, total);
|
builder.field(Fields.TOTAL, total);
|
||||||
} else if (totalHits != null) {
|
} else if (totalHits != null) {
|
||||||
builder.startObject(Fields.TOTAL);
|
builder.startObject(Fields.TOTAL);
|
||||||
totalHits.toXContent(builder, params);
|
builder.field("value", totalHits.value);
|
||||||
|
builder.field("relation", totalHits.relation == Relation.EQUAL_TO ? "eq" : "gte");
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
}
|
}
|
||||||
if (Float.isNaN(maxScore)) {
|
if (Float.isNaN(maxScore)) {
|
||||||
|
@ -313,46 +315,4 @@ public final class SearchHits implements Writeable, ToXContentFragment, Iterable
|
||||||
throw new IllegalArgumentException("invalid total hits relation: " + relation);
|
throw new IllegalArgumentException("invalid total hits relation: " + relation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String printRelation(Relation relation) {
|
|
||||||
return relation == Relation.EQUAL_TO ? "eq" : "gte";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class Total implements Writeable, ToXContentFragment {
|
|
||||||
final TotalHits in;
|
|
||||||
|
|
||||||
Total(TotalHits in) {
|
|
||||||
this.in = Objects.requireNonNull(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
Total(StreamInput in) throws IOException {
|
|
||||||
this.in = Lucene.readTotalHits(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
|
||||||
Lucene.writeTotalHits(out, in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
|
||||||
Total total = (Total) o;
|
|
||||||
return in.value == total.in.value &&
|
|
||||||
in.relation == total.in.relation;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(in.value, in.relation);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
|
||||||
builder.field("value", in.value);
|
|
||||||
builder.field("relation", printRelation(in.relation));
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue