clean-up long values

This commit is contained in:
Simon Willnauer 2013-03-29 16:10:27 +01:00
parent 5aedf74fb0
commit d5c271acf5
17 changed files with 289 additions and 1012 deletions

View File

@ -20,6 +20,7 @@
package org.elasticsearch.index.fielddata; package org.elasticsearch.index.fielddata;
import org.elasticsearch.ElasticSearchIllegalStateException; import org.elasticsearch.ElasticSearchIllegalStateException;
import org.elasticsearch.index.fielddata.LongValues.Iter;
import org.elasticsearch.index.fielddata.util.DoubleArrayRef; import org.elasticsearch.index.fielddata.util.DoubleArrayRef;
import org.elasticsearch.index.fielddata.util.IntArrayRef; import org.elasticsearch.index.fielddata.util.IntArrayRef;
import org.elasticsearch.index.fielddata.util.LongArrayRef; import org.elasticsearch.index.fielddata.util.LongArrayRef;
@ -136,7 +137,6 @@ public interface DoubleValues {
private final LongValues values; private final LongValues values;
private final ValueIter iter = new ValueIter(); private final ValueIter iter = new ValueIter();
private final Proc proc = new Proc();
public LongBased(LongValues values) { public LongBased(LongValues values) {
this.values = values; this.values = values;
@ -172,7 +172,14 @@ public interface DoubleValues {
@Override @Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) { public void forEachValueInDoc(int docId, ValueInDocProc proc) {
values.forEachValueInDoc(docId, this.proc.reset(proc)); if (values.hasValue(docId)) {
final LongValues.Iter longIter = values.getIter(docId);
while(longIter.hasNext()) {
proc.onValue(docId, longIter.next());
}
} else {
proc.onMissing(docId);
}
} }
static class ValueIter implements Iter { static class ValueIter implements Iter {
@ -195,26 +202,6 @@ public interface DoubleValues {
} }
} }
static class Proc implements LongValues.ValueInDocProc {
private ValueInDocProc proc;
private Proc reset(ValueInDocProc proc) {
this.proc = proc;
return this;
}
@Override
public void onValue(int docId, long value) {
this.proc.onValue(docId, (double) value);
}
@Override
public void onMissing(int docId) {
this.proc.onMissing(docId);
}
}
} }
public static class FilteredDoubleValues implements DoubleValues { public static class FilteredDoubleValues implements DoubleValues {

View File

@ -20,46 +20,116 @@
package org.elasticsearch.index.fielddata; package org.elasticsearch.index.fielddata;
import org.elasticsearch.ElasticSearchIllegalStateException; import org.elasticsearch.ElasticSearchIllegalStateException;
import org.elasticsearch.index.fielddata.util.LongArrayRef; import org.elasticsearch.index.fielddata.ordinals.Ordinals;
import org.elasticsearch.index.fielddata.ordinals.Ordinals.Docs;
/** /**
*/ */
public interface LongValues { public abstract class LongValues {
static final LongValues EMPTY = new Empty(); public static final LongValues EMPTY = new Empty();
private final boolean multiValued;
protected final Iter.Single iter = new Iter.Single();
protected LongValues(boolean multiValued) {
this.multiValued = multiValued;
}
/** /**
* Is one of the documents in this field data values is multi valued? * Is one of the documents in this field data values is multi valued?
*/ */
boolean isMultiValued(); public final boolean isMultiValued() {
return multiValued;
}
/** /**
* Is there a value for this doc? * Is there a value for this doc?
*/ */
boolean hasValue(int docId); public abstract boolean hasValue(int docId);
long getValue(int docId); public abstract long getValue(int docId);
long getValueMissing(int docId, long missingValue); public long getValueMissing(int docId, long missingValue) {
if (hasValue(docId)) {
Iter getIter(int docId); return getValue(docId);
}
void forEachValueInDoc(int docId, ValueInDocProc proc); return missingValue;
}
static interface ValueInDocProc {
public Iter getIter(int docId) {
void onValue(int docId, long value); assert !isMultiValued();
if (hasValue(docId)) {
void onMissing(int docId); return iter.reset(getValue(docId));
} else {
return Iter.Empty.INSTANCE;
}
} }
static interface Iter {
public static abstract class DenseLongValues extends LongValues {
protected DenseLongValues(boolean multiValued) {
super(multiValued);
}
@Override
public final boolean hasValue(int docId) {
return true;
}
public final long getValueMissing(int docId, long missingValue) {
assert hasValue(docId);
assert !isMultiValued();
return getValue(docId);
}
public final Iter getIter(int docId) {
assert hasValue(docId);
assert !isMultiValued();
return iter.reset(getValue(docId));
}
}
public static abstract class OrdBasedLongValues extends LongValues {
protected final Docs ordinals;
private final Iter.Multi iter;
protected OrdBasedLongValues(Ordinals.Docs ordinals) {
super(ordinals.isMultiValued());
this.ordinals = ordinals;
iter = new Iter.Multi(this);
}
@Override
public final boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public final long getValue(int docId) {
return getByOrd(ordinals.getOrd(docId));
}
protected abstract long getByOrd(int ord);
@Override
public final Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
}
public static interface Iter {
boolean hasNext(); boolean hasNext();
long next(); long next();
static class Empty implements Iter { public static class Empty implements Iter {
public static final Empty INSTANCE = new Empty(); public static final Empty INSTANCE = new Empty();
@ -74,7 +144,7 @@ public interface LongValues {
} }
} }
static class Single implements Iter { static class Single implements Iter {
public long value; public long value;
public boolean done; public boolean done;
@ -97,12 +167,41 @@ public interface LongValues {
return value; return value;
} }
} }
static class Multi implements Iter {
private org.elasticsearch.index.fielddata.ordinals.Ordinals.Docs.Iter ordsIter;
private int ord;
private OrdBasedLongValues values;
public Multi(OrdBasedLongValues values) {
this.values = values;
}
public Multi reset(Ordinals.Docs.Iter ordsIter) {
this.ordsIter = ordsIter;
this.ord = ordsIter.next();
return this;
}
@Override
public boolean hasNext() {
return ord != 0;
}
@Override
public long next() {
long value = values.getByOrd(ord);
ord = ordsIter.next();
return value;
}
}
} }
static class Empty implements LongValues { static class Empty extends LongValues {
@Override
public boolean isMultiValued() { public Empty() {
return false; super(false);
} }
@Override @Override
@ -115,34 +214,22 @@ public interface LongValues {
throw new ElasticSearchIllegalStateException("Can't retrieve a value from an empty LongValues"); throw new ElasticSearchIllegalStateException("Can't retrieve a value from an empty LongValues");
} }
@Override
public long getValueMissing(int docId, long missingValue) {
return missingValue;
}
@Override @Override
public Iter getIter(int docId) { public Iter getIter(int docId) {
return Iter.Empty.INSTANCE; return Iter.Empty.INSTANCE;
} }
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onMissing(docId);
}
} }
public static class FilteredLongValues implements LongValues { public static class FilteredLongValues extends LongValues {
protected final LongValues delegate; protected final LongValues delegate;
public FilteredLongValues(LongValues delegate) { public FilteredLongValues(LongValues delegate) {
super(delegate.isMultiValued());
this.delegate = delegate; this.delegate = delegate;
} }
public boolean isMultiValued() {
return delegate.isMultiValued();
}
public boolean hasValue(int docId) { public boolean hasValue(int docId) {
return delegate.hasValue(docId); return delegate.hasValue(docId);
} }
@ -151,17 +238,9 @@ public interface LongValues {
return delegate.getValue(docId); return delegate.getValue(docId);
} }
public long getValueMissing(int docId, long missingValue) {
return delegate.getValueMissing(docId, missingValue);
}
public Iter getIter(int docId) { public Iter getIter(int docId) {
return delegate.getIter(docId); return delegate.getIter(docId);
} }
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
delegate.forEachValueInDoc(docId, proc);
}
} }
} }

