diff --git a/buildSrc/src/main/resources/checkstyle_suppressions.xml b/buildSrc/src/main/resources/checkstyle_suppressions.xml
index 9f36857c8b2..609b6557e09 100644
--- a/buildSrc/src/main/resources/checkstyle_suppressions.xml
+++ b/buildSrc/src/main/resources/checkstyle_suppressions.xml
@@ -156,11 +156,6 @@
-
-
-
-
-
@@ -617,7 +612,6 @@
-
@@ -828,7 +822,6 @@
-
@@ -987,8 +980,6 @@
-
-
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStats.java b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStats.java
index a225d7b7e51..a6978ad2a39 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStats.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStats.java
@@ -24,41 +24,48 @@ import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.StringHelper;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
-import org.elasticsearch.common.io.stream.Streamable;
+import org.elasticsearch.common.io.stream.Writeable;
import org.elasticsearch.common.joda.FormatDateTimeFormatter;
import org.elasticsearch.common.joda.Joda;
+import org.elasticsearch.common.network.InetAddresses;
import org.elasticsearch.common.network.NetworkAddress;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import java.io.IOException;
import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-public abstract class FieldStats implements Streamable, ToXContent {
+public abstract class FieldStats implements Writeable, ToXContent {
private final byte type;
private long maxDoc;
private long docCount;
private long sumDocFreq;
private long sumTotalTermFreq;
+ private boolean isSearchable;
+ private boolean isAggregatable;
protected T minValue;
protected T maxValue;
- protected FieldStats(int type) {
- this.type = (byte) type;
+ FieldStats(byte type, long maxDoc, boolean isSearchable, boolean isAggregatable) {
+ this(type, maxDoc, 0, 0, 0, isSearchable, isAggregatable, null, null);
}
- protected FieldStats(int type, long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq) {
- this.type = (byte) type;
+ FieldStats(byte type,
+ long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable, T minValue, T maxValue) {
+ this.type = type;
this.maxDoc = maxDoc;
this.docCount = docCount;
this.sumDocFreq = sumDocFreq;
this.sumTotalTermFreq = sumTotalTermFreq;
+ this.isSearchable = isSearchable;
+ this.isAggregatable = isAggregatable;
+ this.minValue = minValue;
+ this.maxValue = maxValue;
}
byte getType() {
- return type;
+ return this.type;
}
/**
@@ -71,7 +78,8 @@ public abstract class FieldStats implements Streamable, ToXContent {
}
/**
- * @return the number of documents that have at least one term for this field, or -1 if this measurement isn't available.
+ * @return the number of documents that have at least one term for this field,
+ * or -1 if this measurement isn't available.
*
* Note that, documents marked as deleted that haven't yet been merged way aren't taken into account.
*/
@@ -102,7 +110,8 @@ public abstract class FieldStats implements Streamable, ToXContent {
}
/**
- * @return the sum of the term frequencies of all terms in this field across all documents, or -1 if this measurement
+ * @return the sum of the term frequencies of all terms in this field across all documents,
+ * or -1 if this measurement
* isn't available. Term frequency is the total number of occurrences of a term in a particular document and field.
*
* Note that, documents marked as deleted that haven't yet been merged way aren't taken into account.
@@ -111,6 +120,20 @@ public abstract class FieldStats implements Streamable, ToXContent {
return sumTotalTermFreq;
}
+ /**
+ * @return true
if any of the instances of the field name is searchable.
+ */
+ public boolean isSearchable() {
+ return isSearchable;
+ }
+
+ /**
+ * @return true
if any of the instances of the field name is aggregatable.
+ */
+ public boolean isAggregatable() {
+ return isAggregatable;
+ }
+
/**
* @return the lowest value in the field.
*
@@ -152,33 +175,96 @@ public abstract class FieldStats implements Streamable, ToXContent {
protected abstract T valueOf(String value, String optionalFormat);
/**
- * Merges the provided stats into this stats instance.
+ * Accumulates the provided stats into this stats instance.
*/
- public void append(FieldStats stats) {
- this.maxDoc += stats.maxDoc;
- if (stats.docCount == -1) {
+ public final void accumulate(FieldStats other) {
+ this.maxDoc += other.maxDoc;
+ if (other.docCount == -1) {
this.docCount = -1;
} else if (this.docCount != -1) {
- this.docCount += stats.docCount;
+ this.docCount += other.docCount;
}
- if (stats.sumDocFreq == -1) {
+ if (other.sumDocFreq == -1) {
this.sumDocFreq = -1;
} else if (this.sumDocFreq != -1) {
- this.sumDocFreq += stats.sumDocFreq;
+ this.sumDocFreq += other.sumDocFreq;
}
- if (stats.sumTotalTermFreq == -1) {
+ if (other.sumTotalTermFreq == -1) {
this.sumTotalTermFreq = -1;
} else if (this.sumTotalTermFreq != -1) {
- this.sumTotalTermFreq += stats.sumTotalTermFreq;
+ this.sumTotalTermFreq += other.sumTotalTermFreq;
+ }
+
+ isSearchable |= other.isSearchable;
+ isAggregatable |= other.isAggregatable;
+
+ assert type == other.getType();
+ updateMinMax((T) other.minValue, (T) other.maxValue);
+ }
+
+ private void updateMinMax(T min, T max) {
+ if (minValue == null) {
+ minValue = min;
+ } else if (min != null && compare(minValue, min) > 0) {
+ minValue = min;
+ }
+ if (maxValue == null) {
+ maxValue = max;
+ } else if (max != null && compare(maxValue, max) < 0) {
+ maxValue = max;
}
}
- protected abstract int compare(T a, T b);
+ protected abstract int compare(T o1, T o2);
+
+ @Override
+ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
+ builder.startObject();
+ builder.field(Fields.MAX_DOC, maxDoc);
+ builder.field(Fields.DOC_COUNT, docCount);
+ builder.field(Fields.DENSITY, getDensity());
+ builder.field(Fields.SUM_DOC_FREQ, sumDocFreq);
+ builder.field(Fields.SUM_TOTAL_TERM_FREQ, sumTotalTermFreq);
+ builder.field(Fields.SEARCHABLE, isSearchable);
+ builder.field(Fields.AGGREGATABLE, isAggregatable);
+ toInnerXContent(builder);
+ builder.endObject();
+ return builder;
+ }
+
+ protected void toInnerXContent(XContentBuilder builder) throws IOException {
+ builder.field(Fields.MIN_VALUE, getMinValue());
+ builder.field(Fields.MIN_VALUE_AS_STRING, getMinValueAsString());
+ builder.field(Fields.MAX_VALUE, getMaxValue());
+ builder.field(Fields.MAX_VALUE_AS_STRING, getMaxValueAsString());
+ }
+
+ @Override
+ public final void writeTo(StreamOutput out) throws IOException {
+ out.writeByte(type);
+ out.writeLong(maxDoc);
+ out.writeLong(docCount);
+ out.writeLong(sumDocFreq);
+ out.writeLong(sumTotalTermFreq);
+ out.writeBoolean(isSearchable);
+ out.writeBoolean(isAggregatable);
+ boolean hasMinMax = minValue != null;
+ out.writeBoolean(hasMinMax);
+ if (hasMinMax) {
+ writeMinMax(out);
+ }
+ }
+
+ protected abstract void writeMinMax(StreamOutput out) throws IOException;
/**
- * @return true
if this instance matches with the provided index constraint, otherwise false
is returned
+ * @return true
if this instance matches with the provided index constraint,
+ * otherwise false
is returned
*/
public boolean match(IndexConstraint constraint) {
+ if (minValue == null) {
+ return false;
+ }
int cmp;
T value = valueOf(constraint.getValue(), constraint.getOptionalFormat());
if (constraint.getProperty() == IndexConstraint.Property.MIN) {
@@ -203,202 +289,179 @@ public abstract class FieldStats implements Streamable, ToXContent {
}
}
- @Override
- public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
- builder.startObject();
- builder.field(Fields.MAX_DOC, maxDoc);
- builder.field(Fields.DOC_COUNT, docCount);
- builder.field(Fields.DENSITY, getDensity());
- builder.field(Fields.SUM_DOC_FREQ, sumDocFreq);
- builder.field(Fields.SUM_TOTAL_TERM_FREQ, sumTotalTermFreq);
- toInnerXContent(builder);
- builder.endObject();
- return builder;
- }
-
- protected void toInnerXContent(XContentBuilder builder) throws IOException {
- builder.field(Fields.MIN_VALUE, getMinValue());
- builder.field(Fields.MIN_VALUE_AS_STRING, getMinValueAsString());
- builder.field(Fields.MAX_VALUE, getMaxValue());
- builder.field(Fields.MAX_VALUE_AS_STRING, getMaxValueAsString());
- }
-
- @Override
- public void readFrom(StreamInput in) throws IOException {
- maxDoc = in.readVLong();
- docCount = in.readLong();
- sumDocFreq = in.readLong();
- sumTotalTermFreq = in.readLong();
- }
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- out.writeByte(type);
- out.writeVLong(maxDoc);
- out.writeLong(docCount);
- out.writeLong(sumDocFreq);
- out.writeLong(sumTotalTermFreq);
- }
-
- private static abstract class ComparableFieldStats> extends FieldStats {
- protected ComparableFieldStats(int type) {
- super(type);
+ public static class Long extends FieldStats {
+ public Long(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable,
+ long minValue, long maxValue) {
+ super((byte) 0, maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, minValue, maxValue);
}
- protected ComparableFieldStats(int type, long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq) {
- super(type, maxDoc, docCount, sumDocFreq, sumTotalTermFreq);
+ public Long(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable) {
+ super((byte) 0, maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, null, null);
+ }
+
+ public Long(long maxDoc,
+ boolean isSearchable, boolean isAggregatable) {
+ super((byte) 0, maxDoc, isSearchable, isAggregatable);
}
@Override
- protected int compare(T a, T b) {
- return a.compareTo(b);
- }
- }
-
- public static class Long extends ComparableFieldStats {
-
- public Long() {
- super(0);
- }
-
- public Long(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq, long minValue, long maxValue) {
- this(0, maxDoc, docCount, sumDocFreq, sumTotalTermFreq, minValue, maxValue);
- }
-
- protected Long(int type, long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq, long minValue, long maxValue) {
- super(type, maxDoc, docCount, sumDocFreq, sumTotalTermFreq);
- this.minValue = minValue;
- this.maxValue = maxValue;
+ public int compare(java.lang.Long o1, java.lang.Long o2) {
+ return o1.compareTo(o2);
}
@Override
- public String getMinValueAsString() {
- return String.valueOf(minValue.longValue());
- }
-
- @Override
- public String getMaxValueAsString() {
- return String.valueOf(maxValue.longValue());
- }
-
- @Override
- public void append(FieldStats stats) {
- super.append(stats);
- Long other = (Long) stats;
- this.minValue = Math.min(other.minValue, minValue);
- this.maxValue = Math.max(other.maxValue, maxValue);
- }
-
- @Override
- protected java.lang.Long valueOf(String value, String optionalFormat) {
- if (optionalFormat != null) {
- throw new UnsupportedOperationException("custom format isn't supported");
- }
- return java.lang.Long.valueOf(value);
- }
-
- @Override
- public void readFrom(StreamInput in) throws IOException {
- super.readFrom(in);
- minValue = in.readLong();
- maxValue = in.readLong();
- }
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- super.writeTo(out);
+ public void writeMinMax(StreamOutput out) throws IOException {
out.writeLong(minValue);
out.writeLong(maxValue);
}
- }
-
- public static final class Double extends ComparableFieldStats {
-
- public Double() {
- super(2);
- }
-
- public Double(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq, double minValue, double maxValue) {
- super(2, maxDoc, docCount, sumDocFreq, sumTotalTermFreq);
- this.minValue = minValue;
- this.maxValue = maxValue;
+ @Override
+ public java.lang.Long valueOf(String value, String optionalFormat) {
+ return java.lang.Long.parseLong(value);
}
@Override
public String getMinValueAsString() {
- return String.valueOf(minValue.doubleValue());
+ return minValue != null ? java.lang.Long.toString(minValue) : null;
}
@Override
public String getMaxValueAsString() {
- return String.valueOf(maxValue.doubleValue());
+ return maxValue != null ? java.lang.Long.toString(maxValue) : null;
+ }
+ }
+
+ public static class Double extends FieldStats {
+ public Double(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable,
+ double minValue, double maxValue) {
+ super((byte) 1, maxDoc, docCount, sumDocFreq, sumTotalTermFreq, isSearchable, isAggregatable,
+ minValue, maxValue);
+ }
+
+ public Double(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable) {
+ super((byte) 1, maxDoc, docCount, sumDocFreq, sumTotalTermFreq, isSearchable, isAggregatable, null, null);
+ }
+
+ public Double(long maxDoc, boolean isSearchable, boolean isAggregatable) {
+ super((byte) 1, maxDoc, isSearchable, isAggregatable);
}
@Override
- public void append(FieldStats stats) {
- super.append(stats);
- Double other = (Double) stats;
- this.minValue = Math.min(other.minValue, minValue);
- this.maxValue = Math.max(other.maxValue, maxValue);
+ public int compare(java.lang.Double o1, java.lang.Double o2) {
+ return o1.compareTo(o2);
}
@Override
- protected java.lang.Double valueOf(String value, String optionalFormat) {
- if (optionalFormat != null) {
- throw new UnsupportedOperationException("custom format isn't supported");
- }
- return java.lang.Double.valueOf(value);
- }
-
- @Override
- public void readFrom(StreamInput in) throws IOException {
- super.readFrom(in);
- minValue = in.readDouble();
- maxValue = in.readDouble();
- }
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- super.writeTo(out);
+ public void writeMinMax(StreamOutput out) throws IOException {
out.writeDouble(minValue);
out.writeDouble(maxValue);
}
- }
-
- public static final class Text extends ComparableFieldStats {
-
- public Text() {
- super(3);
- }
-
- public Text(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq, BytesRef minValue, BytesRef maxValue) {
- super(3, maxDoc, docCount, sumDocFreq, sumTotalTermFreq);
- this.minValue = minValue;
- this.maxValue = maxValue;
+ @Override
+ public java.lang.Double valueOf(String value, String optionalFormat) {
+ if (optionalFormat != null) {
+ throw new UnsupportedOperationException("custom format isn't supported");
+ }
+ return java.lang.Double.parseDouble(value);
}
@Override
public String getMinValueAsString() {
- return minValue.utf8ToString();
+ return minValue != null ? java.lang.Double.toString(minValue) : null;
}
@Override
public String getMaxValueAsString() {
- return maxValue.utf8ToString();
+ return maxValue != null ? java.lang.Double.toString(maxValue) : null;
+ }
+ }
+
+ public static class Date extends FieldStats {
+ private FormatDateTimeFormatter formatter;
+
+ public Date(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable,
+ FormatDateTimeFormatter formatter,
+ long minValue, long maxValue) {
+ super((byte) 2, maxDoc, docCount, sumDocFreq, sumTotalTermFreq, isSearchable, isAggregatable,
+ minValue, maxValue);
+ this.formatter = formatter;
+ }
+
+ public Date(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable,
+ FormatDateTimeFormatter formatter) {
+ super((byte) 2, maxDoc, docCount, sumDocFreq, sumTotalTermFreq, isSearchable, isAggregatable,
+ null, null);
+ this.formatter = formatter;
+ }
+
+ public Date(long maxDoc, boolean isSearchable, boolean isAggregatable,
+ FormatDateTimeFormatter formatter) {
+ super((byte) 2, maxDoc, isSearchable, isAggregatable);
+ this.formatter = formatter;
}
@Override
- public void append(FieldStats stats) {
- super.append(stats);
- Text other = (Text) stats;
- if (other.minValue.compareTo(minValue) < 0) {
- minValue = other.minValue;
- }
- if (other.maxValue.compareTo(maxValue) > 0) {
- maxValue = other.maxValue;
+ public int compare(java.lang.Long o1, java.lang.Long o2) {
+ return o1.compareTo(o2);
+ }
+
+ @Override
+ public void writeMinMax(StreamOutput out) throws IOException {
+ out.writeString(formatter.format());
+ out.writeLong(minValue);
+ out.writeLong(maxValue);
+ }
+
+ @Override
+ public java.lang.Long valueOf(String value, String fmt) {
+ FormatDateTimeFormatter f = formatter;
+ if (fmt != null) {
+ f = Joda.forPattern(fmt);
}
+ return f.parser().parseDateTime(value).getMillis();
+ }
+
+ @Override
+ public String getMinValueAsString() {
+ return minValue != null ? formatter.printer().print(minValue) : null;
+ }
+
+ @Override
+ public String getMaxValueAsString() {
+ return maxValue != null ? formatter.printer().print(maxValue) : null;
+ }
+ }
+
+ public static class Text extends FieldStats {
+ public Text(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable,
+ BytesRef minValue, BytesRef maxValue) {
+ super((byte) 3, maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable,
+ minValue, maxValue);
+ }
+
+ public Text(long maxDoc, boolean isSearchable, boolean isAggregatable) {
+ super((byte) 3, maxDoc, isSearchable, isAggregatable);
+ }
+
+ @Override
+ public int compare(BytesRef o1, BytesRef o2) {
+ return o1.compareTo(o2);
+ }
+
+ @Override
+ public void writeMinMax(StreamOutput out) throws IOException {
+ out.writeBytesRef(minValue);
+ out.writeBytesRef(maxValue);
}
@Override
@@ -409,167 +472,160 @@ public abstract class FieldStats implements Streamable, ToXContent {
return new BytesRef(value);
}
+ @Override
+ public String getMinValueAsString() {
+ return minValue != null ? minValue.utf8ToString() : null;
+ }
+
+ @Override
+ public String getMaxValueAsString() {
+ return maxValue != null ? maxValue.utf8ToString() : null;
+ }
+
@Override
protected void toInnerXContent(XContentBuilder builder) throws IOException {
builder.field(Fields.MIN_VALUE, getMinValueAsString());
builder.field(Fields.MAX_VALUE, getMaxValueAsString());
}
-
- @Override
- public void readFrom(StreamInput in) throws IOException {
- super.readFrom(in);
- minValue = in.readBytesRef();
- maxValue = in.readBytesRef();
- }
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- super.writeTo(out);
- out.writeBytesRef(minValue);
- out.writeBytesRef(maxValue);
- }
-
- }
-
- public static final class Date extends Long {
-
- private FormatDateTimeFormatter dateFormatter;
-
- public Date() {
- }
-
- public Date(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq, long minValue, long maxValue, FormatDateTimeFormatter dateFormatter) {
- super(1, maxDoc, docCount, sumDocFreq, sumTotalTermFreq, minValue, maxValue);
- this.dateFormatter = dateFormatter;
- }
-
- @Override
- public String getMinValueAsString() {
- return dateFormatter.printer().print(minValue);
- }
-
- @Override
- public String getMaxValueAsString() {
- return dateFormatter.printer().print(maxValue);
- }
-
- @Override
- protected java.lang.Long valueOf(String value, String optionalFormat) {
- FormatDateTimeFormatter dateFormatter = this.dateFormatter;
- if (optionalFormat != null) {
- dateFormatter = Joda.forPattern(optionalFormat);
- }
- return dateFormatter.parser().parseMillis(value);
- }
-
- @Override
- public void readFrom(StreamInput in) throws IOException {
- super.readFrom(in);
- dateFormatter = Joda.forPattern(in.readString());
- }
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- super.writeTo(out);
- out.writeString(dateFormatter.format());
- }
-
}
public static class Ip extends FieldStats {
-
- private InetAddress minValue, maxValue;
-
- public Ip(int maxDoc, int docCount, long sumDocFreq, long sumTotalTermFreq,
- InetAddress minValue, InetAddress maxValue) {
- super(4, maxDoc, docCount, sumDocFreq, sumTotalTermFreq);
- this.minValue = minValue;
- this.maxValue = maxValue;
+ public Ip(long maxDoc, long docCount, long sumDocFreq, long sumTotalTermFreq,
+ boolean isSearchable, boolean isAggregatable,
+ InetAddress minValue, InetAddress maxValue) {
+ super((byte) 4, maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable,
+ minValue, maxValue);
}
- public Ip() {
- super(4);
+ public Ip(long maxDoc, boolean isSearchable, boolean isAggregatable) {
+ super((byte) 4, maxDoc, isSearchable, isAggregatable);
+ }
+
+ @Override
+ public int compare(InetAddress o1, InetAddress o2) {
+ byte[] b1 = InetAddressPoint.encode(o1);
+ byte[] b2 = InetAddressPoint.encode(o2);
+ return StringHelper.compare(b1.length, b1, 0, b2, 0);
+ }
+
+ @Override
+ public void writeMinMax(StreamOutput out) throws IOException {
+ byte[] b1 = InetAddressPoint.encode(minValue);
+ byte[] b2 = InetAddressPoint.encode(maxValue);
+ out.writeByte((byte) b1.length);
+ out.writeBytes(b1);
+ out.writeByte((byte) b2.length);
+ out.writeBytes(b2);
+ }
+
+ @Override
+ public InetAddress valueOf(String value, String fmt) {
+ return InetAddresses.forString(value);
}
@Override
public String getMinValueAsString() {
- return NetworkAddress.format(minValue);
+ return minValue != null ? NetworkAddress.format(minValue) : null;
}
@Override
public String getMaxValueAsString() {
- return NetworkAddress.format(maxValue);
- }
-
- @Override
- protected InetAddress valueOf(String value, String optionalFormat) {
- try {
- return InetAddress.getByName(value);
- } catch (UnknownHostException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- protected int compare(InetAddress a, InetAddress b) {
- byte[] ab = InetAddressPoint.encode(a);
- byte[] bb = InetAddressPoint.encode(b);
- return StringHelper.compare(ab.length, ab, 0, bb, 0);
- }
-
- @Override
- public void readFrom(StreamInput in) throws IOException {
- super.readFrom(in);
- minValue = valueOf(in.readString(), null);
- maxValue = valueOf(in.readString(), null);
- }
-
- @Override
- public void writeTo(StreamOutput out) throws IOException {
- super.writeTo(out);
- out.writeString(NetworkAddress.format(minValue));
- out.writeString(NetworkAddress.format(maxValue));
+ return maxValue != null ? NetworkAddress.format(maxValue) : null;
}
}
- public static FieldStats read(StreamInput in) throws IOException {
- FieldStats stats;
+ public static FieldStats readFrom(StreamInput in) throws IOException {
byte type = in.readByte();
+ long maxDoc = in.readLong();
+ long docCount = in.readLong();
+ long sumDocFreq = in.readLong();
+ long sumTotalTermFreq = in.readLong();
+ boolean isSearchable = in.readBoolean();
+ boolean isAggregatable = in.readBoolean();
+ boolean hasMinMax = in.readBoolean();
+
switch (type) {
case 0:
- stats = new Long();
- break;
+ if (hasMinMax) {
+ return new Long(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, in.readLong(), in.readLong());
+ }
+ return new Long(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable);
+
case 1:
- stats = new Date();
- break;
+ if (hasMinMax) {
+ return new Double(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, in.readDouble(), in.readDouble());
+ }
+ return new Double(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable);
+
case 2:
- stats = new Double();
- break;
+ FormatDateTimeFormatter formatter = Joda.forPattern(in.readString());
+ if (hasMinMax) {
+ return new Date(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, formatter, in.readLong(), in.readLong());
+ }
+ return new Date(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, formatter);
+
case 3:
- stats = new Text();
- break;
+ if (hasMinMax) {
+ return new Text(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, in.readBytesRef(), in.readBytesRef());
+ }
+ return new Text(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, null, null);
+
case 4:
- stats = new Ip();
- break;
+ InetAddress min = null;
+ InetAddress max = null;
+ if (hasMinMax) {
+ int l1 = in.readByte();
+ byte[] b1 = new byte[l1];
+ int l2 = in.readByte();
+ byte[] b2 = new byte[l2];
+ min = InetAddressPoint.decode(b1);
+ max = InetAddressPoint.decode(b2);
+ }
+ return new Ip(maxDoc, docCount, sumDocFreq, sumTotalTermFreq,
+ isSearchable, isAggregatable, min, max);
+
default:
- throw new IllegalArgumentException("Illegal type [" + type + "]");
+ throw new IllegalArgumentException("Unknown type.");
+ }
+ }
+
+ public static String typeName(byte type) {
+ switch (type) {
+ case 0:
+ return "whole-number";
+ case 1:
+ return "floating-point";
+ case 2:
+ return "date";
+ case 3:
+ return "text";
+ case 4:
+ return "ip";
+ default:
+ throw new IllegalArgumentException("Unknown type.");
}
- stats.readFrom(in);
- return stats;
}
private final static class Fields {
-
final static String MAX_DOC = new String("max_doc");
final static String DOC_COUNT = new String("doc_count");
final static String DENSITY = new String("density");
final static String SUM_DOC_FREQ = new String("sum_doc_freq");
final static String SUM_TOTAL_TERM_FREQ = new String("sum_total_term_freq");
+ final static String SEARCHABLE = new String("searchable");
+ final static String AGGREGATABLE = new String("aggregatable");
final static String MIN_VALUE = new String("min_value");
final static String MIN_VALUE_AS_STRING = new String("min_value_as_string");
final static String MAX_VALUE = new String("max_value");
final static String MAX_VALUE_AS_STRING = new String("max_value_as_string");
-
}
-
}
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsRequest.java b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsRequest.java
index 4404cdafecc..a1e1110f622 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsRequest.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsRequest.java
@@ -108,7 +108,8 @@ public class FieldStatsRequest extends BroadcastRequest {
this.indexConstraints = indexConstraints.toArray(new IndexConstraint[indexConstraints.size()]);
}
- private void parseIndexContraints(List indexConstraints, XContentParser parser) throws IOException {
+ private void parseIndexContraints(List indexConstraints,
+ XContentParser parser) throws IOException {
Token token = parser.currentToken();
assert token == Token.START_OBJECT;
String field = null;
@@ -117,7 +118,8 @@ public class FieldStatsRequest extends BroadcastRequest {
if (token == Token.FIELD_NAME) {
field = currentName = parser.currentName();
} else if (token == Token.START_OBJECT) {
- for (Token fieldToken = parser.nextToken(); fieldToken != Token.END_OBJECT; fieldToken = parser.nextToken()) {
+ for (Token fieldToken = parser.nextToken();
+ fieldToken != Token.END_OBJECT; fieldToken = parser.nextToken()) {
if (fieldToken == Token.FIELD_NAME) {
currentName = parser.currentName();
} else if (fieldToken == Token.START_OBJECT) {
@@ -125,7 +127,8 @@ public class FieldStatsRequest extends BroadcastRequest {
String value = null;
String optionalFormat = null;
IndexConstraint.Comparison comparison = null;
- for (Token propertyToken = parser.nextToken(); propertyToken != Token.END_OBJECT; propertyToken = parser.nextToken()) {
+ for (Token propertyToken = parser.nextToken();
+ propertyToken != Token.END_OBJECT; propertyToken = parser.nextToken()) {
if (propertyToken.isValue()) {
if ("format".equals(parser.currentName())) {
optionalFormat = parser.text();
@@ -162,7 +165,8 @@ public class FieldStatsRequest extends BroadcastRequest {
public ActionRequestValidationException validate() {
ActionRequestValidationException validationException = super.validate();
if ("cluster".equals(level) == false && "indices".equals(level) == false) {
- validationException = ValidateActions.addValidationError("invalid level option [" + level + "]", validationException);
+ validationException =
+ ValidateActions.addValidationError("invalid level option [" + level + "]", validationException);
}
if (fields == null || fields.length == 0) {
validationException = ValidateActions.addValidationError("no fields specified", validationException);
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsRequestBuilder.java
index c5270a7e0bc..c0c4d78de9b 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsRequestBuilder.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsRequestBuilder.java
@@ -24,7 +24,8 @@ import org.elasticsearch.client.ElasticsearchClient;
/**
*/
-public class FieldStatsRequestBuilder extends BroadcastOperationRequestBuilder {
+public class FieldStatsRequestBuilder extends
+ BroadcastOperationRequestBuilder {
public FieldStatsRequestBuilder(ElasticsearchClient client, FieldStatsAction action) {
super(client, action, new FieldStatsRequest());
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsResponse.java b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsResponse.java
index a8f66ca56ea..14e2f13d4ff 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsResponse.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsResponse.java
@@ -33,15 +33,19 @@ import java.util.Map;
/**
*/
public class FieldStatsResponse extends BroadcastResponse {
-
private Map> indicesMergedFieldStats;
+ private Map conflicts;
public FieldStatsResponse() {
}
- public FieldStatsResponse(int totalShards, int successfulShards, int failedShards, List shardFailures, Map> indicesMergedFieldStats) {
+ public FieldStatsResponse(int totalShards, int successfulShards, int failedShards,
+ List shardFailures,
+ Map> indicesMergedFieldStats,
+ Map conflicts) {
super(totalShards, successfulShards, failedShards, shardFailures);
this.indicesMergedFieldStats = indicesMergedFieldStats;
+ this.conflicts = conflicts;
}
@Nullable
@@ -49,6 +53,10 @@ public class FieldStatsResponse extends BroadcastResponse {
return indicesMergedFieldStats.get("_all");
}
+ public Map getConflicts() {
+ return conflicts;
+ }
+
public Map> getIndicesMergedFieldStats() {
return indicesMergedFieldStats;
}
@@ -56,7 +64,7 @@ public class FieldStatsResponse extends BroadcastResponse {
@Override
public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
- final int size = in.readVInt();
+ int size = in.readVInt();
indicesMergedFieldStats = new HashMap<>(size);
for (int i = 0; i < size; i++) {
String key = in.readString();
@@ -65,10 +73,18 @@ public class FieldStatsResponse extends BroadcastResponse {
indicesMergedFieldStats.put(key, indexFieldStats);
for (int j = 0; j < indexSize; j++) {
key = in.readString();
- FieldStats value = FieldStats.read(in);
+ FieldStats value = FieldStats.readFrom(in);
indexFieldStats.put(key, value);
}
}
+ size = in.readVInt();
+ conflicts = new HashMap<>(size);
+ for (int i = 0; i < size; i++) {
+ String key = in.readString();
+ String value = in.readString();
+ conflicts.put(key, value);
+ }
+
}
@Override
@@ -83,5 +99,10 @@ public class FieldStatsResponse extends BroadcastResponse {
entry2.getValue().writeTo(out);
}
}
+ out.writeVInt(conflicts.size());
+ for (Map.Entry entry : conflicts.entrySet()) {
+ out.writeString(entry.getKey());
+ out.writeString(entry.getValue());
+ }
}
}
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java
index d6e6b5fc0a3..a3043d3ae35 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java
@@ -54,7 +54,7 @@ public class FieldStatsShardResponse extends BroadcastShardResponse {
fieldStats = new HashMap<>(size);
for (int i = 0; i < size; i++) {
String key = in.readString();
- FieldStats value = FieldStats.read(in);
+ FieldStats value = FieldStats.readFrom(in);
fieldStats.put(key, value);
}
}
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/IndexConstraint.java b/core/src/main/java/org/elasticsearch/action/fieldstats/IndexConstraint.java
index 681b7d7a442..62eaf207e31 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/IndexConstraint.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/IndexConstraint.java
@@ -50,7 +50,8 @@ public class IndexConstraint {
this(field, property, comparison, value, null);
}
- public IndexConstraint(String field, Property property, Comparison comparison, String value, String optionalFormat) {
+ public IndexConstraint(String field, Property property,
+ Comparison comparison, String value, String optionalFormat) {
this.field = Objects.requireNonNull(field);
this.property = Objects.requireNonNull(property);
this.comparison = Objects.requireNonNull(comparison);
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java b/core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java
index 5981128126e..fbff98bbf4c 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java
@@ -33,6 +33,7 @@ import org.elasticsearch.cluster.routing.GroupShardsIterator;
import org.elasticsearch.cluster.routing.ShardRouting;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.inject.Inject;
+import org.elasticsearch.common.regex.Regex;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.IndexService;
import org.elasticsearch.index.engine.Engine;
@@ -45,32 +46,41 @@ import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
+
import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
import java.util.Set;
+import java.util.HashSet;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
import java.util.concurrent.atomic.AtomicReferenceArray;
-public class TransportFieldStatsTransportAction extends TransportBroadcastAction {
+public class TransportFieldStatsTransportAction extends
+ TransportBroadcastAction {
private final IndicesService indicesService;
@Inject
public TransportFieldStatsTransportAction(Settings settings, ThreadPool threadPool, ClusterService clusterService,
TransportService transportService, ActionFilters actionFilters,
- IndexNameExpressionResolver indexNameExpressionResolver, IndicesService indicesService) {
- super(settings, FieldStatsAction.NAME, threadPool, clusterService, transportService, actionFilters, indexNameExpressionResolver, FieldStatsRequest::new, FieldStatsShardRequest::new, ThreadPool.Names.MANAGEMENT);
+ IndexNameExpressionResolver indexNameExpressionResolver,
+ IndicesService indicesService) {
+ super(settings, FieldStatsAction.NAME, threadPool, clusterService, transportService,
+ actionFilters, indexNameExpressionResolver, FieldStatsRequest::new,
+ FieldStatsShardRequest::new, ThreadPool.Names.MANAGEMENT);
this.indicesService = indicesService;
}
@Override
- protected FieldStatsResponse newResponse(FieldStatsRequest request, AtomicReferenceArray shardsResponses, ClusterState clusterState) {
+ protected FieldStatsResponse newResponse(FieldStatsRequest request, AtomicReferenceArray shardsResponses,
+ ClusterState clusterState) {
int successfulShards = 0;
int failedShards = 0;
+ Map conflicts = new HashMap<>();
Map> indicesMergedFieldStats = new HashMap<>();
List shardFailures = new ArrayList<>();
for (int i = 0; i < shardsResponses.length(); i++) {
@@ -79,7 +89,9 @@ public class TransportFieldStatsTransportAction extends TransportBroadcastAction
// simply ignore non active shards
} else if (shardValue instanceof BroadcastShardOperationFailedException) {
failedShards++;
- shardFailures.add(new DefaultShardOperationFailedException((BroadcastShardOperationFailedException) shardValue));
+ shardFailures.add(
+ new DefaultShardOperationFailedException((BroadcastShardOperationFailedException) shardValue)
+ );
} else {
successfulShards++;
FieldStatsShardResponse shardResponse = (FieldStatsShardResponse) shardValue;
@@ -104,40 +116,63 @@ public class TransportFieldStatsTransportAction extends TransportBroadcastAction
FieldStats> existing = indexMergedFieldStats.get(entry.getKey());
if (existing != null) {
if (existing.getType() != entry.getValue().getType()) {
- throw new IllegalStateException(
- "trying to merge the field stats of field [" + entry.getKey() + "] from index [" + shardResponse.getIndex() + "] but the field type is incompatible, try to set the 'level' option to 'indices'"
- );
+ if (conflicts.containsKey(entry.getKey()) == false) {
+ conflicts.put(entry.getKey(),
+ "Field [" + entry.getKey() + "] of type [" +
+ FieldStats.typeName(entry.getValue().getType()) +
+ "] conflicts with existing field of type [" +
+ FieldStats.typeName(existing.getType()) +
+ "] in other index.");
+ }
+ } else {
+ existing.accumulate(entry.getValue());
}
- existing.append(entry.getValue());
} else {
indexMergedFieldStats.put(entry.getKey(), entry.getValue());
}
}
}
+
+ // Check the field with conflicts and remove them.
+ for (String conflictKey : conflicts.keySet()) {
+ Iterator>> iterator =
+ indicesMergedFieldStats.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry> entry = iterator.next();
+ if (entry.getValue().containsKey(conflictKey)) {
+ entry.getValue().remove(conflictKey);
+ }
+ }
+ }
+
}
if (request.getIndexConstraints().length != 0) {
Set fieldStatFields = new HashSet<>(Arrays.asList(request.getFields()));
for (IndexConstraint indexConstraint : request.getIndexConstraints()) {
- Iterator>> iterator = indicesMergedFieldStats.entrySet().iterator();
+ Iterator>> iterator =
+ indicesMergedFieldStats.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry> entry = iterator.next();
FieldStats indexConstraintFieldStats = entry.getValue().get(indexConstraint.getField());
if (indexConstraintFieldStats != null && indexConstraintFieldStats.match(indexConstraint)) {
- // If the field stats didn't occur in the list of fields in the original request we need to remove the
- // field stats, because it was never requested and was only needed to validate the index constraint
+ // If the field stats didn't occur in the list of fields in the original request
+ // we need to remove the field stats, because it was never requested and was only needed to
+ // validate the index constraint.
if (fieldStatFields.contains(indexConstraint.getField()) == false) {
entry.getValue().remove(indexConstraint.getField());
}
} else {
- // The index constraint didn't match or was empty, so we remove all the field stats of the index we're checking
+ // The index constraint didn't match or was empty,
+ // so we remove all the field stats of the index we're checking.
iterator.remove();
}
}
}
}
- return new FieldStatsResponse(shardsResponses.length(), successfulShards, failedShards, shardFailures, indicesMergedFieldStats);
+ return new FieldStatsResponse(shardsResponses.length(), successfulShards, failedShards,
+ shardFailures, indicesMergedFieldStats, conflicts);
}
@Override
@@ -159,13 +194,22 @@ public class TransportFieldStatsTransportAction extends TransportBroadcastAction
IndexShard shard = indexServices.getShard(shardId.id());
try (Engine.Searcher searcher = shard.acquireSearcher("fieldstats")) {
for (String field : request.getFields()) {
- MappedFieldType fieldType = mapperService.fullName(field);
- if (fieldType == null) {
- throw new IllegalArgumentException("field [" + field + "] doesn't exist");
+ Collection matchFields;
+ if (Regex.isSimpleMatchPattern(field)) {
+ matchFields = mapperService.simpleMatchToIndexNames(field);
+ } else {
+ matchFields = Collections.singleton(field);
}
- FieldStats> stats = fieldType.stats(searcher.reader());
- if (stats != null) {
- fieldStats.put(field, stats);
+ for (String matchField : matchFields) {
+ MappedFieldType fieldType = mapperService.fullName(matchField);
+ if (fieldType == null) {
+ // ignore.
+ continue;
+ }
+ FieldStats> stats = fieldType.stats(searcher.reader());
+ if (stats != null) {
+ fieldStats.put(matchField, stats);
+ }
}
}
} catch (IOException e) {
@@ -175,7 +219,8 @@ public class TransportFieldStatsTransportAction extends TransportBroadcastAction
}
@Override
- protected GroupShardsIterator shards(ClusterState clusterState, FieldStatsRequest request, String[] concreteIndices) {
+ protected GroupShardsIterator shards(ClusterState clusterState, FieldStatsRequest request,
+ String[] concreteIndices) {
return clusterService.operationRouting().searchShards(clusterState, concreteIndices, null, null);
}
@@ -185,7 +230,8 @@ public class TransportFieldStatsTransportAction extends TransportBroadcastAction
}
@Override
- protected ClusterBlockException checkRequestBlock(ClusterState state, FieldStatsRequest request, String[] concreteIndices) {
+ protected ClusterBlockException checkRequestBlock(ClusterState state, FieldStatsRequest request,
+ String[] concreteIndices) {
return state.blocks().indicesBlockedException(ClusterBlockLevel.READ, concreteIndices);
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java b/core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java
index 2dc54f1f55c..163c8578bee 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java
@@ -96,7 +96,11 @@ public abstract class MappedFieldType extends FieldType {
@Override
public abstract MappedFieldType clone();
- /** Return a fielddata builder for this field. */
+ /** Return a fielddata builder for this field
+ * @throws IllegalArgumentException if the fielddata is not supported on this type.
+ * An IllegalArgumentException is needed in order to return an http error 400
+ * when this error occurs in a request. see: {@link org.elasticsearch.ExceptionsHelper#status}
+ **/
public IndexFieldData.Builder fielddataBuilder() {
throw new IllegalArgumentException("Fielddata is not supported on field [" + name() + "] of type [" + typeName() + "]");
}
@@ -315,6 +319,25 @@ public abstract class MappedFieldType extends FieldType {
return BytesRefs.toBytesRef(value);
}
+ /** Returns true if the field is searchable.
+ *
+ */
+ protected boolean isSearchable() {
+ return indexOptions() != IndexOptions.NONE;
+ }
+
+ /** Returns true if the field is aggregatable.
+ *
+ */
+ protected boolean isAggregatable() {
+ try {
+ fielddataBuilder();
+ return true;
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ }
+
/** Generates a query that will only match documents that contain the given value.
* The default implementation returns a {@link TermQuery} over the value bytes,
* boosted by {@link #boost()}.
@@ -376,11 +399,13 @@ public abstract class MappedFieldType extends FieldType {
int maxDoc = reader.maxDoc();
Terms terms = MultiFields.getTerms(reader, name());
if (terms == null) {
- return null;
+ return new FieldStats.Text(maxDoc, isSearchable(), isAggregatable());
}
- return new FieldStats.Text(
- maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), terms.getMin(), terms.getMax()
- );
+ FieldStats stats = new FieldStats.Text(maxDoc, terms.getDocCount(),
+ terms.getSumDocFreq(), terms.getSumTotalTermFreq(),
+ isSearchable(), isAggregatable(),
+ terms.getMin(), terms.getMax());
+ return stats;
}
/**
@@ -411,9 +436,13 @@ public abstract class MappedFieldType extends FieldType {
return null;
}
+ /** @throws IllegalArgumentException if the fielddata is not supported on this type.
+ * An IllegalArgumentException is needed in order to return an http error 400
+ * when this error occurs in a request. see: {@link org.elasticsearch.ExceptionsHelper#status}
+ **/
protected final void failIfNoDocValues() {
if (hasDocValues() == false) {
- throw new IllegalStateException("Can't load fielddata on [" + name()
+ throw new IllegalArgumentException("Can't load fielddata on [" + name()
+ "] because fielddata is unsupported on fields of type ["
+ typeName() + "]. Use doc values instead.");
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java
index 21131ebbc89..1d238e38ced 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java
@@ -396,15 +396,14 @@ public class DateFieldMapper extends FieldMapper implements AllFieldMapper.Inclu
String field = name();
long size = PointValues.size(reader, field);
if (size == 0) {
- return null;
+ return new FieldStats.Date(reader.maxDoc(), isSearchable(), isAggregatable(), dateTimeFormatter());
}
int docCount = PointValues.getDocCount(reader, field);
byte[] min = PointValues.getMinPackedValue(reader, field);
byte[] max = PointValues.getMaxPackedValue(reader, field);
return new FieldStats.Date(reader.maxDoc(),docCount, -1L, size,
- LongPoint.decodeDimension(min, 0),
- LongPoint.decodeDimension(max, 0),
- dateTimeFormatter());
+ isSearchable(), isAggregatable(),
+ dateTimeFormatter(), LongPoint.decodeDimension(min, 0), LongPoint.decodeDimension(max, 0));
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyByteFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyByteFieldMapper.java
index 8248656aead..5c6712a31a1 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyByteFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyByteFieldMapper.java
@@ -170,17 +170,17 @@ public class LegacyByteFieldMapper extends LegacyNumberFieldMapper {
}
@Override
- public FieldStats stats(IndexReader reader) throws IOException {
+ public FieldStats.Long stats(IndexReader reader) throws IOException {
int maxDoc = reader.maxDoc();
Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
if (terms == null) {
- return null;
+ return new FieldStats.Long(maxDoc, isSearchable(), isAggregatable());
}
long minValue = LegacyNumericUtils.getMinInt(terms);
long maxValue = LegacyNumericUtils.getMaxInt(terms);
- return new FieldStats.Long(
- maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue
- );
+ return new FieldStats.Long(maxDoc, terms.getDocCount(),
+ terms.getSumDocFreq(), terms.getSumTotalTermFreq(), isSearchable(), isAggregatable(),
+ minValue, maxValue);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyDateFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyDateFieldMapper.java
index c2dfd56e4d8..10a6b4a2ecd 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyDateFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyDateFieldMapper.java
@@ -375,17 +375,17 @@ public class LegacyDateFieldMapper extends LegacyNumberFieldMapper {
}
@Override
- public FieldStats stats(IndexReader reader) throws IOException {
+ public FieldStats.Date stats(IndexReader reader) throws IOException {
int maxDoc = reader.maxDoc();
Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
if (terms == null) {
- return null;
+ return new FieldStats.Date(maxDoc, isSearchable(), isAggregatable(), dateTimeFormatter());
}
long minValue = LegacyNumericUtils.getMinLong(terms);
long maxValue = LegacyNumericUtils.getMaxLong(terms);
- return new FieldStats.Date(
- maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue, dateTimeFormatter()
- );
+ return new FieldStats.Date(maxDoc, terms.getDocCount(),
+ terms.getSumDocFreq(), terms.getSumTotalTermFreq(), isSearchable(), isAggregatable(),
+ dateTimeFormatter(), minValue, maxValue);
}
public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, @Nullable DateTimeZone timeZone, @Nullable DateMathParser forcedDateParser) {
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyDoubleFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyDoubleFieldMapper.java
index abbe26dd71c..3a3c506a3ef 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyDoubleFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyDoubleFieldMapper.java
@@ -136,12 +136,12 @@ public class LegacyDoubleFieldMapper extends LegacyNumberFieldMapper {
}
@Override
- public Double nullValue() {
- return (Double)super.nullValue();
+ public java.lang.Double nullValue() {
+ return (java.lang.Double)super.nullValue();
}
@Override
- public Double valueForSearch(Object value) {
+ public java.lang.Double valueForSearch(Object value) {
if (value == null) {
return null;
}
@@ -151,7 +151,7 @@ public class LegacyDoubleFieldMapper extends LegacyNumberFieldMapper {
if (value instanceof BytesRef) {
return Numbers.bytesToDouble((BytesRef) value);
}
- return Double.parseDouble(value.toString());
+ return java.lang.Double.parseDouble(value.toString());
}
@Override
@@ -181,17 +181,17 @@ public class LegacyDoubleFieldMapper extends LegacyNumberFieldMapper {
}
@Override
- public FieldStats stats(IndexReader reader) throws IOException {
+ public FieldStats.Double stats(IndexReader reader) throws IOException {
int maxDoc = reader.maxDoc();
Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
if (terms == null) {
- return null;
+ return new FieldStats.Double(maxDoc, isSearchable(), isAggregatable());
}
double minValue = NumericUtils.sortableLongToDouble(LegacyNumericUtils.getMinLong(terms));
double maxValue = NumericUtils.sortableLongToDouble(LegacyNumericUtils.getMaxLong(terms));
- return new FieldStats.Double(
- maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue
- );
+ return new FieldStats.Double(maxDoc, terms.getDocCount(),
+ terms.getSumDocFreq(), terms.getSumTotalTermFreq(), isSearchable(), isAggregatable(),
+ minValue, maxValue);
}
@Override
@@ -235,13 +235,13 @@ public class LegacyDoubleFieldMapper extends LegacyNumberFieldMapper {
}
value = fieldType().nullValue();
} else {
- value = Double.parseDouble(sExternalValue);
+ value = java.lang.Double.parseDouble(sExternalValue);
}
} else {
value = ((Number) externalValue).doubleValue();
}
if (context.includeInAll(includeInAll, this)) {
- context.allEntries().addText(fieldType().name(), Double.toString(value), boost);
+ context.allEntries().addText(fieldType().name(), java.lang.Double.toString(value), boost);
}
} else {
XContentParser parser = context.parser();
@@ -258,7 +258,7 @@ public class LegacyDoubleFieldMapper extends LegacyNumberFieldMapper {
&& Version.indexCreated(context.indexSettings()).before(Version.V_5_0_0_alpha1)) {
XContentParser.Token token;
String currentFieldName = null;
- Double objValue = fieldType().nullValue();
+ java.lang.Double objValue = fieldType().nullValue();
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName();
@@ -341,7 +341,7 @@ public class LegacyDoubleFieldMapper extends LegacyNumberFieldMapper {
@Override
public String numericAsString() {
- return Double.toString(number);
+ return java.lang.Double.toString(number);
}
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyFloatFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyFloatFieldMapper.java
index 153681553ce..a5dbc98fa7d 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyFloatFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyFloatFieldMapper.java
@@ -166,17 +166,16 @@ public class LegacyFloatFieldMapper extends LegacyNumberFieldMapper {
}
@Override
- public FieldStats stats(IndexReader reader) throws IOException {
+ public FieldStats.Double stats(IndexReader reader) throws IOException {
int maxDoc = reader.maxDoc();
Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
if (terms == null) {
- return null;
+ return new FieldStats.Double(maxDoc, isSearchable(), isAggregatable());
}
float minValue = NumericUtils.sortableIntToFloat(LegacyNumericUtils.getMinInt(terms));
float maxValue = NumericUtils.sortableIntToFloat(LegacyNumericUtils.getMaxInt(terms));
- return new FieldStats.Double(
- maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue
- );
+ return new FieldStats.Double(maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(),
+ isSearchable(), isAggregatable(), minValue, maxValue);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyIntegerFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyIntegerFieldMapper.java
index a7472e85847..b2b95950436 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyIntegerFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyIntegerFieldMapper.java
@@ -170,17 +170,17 @@ public class LegacyIntegerFieldMapper extends LegacyNumberFieldMapper {
}
@Override
- public FieldStats stats(IndexReader reader) throws IOException {
+ public FieldStats.Long stats(IndexReader reader) throws IOException {
int maxDoc = reader.maxDoc();
Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
if (terms == null) {
- return null;
+ return new FieldStats.Long(maxDoc, isSearchable(), isAggregatable());
}
long minValue = LegacyNumericUtils.getMinInt(terms);
long maxValue = LegacyNumericUtils.getMaxInt(terms);
return new FieldStats.Long(
- maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue
- );
+ maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(),
+ isSearchable(), isAggregatable(), minValue, maxValue);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyLongFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyLongFieldMapper.java
index 9fcd6757a46..b8fb3c7fcef 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyLongFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyLongFieldMapper.java
@@ -173,13 +173,14 @@ public class LegacyLongFieldMapper extends LegacyNumberFieldMapper {
int maxDoc = reader.maxDoc();
Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
if (terms == null) {
- return null;
+ return new FieldStats.Long(
+ maxDoc, isSearchable(), isAggregatable());
}
long minValue = LegacyNumericUtils.getMinLong(terms);
long maxValue = LegacyNumericUtils.getMaxLong(terms);
return new FieldStats.Long(
- maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue
- );
+ maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(),
+ isSearchable(), isAggregatable(), minValue, maxValue);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyShortFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyShortFieldMapper.java
index c0e496cbe63..ff85e30be2e 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyShortFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LegacyShortFieldMapper.java
@@ -174,17 +174,17 @@ public class LegacyShortFieldMapper extends LegacyNumberFieldMapper {
}
@Override
- public FieldStats stats(IndexReader reader) throws IOException {
+ public FieldStats.Long stats(IndexReader reader) throws IOException {
int maxDoc = reader.maxDoc();
Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
if (terms == null) {
- return null;
+ return new FieldStats.Long(maxDoc, isSearchable(), isAggregatable());
}
long minValue = LegacyNumericUtils.getMinInt(terms);
long maxValue = LegacyNumericUtils.getMaxInt(terms);
return new FieldStats.Long(
- maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue
- );
+ maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(),
+ isSearchable(), isAggregatable(), minValue, maxValue);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/NumberFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/NumberFieldMapper.java
index dd48fb417f5..d1a023ff755 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/NumberFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/NumberFieldMapper.java
@@ -120,7 +120,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
@Override
public NumberFieldMapper build(BuilderContext context) {
setupFieldType(context);
- NumberFieldMapper fieldMapper = new NumberFieldMapper(name, fieldType, defaultFieldType, ignoreMalformed(context),
+ NumberFieldMapper fieldMapper =
+ new NumberFieldMapper(name, fieldType, defaultFieldType, ignoreMalformed(context),
coerce(context), context.indexSettings(), multiFieldsBuilder.build(this, context), copyTo);
return (NumberFieldMapper) fieldMapper.includeInAll(includeInAll);
}
@@ -135,7 +136,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- public Mapper.Builder,?> parse(String name, Map node, ParserContext parserContext) throws MapperParsingException {
+ public Mapper.Builder,?> parse(String name, Map node,
+ ParserContext parserContext) throws MapperParsingException {
if (parserContext.indexVersionCreated().before(Version.V_5_0_0_alpha2)) {
switch (type) {
case BYTE:
@@ -212,7 +214,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- Query rangeQuery(String field, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper) {
+ Query rangeQuery(String field, Object lowerTerm, Object upperTerm,
+ boolean includeLower, boolean includeUpper) {
float l = Float.NEGATIVE_INFINITY;
float u = Float.POSITIVE_INFINITY;
if (lowerTerm != null) {
@@ -238,13 +241,15 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- public List createFields(String name, Number value, boolean indexed, boolean docValued, boolean stored) {
+ public List createFields(String name, Number value,
+ boolean indexed, boolean docValued, boolean stored) {
List fields = new ArrayList<>();
if (indexed) {
fields.add(new FloatPoint(name, value.floatValue()));
}
if (docValued) {
- fields.add(new SortedNumericDocValuesField(name, NumericUtils.floatToSortableInt(value.floatValue())));
+ fields.add(new SortedNumericDocValuesField(name,
+ NumericUtils.floatToSortableInt(value.floatValue())));
}
if (stored) {
fields.add(new StoredField(name, value.floatValue()));
@@ -253,17 +258,18 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- FieldStats.Double stats(IndexReader reader, String field) throws IOException {
- long size = PointValues.size(reader, field);
+ FieldStats.Double stats(IndexReader reader, String fieldName,
+ boolean isSearchable, boolean isAggregatable) throws IOException {
+ long size = PointValues.size(reader, fieldName);
if (size == 0) {
- return null;
+ return new FieldStats.Double(reader.maxDoc(), isSearchable, isAggregatable);
}
- int docCount = PointValues.getDocCount(reader, field);
- byte[] min = PointValues.getMinPackedValue(reader, field);
- byte[] max = PointValues.getMaxPackedValue(reader, field);
+ int docCount = PointValues.getDocCount(reader, fieldName);
+ byte[] min = PointValues.getMinPackedValue(reader, fieldName);
+ byte[] max = PointValues.getMaxPackedValue(reader, fieldName);
return new FieldStats.Double(reader.maxDoc(),docCount, -1L, size,
- FloatPoint.decodeDimension(min, 0),
- FloatPoint.decodeDimension(max, 0));
+ isSearchable, isAggregatable,
+ FloatPoint.decodeDimension(min, 0), FloatPoint.decodeDimension(max, 0));
}
},
DOUBLE("double", NumericType.DOUBLE) {
@@ -299,7 +305,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- Query rangeQuery(String field, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper) {
+ Query rangeQuery(String field, Object lowerTerm, Object upperTerm,
+ boolean includeLower, boolean includeUpper) {
double l = Double.NEGATIVE_INFINITY;
double u = Double.POSITIVE_INFINITY;
if (lowerTerm != null) {
@@ -325,13 +332,15 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- public List createFields(String name, Number value, boolean indexed, boolean docValued, boolean stored) {
+ public List createFields(String name, Number value,
+ boolean indexed, boolean docValued, boolean stored) {
List fields = new ArrayList<>();
if (indexed) {
fields.add(new DoublePoint(name, value.doubleValue()));
}
if (docValued) {
- fields.add(new SortedNumericDocValuesField(name, NumericUtils.doubleToSortableLong(value.doubleValue())));
+ fields.add(new SortedNumericDocValuesField(name,
+ NumericUtils.doubleToSortableLong(value.doubleValue())));
}
if (stored) {
fields.add(new StoredField(name, value.doubleValue()));
@@ -340,17 +349,18 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- FieldStats.Double stats(IndexReader reader, String field) throws IOException {
- long size = PointValues.size(reader, field);
+ FieldStats.Double stats(IndexReader reader, String fieldName,
+ boolean isSearchable, boolean isAggregatable) throws IOException {
+ long size = PointValues.size(reader, fieldName);
if (size == 0) {
- return null;
+ return new FieldStats.Double(reader.maxDoc(), isSearchable, isAggregatable);
}
- int docCount = PointValues.getDocCount(reader, field);
- byte[] min = PointValues.getMinPackedValue(reader, field);
- byte[] max = PointValues.getMaxPackedValue(reader, field);
+ int docCount = PointValues.getDocCount(reader, fieldName);
+ byte[] min = PointValues.getMinPackedValue(reader, fieldName);
+ byte[] max = PointValues.getMaxPackedValue(reader, fieldName);
return new FieldStats.Double(reader.maxDoc(),docCount, -1L, size,
- DoublePoint.decodeDimension(min, 0),
- DoublePoint.decodeDimension(max, 0));
+ isSearchable, isAggregatable,
+ DoublePoint.decodeDimension(min, 0), DoublePoint.decodeDimension(max, 0));
}
},
BYTE("byte", NumericType.BYTE) {
@@ -385,7 +395,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- Query rangeQuery(String field, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper) {
+ Query rangeQuery(String field, Object lowerTerm, Object upperTerm,
+ boolean includeLower, boolean includeUpper) {
return INTEGER.rangeQuery(field, lowerTerm, upperTerm, includeLower, includeUpper);
}
@@ -395,13 +406,15 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- public List createFields(String name, Number value, boolean indexed, boolean docValued, boolean stored) {
+ public List createFields(String name, Number value,
+ boolean indexed, boolean docValued, boolean stored) {
return INTEGER.createFields(name, value, indexed, docValued, stored);
}
@Override
- FieldStats.Long stats(IndexReader reader, String field) throws IOException {
- return (FieldStats.Long) INTEGER.stats(reader, field);
+ FieldStats.Long stats(IndexReader reader, String fieldName,
+ boolean isSearchable, boolean isAggregatable) throws IOException {
+ return (FieldStats.Long) INTEGER.stats(reader, fieldName, isSearchable, isAggregatable);
}
@Override
@@ -441,7 +454,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- Query rangeQuery(String field, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper) {
+ Query rangeQuery(String field, Object lowerTerm, Object upperTerm,
+ boolean includeLower, boolean includeUpper) {
return INTEGER.rangeQuery(field, lowerTerm, upperTerm, includeLower, includeUpper);
}
@@ -451,13 +465,15 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- public List createFields(String name, Number value, boolean indexed, boolean docValued, boolean stored) {
+ public List createFields(String name, Number value,
+ boolean indexed, boolean docValued, boolean stored) {
return INTEGER.createFields(name, value, indexed, docValued, stored);
}
@Override
- FieldStats.Long stats(IndexReader reader, String field) throws IOException {
- return (FieldStats.Long) INTEGER.stats(reader, field);
+ FieldStats.Long stats(IndexReader reader, String fieldName,
+ boolean isSearchable, boolean isAggregatable) throws IOException {
+ return (FieldStats.Long) INTEGER.stats(reader, fieldName, isSearchable, isAggregatable);
}
@Override
@@ -498,7 +514,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- Query rangeQuery(String field, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper) {
+ Query rangeQuery(String field, Object lowerTerm, Object upperTerm,
+ boolean includeLower, boolean includeUpper) {
int l = Integer.MIN_VALUE;
int u = Integer.MAX_VALUE;
if (lowerTerm != null) {
@@ -530,7 +547,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- public List createFields(String name, Number value, boolean indexed, boolean docValued, boolean stored) {
+ public List createFields(String name, Number value,
+ boolean indexed, boolean docValued, boolean stored) {
List fields = new ArrayList<>();
if (indexed) {
fields.add(new IntPoint(name, value.intValue()));
@@ -545,17 +563,18 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- FieldStats.Long stats(IndexReader reader, String field) throws IOException {
- long size = PointValues.size(reader, field);
+ FieldStats.Long stats(IndexReader reader, String fieldName,
+ boolean isSearchable, boolean isAggregatable) throws IOException {
+ long size = PointValues.size(reader, fieldName);
if (size == 0) {
- return null;
+ return new FieldStats.Long(reader.maxDoc(), isSearchable, isAggregatable);
}
- int docCount = PointValues.getDocCount(reader, field);
- byte[] min = PointValues.getMinPackedValue(reader, field);
- byte[] max = PointValues.getMaxPackedValue(reader, field);
+ int docCount = PointValues.getDocCount(reader, fieldName);
+ byte[] min = PointValues.getMinPackedValue(reader, fieldName);
+ byte[] max = PointValues.getMaxPackedValue(reader, fieldName);
return new FieldStats.Long(reader.maxDoc(),docCount, -1L, size,
- IntPoint.decodeDimension(min, 0),
- IntPoint.decodeDimension(max, 0));
+ isSearchable, isAggregatable,
+ IntPoint.decodeDimension(min, 0), IntPoint.decodeDimension(max, 0));
}
},
LONG("long", NumericType.LONG) {
@@ -591,7 +610,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- Query rangeQuery(String field, Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper) {
+ Query rangeQuery(String field, Object lowerTerm, Object upperTerm,
+ boolean includeLower, boolean includeUpper) {
long l = Long.MIN_VALUE;
long u = Long.MAX_VALUE;
if (lowerTerm != null) {
@@ -623,7 +643,8 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- public List createFields(String name, Number value, boolean indexed, boolean docValued, boolean stored) {
+ public List createFields(String name, Number value,
+ boolean indexed, boolean docValued, boolean stored) {
List fields = new ArrayList<>();
if (indexed) {
fields.add(new LongPoint(name, value.longValue()));
@@ -638,17 +659,18 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
@Override
- FieldStats.Long stats(IndexReader reader, String field) throws IOException {
- long size = PointValues.size(reader, field);
+ FieldStats.Long stats(IndexReader reader, String fieldName,
+ boolean isSearchable, boolean isAggregatable) throws IOException {
+ long size = PointValues.size(reader, fieldName);
if (size == 0) {
- return null;
+ return new FieldStats.Long(reader.maxDoc(), isSearchable, isAggregatable);
}
- int docCount = PointValues.getDocCount(reader, field);
- byte[] min = PointValues.getMinPackedValue(reader, field);
- byte[] max = PointValues.getMaxPackedValue(reader, field);
+ int docCount = PointValues.getDocCount(reader, fieldName);
+ byte[] min = PointValues.getMinPackedValue(reader, fieldName);
+ byte[] max = PointValues.getMaxPackedValue(reader, fieldName);
return new FieldStats.Long(reader.maxDoc(),docCount, -1L, size,
- LongPoint.decodeDimension(min, 0),
- LongPoint.decodeDimension(max, 0));
+ isSearchable, isAggregatable,
+ LongPoint.decodeDimension(min, 0), LongPoint.decodeDimension(max, 0));
}
};
@@ -670,12 +692,15 @@ public class NumberFieldMapper extends FieldMapper implements AllFieldMapper.Inc
}
abstract Query termQuery(String field, Object value);
abstract Query termsQuery(String field, List