Skip to content

Commit 55e2fd4

Browse files
Add bucketedSort based on int
Follow up on #127968
1 parent 56de057 commit 55e2fd4

File tree

2 files changed

+128
-1
lines changed

2 files changed

+128
-1
lines changed

server/src/main/java/org/elasticsearch/index/fielddata/fieldcomparator/IntValuesComparatorSource.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@
1515
import org.apache.lucene.search.Pruning;
1616
import org.apache.lucene.search.SortField;
1717
import org.apache.lucene.search.comparators.IntComparator;
18+
import org.elasticsearch.common.util.BigArrays;
1819
import org.elasticsearch.core.Nullable;
1920
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
2021
import org.elasticsearch.index.fielddata.IndexNumericFieldData.NumericType;
22+
import org.elasticsearch.search.DocValueFormat;
2123
import org.elasticsearch.search.MultiValueMode;
24+
import org.elasticsearch.search.sort.BucketedSort;
25+
import org.elasticsearch.search.sort.SortOrder;
2226

2327
import java.io.IOException;
2428

@@ -62,6 +66,39 @@ protected NumericDocValues getNumericDocValues(LeafReaderContext context, String
6266
};
6367
}
6468

65-
// TODO: add newBucketedSort based on integer values
69+
@Override
70+
public BucketedSort newBucketedSort(
71+
BigArrays bigArrays,
72+
SortOrder sortOrder,
73+
DocValueFormat format,
74+
int bucketSize,
75+
BucketedSort.ExtraData extra
76+
) {
77+
return new BucketedSort.ForInts(bigArrays, sortOrder, format, bucketSize, extra) {
78+
private final int iMissingValue = (Integer) missingObject(missingValue, sortOrder == SortOrder.DESC);
79+
80+
@Override
81+
public Leaf forLeaf(LeafReaderContext ctx) throws IOException {
82+
return new Leaf(ctx) {
83+
private final NumericDocValues docValues = getNumericDocValues(ctx, iMissingValue);
84+
private int docValue;
85+
86+
@Override
87+
protected boolean advanceExact(int doc) throws IOException {
88+
if (docValues.advanceExact(doc)) {
89+
docValue = (int) docValues.longValue();
90+
return true;
91+
}
92+
return false;
93+
}
94+
95+
@Override
96+
protected int docValue() {
97+
return docValue;
98+
}
99+
};
100+
}
101+
};
102+
}
66103

67104
}

server/src/main/java/org/elasticsearch/search/sort/BucketedSort.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.common.util.BitArray;
1818
import org.elasticsearch.common.util.DoubleArray;
1919
import org.elasticsearch.common.util.FloatArray;
20+
import org.elasticsearch.common.util.IntArray;
2021
import org.elasticsearch.common.util.LongArray;
2122
import org.elasticsearch.core.Releasable;
2223
import org.elasticsearch.core.Releasables;
@@ -714,4 +715,93 @@ protected final boolean docBetterThan(long index) {
714715
}
715716
}
716717
}
718+
719+
public abstract static class ForInts extends BucketedSort {
720+
private IntArray values;
721+
722+
@SuppressWarnings("this-escape")
723+
public ForInts(BigArrays bigArrays, SortOrder sortOrder, DocValueFormat format, int bucketSize, ExtraData extra) {
724+
super(bigArrays, sortOrder, format, bucketSize, extra);
725+
boolean success = false;
726+
try {
727+
values = bigArrays.newIntArray(1, false);
728+
success = true;
729+
} finally {
730+
if (success == false) {
731+
close();
732+
}
733+
}
734+
initGatherOffsets();
735+
}
736+
737+
@Override
738+
public final boolean needsScores() {
739+
return false;
740+
}
741+
742+
@Override
743+
protected final BigArray values() {
744+
return values;
745+
}
746+
747+
@Override
748+
protected final void growValues(long minSize) {
749+
values = bigArrays.grow(values, minSize);
750+
}
751+
752+
@Override
753+
protected final int getNextGatherOffset(long rootIndex) {
754+
return values.get(rootIndex);
755+
}
756+
757+
@Override
758+
protected final void setNextGatherOffset(long rootIndex, int offset) {
759+
values.set(rootIndex, offset);
760+
}
761+
762+
@Override
763+
protected final SortValue getValue(long index) {
764+
return SortValue.from(values.get(index));
765+
}
766+
767+
@Override
768+
protected final boolean betterThan(long lhs, long rhs) {
769+
return getOrder().reverseMul() * Integer.compare(values.get(lhs), values.get(rhs)) < 0;
770+
}
771+
772+
@Override
773+
protected final void swap(long lhs, long rhs) {
774+
int tmp = values.get(lhs);
775+
values.set(lhs, values.get(rhs));
776+
values.set(rhs, tmp);
777+
}
778+
779+
protected abstract class Leaf extends BucketedSort.Leaf {
780+
protected Leaf(LeafReaderContext ctx) {
781+
super(ctx);
782+
}
783+
784+
/**
785+
* Return the value for of this sort for the document to which
786+
* we just {@link #advanceExact(int) moved}. This should be fast
787+
* because it is called twice per competitive hit when in heap
788+
* mode, once for {@link #docBetterThan(long)} and once
789+
* for {@link #setIndexToDocValue(long)}.
790+
*/
791+
protected abstract int docValue();
792+
793+
@Override
794+
public final void setScorer(Scorable scorer) {}
795+
796+
@Override
797+
protected final void setIndexToDocValue(long index) {
798+
values.set(index, docValue());
799+
}
800+
801+
@Override
802+
protected final boolean docBetterThan(long index) {
803+
return getOrder().reverseMul() * Integer.compare(docValue(), values.get(index)) < 0;
804+
}
805+
}
806+
}
717807
}

0 commit comments

Comments
 (0)