View File

@ -222,7 +222,6 @@ public interface StringValues {
private final StringArrayRef arrayScratch = new StringArrayRef(new String[1], 1); private final StringArrayRef arrayScratch = new StringArrayRef(new String[1], 1);
private final ValuesIter valuesIter = new ValuesIter(); private final ValuesIter valuesIter = new ValuesIter();
private final Proc proc = new Proc();
public LongBased(LongValues values) { public LongBased(LongValues values) {
this.values = values; this.values = values;
@ -254,7 +253,14 @@ public interface StringValues {
@Override @Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) { public void forEachValueInDoc(int docId, ValueInDocProc proc) {
values.forEachValueInDoc(docId, this.proc.reset(proc)); if (values.hasValue(docId)) {
final LongValues.Iter longIter = values.getIter(docId);
while(longIter.hasNext()) {
proc.onValue(docId, Long.toString(longIter.next()));
}
} else {
proc.onMissing(docId);
}
} }
static class ValuesIter implements Iter { static class ValuesIter implements Iter {
@ -277,25 +283,7 @@ public interface StringValues {
} }
} }
static class Proc implements LongValues.ValueInDocProc {
private ValueInDocProc proc;
private Proc reset(ValueInDocProc proc) {
this.proc = proc;
return this;
}
@Override
public void onValue(int docId, long value) {
proc.onValue(docId, Long.toString(value));
}
@Override
public void onMissing(int docId) {
proc.onMissing(docId);
}
}
} }
public interface WithOrdinals extends StringValues { public interface WithOrdinals extends StringValues {

View File

@ -140,90 +140,20 @@ public abstract class ByteArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values, ordinals.ordinals()); return new DoubleValues(values, ordinals.ordinals());
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.OrdBasedLongValues {
private final byte[] values; private final byte[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
LongValues(byte[] values, Ordinals.Docs ordinals) { LongValues(byte[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values; this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
} }
@Override @Override
public boolean isMultiValued() { protected long getByOrd(int ord) {
return ordinals.isMultiValued(); return (long) values[ord];
} }
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public long getValue(int docId) {
return (long) values[ordinals.getOrd(docId)];
}
@Override
public long getValueMissing(int docId, long missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (long) values[ord];
}
}
@Override
public Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
Ordinals.Docs.Iter iter = ordinals.getIter(docId);
int ord = iter.next();
if (ord == 0) {
proc.onMissing(docId);
return;
}
do {
proc.onValue(docId, (long) values[ord]);
} while ((ord = iter.next()) != 0);
}
static class ValuesIter implements Iter {
private final byte[] values;
private Ordinals.Docs.Iter ordsIter;
private int ord;
ValuesIter(byte[] values) {
this.values = values;
}
public ValuesIter reset(Ordinals.Docs.Iter ordsIter) {
this.ordsIter = ordsIter;
this.ord = ordsIter.next();
return this;
}
@Override
public boolean hasNext() {
return ord != 0;
}
@Override
public long next() {
byte value = values[ord];
ord = ordsIter.next();
return (long) value;
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -370,23 +300,17 @@ public abstract class ByteArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values, set); return new DoubleValues(values, set);
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues {
private final byte[] values; private final byte[] values;
private final FixedBitSet set; private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
LongValues(byte[] values, FixedBitSet set) { LongValues(byte[] values, FixedBitSet set) {
super(false);
this.values = values; this.values = values;
this.set = set; this.set = set;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override @Override
public boolean hasValue(int docId) { public boolean hasValue(int docId) {
return set.get(docId); return set.get(docId);
@ -397,32 +321,6 @@ public abstract class ByteArrayAtomicFieldData extends AtomicNumericFieldData {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
if (set.get(docId)) {
return (long) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((long) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (long) values[docId]);
} else {
proc.onMissing(docId);
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -538,44 +436,21 @@ public abstract class ByteArrayAtomicFieldData extends AtomicNumericFieldData {
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.DenseLongValues {
private final byte[] values; private final byte[] values;
private final Iter.Single iter = new Iter.Single();
LongValues(byte[] values) { LongValues(byte[] values) {
super(false);
this.values = values; this.values = values;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override @Override
public long getValue(int docId) { public long getValue(int docId) {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
return (long) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((long) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (long) values[docId]);
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {

View File

@ -232,88 +232,18 @@ public abstract class DoubleArrayAtomicFieldData extends AtomicNumericFieldData
} }
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.OrdBasedLongValues {
private final double[] values; private final double[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
LongValues(double[] values, Ordinals.Docs ordinals) { LongValues(double[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values; this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
} }
@Override @Override
public boolean isMultiValued() { protected final long getByOrd(int ord) {
return ordinals.isMultiValued(); return (long)values[ord];
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public long getValue(int docId) {
return (long) values[ordinals.getOrd(docId)];
}
@Override
public long getValueMissing(int docId, long missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (long) values[ord];
}
}
@Override
public Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
Ordinals.Docs.Iter iter = ordinals.getIter(docId);
int ord = iter.next();
if (ord == 0) {
proc.onMissing(docId);
return;
}
do {
proc.onValue(docId, (long) values[ord]);
} while ((ord = iter.next()) != 0);
}
static class ValuesIter implements LongValues.Iter {
private final double[] values;
private Ordinals.Docs.Iter ordsIter;
private int ord;
ValuesIter(double[] values) {
this.values = values;
}
public ValuesIter reset(Ordinals.Docs.Iter ordsIter) {
this.ordsIter = ordsIter;
this.ord = ordsIter.next();
return this;
}
@Override
public boolean hasNext() {
return ord != 0;
}
@Override
public long next() {
double value = values[ord];
ord = ordsIter.next();
return (long) value;
}
} }
} }
@ -459,23 +389,17 @@ public abstract class DoubleArrayAtomicFieldData extends AtomicNumericFieldData
return new DoubleValues(values, set); return new DoubleValues(values, set);
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues {
private final double[] values; private final double[] values;
private final FixedBitSet set; private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
LongValues(double[] values, FixedBitSet set) { LongValues(double[] values, FixedBitSet set) {
super(false);
this.values = values; this.values = values;
this.set = set; this.set = set;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override @Override
public boolean hasValue(int docId) { public boolean hasValue(int docId) {
return set.get(docId); return set.get(docId);
@ -485,31 +409,6 @@ public abstract class DoubleArrayAtomicFieldData extends AtomicNumericFieldData
public long getValue(int docId) { public long getValue(int docId) {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
if (set.get(docId)) {
return (long) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((long) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (long) values[docId]);
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -656,45 +555,20 @@ public abstract class DoubleArrayAtomicFieldData extends AtomicNumericFieldData
} }
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.DenseLongValues {
private final double[] values; private final double[] values;
private final Iter.Single iter = new Iter.Single();
LongValues(double[] values) { LongValues(double[] values) {
super(false);
this.values = values; this.values = values;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override @Override
public long getValue(int docId) { public long getValue(int docId) {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
return (long) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((long) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (long) values[docId]);
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {

View File

@ -146,88 +146,18 @@ public abstract class FloatArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values, ordinals.ordinals()); return new DoubleValues(values, ordinals.ordinals());
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.OrdBasedLongValues {
private final float[] values; private final float[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
LongValues(float[] values, Ordinals.Docs ordinals) { LongValues(float[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values; this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
} }
@Override @Override
public boolean isMultiValued() { public long getByOrd(int ord) {
return ordinals.isMultiValued(); return (long) values[ord];
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public long getValue(int docId) {
return (long) values[ordinals.getOrd(docId)];
}
@Override
public long getValueMissing(int docId, long missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (long) values[ord];
}
}
@Override
public Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
Ordinals.Docs.Iter iter = ordinals.getIter(docId);
int ord = iter.next();
if (ord == 0) {
proc.onMissing(docId);
return;
}
do {
proc.onValue(docId, (long) values[ord]);
} while ((ord = iter.next()) != 0);
}
static class ValuesIter implements Iter {
private final float[] values;
private Ordinals.Docs.Iter ordsIter;
private int ord;
ValuesIter(float[] values) {
this.values = values;
}
public ValuesIter reset(Ordinals.Docs.Iter ordsIter) {
this.ordsIter = ordsIter;
this.ord = ordsIter.next();
return this;
}
@Override
public boolean hasNext() {
return ord != 0;
}
@Override
public long next() {
float value = values[ord];
ord = ordsIter.next();
return (long) value;
}
} }
} }
@ -374,22 +304,17 @@ public abstract class FloatArrayAtomicFieldData extends AtomicNumericFieldData {
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues {
private final float[] values; private final float[] values;
private final FixedBitSet set; private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
LongValues(float[] values, FixedBitSet set) { LongValues(float[] values, FixedBitSet set) {
super(false);
this.values = values; this.values = values;
this.set = set; this.set = set;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override @Override
public boolean hasValue(int docId) { public boolean hasValue(int docId) {
return set.get(docId); return set.get(docId);
@ -399,33 +324,6 @@ public abstract class FloatArrayAtomicFieldData extends AtomicNumericFieldData {
public long getValue(int docId) { public long getValue(int docId) {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
if (set.get(docId)) {
return (long) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((long) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (long) values[docId]);
} else {
proc.onMissing(docId);
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -541,44 +439,20 @@ public abstract class FloatArrayAtomicFieldData extends AtomicNumericFieldData {
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.DenseLongValues {
private final float[] values; private final float[] values;
private final Iter.Single iter = new Iter.Single();
LongValues(float[] values) { LongValues(float[] values) {
super(false);
this.values = values; this.values = values;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override @Override
public long getValue(int docId) { public long getValue(int docId) {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
return (long) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((long) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (long) values[docId]);
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {

View File

@ -148,89 +148,20 @@ public abstract class IntArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values, ordinals.ordinals()); return new DoubleValues(values, ordinals.ordinals());
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.OrdBasedLongValues {
private final int[] values; private final int[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
LongValues(int[] values, Ordinals.Docs ordinals) { LongValues(int[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values; this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
} }
@Override @Override
public boolean isMultiValued() { public long getByOrd(int ord) {
return ordinals.isMultiValued(); return (long) values[ord];
} }
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public long getValue(int docId) {
return (long) values[ordinals.getOrd(docId)];
}
@Override
public long getValueMissing(int docId, long missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (long) values[ord];
}
}
@Override
public Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
Ordinals.Docs.Iter iter = ordinals.getIter(docId);
int ord = iter.next();
if (ord == 0) {
proc.onMissing(docId);
return;
}
do {
proc.onValue(docId, (long) values[ord]);
} while ((ord = iter.next()) != 0);
}
static class ValuesIter implements Iter {
private final int[] values;
private Ordinals.Docs.Iter ordsIter;
private int ord;
ValuesIter(int[] values) {
this.values = values;
}
public ValuesIter reset(Ordinals.Docs.Iter ordsIter) {
this.ordsIter = ordsIter;
this.ord = ordsIter.next();
return this;
}
@Override
public boolean hasNext() {
return ord != 0;
}
@Override
public long next() {
int value = values[ord];
ord = ordsIter.next();
return (long) value;
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -375,22 +306,17 @@ public abstract class IntArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values, set); return new DoubleValues(values, set);
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues {
private final int[] values; private final int[] values;
private final FixedBitSet set; private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
LongValues(int[] values, FixedBitSet set) { LongValues(int[] values, FixedBitSet set) {
super(false);
this.values = values; this.values = values;
this.set = set; this.set = set;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override @Override
public boolean hasValue(int docId) { public boolean hasValue(int docId) {
return set.get(docId); return set.get(docId);
@ -401,32 +327,6 @@ public abstract class IntArrayAtomicFieldData extends AtomicNumericFieldData {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
if (set.get(docId)) {
return (long) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((long) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (long) values[docId]);
} else {
proc.onMissing(docId);
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -540,45 +440,21 @@ public abstract class IntArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values); return new DoubleValues(values);
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.DenseLongValues {
private final int[] values; private final int[] values;
private final Iter.Single iter = new Iter.Single();
LongValues(int[] values) { LongValues(int[] values) {
super(false);
assert values.length != 0; assert values.length != 0;
this.values = values; this.values = values;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override @Override
public long getValue(int docId) { public long getValue(int docId) {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
return (long) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((long) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (long) values[docId]);
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {

View File

@ -226,88 +226,18 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
} }
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.OrdBasedLongValues {
private final long[] values; private final long[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
LongValues(long[] values, Ordinals.Docs ordinals) { LongValues(long[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values; this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
} }
@Override @Override
public boolean isMultiValued() { public long getByOrd(int ord) {
return ordinals.isMultiValued(); return values[ord];
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public long getValue(int docId) {
return values[ordinals.getOrd(docId)];
}
@Override
public long getValueMissing(int docId, long missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return values[ord];
}
}
@Override
public Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
Ordinals.Docs.Iter iter = ordinals.getIter(docId);
int ord = iter.next();
if (ord == 0) {
proc.onMissing(docId);
return;
}
do {
proc.onValue(docId, values[ord]);
} while ((ord = iter.next()) != 0);
}
static class ValuesIter implements Iter {
private final long[] values;
private Ordinals.Docs.Iter ordsIter;
private int ord;
ValuesIter(long[] values) {
this.values = values;
}
public ValuesIter reset(Ordinals.Docs.Iter ordsIter) {
this.ordsIter = ordsIter;
this.ord = ordsIter.next();
return this;
}
@Override
public boolean hasNext() {
return ord != 0;
}
@Override
public long next() {
long value = values[ord];
ord = ordsIter.next();
return value;
}
} }
} }
@ -502,22 +432,17 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
} }
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues {
private final long[] values; private final long[] values;
private final FixedBitSet set; private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
LongValues(long[] values, FixedBitSet set) { LongValues(long[] values, FixedBitSet set) {
super(false);
this.values = values; this.values = values;
this.set = set; this.set = set;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override @Override
public boolean hasValue(int docId) { public boolean hasValue(int docId) {
return set.get(docId); return set.get(docId);
@ -527,33 +452,6 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
public long getValue(int docId) { public long getValue(int docId) {
return values[docId]; return values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
if (set.get(docId)) {
return values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset(values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, values[docId]);
} else {
proc.onMissing(docId);
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -702,44 +600,21 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
} }
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.DenseLongValues {
private final long[] values; private final long[] values;
private final Iter.Single iter = new Iter.Single(); private final Iter.Single iter = new Iter.Single();
LongValues(long[] values) { LongValues(long[] values) {
super(false);
this.values = values; this.values = values;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override @Override
public long getValue(int docId) { public long getValue(int docId) {
return values[docId]; return values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
return values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset(values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, values[docId]);
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {

View File

@ -21,11 +21,13 @@ package org.elasticsearch.index.fielddata.plain;
import org.apache.lucene.util.FixedBitSet; import org.apache.lucene.util.FixedBitSet;
import org.elasticsearch.common.RamUsage; import org.elasticsearch.common.RamUsage;
import org.elasticsearch.index.fielddata.*; import org.elasticsearch.index.fielddata.AtomicNumericFieldData;
import org.elasticsearch.index.fielddata.BytesValues;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.index.fielddata.ScriptDocValues;
import org.elasticsearch.index.fielddata.StringValues;
import org.elasticsearch.index.fielddata.ordinals.Ordinals; import org.elasticsearch.index.fielddata.ordinals.Ordinals;
import org.elasticsearch.index.fielddata.util.DoubleArrayRef;
import org.elasticsearch.index.fielddata.util.IntArrayRef;
import org.elasticsearch.index.fielddata.util.LongArrayRef;
/** /**
*/ */
@ -146,89 +148,20 @@ public abstract class ShortArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values, ordinals.ordinals()); return new DoubleValues(values, ordinals.ordinals());
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.OrdBasedLongValues {
private final short[] values; private final short[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
LongValues(short[] values, Ordinals.Docs ordinals) { LongValues(short[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values; this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
} }
@Override @Override
public boolean isMultiValued() { public long getByOrd(int ord) {
return ordinals.isMultiValued(); return (long) values[ord];
} }
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public long getValue(int docId) {
return (long) values[ordinals.getOrd(docId)];
}
@Override
public long getValueMissing(int docId, long missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (long) values[ord];
}
}
@Override
public Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
Ordinals.Docs.Iter iter = ordinals.getIter(docId);
int ord = iter.next();
if (ord == 0) {
proc.onMissing(docId);
return;
}
do {
proc.onValue(docId, (long) values[ord]);
} while ((ord = iter.next()) != 0);
}
static class ValuesIter implements Iter {
private final short[] values;
private Ordinals.Docs.Iter ordsIter;
private int ord;
ValuesIter(short[] values) {
this.values = values;
}
public ValuesIter reset(Ordinals.Docs.Iter ordsIter) {
this.ordsIter = ordsIter;
this.ord = ordsIter.next();
return this;
}
@Override
public boolean hasNext() {
return ord != 0;
}
@Override
public long next() {
short value = values[ord];
ord = ordsIter.next();
return (long) value;
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -373,22 +306,17 @@ public abstract class ShortArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values, set); return new DoubleValues(values, set);
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues {
private final short[] values; private final short[] values;
private final FixedBitSet set; private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
LongValues(short[] values, FixedBitSet set) { LongValues(short[] values, FixedBitSet set) {
super(false);
this.values = values; this.values = values;
this.set = set; this.set = set;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override @Override
public boolean hasValue(int docId) { public boolean hasValue(int docId) {
return set.get(docId); return set.get(docId);
@ -398,33 +326,6 @@ public abstract class ShortArrayAtomicFieldData extends AtomicNumericFieldData {
public long getValue(int docId) { public long getValue(int docId) {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
if (set.get(docId)) {
return (long) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((long) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (long) values[docId]);
} else {
proc.onMissing(docId);
}
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
@ -541,44 +442,20 @@ public abstract class ShortArrayAtomicFieldData extends AtomicNumericFieldData {
return new DoubleValues(values); return new DoubleValues(values);
} }
static class LongValues implements org.elasticsearch.index.fielddata.LongValues { static class LongValues extends org.elasticsearch.index.fielddata.LongValues.DenseLongValues {
private final short[] values; private final short[] values;
private final Iter.Single iter = new Iter.Single();
LongValues(short[] values) { LongValues(short[] values) {
super(false);
this.values = values; this.values = values;
} }
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override @Override
public long getValue(int docId) { public long getValue(int docId) {
return (long) values[docId]; return (long) values[docId];
} }
@Override
public long getValueMissing(int docId, long missingValue) {
return (long) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((long) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (long) values[docId]);
}
} }
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues { static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {

View File

@ -0,0 +1,52 @@
/*
* Licensed to ElasticSearch and Shay Banon under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. ElasticSearch licenses this
* file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.search.facet;
import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.index.fielddata.LongValues.Iter;
/**
* Simple Facet aggregator base class for {@link LongValues}
*/
public abstract class LongFacetAggregatorBase {
private int total;
private int missing;
public void onDoc(int docId, LongValues values) {
if (values.hasValue(docId)) {
final Iter iter = values.getIter(docId);
while(iter.hasNext()) {
onValue(docId, iter.next());
total++;
}
} else {
missing++;
}
}
protected abstract void onValue(int docId, long next);
public final int total() {
return total;
}
public final int missing() {
return missing;
}
}

View File

@ -27,6 +27,7 @@ import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.index.fielddata.LongValues; import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.search.facet.FacetExecutor; import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet; import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.LongFacetAggregatorBase;
import java.io.IOException; import java.io.IOException;
@ -76,7 +77,7 @@ public class CountDateHistogramFacetExecutor extends FacetExecutor {
@Override @Override
public void collect(int doc) throws IOException { public void collect(int doc) throws IOException {
values.forEachValueInDoc(doc, histoProc); histoProc.onDoc(doc, values);
} }
@Override @Override
@ -84,7 +85,7 @@ public class CountDateHistogramFacetExecutor extends FacetExecutor {
} }
} }
public static class DateHistogramProc implements LongValues.ValueInDocProc { public static class DateHistogramProc extends LongFacetAggregatorBase {
private final TLongLongHashMap counts; private final TLongLongHashMap counts;
private final TimeZoneRounding tzRounding; private final TimeZoneRounding tzRounding;
@ -94,10 +95,6 @@ public class CountDateHistogramFacetExecutor extends FacetExecutor {
this.tzRounding = tzRounding; this.tzRounding = tzRounding;
} }
@Override
public void onMissing(int docId) {
}
@Override @Override
public void onValue(int docId, long value) { public void onValue(int docId, long value) {
counts.adjustOrPutValue(tzRounding.calc(value), 1, 1); counts.adjustOrPutValue(tzRounding.calc(value), 1, 1);

View File

@ -28,6 +28,7 @@ import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.index.fielddata.LongValues; import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.search.facet.FacetExecutor; import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet; import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.LongFacetAggregatorBase;
import java.io.IOException; import java.io.IOException;
@ -79,7 +80,7 @@ public class ValueDateHistogramFacetExecutor extends FacetExecutor {
@Override @Override
public void collect(int doc) throws IOException { public void collect(int doc) throws IOException {
keyValues.forEachValueInDoc(doc, histoProc); histoProc.onDoc(doc, keyValues);
} }
@Override @Override
@ -87,7 +88,7 @@ public class ValueDateHistogramFacetExecutor extends FacetExecutor {
} }
} }
public static class DateHistogramProc implements LongValues.ValueInDocProc { public static class DateHistogramProc extends LongFacetAggregatorBase {
final ExtTLongObjectHashMap<InternalFullDateHistogramFacet.FullEntry> entries; final ExtTLongObjectHashMap<InternalFullDateHistogramFacet.FullEntry> entries;
private final TimeZoneRounding tzRounding; private final TimeZoneRounding tzRounding;
@ -101,10 +102,6 @@ public class ValueDateHistogramFacetExecutor extends FacetExecutor {
this.entries = entries; this.entries = entries;
} }
@Override
public void onMissing(int docId) {
}
@Override @Override
public void onValue(int docId, long value) { public void onValue(int docId, long value) {
long time = tzRounding.calc(value); long time = tzRounding.calc(value);

View File

@ -29,6 +29,7 @@ import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.script.SearchScript; import org.elasticsearch.script.SearchScript;
import org.elasticsearch.search.facet.FacetExecutor; import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet; import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.LongFacetAggregatorBase;
import java.io.IOException; import java.io.IOException;
@ -86,7 +87,7 @@ public class ValueScriptDateHistogramFacetExecutor extends FacetExecutor {
@Override @Override
public void collect(int doc) throws IOException { public void collect(int doc) throws IOException {
keyValues.forEachValueInDoc(doc, histoProc); histoProc.onDoc(doc, keyValues);
} }
@Override @Override
@ -94,7 +95,7 @@ public class ValueScriptDateHistogramFacetExecutor extends FacetExecutor {
} }
} }
public static class DateHistogramProc implements LongValues.ValueInDocProc { public static class DateHistogramProc extends LongFacetAggregatorBase {
private final TimeZoneRounding tzRounding; private final TimeZoneRounding tzRounding;
protected final SearchScript valueScript; protected final SearchScript valueScript;
@ -107,10 +108,6 @@ public class ValueScriptDateHistogramFacetExecutor extends FacetExecutor {
this.entries = entries; this.entries = entries;
} }
@Override
public void onMissing(int docId) {
}
@Override @Override
public void onValue(int docId, long value) { public void onValue(int docId, long value) {
valueScript.setNextDocId(docId); valueScript.setNextDocId(docId);

View File

@ -34,6 +34,7 @@ import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.script.SearchScript; import org.elasticsearch.script.SearchScript;
import org.elasticsearch.search.facet.FacetExecutor; import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet; import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.LongFacetAggregatorBase;
import org.elasticsearch.search.facet.terms.TermsFacet; import org.elasticsearch.search.facet.terms.TermsFacet;
import org.elasticsearch.search.facet.terms.support.EntryPriorityQueue; import org.elasticsearch.search.facet.terms.support.EntryPriorityQueue;
import org.elasticsearch.search.internal.SearchContext; import org.elasticsearch.search.internal.SearchContext;
@ -50,7 +51,6 @@ public class TermsLongFacetExecutor extends FacetExecutor {
private final IndexNumericFieldData indexFieldData; private final IndexNumericFieldData indexFieldData;
private final TermsFacet.ComparatorType comparatorType; private final TermsFacet.ComparatorType comparatorType;
private final int size; private final int size;
private final int numberOfShards;
private final SearchScript script; private final SearchScript script;
private final ImmutableSet<BytesRef> excluded; private final ImmutableSet<BytesRef> excluded;
@ -63,7 +63,6 @@ public class TermsLongFacetExecutor extends FacetExecutor {
this.indexFieldData = indexFieldData; this.indexFieldData = indexFieldData;
this.size = size; this.size = size;
this.comparatorType = comparatorType; this.comparatorType = comparatorType;
this.numberOfShards = context.numberOfShards();
this.script = script; this.script = script;
this.excluded = excluded; this.excluded = excluded;
@ -147,7 +146,7 @@ public class TermsLongFacetExecutor extends FacetExecutor {
@Override @Override
public void collect(int doc) throws IOException { public void collect(int doc) throws IOException {
values.forEachValueInDoc(doc, aggregator); aggregator.onDoc(doc, values);
} }
@Override @Override
@ -200,13 +199,10 @@ public class TermsLongFacetExecutor extends FacetExecutor {
} }
} }
public static class StaticAggregatorValueProc implements LongValues.ValueInDocProc { public static class StaticAggregatorValueProc extends LongFacetAggregatorBase {
private final TLongIntHashMap facets; private final TLongIntHashMap facets;
private int missing;
private int total;
public StaticAggregatorValueProc(TLongIntHashMap facets) { public StaticAggregatorValueProc(TLongIntHashMap facets) {
this.facets = facets; this.facets = facets;
} }
@ -214,24 +210,10 @@ public class TermsLongFacetExecutor extends FacetExecutor {
@Override @Override
public void onValue(int docId, long value) { public void onValue(int docId, long value) {
facets.adjustOrPutValue(value, 1, 1); facets.adjustOrPutValue(value, 1, 1);
total++;
}
@Override
public void onMissing(int docId) {
missing++;
} }
public final TLongIntHashMap facets() { public final TLongIntHashMap facets() {
return facets; return facets;
} }
public final int missing() {
return this.missing;
}
public final int total() {
return this.total;
}
} }
} }

View File

@ -31,6 +31,7 @@ import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.script.SearchScript; import org.elasticsearch.script.SearchScript;
import org.elasticsearch.search.facet.FacetExecutor; import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet; import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.LongFacetAggregatorBase;
import org.elasticsearch.search.facet.termsstats.TermsStatsFacet; import org.elasticsearch.search.facet.termsstats.TermsStatsFacet;
import org.elasticsearch.search.internal.SearchContext; import org.elasticsearch.search.internal.SearchContext;
@ -128,19 +129,18 @@ public class TermsStatsLongFacetExecutor extends FacetExecutor {
@Override @Override
public void collect(int doc) throws IOException { public void collect(int doc) throws IOException {
keyValues.forEachValueInDoc(doc, aggregator); aggregator.onDoc(doc, keyValues);
} }
@Override @Override
public void postCollection() { public void postCollection() {
TermsStatsLongFacetExecutor.this.missing = aggregator.missing; TermsStatsLongFacetExecutor.this.missing = aggregator.missing();
} }
} }
public static class Aggregator implements LongValues.ValueInDocProc { public static class Aggregator extends LongFacetAggregatorBase {
final ExtTLongObjectHashMap<InternalTermsStatsLongFacet.LongEntry> entries; final ExtTLongObjectHashMap<InternalTermsStatsLongFacet.LongEntry> entries;
int missing;
DoubleValues valueValues; DoubleValues valueValues;
final ValueAggregator valueAggregator = new ValueAggregator(); final ValueAggregator valueAggregator = new ValueAggregator();
@ -160,10 +160,6 @@ public class TermsStatsLongFacetExecutor extends FacetExecutor {
valueValues.forEachValueInDoc(docId, valueAggregator); valueValues.forEachValueInDoc(docId, valueAggregator);
} }
@Override
public void onMissing(int docId) {
missing++;
}
public static class ValueAggregator implements DoubleValues.ValueInDocProc { public static class ValueAggregator implements DoubleValues.ValueInDocProc {

View File

@ -19,25 +19,32 @@
package org.elasticsearch.test.unit.index.fielddata; package org.elasticsearch.test.unit.index.fielddata;
import org.apache.lucene.analysis.standard.StandardAnalyzer; import static org.hamcrest.MatcherAssert.assertThat;
import org.apache.lucene.index.*; import static org.hamcrest.Matchers.equalTo;
import org.apache.lucene.store.RAMDirectory; import static org.hamcrest.Matchers.sameInstance;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.lucene.HashedBytesRef;
import org.elasticsearch.common.lucene.Lucene;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.fielddata.*;
import org.elasticsearch.index.mapper.FieldMapper;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat; import org.apache.lucene.analysis.standard.StandardAnalyzer;
import static org.hamcrest.Matchers.equalTo; import org.apache.lucene.index.AtomicReader;
import static org.hamcrest.Matchers.sameInstance; import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.SlowCompositeReaderWrapper;
import org.apache.lucene.store.RAMDirectory;
import org.elasticsearch.common.lucene.Lucene;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.FieldDataType;
import org.elasticsearch.index.fielddata.IndexFieldData;
import org.elasticsearch.index.fielddata.IndexFieldDataService;
import org.elasticsearch.index.fielddata.StringValues;
import org.elasticsearch.index.mapper.FieldMapper;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/** /**
*/ */
@ -115,42 +122,6 @@ public abstract class AbstractFieldDataTests {
} }
} }
public static class LongValuesVerifierProc implements LongValues.ValueInDocProc {
private static final Long MISSING = new Long(0);
private final int docId;
private final List<Long> expected = new ArrayList<Long>();
private int idx;
LongValuesVerifierProc(int docId) {
this.docId = docId;
}
public LongValuesVerifierProc addExpected(long value) {
expected.add(value);
return this;
}
public LongValuesVerifierProc addMissing() {
expected.add(MISSING);
return this;
}
@Override
public void onValue(int docId, long value) {
assertThat(docId, equalTo(this.docId));
assertThat(value, equalTo(expected.get(idx++)));
}
@Override
public void onMissing(int docId) {
assertThat(docId, equalTo(this.docId));
assertThat(MISSING, sameInstance(expected.get(idx++)));
}
}
public static class DoubleValuesVerifierProc implements DoubleValues.ValueInDocProc { public static class DoubleValuesVerifierProc implements DoubleValues.ValueInDocProc {
private static final Double MISSING = new Double(0); private static final Double MISSING = new Double(0);

View File

@ -79,10 +79,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
assertThat(longValuesIter.next(), equalTo(3l)); assertThat(longValuesIter.next(), equalTo(3l));
assertThat(longValuesIter.hasNext(), equalTo(false)); assertThat(longValuesIter.hasNext(), equalTo(false));
longValues.forEachValueInDoc(0, new LongValuesVerifierProc(0).addExpected(2l));
longValues.forEachValueInDoc(1, new LongValuesVerifierProc(1).addExpected(1l));
longValues.forEachValueInDoc(2, new LongValuesVerifierProc(2).addExpected(3l));
DoubleValues doubleValues = fieldData.getDoubleValues(); DoubleValues doubleValues = fieldData.getDoubleValues();
assertThat(doubleValues.isMultiValued(), equalTo(false)); assertThat(doubleValues.isMultiValued(), equalTo(false));
@ -172,10 +168,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
assertThat(longValuesIter.next(), equalTo(3l)); assertThat(longValuesIter.next(), equalTo(3l));
assertThat(longValuesIter.hasNext(), equalTo(false)); assertThat(longValuesIter.hasNext(), equalTo(false));
longValues.forEachValueInDoc(0, new LongValuesVerifierProc(0).addExpected(2l));
longValues.forEachValueInDoc(1, new LongValuesVerifierProc(1).addMissing());
longValues.forEachValueInDoc(2, new LongValuesVerifierProc(2).addExpected(3l));
DoubleValues doubleValues = fieldData.getDoubleValues(); DoubleValues doubleValues = fieldData.getDoubleValues();
assertThat(doubleValues.isMultiValued(), equalTo(false)); assertThat(doubleValues.isMultiValued(), equalTo(false));
@ -295,10 +287,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
assertThat(longValuesIter.next(), equalTo(3l)); assertThat(longValuesIter.next(), equalTo(3l));
assertThat(longValuesIter.hasNext(), equalTo(false)); assertThat(longValuesIter.hasNext(), equalTo(false));
longValues.forEachValueInDoc(0, new LongValuesVerifierProc(0).addExpected(2l).addExpected(4l));
longValues.forEachValueInDoc(1, new LongValuesVerifierProc(1).addExpected(1l));
longValues.forEachValueInDoc(2, new LongValuesVerifierProc(2).addExpected(3l));
DoubleValues doubleValues = fieldData.getDoubleValues(); DoubleValues doubleValues = fieldData.getDoubleValues();
assertThat(doubleValues.isMultiValued(), equalTo(true)); assertThat(doubleValues.isMultiValued(), equalTo(true));
@ -375,10 +363,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
assertThat(longValuesIter.next(), equalTo(3l)); assertThat(longValuesIter.next(), equalTo(3l));
assertThat(longValuesIter.hasNext(), equalTo(false)); assertThat(longValuesIter.hasNext(), equalTo(false));
longValues.forEachValueInDoc(0, new LongValuesVerifierProc(0).addExpected(2l).addExpected(4l));
longValues.forEachValueInDoc(1, new LongValuesVerifierProc(1).addMissing());
longValues.forEachValueInDoc(2, new LongValuesVerifierProc(2).addExpected(3l));
DoubleValues doubleValues = fieldData.getDoubleValues(); DoubleValues doubleValues = fieldData.getDoubleValues();
assertThat(doubleValues.isMultiValued(), equalTo(true)); assertThat(doubleValues.isMultiValued(), equalTo(true));
@ -445,10 +429,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
longValuesIter = longValues.getIter(2); longValuesIter = longValues.getIter(2);
assertThat(longValuesIter.hasNext(), equalTo(false)); assertThat(longValuesIter.hasNext(), equalTo(false));
longValues.forEachValueInDoc(0, new LongValuesVerifierProc(0).addMissing());
longValues.forEachValueInDoc(1, new LongValuesVerifierProc(1).addMissing());
longValues.forEachValueInDoc(2, new LongValuesVerifierProc(2).addMissing());
// double values // double values
DoubleValues doubleValues = fieldData.getDoubleValues(); DoubleValues doubleValues = fieldData.getDoubleValues();