mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-01 16:39:11 +00:00
add getMaxOrd, and properly document the difference between it and numOrds
This commit is contained in:
parent
6f1932ab67
commit
a8c9e580ed
@ -68,6 +68,11 @@ public class DocIdOrdinals implements Ordinals {
|
||||
return numDocs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return numDocs + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Ordinals.Docs ordinals() {
|
||||
return new Docs(this);
|
||||
@ -98,6 +103,11 @@ public class DocIdOrdinals implements Ordinals {
|
||||
return parent.getNumOrds();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return parent.getMaxOrd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMultiValued() {
|
||||
return false;
|
||||
|
@ -61,6 +61,11 @@ public class EmptyOrdinals implements Ordinals {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Docs ordinals() {
|
||||
return new Docs(this);
|
||||
@ -86,7 +91,12 @@ public class EmptyOrdinals implements Ordinals {
|
||||
|
||||
@Override
|
||||
public int getNumOrds() {
|
||||
return parent.getNumOrds();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -33,6 +33,7 @@ public final class MultiFlatArrayOrdinals implements Ordinals {
|
||||
private final int[][] ordinals;
|
||||
private final int numDocs;
|
||||
private final int numOrds;
|
||||
private final int maxOrd;
|
||||
|
||||
private long size = -1;
|
||||
|
||||
@ -41,6 +42,7 @@ public final class MultiFlatArrayOrdinals implements Ordinals {
|
||||
this.ordinals = ordinals;
|
||||
this.numDocs = ordinals[0].length;
|
||||
this.numOrds = numOrds;
|
||||
this.maxOrd = numOrds + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -81,6 +83,11 @@ public final class MultiFlatArrayOrdinals implements Ordinals {
|
||||
return numOrds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return this.maxOrd;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Docs ordinals() {
|
||||
return new Docs(this, ordinals);
|
||||
@ -116,6 +123,11 @@ public final class MultiFlatArrayOrdinals implements Ordinals {
|
||||
return parent.getNumOrds();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return parent.getMaxOrd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMultiValued() {
|
||||
return true;
|
||||
|
@ -52,10 +52,16 @@ public interface Ordinals {
|
||||
int getNumDocs();
|
||||
|
||||
/**
|
||||
* The number of ordinals.
|
||||
* The number of ordinals, excluding the "0" ordinal indicating a missing value.
|
||||
*/
|
||||
int getNumOrds();
|
||||
|
||||
/**
|
||||
* Returns total unique ord count; this includes +1 for
|
||||
* the null ord (always 0).
|
||||
*/
|
||||
int getMaxOrd();
|
||||
|
||||
/**
|
||||
* Returns a lightweight (non thread safe) view iterator of the ordinals.
|
||||
*/
|
||||
@ -80,10 +86,16 @@ public interface Ordinals {
|
||||
int getNumDocs();
|
||||
|
||||
/**
|
||||
* The number of ordinals.
|
||||
* The number of ordinals, excluding the "0" ordinal (indicating a missing value).
|
||||
*/
|
||||
int getNumOrds();
|
||||
|
||||
/**
|
||||
* Returns total unique ord count; this includes +1 for
|
||||
* the null ord (always 0).
|
||||
*/
|
||||
int getMaxOrd();
|
||||
|
||||
/**
|
||||
* Is one of the docs maps to more than one ordinal?
|
||||
*/
|
||||
|
@ -29,12 +29,14 @@ public class SingleArrayOrdinals implements Ordinals {
|
||||
// ordinals with value 0 indicates no value
|
||||
private final int[] ordinals;
|
||||
private final int numOrds;
|
||||
private final int maxOrd;
|
||||
|
||||
private long size = -1;
|
||||
|
||||
public SingleArrayOrdinals(int[] ordinals, int numOrds) {
|
||||
this.ordinals = ordinals;
|
||||
this.numOrds = numOrds;
|
||||
this.maxOrd = numOrds + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -70,6 +72,11 @@ public class SingleArrayOrdinals implements Ordinals {
|
||||
return numOrds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return maxOrd;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Docs ordinals() {
|
||||
return new Docs(this, ordinals);
|
||||
@ -103,6 +110,11 @@ public class SingleArrayOrdinals implements Ordinals {
|
||||
return parent.getNumOrds();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return parent.getMaxOrd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMultiValued() {
|
||||
return false;
|
||||
|
@ -30,12 +30,14 @@ public class SinglePackedOrdinals implements Ordinals {
|
||||
// ordinals with value 0 indicates no value
|
||||
private final PackedInts.Reader reader;
|
||||
private final int numOrds;
|
||||
private final int maxOrd;
|
||||
|
||||
private long size = -1;
|
||||
|
||||
public SinglePackedOrdinals(PackedInts.Reader reader, int numOrds) {
|
||||
this.reader = reader;
|
||||
this.numOrds = numOrds;
|
||||
this.maxOrd = numOrds + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -74,6 +76,11 @@ public class SinglePackedOrdinals implements Ordinals {
|
||||
return numOrds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return maxOrd;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Docs ordinals() {
|
||||
return new Docs(this, reader);
|
||||
@ -107,6 +114,11 @@ public class SinglePackedOrdinals implements Ordinals {
|
||||
return parent.getNumOrds();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return parent.getMaxOrd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMultiValued() {
|
||||
return false;
|
||||
|
@ -33,17 +33,19 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
private final int[] lookup;
|
||||
private final PositiveIntPool pool;
|
||||
private final int numOrds;
|
||||
private final int maxOrd;
|
||||
private final int numDocs;
|
||||
private long size;
|
||||
|
||||
|
||||
public SparseMultiArrayOrdinals(OrdinalsBuilder builder, int maxSize) {
|
||||
int blockShift = Math.min(floorPow2(builder.getTotalNumOrds()<<1), floorPow2(maxSize));
|
||||
int blockShift = Math.min(floorPow2(builder.getTotalNumOrds() << 1), floorPow2(maxSize));
|
||||
this.pool = new PositiveIntPool(Math.max(4, blockShift));
|
||||
this.numDocs = builder.maxDoc();
|
||||
|
||||
|
||||
|
||||
|
||||
this.lookup = new int[numDocs];
|
||||
this.numOrds = builder.getNumOrds();
|
||||
this.maxOrd = numOrds + 1;
|
||||
IntArrayRef spare;
|
||||
for (int doc = 0; doc < numDocs; doc++) {
|
||||
spare = builder.docOrds(doc);
|
||||
@ -54,11 +56,11 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
lookup[doc] = spare.values[spare.start];
|
||||
} else {
|
||||
int offset = pool.put(spare);
|
||||
lookup[doc] = -(offset)-1;
|
||||
lookup[doc] = -(offset) - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static int floorPow2(int number) {
|
||||
return 31 - Integer.numberOfLeadingZeros(number);
|
||||
}
|
||||
@ -96,6 +98,11 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
return numOrds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return maxOrd;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Docs ordinals() {
|
||||
return new Docs(this, lookup, pool);
|
||||
@ -132,6 +139,11 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
return parent.getNumOrds();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxOrd() {
|
||||
return parent.getMaxOrd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMultiValued() {
|
||||
return true;
|
||||
@ -141,7 +153,7 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
public int getOrd(int docId) {
|
||||
int pointer = lookup[docId];
|
||||
if (pointer < 0) {
|
||||
return pool.getFirstFromOffset(-(pointer+1));
|
||||
return pool.getFirstFromOffset(-(pointer + 1));
|
||||
}
|
||||
return pointer;
|
||||
}
|
||||
@ -157,7 +169,7 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
spare.values[0] = pointer;
|
||||
return spare;
|
||||
} else {
|
||||
pool.fill(spare, -(pointer+1));
|
||||
pool.fill(spare, -(pointer + 1));
|
||||
return spare;
|
||||
}
|
||||
}
|
||||
@ -173,7 +185,7 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
if (pointer >= 0) {
|
||||
proc.onOrdinal(docId, pointer);
|
||||
} else {
|
||||
pool.fill(spare, -(pointer+1));
|
||||
pool.fill(spare, -(pointer + 1));
|
||||
for (int i = spare.start; i < spare.end; i++) {
|
||||
proc.onOrdinal(docId, spare.values[i]);
|
||||
}
|
||||
@ -194,7 +206,7 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
public IterImpl reset(int docId) {
|
||||
final int pointer = lookup[docId];
|
||||
if (pointer < 0) {
|
||||
pool.fill(slice, -(pointer+1));
|
||||
pool.fill(slice, -(pointer + 1));
|
||||
} else {
|
||||
slice.values[0] = pointer;
|
||||
slice.start = 0;
|
||||
@ -208,7 +220,7 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
|
||||
public int next() {
|
||||
if (valuesOffset >= slice.end) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return slice.values[slice.start + (valuesOffset++)];
|
||||
}
|
||||
}
|
||||
|
@ -221,13 +221,13 @@ public class TermsStringOrdinalsFacetCollector extends AbstractFacetCollector {
|
||||
int position = 0;
|
||||
BytesRef current;
|
||||
int total;
|
||||
private final int numOrds;
|
||||
private final int maxOrd;
|
||||
|
||||
public ReaderAggregator(BytesValues.WithOrdinals values) {
|
||||
this.values = values;
|
||||
this.numOrds = values.ordinals().getNumOrds();
|
||||
this.maxOrd = values.ordinals().getMaxOrd();
|
||||
|
||||
this.counts = CacheRecycler.popIntArray(numOrds);
|
||||
this.counts = CacheRecycler.popIntArray(maxOrd);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -237,7 +237,7 @@ public class TermsStringOrdinalsFacetCollector extends AbstractFacetCollector {
|
||||
}
|
||||
|
||||
public boolean nextPosition() {
|
||||
if (++position > numOrds) {
|
||||
if (++position >= maxOrd) {
|
||||
return false;
|
||||
}
|
||||
current = values.getValueByOrd(position);
|
||||
|
@ -19,34 +19,28 @@
|
||||
|
||||
package org.elasticsearch.test.unit.index.fielddata.ordinals;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||
import org.elasticsearch.index.fielddata.ordinals.Ordinals;
|
||||
import org.elasticsearch.index.fielddata.ordinals.OrdinalsBuilder;
|
||||
import org.elasticsearch.index.fielddata.util.IntArrayRef;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
|
||||
/**
|
||||
*/
|
||||
public abstract class MultiOrdinalsTests {
|
||||
|
||||
|
||||
protected final Ordinals creationMultiOrdinals(OrdinalsBuilder builder) {
|
||||
return this.creationMultiOrdinals(builder, ImmutableSettings.builder());
|
||||
}
|
||||
|
||||
|
||||
protected abstract Ordinals creationMultiOrdinals(OrdinalsBuilder builder, ImmutableSettings.Builder settings);
|
||||
|
||||
|
||||
@Test
|
||||
public void testRandomValues() {
|
||||
Random random = new Random(100);
|
||||
@ -65,12 +59,14 @@ public abstract class MultiOrdinalsTests {
|
||||
public int compare(OrdAndId o1, OrdAndId o2) {
|
||||
if (o1.ord < o2.ord) {
|
||||
return -1;
|
||||
} if (o1.ord == o2.ord) {
|
||||
}
|
||||
if (o1.ord == o2.ord) {
|
||||
if (o1.id < o2.id) {
|
||||
return -1;
|
||||
} if (o1.id > o2.id) {
|
||||
}
|
||||
if (o1.id > o2.id) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
@ -84,19 +80,21 @@ public abstract class MultiOrdinalsTests {
|
||||
}
|
||||
builder.addDoc(ordAndId.id);
|
||||
}
|
||||
|
||||
|
||||
Collections.sort(ordsAndIds, new Comparator<OrdAndId>() {
|
||||
|
||||
@Override
|
||||
public int compare(OrdAndId o1, OrdAndId o2) {
|
||||
if (o1.id < o2.id) {
|
||||
return -1;
|
||||
} if (o1.id == o2.id) {
|
||||
}
|
||||
if (o1.id == o2.id) {
|
||||
if (o1.ord < o2.ord) {
|
||||
return -1;
|
||||
} if (o1.ord > o2.ord) {
|
||||
}
|
||||
if (o1.ord > o2.ord) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
@ -114,7 +112,7 @@ public abstract class MultiOrdinalsTests {
|
||||
assertThat(docs.getOrd(docId), equalTo(docOrds.get(0)));
|
||||
IntArrayRef ref = docs.getOrds(docId);
|
||||
assertThat(ref.start, equalTo(0));
|
||||
|
||||
|
||||
for (int i = ref.start; i < ref.end; i++) {
|
||||
assertThat(ref.values[i], equalTo(docOrds.get(i)));
|
||||
}
|
||||
@ -122,10 +120,10 @@ public abstract class MultiOrdinalsTests {
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
array[i] = docOrds.get(i);
|
||||
}
|
||||
assertIter(docs.getIter(docId), array);
|
||||
assertIter(docs.getIter(docId), array);
|
||||
docs.forEachOrdinalInDoc(docId, assertOrdinalInProcDoc(array));
|
||||
}
|
||||
for (int i = docId+1; i < ordAndId.id; i++) {
|
||||
for (int i = docId + 1; i < ordAndId.id; i++) {
|
||||
assertThat(docs.getOrd(i), equalTo(0));
|
||||
}
|
||||
docId = ordAndId.id;
|
||||
@ -134,13 +132,13 @@ public abstract class MultiOrdinalsTests {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static class OrdAndId {
|
||||
final int ord;
|
||||
final int id;
|
||||
|
||||
|
||||
public OrdAndId(int ord, int id) {
|
||||
this.ord = ord;
|
||||
this.id = id;
|
||||
@ -193,12 +191,13 @@ public abstract class MultiOrdinalsTests {
|
||||
builder.nextOrdinal();
|
||||
builder.addDoc(5).addDoc(6);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Ordinals ordinals = creationMultiOrdinals(builder);
|
||||
Ordinals.Docs docs = ordinals.ordinals();
|
||||
assertThat(docs.getNumDocs(), equalTo(maxDoc));
|
||||
assertThat(docs.getNumOrds(), equalTo(maxOrds)); // Includes null ord
|
||||
assertThat(docs.getNumOrds(), equalTo(maxOrds));
|
||||
assertThat(docs.getMaxOrd(), equalTo(maxOrds + 1)); // Includes null ord
|
||||
assertThat(docs.isMultiValued(), equalTo(true));
|
||||
|
||||
// Document 1
|
||||
|
Loading…
x
Reference in New Issue
Block a user