mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-24 17:09:48 +00:00
clean-up double values
This commit is contained in:
parent
d5c271acf5
commit
dff2a9279c
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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++;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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++;
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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++)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user