Skip to content

Commit a2a01f8

Browse files
Support retrieving doc values of unsigned long field (opensearch-project#16543)
* Support retrieving doc values of unsigned long field Signed-off-by: panguixin <panguixin@bytedance.com> * add test Signed-off-by: panguixin <panguixin@bytedance.com> * changelog Signed-off-by: panguixin <panguixin@bytedance.com> * randomize test Signed-off-by: panguixin <panguixin@bytedance.com> --------- Signed-off-by: panguixin <panguixin@bytedance.com>
1 parent 0363aa7 commit a2a01f8

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
2828
- Revert changes to upload remote state manifest using minimum codec version([#16403](https://github.com/opensearch-project/OpenSearch/pull/16403))
2929
- Ensure index templates are not applied to system indices ([#16418](https://github.com/opensearch-project/OpenSearch/pull/16418))
3030
- Remove resource usages object from search response headers ([#16532](https://github.com/opensearch-project/OpenSearch/pull/16532))
31+
- Support retrieving doc values of unsigned long field ([#16543](https://github.com/opensearch-project/OpenSearch/pull/16543))
3132

3233
### Security
3334

server/src/main/java/org/opensearch/index/fielddata/plain/SortedNumericIndexFieldData.java

+23
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.lucene.sandbox.document.HalfFloatPoint;
4242
import org.apache.lucene.util.Accountable;
4343
import org.apache.lucene.util.NumericUtils;
44+
import org.opensearch.common.Numbers;
4445
import org.opensearch.common.time.DateUtils;
4546
import org.opensearch.core.indices.breaker.CircuitBreakerService;
4647
import org.opensearch.index.fielddata.FieldData;
@@ -573,6 +574,28 @@ public final SortedBinaryDocValues getBytesValues() {
573574
return FieldData.toUnsignedString(getLongValues());
574575
}
575576

577+
@Override
578+
public DocValueFetcher.Leaf getLeafValueFetcher(DocValueFormat format) {
579+
SortedNumericDocValues values = getLongValues();
580+
return new DocValueFetcher.Leaf() {
581+
@Override
582+
public boolean advanceExact(int docId) throws IOException {
583+
return values.advanceExact(docId);
584+
}
585+
586+
@Override
587+
public int docValueCount() {
588+
return values.docValueCount();
589+
}
590+
591+
@Override
592+
public Object nextValue() throws IOException {
593+
final BigInteger value = Numbers.toUnsignedBigInteger(values.nextValue());
594+
return format.format(value);
595+
}
596+
};
597+
}
598+
576599
@Override
577600
public long ramBytesUsed() {
578601
return 0L;

server/src/test/java/org/opensearch/index/mapper/NumberFieldTypeTests.java

+25
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
import org.opensearch.index.mapper.NumberFieldMapper.NumberFieldType;
7474
import org.opensearch.index.mapper.NumberFieldMapper.NumberType;
7575
import org.opensearch.index.query.QueryShardContext;
76+
import org.opensearch.search.DocValueFormat;
7677
import org.opensearch.search.MultiValueMode;
7778
import org.opensearch.search.query.BitmapDocValuesQuery;
7879
import org.junit.Before;
@@ -981,4 +982,28 @@ public void testBitmapQuery() throws IOException {
981982
NumberFieldType finalFt = ft;
982983
assertThrows(IllegalArgumentException.class, () -> finalFt.bitmapQuery(bitmap));
983984
}
985+
986+
public void testFetchUnsignedLongDocValues() throws IOException {
987+
Directory dir = newDirectory();
988+
IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(null));
989+
Document doc = new Document();
990+
final BigInteger expectedValue = randomUnsignedLong();
991+
doc.add(new SortedNumericDocValuesField("ul", expectedValue.longValue()));
992+
w.addDocument(doc);
993+
try (DirectoryReader reader = DirectoryReader.open(w)) {
994+
final NumberFieldType ft = new NumberFieldType("ul", NumberType.UNSIGNED_LONG);
995+
IndexNumericFieldData fielddata = (IndexNumericFieldData) ft.fielddataBuilder(
996+
"index",
997+
() -> { throw new UnsupportedOperationException(); }
998+
).build(null, null);
999+
assertEquals(IndexNumericFieldData.NumericType.UNSIGNED_LONG, fielddata.getNumericType());
1000+
DocValueFetcher.Leaf fetcher = fielddata.load(reader.leaves().get(0)).getLeafValueFetcher(DocValueFormat.UNSIGNED_LONG);
1001+
assertTrue(fetcher.advanceExact(0));
1002+
assertEquals(1, fetcher.docValueCount());
1003+
final Object value = fetcher.nextValue();
1004+
assertTrue(value instanceof BigInteger);
1005+
assertEquals(expectedValue, value);
1006+
}
1007+
IOUtils.close(w, dir);
1008+
}
9841009
}

0 commit comments

Comments
 (0)