clean-up double values

This commit is contained in:
Simon Willnauer 2013-03-29 18:44:20 +01:00
parent d5c271acf5
commit dff2a9279c
25 changed files with 314 additions and 1155 deletions

View File

@ -20,48 +20,126 @@
package org.elasticsearch.index.fielddata;
import org.elasticsearch.ElasticSearchIllegalStateException;
import org.elasticsearch.index.fielddata.LongValues.Iter;
import org.elasticsearch.index.fielddata.util.DoubleArrayRef;
import org.elasticsearch.index.fielddata.util.IntArrayRef;
import org.elasticsearch.index.fielddata.util.LongArrayRef;
import org.elasticsearch.index.fielddata.ordinals.Ordinals;
import org.elasticsearch.index.fielddata.ordinals.Ordinals.Docs;
/**
*/
public interface DoubleValues {
public abstract class DoubleValues {
static final DoubleValues EMPTY = new Empty();
public static final DoubleValues EMPTY = new Empty();
private final boolean multiValued;
protected final Iter.Single iter = new Iter.Single();
protected DoubleValues(boolean multiValued) {
this.multiValued = multiValued;
}
/**
* 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?
*/
boolean hasValue(int docId);
public abstract boolean hasValue(int docId);
double getValue(int docId);
public abstract double getValue(int docId);
double getValueMissing(int docId, double missingValue);
Iter getIter(int docId);
void forEachValueInDoc(int docId, ValueInDocProc proc);
static interface ValueInDocProc {
void onValue(int docId, double value);
void onMissing(int docId);
public double getValueMissing(int docId, double missingValue) {
if (hasValue(docId)) {
return getValue(docId);
}
return missingValue;
}
public Iter getIter(int docId) {
assert !isMultiValued();
if (hasValue(docId)) {
return iter.reset(getValue(docId));
} else {
return Iter.Empty.INSTANCE;
}
}
static interface Iter {
public static abstract class DenseDoubleValues extends DoubleValues {
protected DenseDoubleValues(boolean multiValued) {
super(multiValued);
}
@Override
public final boolean hasValue(int docId) {
return true;
}
public final double getValueMissing(int docId, double 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 OrdBasedDoubleValues extends DoubleValues {
protected final Docs ordinals;
private final Iter.Multi iter;
protected OrdBasedDoubleValues(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 double getValue(int docId) {
return getByOrd(ordinals.getOrd(docId));
}
@Override
public final double getValueMissing(int docId, double missingValue) {
final int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return getByOrd(ord);
}
}
protected abstract double getByOrd(int ord);
@Override
public final Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
}
public static interface Iter {
boolean hasNext();
double next();
static class Empty implements Iter {
public static class Empty implements Iter {
public static final Empty INSTANCE = new Empty();
@ -76,7 +154,7 @@ public interface DoubleValues {
}
}
static class Single implements Iter {
static class Single implements Iter {
public double value;
public boolean done;
@ -99,12 +177,41 @@ public interface DoubleValues {
return value;
}
}
static class Multi implements Iter {
private org.elasticsearch.index.fielddata.ordinals.Ordinals.Docs.Iter ordsIter;
private int ord;
private OrdBasedDoubleValues values;
public Multi(OrdBasedDoubleValues 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 double next() {
double value = values.getByOrd(ord);
ord = ordsIter.next();
return value;
}
}
}
static class Empty implements DoubleValues {
@Override
public boolean isMultiValued() {
return false;
static class Empty extends DoubleValues {
public Empty() {
super(false);
}
@Override
@ -117,105 +224,22 @@ public interface DoubleValues {
throw new ElasticSearchIllegalStateException("Can't retrieve a value from an empty DoubleValues");
}
@Override
public double getValueMissing(int docId, double missingValue) {
return missingValue;
}
@Override
public Iter getIter(int docId) {
return Iter.Empty.INSTANCE;
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onMissing(docId);
}
}
public static class LongBased implements DoubleValues {
private final LongValues values;
private final ValueIter iter = new ValueIter();
public LongBased(LongValues values) {
this.values = values;
}
@Override
public boolean isMultiValued() {
return values.isMultiValued();
}
@Override
public boolean hasValue(int docId) {
return values.hasValue(docId);
}
@Override
public double getValue(int docId) {
return (double) values.getValue(docId);
}
@Override
public double getValueMissing(int docId, double missingValue) {
if (!values.hasValue(docId)) {
return missingValue;
}
return getValue(docId);
}
@Override
public Iter getIter(int docId) {
return this.iter.reset(values.getIter(docId));
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc 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 {
private LongValues.Iter iter;
private ValueIter reset(LongValues.Iter iter) {
this.iter = iter;
return this;
}
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public double next() {
return (double) iter.next();
}
}
}
public static class FilteredDoubleValues implements DoubleValues {
public static class FilteredDoubleValues extends DoubleValues {
protected final DoubleValues delegate;
public FilteredDoubleValues(DoubleValues delegate) {
super(delegate.isMultiValued());
this.delegate = delegate;
}
public boolean isMultiValued() {
return delegate.isMultiValued();
}
public boolean hasValue(int docId) {
return delegate.hasValue(docId);
}
@ -224,16 +248,9 @@ public interface DoubleValues {
return delegate.getValue(docId);
}
public double getValueMissing(int docId, double missingValue) {
return delegate.getValueMissing(docId, missingValue);
}
public Iter getIter(int docId) {
return delegate.getIter(docId);
}
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
delegate.forEachValueInDoc(docId, proc);
}
}
}

View File

@ -120,6 +120,16 @@ public abstract class LongValues {
public final Iter getIter(int docId) {
return iter.reset(ordinals.getIter(docId));
}
@Override
public final long getValueMissing(int docId, long missingValue) {
final int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return getByOrd(ord);
}
}
}

View File

@ -141,7 +141,6 @@ public interface StringValues {
private final StringArrayRef arrayScratch = new StringArrayRef(new String[1], 1);
private final ValuesIter valuesIter = new ValuesIter();
private final Proc proc = new Proc();
public DoubleBased(DoubleValues values) {
this.values = values;
@ -172,7 +171,14 @@ public interface StringValues {
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
values.forEachValueInDoc(docId, this.proc.reset(proc));
if (values.hasValue(docId)) {
final DoubleValues.Iter doubleIter = values.getIter(docId);
while(doubleIter.hasNext()) {
proc.onValue(docId, Double.toString(doubleIter.next()));
}
} else {
proc.onMissing(docId);
}
}
static class ValuesIter implements Iter {
@ -195,32 +201,11 @@ public interface StringValues {
}
}
static class Proc implements DoubleValues.ValueInDocProc {
private ValueInDocProc proc;
private Proc reset(ValueInDocProc proc) {
this.proc = proc;
return this;
}
@Override
public void onValue(int docId, double value) {
proc.onValue(docId, Double.toString(value));
}
@Override
public void onMissing(int docId) {
proc.onMissing(docId);
}
}
}
public static class LongBased implements StringValues {
private final LongValues values;
private final StringArrayRef arrayScratch = new StringArrayRef(new String[1], 1);
private final ValuesIter valuesIter = new ValuesIter();
public LongBased(LongValues values) {

View File

@ -156,89 +156,21 @@ public abstract class ByteArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.OrdBasedDoubleValues {
private final byte[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
DoubleValues(byte[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
}
@Override
public boolean isMultiValued() {
return ordinals.isMultiValued();
public double getByOrd(int ord) {
return (double) values[ord];
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public double getValue(int docId) {
return (double) values[ordinals.getOrd(docId)];
}
@Override
public double getValueMissing(int docId, double missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (double) 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, (double) 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 double next() {
byte value = values[ord];
ord = ordsIter.next();
return (double) value;
}
}
}
}
@ -323,22 +255,17 @@ public abstract class ByteArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues {
private final byte[] values;
private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
DoubleValues(byte[] values, FixedBitSet set) {
super(false);
this.values = values;
this.set = set;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return set.get(docId);
@ -348,35 +275,7 @@ public abstract class ByteArrayAtomicFieldData extends AtomicNumericFieldData {
public double getValue(int docId) {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
if (set.get(docId)) {
return (double) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((double) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (double) values[docId]);
} else {
proc.onMissing(docId);
}
}
}
}
/**
@ -453,45 +352,19 @@ public abstract class ByteArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.DenseDoubleValues {
private final byte[] values;
private final Iter.Single iter = new Iter.Single();
DoubleValues(byte[] values) {
super(false);
this.values = values;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override
public double getValue(int docId) {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
return (double) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((double) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (double) values[docId]);
}
}
}
}

View File

@ -21,12 +21,13 @@ package org.elasticsearch.index.fielddata.plain;
import org.apache.lucene.util.FixedBitSet;
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.util.DoubleArrayRef;
import org.elasticsearch.index.fielddata.util.IntArrayRef;
import org.elasticsearch.index.fielddata.util.LongArrayRef;
import org.elasticsearch.index.fielddata.util.StringArrayRef;
/**
*/
@ -247,88 +248,18 @@ public abstract class DoubleArrayAtomicFieldData extends AtomicNumericFieldData
}
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.OrdBasedDoubleValues {
private final double[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
DoubleValues(double[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
}
@Override
public boolean isMultiValued() {
return ordinals.isMultiValued();
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public double getValue(int docId) {
return values[ordinals.getOrd(docId)];
}
@Override
public double getValueMissing(int docId, double 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 DoubleValues.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 double next() {
double value = values[ord];
ord = ordsIter.next();
return value;
}
public double getByOrd(int ord) {
return values[ord];
}
}
}
@ -411,23 +342,17 @@ public abstract class DoubleArrayAtomicFieldData extends AtomicNumericFieldData
}
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues {
private final double[] values;
private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
DoubleValues(double[] values, FixedBitSet set) {
super(false);
this.values = values;
this.set = set;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return set.get(docId);
@ -438,32 +363,6 @@ public abstract class DoubleArrayAtomicFieldData extends AtomicNumericFieldData
return values[docId];
}
@Override
public double getValueMissing(int docId, double 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);
}
}
}
}
@ -571,45 +470,20 @@ public abstract class DoubleArrayAtomicFieldData extends AtomicNumericFieldData
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.DenseDoubleValues {
private final double[] values;
private final Iter.Single iter = new Iter.Single();
DoubleValues(double[] values) {
super(false);
this.values = values;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override
public double getValue(int docId) {
return values[docId];
}
@Override
public double getValueMissing(int docId, double 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]);
}
}
}
}

View File

@ -161,88 +161,18 @@ public abstract class FloatArrayAtomicFieldData extends AtomicNumericFieldData {
}
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.OrdBasedDoubleValues {
private final float[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
DoubleValues(float[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
}
@Override
public boolean isMultiValued() {
return ordinals.isMultiValued();
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public double getValue(int docId) {
return (double) values[ordinals.getOrd(docId)];
}
@Override
public double getValueMissing(int docId, double missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (double) 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, (double) 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 double next() {
float value = values[ord];
ord = ordsIter.next();
return (double) value;
}
protected double getByOrd(int ord) {
return values[ord];
}
}
}
@ -326,22 +256,17 @@ public abstract class FloatArrayAtomicFieldData extends AtomicNumericFieldData {
}
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues {
private final float[] values;
private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
DoubleValues(float[] values, FixedBitSet set) {
super(false);
this.values = values;
this.set = set;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return set.get(docId);
@ -352,32 +277,6 @@ public abstract class FloatArrayAtomicFieldData extends AtomicNumericFieldData {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
if (set.get(docId)) {
return (double) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((double) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (double) values[docId]);
} else {
proc.onMissing(docId);
}
}
}
}
@ -455,44 +354,19 @@ public abstract class FloatArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.DenseDoubleValues {
private final float[] values;
private final Iter.Single iter = new Iter.Single();
DoubleValues(float[] values) {
super(false);
this.values = values;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override
public double getValue(int docId) {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
return (double) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((double) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (double) values[docId]);
}
}
}
}

View File

@ -164,89 +164,20 @@ public abstract class IntArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.OrdBasedDoubleValues{
private final int[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
DoubleValues(int[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
}
@Override
public boolean isMultiValued() {
return ordinals.isMultiValued();
protected double getByOrd(int ord) {
return values[ord];
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public double getValue(int docId) {
return (double) values[ordinals.getOrd(docId)];
}
@Override
public double getValueMissing(int docId, double missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (double) 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, (double) 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 double next() {
int value = values[ord];
ord = ordsIter.next();
return (double) value;
}
}
}
}
@ -329,22 +260,17 @@ public abstract class IntArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues {
private final int[] values;
private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
DoubleValues(int[] values, FixedBitSet set) {
super(false);
this.values = values;
this.set = set;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return set.get(docId);
@ -354,33 +280,6 @@ public abstract class IntArrayAtomicFieldData extends AtomicNumericFieldData {
public double getValue(int docId) {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
if (set.get(docId)) {
return (double) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((double) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (double) values[docId]);
} else {
proc.onMissing(docId);
}
}
}
}
@ -457,44 +356,19 @@ public abstract class IntArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.DenseDoubleValues {
private final int[] values;
private final Iter.Single iter = new Iter.Single();
DoubleValues(int[] values) {
super(false);
this.values = values;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override
public double getValue(int docId) {
return values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
return (double) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((double) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (double) values[docId]);
}
}
}

View File

@ -21,12 +21,13 @@ package org.elasticsearch.index.fielddata.plain;
import org.apache.lucene.util.FixedBitSet;
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.util.DoubleArrayRef;
import org.elasticsearch.index.fielddata.util.IntArrayRef;
import org.elasticsearch.index.fielddata.util.LongArrayRef;
import org.elasticsearch.index.fielddata.util.StringArrayRef;
/**
*/
@ -241,89 +242,21 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
}
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.OrdBasedDoubleValues {
private final long[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
DoubleValues(long[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
}
@Override
public boolean isMultiValued() {
return ordinals.isMultiValued();
protected double getByOrd(int ord) {
return values[ord];
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public double getValue(int docId) {
return (double) values[ordinals.getOrd(docId)];
}
@Override
public double getValueMissing(int docId, double missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (double) 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, (double) 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 double next() {
double value = (double) values[ord];
ord = ordsIter.next();
return value;
}
}
}
}
@ -454,21 +387,17 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
}
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues {
private final long[] values;
private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
DoubleValues(long[] values, FixedBitSet set) {
super(false);
this.values = values;
this.set = set;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
@ -479,33 +408,6 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
public double getValue(int docId) {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
if (set.get(docId)) {
return (double) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((double) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (double) values[docId]);
} else {
proc.onMissing(docId);
}
}
}
}
@ -603,7 +505,6 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
static class LongValues extends org.elasticsearch.index.fielddata.LongValues.DenseLongValues {
private final long[] values;
private final Iter.Single iter = new Iter.Single();
LongValues(long[] values) {
super(false);
@ -617,44 +518,20 @@ public abstract class LongArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.DenseDoubleValues {
private final long[] values;
private final Iter.Single iter = new Iter.Single();
DoubleValues(long[] values) {
super(false);
this.values = values;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override
public double getValue(int docId) {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
return (double) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((double) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (double) values[docId]);
}
}
}
}

View File

@ -164,89 +164,20 @@ public abstract class ShortArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.OrdBasedDoubleValues {
private final short[] values;
private final Ordinals.Docs ordinals;
private final ValuesIter iter;
DoubleValues(short[] values, Ordinals.Docs ordinals) {
super(ordinals);
this.values = values;
this.ordinals = ordinals;
this.iter = new ValuesIter(values);
}
@Override
public boolean isMultiValued() {
return ordinals.isMultiValued();
protected double getByOrd(int ord) {
return values[ord];
}
@Override
public boolean hasValue(int docId) {
return ordinals.getOrd(docId) != 0;
}
@Override
public double getValue(int docId) {
return (double) values[ordinals.getOrd(docId)];
}
@Override
public double getValueMissing(int docId, double missingValue) {
int ord = ordinals.getOrd(docId);
if (ord == 0) {
return missingValue;
} else {
return (double) 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, (double) 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 double next() {
short value = values[ord];
ord = ordsIter.next();
return (double) value;
}
}
}
}
@ -328,23 +259,17 @@ public abstract class ShortArrayAtomicFieldData extends AtomicNumericFieldData {
}
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues {
private final short[] values;
private final FixedBitSet set;
private final Iter.Single iter = new Iter.Single();
DoubleValues(short[] values, FixedBitSet set) {
super(false);
this.values = values;
this.set = set;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return set.get(docId);
@ -354,35 +279,7 @@ public abstract class ShortArrayAtomicFieldData extends AtomicNumericFieldData {
public double getValue(int docId) {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
if (set.get(docId)) {
return (double) values[docId];
} else {
return missingValue;
}
}
@Override
public Iter getIter(int docId) {
if (set.get(docId)) {
return iter.reset((double) values[docId]);
} else {
return Iter.Empty.INSTANCE;
}
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
if (set.get(docId)) {
proc.onValue(docId, (double) values[docId]);
} else {
proc.onMissing(docId);
}
}
}
}
/**
@ -458,44 +355,20 @@ public abstract class ShortArrayAtomicFieldData extends AtomicNumericFieldData {
}
static class DoubleValues implements org.elasticsearch.index.fielddata.DoubleValues {
static class DoubleValues extends org.elasticsearch.index.fielddata.DoubleValues.DenseDoubleValues {
private final short[] values;
private final Iter.Single iter = new Iter.Single();
DoubleValues(short[] values) {
super(false);
this.values = values;
}
@Override
public boolean isMultiValued() {
return false;
}
@Override
public boolean hasValue(int docId) {
return true;
}
@Override
public double getValue(int docId) {
return (double) values[docId];
}
@Override
public double getValueMissing(int docId, double missingValue) {
return (double) values[docId];
}
@Override
public Iter getIter(int docId) {
return iter.reset((double) values[docId]);
}
@Override
public void forEachValueInDoc(int docId, ValueInDocProc proc) {
proc.onValue(docId, (double) values[docId]);
}
}
}
}

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.DoubleValues;
import org.elasticsearch.index.fielddata.DoubleValues.Iter;
/**
* Simple Facet aggregator base class for {@link DoubleValues}
*/
public abstract class DoubleFacetAggregatorBase {
private int total;
private int missing;
public void onDoc(int docId, DoubleValues 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, double next);
public final int total() {
return total;
}
public final int missing() {
return missing;
}
}

View File

@ -26,6 +26,7 @@ import org.elasticsearch.common.trove.ExtTLongObjectHashMap;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.LongFacetAggregatorBase;
@ -113,17 +114,13 @@ public class ValueDateHistogramFacetExecutor extends FacetExecutor {
}
entry.count++;
valueAggregator.entry = entry;
valueValues.forEachValueInDoc(docId, valueAggregator);
valueAggregator.onDoc(docId, valueValues);
}
public static class ValueAggregator implements DoubleValues.ValueInDocProc {
public final static class ValueAggregator extends DoubleFacetAggregatorBase {
InternalFullDateHistogramFacet.FullEntry entry;
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
entry.totalCount++;

View File

@ -24,6 +24,7 @@ import org.apache.lucene.index.AtomicReaderContext;
import org.elasticsearch.common.CacheRecycler;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.internal.SearchContext;
@ -80,7 +81,7 @@ public class CountHistogramFacetExecutor extends FacetExecutor {
@Override
public void collect(int doc) throws IOException {
values.forEachValueInDoc(doc, histoProc);
histoProc.onDoc(doc, values);
}
@Override
@ -88,7 +89,7 @@ public class CountHistogramFacetExecutor extends FacetExecutor {
}
}
public static class HistogramProc implements DoubleValues.ValueInDocProc {
public final static class HistogramProc extends DoubleFacetAggregatorBase {
private final long interval;
private final TLongLongHashMap counts;
@ -98,10 +99,6 @@ public class CountHistogramFacetExecutor extends FacetExecutor {
this.counts = counts;
}
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
long bucket = bucket(value, interval);

View File

@ -24,6 +24,7 @@ import org.elasticsearch.common.CacheRecycler;
import org.elasticsearch.common.trove.ExtTLongObjectHashMap;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.internal.SearchContext;
@ -80,7 +81,7 @@ public class FullHistogramFacetExecutor extends FacetExecutor {
@Override
public void collect(int doc) throws IOException {
values.forEachValueInDoc(doc, histoProc);
histoProc.onDoc(doc, values);
}
@Override
@ -88,7 +89,7 @@ public class FullHistogramFacetExecutor extends FacetExecutor {
}
}
public static class HistogramProc implements DoubleValues.ValueInDocProc {
public final static class HistogramProc extends DoubleFacetAggregatorBase {
final long interval;
final ExtTLongObjectHashMap<InternalFullHistogramFacet.FullEntry> entries;
@ -98,10 +99,6 @@ public class FullHistogramFacetExecutor extends FacetExecutor {
this.entries = entries;
}
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
long bucket = bucket(value, interval);

View File

@ -24,6 +24,7 @@ import org.elasticsearch.common.CacheRecycler;
import org.elasticsearch.common.trove.ExtTLongObjectHashMap;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.internal.SearchContext;
@ -77,7 +78,7 @@ public class ValueHistogramFacetExecutor extends FacetExecutor {
@Override
public void collect(int doc) throws IOException {
keyValues.forEachValueInDoc(doc, histoProc);
histoProc.onDoc(doc, keyValues);
}
@Override
@ -85,7 +86,7 @@ public class ValueHistogramFacetExecutor extends FacetExecutor {
}
}
public static class HistogramProc implements DoubleValues.ValueInDocProc {
public final static class HistogramProc extends DoubleFacetAggregatorBase {
final long interval;
final ExtTLongObjectHashMap<InternalFullHistogramFacet.FullEntry> entries;
@ -99,10 +100,6 @@ public class ValueHistogramFacetExecutor extends FacetExecutor {
this.entries = entries;
}
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
long bucket = FullHistogramFacetExecutor.bucket(value, interval);
@ -113,17 +110,13 @@ public class ValueHistogramFacetExecutor extends FacetExecutor {
}
entry.count++;
valueAggregator.entry = entry;
valueValues.forEachValueInDoc(docId, valueAggregator);
valueAggregator.onDoc(docId, valueValues);
}
public static class ValueAggregator implements DoubleValues.ValueInDocProc {
public final static class ValueAggregator extends DoubleFacetAggregatorBase {
InternalFullHistogramFacet.FullEntry entry;
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
entry.totalCount++;

View File

@ -26,6 +26,7 @@ import org.elasticsearch.common.trove.ExtTLongObjectHashMap;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.script.SearchScript;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.internal.SearchContext;
@ -91,7 +92,7 @@ public class ValueScriptHistogramFacetExecutor extends FacetExecutor {
@Override
public void collect(int doc) throws IOException {
values.forEachValueInDoc(doc, histoProc);
histoProc.onDoc(doc, values);
}
@Override
@ -99,7 +100,7 @@ public class ValueScriptHistogramFacetExecutor extends FacetExecutor {
}
}
public static class HistogramProc implements DoubleValues.ValueInDocProc {
public static class HistogramProc extends DoubleFacetAggregatorBase {
private final long interval;
@ -112,11 +113,6 @@ public class ValueScriptHistogramFacetExecutor extends FacetExecutor {
this.valueScript = valueScript;
this.entries = entries;
}
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
valueScript.setNextDocId(docId);

View File

@ -22,6 +22,7 @@ package org.elasticsearch.search.facet.range;
import org.apache.lucene.index.AtomicReaderContext;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.internal.SearchContext;
@ -74,7 +75,7 @@ public class KeyValueRangeFacetExecutor extends FacetExecutor {
for (RangeFacet.Entry entry : entries) {
entry.foundInDoc = false;
}
keyValues.forEachValueInDoc(doc, rangeProc);
rangeProc.onDoc(doc, keyValues);
}
@Override
@ -82,7 +83,7 @@ public class KeyValueRangeFacetExecutor extends FacetExecutor {
}
}
public static class RangeProc implements DoubleValues.ValueInDocProc {
public static class RangeProc extends DoubleFacetAggregatorBase {
private final RangeFacet.Entry[] entries;
@ -92,10 +93,6 @@ public class KeyValueRangeFacetExecutor extends FacetExecutor {
this.entries = entries;
}
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
for (RangeFacet.Entry entry : entries) {

View File

@ -22,6 +22,7 @@ package org.elasticsearch.search.facet.range;
import org.apache.lucene.index.AtomicReaderContext;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.internal.SearchContext;
@ -71,7 +72,7 @@ public class RangeFacetExecutor extends FacetExecutor {
for (RangeFacet.Entry entry : entries) {
entry.foundInDoc = false;
}
values.forEachValueInDoc(doc, rangeProc);
rangeProc.onDoc(doc, values);
}
@Override
@ -79,7 +80,7 @@ public class RangeFacetExecutor extends FacetExecutor {
}
}
public static class RangeProc implements DoubleValues.ValueInDocProc {
public static class RangeProc extends DoubleFacetAggregatorBase{
private final RangeFacet.Entry[] entries;
@ -87,10 +88,6 @@ public class RangeFacetExecutor extends FacetExecutor {
this.entries = entries;
}
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
for (RangeFacet.Entry entry : entries) {

View File

@ -22,6 +22,7 @@ package org.elasticsearch.search.facet.statistical;
import org.apache.lucene.index.AtomicReaderContext;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.internal.SearchContext;
@ -68,7 +69,7 @@ public class StatisticalFacetExecutor extends FacetExecutor {
@Override
public void collect(int doc) throws IOException {
values.forEachValueInDoc(doc, statsProc);
statsProc.onDoc(doc, values);
}
@Override
@ -82,7 +83,7 @@ public class StatisticalFacetExecutor extends FacetExecutor {
}
}
public static class StatsProc implements DoubleValues.ValueInDocProc {
public static class StatsProc extends DoubleFacetAggregatorBase {
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
@ -104,11 +105,6 @@ public class StatisticalFacetExecutor extends FacetExecutor {
count++;
}
@Override
public void onMissing(int docId) {
missing++;
}
public final double min() {
return min;
}
@ -117,10 +113,6 @@ public class StatisticalFacetExecutor extends FacetExecutor {
return max;
}
public final double total() {
return total;
}
public final long count() {
return count;
}

View File

@ -22,6 +22,7 @@ package org.elasticsearch.search.facet.statistical;
import org.apache.lucene.index.AtomicReaderContext;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.internal.SearchContext;
@ -75,7 +76,7 @@ public class StatisticalFieldsFacetExecutor extends FacetExecutor {
@Override
public void collect(int doc) throws IOException {
for (DoubleValues value : values) {
value.forEachValueInDoc(doc, statsProc);
statsProc.onDoc(doc, value);
}
}
@ -83,18 +84,18 @@ public class StatisticalFieldsFacetExecutor extends FacetExecutor {
public void postCollection() {
StatisticalFieldsFacetExecutor.this.min = statsProc.min;
StatisticalFieldsFacetExecutor.this.max = statsProc.max;
StatisticalFieldsFacetExecutor.this.total = statsProc.total;
StatisticalFieldsFacetExecutor.this.total = statsProc.sum;
StatisticalFieldsFacetExecutor.this.sumOfSquares = statsProc.sumOfSquares;
StatisticalFieldsFacetExecutor.this.count = statsProc.count;
StatisticalFieldsFacetExecutor.this.missing = statsProc.missing;
}
}
public static class StatsProc implements DoubleValues.ValueInDocProc {
public static class StatsProc extends DoubleFacetAggregatorBase {
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
double total = 0;
double sum = 0;
double sumOfSquares = 0.0;
long count;
int missing;
@ -108,33 +109,8 @@ public class StatisticalFieldsFacetExecutor extends FacetExecutor {
max = value;
}
sumOfSquares += value * value;
total += value;
sum += value;
count++;
}
@Override
public void onMissing(int docId) {
missing++;
}
public final double min() {
return min;
}
public final double max() {
return max;
}
public final double total() {
return total;
}
public final long count() {
return count;
}
public final double sumOfSquares() {
return sumOfSquares;
}
}
}

View File

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

View File

@ -28,6 +28,7 @@ import org.elasticsearch.common.trove.ExtTDoubleObjectHashMap;
import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.script.SearchScript;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.termsstats.TermsStatsFacet;
@ -47,7 +48,6 @@ public class TermsStatsDoubleFacetExecutor extends FacetExecutor {
final SearchScript script;
private final int size;
private final int numberOfShards;
final ExtTDoubleObjectHashMap<InternalTermsStatsDoubleFacet.DoubleEntry> entries;
long missing;
@ -56,7 +56,6 @@ public class TermsStatsDoubleFacetExecutor extends FacetExecutor {
int size, TermsStatsFacet.ComparatorType comparatorType, SearchContext context) {
this.size = size;
this.comparatorType = comparatorType;
this.numberOfShards = context.numberOfShards();
this.keyIndexFieldData = keyIndexFieldData;
this.valueIndexFieldData = valueIndexFieldData;
this.script = script;
@ -127,7 +126,7 @@ public class TermsStatsDoubleFacetExecutor extends FacetExecutor {
@Override
public void collect(int doc) throws IOException {
keyValues.forEachValueInDoc(doc, aggregator);
aggregator.onDoc(doc, keyValues);
}
@Override
@ -136,7 +135,7 @@ public class TermsStatsDoubleFacetExecutor extends FacetExecutor {
}
}
public static class Aggregator implements DoubleValues.ValueInDocProc {
public static class Aggregator extends DoubleFacetAggregatorBase {
final ExtTDoubleObjectHashMap<InternalTermsStatsDoubleFacet.DoubleEntry> entries;
int missing;
@ -156,21 +155,13 @@ public class TermsStatsDoubleFacetExecutor extends FacetExecutor {
}
doubleEntry.count++;
valueAggregator.doubleEntry = doubleEntry;
valueFieldData.forEachValueInDoc(docId, valueAggregator);
valueAggregator.onDoc(docId, valueFieldData);
}
@Override
public void onMissing(int docId) {
missing++;
}
public static class ValueAggregator implements DoubleValues.ValueInDocProc {
public static class ValueAggregator extends DoubleFacetAggregatorBase {
InternalTermsStatsDoubleFacet.DoubleEntry doubleEntry;
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {

View File

@ -29,6 +29,7 @@ import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.index.fielddata.LongValues;
import org.elasticsearch.script.SearchScript;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.LongFacetAggregatorBase;
@ -157,18 +158,14 @@ public class TermsStatsLongFacetExecutor extends FacetExecutor {
}
longEntry.count++;
valueAggregator.longEntry = longEntry;
valueValues.forEachValueInDoc(docId, valueAggregator);
valueAggregator.onDoc(docId, valueValues);
}
public static class ValueAggregator implements DoubleValues.ValueInDocProc {
public final static class ValueAggregator extends DoubleFacetAggregatorBase {
InternalTermsStatsLongFacet.LongEntry longEntry;
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
if (value < longEntry.min) {

View File

@ -35,6 +35,7 @@ import org.elasticsearch.index.fielddata.DoubleValues;
import org.elasticsearch.index.fielddata.IndexFieldData;
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
import org.elasticsearch.script.SearchScript;
import org.elasticsearch.search.facet.DoubleFacetAggregatorBase;
import org.elasticsearch.search.facet.FacetExecutor;
import org.elasticsearch.search.facet.InternalFacet;
import org.elasticsearch.search.facet.terms.strings.HashedAggregator;
@ -50,9 +51,7 @@ public class TermsStatsStringFacetExecutor extends FacetExecutor {
final IndexFieldData keyIndexFieldData;
final IndexNumericFieldData valueIndexFieldData;
final SearchScript script;
private final int size;
private final int numberOfShards;
final ExtTHashMap<HashedBytesRef, InternalTermsStatsStringFacet.StringEntry> entries;
long missing;
@ -64,8 +63,6 @@ public class TermsStatsStringFacetExecutor extends FacetExecutor {
this.script = valueScript;
this.size = size;
this.comparatorType = comparatorType;
this.numberOfShards = context.numberOfShards();
this.entries = CacheRecycler.popHashMap();
}
@ -166,17 +163,13 @@ public class TermsStatsStringFacetExecutor extends FacetExecutor {
}
stringEntry.count++;
valueAggregator.stringEntry = stringEntry;
valueValues.forEachValueInDoc(docId, valueAggregator);
valueAggregator.onDoc(docId, valueValues);
}
public static class ValueAggregator implements DoubleValues.ValueInDocProc {
public static class ValueAggregator extends DoubleFacetAggregatorBase {
InternalTermsStatsStringFacet.StringEntry stringEntry;
@Override
public void onMissing(int docId) {
}
@Override
public void onValue(int docId, double value) {
if (value < stringEntry.min) {

View File

@ -122,39 +122,4 @@ public abstract class AbstractFieldDataTests {
}
}
public static class DoubleValuesVerifierProc implements DoubleValues.ValueInDocProc {
private static final Double MISSING = new Double(0);
private final int docId;
private final List<Double> expected = new ArrayList<Double>();
private int idx;
DoubleValuesVerifierProc(int docId) {
this.docId = docId;
}
public DoubleValuesVerifierProc addExpected(double value) {
expected.add(value);
return this;
}
public DoubleValuesVerifierProc addMissing() {
expected.add(MISSING);
return this;
}
@Override
public void onValue(int docId, double 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++)));
}
}
}

View File

@ -110,10 +110,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
assertThat(doubleValuesIter.next(), equalTo(3d));
assertThat(doubleValuesIter.hasNext(), equalTo(false));
doubleValues.forEachValueInDoc(0, new DoubleValuesVerifierProc(0).addExpected(2d));
doubleValues.forEachValueInDoc(1, new DoubleValuesVerifierProc(1).addExpected(1d));
doubleValues.forEachValueInDoc(2, new DoubleValuesVerifierProc(2).addExpected(3d));
IndexSearcher searcher = new IndexSearcher(readerContext.reader());
TopFieldDocs topDocs;
@ -196,10 +192,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
assertThat(doubleValuesIter.next(), equalTo(3d));
assertThat(doubleValuesIter.hasNext(), equalTo(false));
doubleValues.forEachValueInDoc(0, new DoubleValuesVerifierProc(0).addExpected(2d));
doubleValues.forEachValueInDoc(1, new DoubleValuesVerifierProc(1).addMissing());
doubleValues.forEachValueInDoc(2, new DoubleValuesVerifierProc(2).addExpected(3d));
IndexSearcher searcher = new IndexSearcher(readerContext.reader());
TopFieldDocs topDocs;
@ -319,10 +311,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
assertThat(doubleValuesIter.hasNext(), equalTo(true));
assertThat(doubleValuesIter.next(), equalTo(3d));
assertThat(doubleValuesIter.hasNext(), equalTo(false));
doubleValues.forEachValueInDoc(0, new DoubleValuesVerifierProc(0).addExpected(2d).addExpected(4d));
doubleValues.forEachValueInDoc(1, new DoubleValuesVerifierProc(1).addExpected(1d));
doubleValues.forEachValueInDoc(2, new DoubleValuesVerifierProc(2).addExpected(3d));
}
@Test
@ -392,10 +380,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
assertThat(doubleValuesIter.hasNext(), equalTo(true));
assertThat(doubleValuesIter.next(), equalTo(3d));
assertThat(doubleValuesIter.hasNext(), equalTo(false));
doubleValues.forEachValueInDoc(0, new DoubleValuesVerifierProc(0).addExpected(2d).addExpected(4d));
doubleValues.forEachValueInDoc(1, new DoubleValuesVerifierProc(1).addMissing());
doubleValues.forEachValueInDoc(2, new DoubleValuesVerifierProc(2).addExpected(3d));
}
@Test
@ -451,10 +435,6 @@ public abstract class NumericFieldDataTests extends StringFieldDataTests {
doubleValuesIter = doubleValues.getIter(2);
assertThat(doubleValuesIter.hasNext(), equalTo(false));
doubleValues.forEachValueInDoc(0, new DoubleValuesVerifierProc(0).addMissing());
doubleValues.forEachValueInDoc(1, new DoubleValuesVerifierProc(1).addMissing());
doubleValues.forEachValueInDoc(2, new DoubleValuesVerifierProc(2).addMissing());
}
protected void fillAllMissing() throws Exception {