Remove per-doc ord collector callback infavor of an iterator

This commit is contained in:
Simon Willnauer 2013-04-21 17:56:59 +02:00
parent c390f9b1a9
commit 7a36bed031
9 changed files with 11 additions and 82 deletions

View File

@ -128,10 +128,5 @@ public class DocIdOrdinals implements Ordinals {
public Iter getIter(int docId) {
return iter.reset(docId + 1);
}
@Override
public void forEachOrdinalInDoc(int docId, OrdinalInDocProc proc) {
proc.onOrdinal(docId, docId + 1);
}
}
}

View File

@ -120,9 +120,5 @@ public class EmptyOrdinals implements Ordinals {
return EmptyIter.INSTANCE;
}
@Override
public void forEachOrdinalInDoc(int docId, OrdinalInDocProc proc) {
proc.onOrdinal(docId, 0);
}
}
}

View File

@ -163,18 +163,6 @@ public final class MultiFlatArrayOrdinals implements Ordinals {
return iter.reset(docId);
}
@Override
public void forEachOrdinalInDoc(int docId, OrdinalInDocProc proc) {
for (int i = 0; i < ordinals.length; i++) {
int ordinal = ordinals[i][docId];
if (ordinal == 0) {
if (i == 0) proc.onOrdinal(docId, 0);
return;
}
proc.onOrdinal(docId, ordinal);
}
}
public static class IterImpl implements Docs.Iter {
private final int[][] ordinals;

View File

@ -119,15 +119,6 @@ public interface Ordinals {
*/
Iter getIter(int docId);
/**
* Iterates over the ordinals associated with a docId. If there are no values,
* a callback with a value 0 will be done.
*/
void forEachOrdinalInDoc(int docId, OrdinalInDocProc proc);
public static interface OrdinalInDocProc {
void onOrdinal(int docId, int ordinal);
}
/**
* An iterator over ordinals values.

View File

@ -143,9 +143,5 @@ public class SingleArrayOrdinals implements Ordinals {
return iter.reset(ordinals[docId]);
}
@Override
public void forEachOrdinalInDoc(int docId, OrdinalInDocProc proc) {
proc.onOrdinal(docId, ordinals[docId]);
}
}
}

View File

@ -147,9 +147,5 @@ public class SinglePackedOrdinals implements Ordinals {
return iter.reset((int) reader.get(docId));
}
@Override
public void forEachOrdinalInDoc(int docId, OrdinalInDocProc proc) {
proc.onOrdinal(docId, (int) reader.get(docId));
}
}
}

View File

@ -180,19 +180,6 @@ public final class SparseMultiArrayOrdinals implements Ordinals {
return iter.reset(docId);
}
@Override
public void forEachOrdinalInDoc(int docId, OrdinalInDocProc proc) {
int pointer = lookup[docId];
if (pointer >= 0) {
proc.onOrdinal(docId, pointer);
} else {
pool.fill(spare, -(pointer + 1));
for (int i = spare.offset; i < spare.length + spare.offset; i++) {
proc.onOrdinal(docId, spare.ints[i]);
}
}
}
class IterImpl implements Docs.Iter {
private final int[] lookup;
private final PositiveIntPool pool;

View File

@ -30,6 +30,7 @@ import org.elasticsearch.common.collect.BoundedTreeSet;
import org.elasticsearch.index.fielddata.BytesValues;
import org.elasticsearch.index.fielddata.IndexFieldData;
import org.elasticsearch.index.fielddata.ordinals.Ordinals;
import org.elasticsearch.index.fielddata.ordinals.Ordinals.Docs.Iter;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.terms.TermsFacet;
@ -198,6 +199,7 @@ public class TermsStringOrdinalsFacetExecutor extends FacetExecutor {
private long total;
private BytesValues.WithOrdinals values;
private ReaderAggregator current;
private Ordinals.Docs ordinals;
@Override
public void setNextReader(AtomicReaderContext context) throws IOException {
@ -210,11 +212,17 @@ public class TermsStringOrdinalsFacetExecutor extends FacetExecutor {
}
values = indexFieldData.load(context).getBytesValues();
current = new ReaderAggregator(values, ordinalsCacheAbove);
ordinals = values.ordinals();
}
@Override
public void collect(int doc) throws IOException {
values.ordinals().forEachOrdinalInDoc(doc, current);
Iter iter = ordinals.getIter(doc);
int ord = iter.next();
current.onOrdinal(doc, ord);
while((ord = iter.next()) != 0) {
current.onOrdinal(doc, ord);
}
}
@Override
@ -233,7 +241,7 @@ public class TermsStringOrdinalsFacetExecutor extends FacetExecutor {
}
}
public static class ReaderAggregator implements Ordinals.Docs.OrdinalInDocProc {
public static final class ReaderAggregator {
final BytesValues.WithOrdinals values;
final int[] counts;
@ -254,8 +262,7 @@ public class TermsStringOrdinalsFacetExecutor extends FacetExecutor {
}
}
@Override
public void onOrdinal(int docId, int ordinal) {
final void onOrdinal(int docId, int ordinal) {
counts[ordinal]++;
total++;
}

View File

@ -122,7 +122,6 @@ public abstract class MultiOrdinalsTests {
array[i] = docOrds.get(i);
}
assertIter(docs.getIter(docId), array);
docs.forEachOrdinalInDoc(docId, assertOrdinalInProcDoc(array));
}
for (int i = docId + 1; i < ordAndId.id; i++) {
assertThat(docs.getOrd(i), equalTo(0));
@ -210,7 +209,6 @@ public abstract class MultiOrdinalsTests {
assertThat(ref.ints[1], equalTo(4));
assertThat(ref.length, equalTo(2));
assertIter(docs.getIter(0), 2, 4);
docs.forEachOrdinalInDoc(0, assertOrdinalInProcDoc(2, 4));
// Document 2
assertThat(docs.getOrd(1), equalTo(1));
@ -219,7 +217,6 @@ public abstract class MultiOrdinalsTests {
assertThat(ref.ints[0], equalTo(1));
assertThat(ref.length, equalTo(1));
assertIter(docs.getIter(1), 1);
docs.forEachOrdinalInDoc(1, assertOrdinalInProcDoc(1));
// Document 3
assertThat(docs.getOrd(2), equalTo(3));
@ -228,7 +225,6 @@ public abstract class MultiOrdinalsTests {
assertThat(ref.ints[0], equalTo(3));
assertThat(ref.length, equalTo(1));
assertIter(docs.getIter(2), 3);
docs.forEachOrdinalInDoc(2, assertOrdinalInProcDoc(3));
// Document 4
assertThat(docs.getOrd(3), equalTo(0));
@ -236,7 +232,6 @@ public abstract class MultiOrdinalsTests {
assertThat(ref.offset, equalTo(0));
assertThat(ref.length, equalTo(0));
assertIter(docs.getIter(3));
docs.forEachOrdinalInDoc(3, assertOrdinalInProcDoc(0));
// Document 5
assertThat(docs.getOrd(4), equalTo(1));
@ -249,7 +244,6 @@ public abstract class MultiOrdinalsTests {
assertThat(ref.ints[4], equalTo(6));
assertThat(ref.length, equalTo(5));
assertIter(docs.getIter(4), 1, 3, 4, 5, 6);
docs.forEachOrdinalInDoc(4, assertOrdinalInProcDoc(1, 3, 4, 5, 6));
// Document 6
assertThat(docs.getOrd(5), equalTo(1));
@ -261,7 +255,6 @@ public abstract class MultiOrdinalsTests {
assertThat(ref.ints[i], equalTo(i + 1));
}
assertIter(docs.getIter(5), expectedOrds);
docs.forEachOrdinalInDoc(5, assertOrdinalInProcDoc(expectedOrds));
assertThat(ref.length, equalTo(maxOrds));
// Document 7
@ -274,7 +267,6 @@ public abstract class MultiOrdinalsTests {
assertThat(ref.ints[i], equalTo(i + 1));
}
assertIter(docs.getIter(6), expectedOrds);
docs.forEachOrdinalInDoc(6, assertOrdinalInProcDoc(expectedOrds));
assertThat(ref.length, equalTo(maxOrds));
}
@ -286,23 +278,4 @@ public abstract class MultiOrdinalsTests {
assertThat(iter.next(), equalTo(0)); // Just checking it stays 0
}
protected static Ordinals.Docs.OrdinalInDocProc assertOrdinalInProcDoc(int... expectedOrdinals) {
return new AssertingOrdinalInDocProc(expectedOrdinals);
}
static class AssertingOrdinalInDocProc implements Ordinals.Docs.OrdinalInDocProc {
private final int[] expectedOrdinals;
private int index = 0;
AssertingOrdinalInDocProc(int... expectedOrdinals) {
this.expectedOrdinals = expectedOrdinals;
}
@Override
public void onOrdinal(int docId, int ordinal) {
assertThat(ordinal, equalTo(expectedOrdinals[index++]));
}
}
}