add getMaxOrd, and properly document the difference between it and numOrds

This commit is contained in:
Shay Banon 2013-02-01 16:13:13 +01:00
parent 6f1932ab67
commit a8c9e580ed
9 changed files with 125 additions and 46 deletions

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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?
*/

View File

@ -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;

View File

@ -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;

View File

@ -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++)];
}
}

View File

@ -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);

View File

@ -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