|
@@ -10,6 +10,7 @@ import org.apache.lucene.document.BinaryDocValuesField;
|
|
|
import org.apache.lucene.document.Field;
|
|
|
import org.apache.lucene.index.BinaryDocValues;
|
|
|
import org.apache.lucene.index.DocValues;
|
|
|
+import org.apache.lucene.index.LeafReader;
|
|
|
import org.apache.lucene.index.LeafReaderContext;
|
|
|
import org.apache.lucene.search.Query;
|
|
|
import org.apache.lucene.search.SortField;
|
|
@@ -31,6 +32,7 @@ import org.elasticsearch.index.mapper.FieldMapper;
|
|
|
import org.elasticsearch.index.mapper.MappedFieldType;
|
|
|
import org.elasticsearch.index.mapper.MapperBuilderContext;
|
|
|
import org.elasticsearch.index.mapper.MapperParsingException;
|
|
|
+import org.elasticsearch.index.mapper.SourceLoader;
|
|
|
import org.elasticsearch.index.mapper.SourceValueFetcher;
|
|
|
import org.elasticsearch.index.mapper.TextSearchInfo;
|
|
|
import org.elasticsearch.index.mapper.TimeSeriesParams;
|
|
@@ -42,6 +44,7 @@ import org.elasticsearch.search.MultiValueMode;
|
|
|
import org.elasticsearch.search.sort.BucketedSort;
|
|
|
import org.elasticsearch.search.sort.SortOrder;
|
|
|
import org.elasticsearch.xcontent.ParseField;
|
|
|
+import org.elasticsearch.xcontent.XContentBuilder;
|
|
|
import org.elasticsearch.xcontent.XContentParser;
|
|
|
import org.elasticsearch.xcontent.XContentSubParser;
|
|
|
import org.elasticsearch.xpack.analytics.aggregations.support.AnalyticsValuesSourceType;
|
|
@@ -49,6 +52,7 @@ import org.elasticsearch.xpack.analytics.aggregations.support.AnalyticsValuesSou
|
|
|
import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Map;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken;
|
|
|
|
|
@@ -447,4 +451,74 @@ public class HistogramFieldMapper extends FieldMapper {
|
|
|
return count;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
|
|
|
+ if (ignoreMalformed.value()) {
|
|
|
+ throw new IllegalArgumentException(
|
|
|
+ "field [" + name() + "] of type [histogram] doesn't support synthetic source because it ignores malformed histograms"
|
|
|
+ );
|
|
|
+ }
|
|
|
+ if (copyTo.copyToFields().isEmpty() != true) {
|
|
|
+ throw new IllegalArgumentException(
|
|
|
+ "field [" + name() + "] of type [histogram] doesn't support synthetic source because it declares copy_to"
|
|
|
+ );
|
|
|
+ }
|
|
|
+ return new SourceLoader.SyntheticFieldLoader() {
|
|
|
+ private final InternalHistogramValue value = new InternalHistogramValue();
|
|
|
+ private BytesRef binaryValue;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Stream<Map.Entry<String, StoredFieldLoader>> storedFieldLoaders() {
|
|
|
+ return Stream.of();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DocValuesLoader docValuesLoader(LeafReader leafReader, int[] docIdsInLeaf) throws IOException {
|
|
|
+ BinaryDocValues docValues = leafReader.getBinaryDocValues(fieldType().name());
|
|
|
+ if (docValues == null) {
|
|
|
+ // No values in this leaf
|
|
|
+ binaryValue = null;
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return docId -> {
|
|
|
+ if (docValues.advanceExact(docId)) {
|
|
|
+ binaryValue = docValues.binaryValue();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ binaryValue = null;
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean hasValue() {
|
|
|
+ return binaryValue != null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void write(XContentBuilder b) throws IOException {
|
|
|
+ if (binaryValue == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ b.startObject(simpleName());
|
|
|
+
|
|
|
+ value.reset(binaryValue);
|
|
|
+ b.startArray("values");
|
|
|
+ while (value.next()) {
|
|
|
+ b.value(value.value());
|
|
|
+ }
|
|
|
+ b.endArray();
|
|
|
+
|
|
|
+ value.reset(binaryValue);
|
|
|
+ b.startArray("counts");
|
|
|
+ while (value.next()) {
|
|
|
+ b.value(value.count());
|
|
|
+ }
|
|
|
+ b.endArray();
|
|
|
+
|
|
|
+ b.endObject();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
}
|