All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.arakelian.elastic.search.WriteAggregationVisitor Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF 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 com.arakelian.elastic.search;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.arakelian.elastic.model.VersionComponents;
import com.arakelian.elastic.model.aggs.ValuesSourceAggregation;
import com.arakelian.elastic.model.aggs.bucket.BucketOrder;
import com.arakelian.elastic.model.aggs.bucket.DateHistogramAggregation;
import com.arakelian.elastic.model.aggs.bucket.DateRangeAggregation;
import com.arakelian.elastic.model.aggs.bucket.GeoHashGridAggregation;
import com.arakelian.elastic.model.aggs.bucket.HistogramAggregation;
import com.arakelian.elastic.model.aggs.bucket.IpRangeAggregation;
import com.arakelian.elastic.model.aggs.bucket.MissingAggregation;
import com.arakelian.elastic.model.aggs.bucket.RangeAggregation;
import com.arakelian.elastic.model.aggs.bucket.SamplerAggregation;
import com.arakelian.elastic.model.aggs.bucket.TermsAggregation;
import com.arakelian.elastic.model.aggs.metrics.AvgAggregation;
import com.arakelian.elastic.model.aggs.metrics.CardinalityAggregation;
import com.arakelian.elastic.model.aggs.metrics.ExtendedStatsAggregation;
import com.arakelian.elastic.model.aggs.metrics.GeoBoundsAggregation;
import com.arakelian.elastic.model.aggs.metrics.GeoCentroidAggregation;
import com.arakelian.elastic.model.aggs.metrics.MaxAggregation;
import com.arakelian.elastic.model.aggs.metrics.MinAggregation;
import com.arakelian.elastic.model.aggs.metrics.PercentileRanksAggregation;
import com.arakelian.elastic.model.aggs.metrics.PercentileRanksAggregation.Method;
import com.arakelian.elastic.model.aggs.metrics.PercentilesAggregation;
import com.arakelian.elastic.model.aggs.metrics.StatsAggregation;
import com.arakelian.elastic.model.aggs.metrics.SumAggregation;
import com.arakelian.elastic.model.aggs.metrics.ValueCountAggregation;
import com.fasterxml.jackson.core.JsonGenerator;

public class WriteAggregationVisitor extends AbstractVisitor implements AggregationVisitor {
    public WriteAggregationVisitor(final JsonGenerator writer, final VersionComponents version) {
        super(writer, version);
    }

    @Override
    public boolean enterAvg(final AvgAggregation agg) {
        try {
            writer.writeFieldName("avg");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // avg
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterCardinality(final CardinalityAggregation agg) {
        try {
            writer.writeFieldName("cardinality");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("precision_threshold", agg.getPrecisionThreshold());
            writer.writeEndObject(); // cardinality
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterDateHistogram(final DateHistogramAggregation agg) {
        try {
            writer.writeFieldName("date_histogram");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("keyed", agg.isKeyed());
            writeFieldValue("offset", agg.getOffset());
            writeFieldValue("interval", agg.getInterval());
            writeFieldValue("min_doc_count", agg.getMinDocCount());
            writer.writeEndObject(); // date_histogram
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterDateRange(final DateRangeAggregation agg) {
        try {
            writer.writeFieldName("date_range");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // date_range
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterExtendedStats(final ExtendedStatsAggregation agg) {
        try {
            writer.writeFieldName("extended_stats");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("sigma", agg.getSigma());
            writer.writeEndObject(); // extended_stats
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterGeoBounds(final GeoBoundsAggregation agg) {
        try {
            writer.writeFieldName("geo_bounds");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("wrap_longitude", agg.isWrapLongitude());
            writer.writeEndObject(); // geo_bounds
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterGeoCentroid(final GeoCentroidAggregation agg) {
        try {
            writer.writeFieldName("geo_centroid");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // geo_centroid
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterGeoHashGrid(final GeoHashGridAggregation agg) {
        try {
            writer.writeFieldName("geohash_grid");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("precision", agg.getPrecision());
            writeFieldValue("size", agg.getRequiredSize());
            writeFieldValue("shard_size", agg.getShardSize());
            writer.writeEndObject(); // geohash_grid
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterHistogram(final HistogramAggregation agg) {
        try {
            writer.writeFieldName("histogram");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // histogram
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterIpRange(final IpRangeAggregation agg) {
        try {
            writer.writeFieldName("ip_range");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // ip_range
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterMax(final MaxAggregation agg) {
        try {
            writer.writeFieldName("max");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // max
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterMin(final MinAggregation agg) {
        try {
            writer.writeFieldName("min");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // min
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterMissing(final MissingAggregation agg) {
        try {
            writer.writeFieldName("missing");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // missing
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterPercentileRanks(final PercentileRanksAggregation agg) {
        try {
            writer.writeFieldName("percentile_ranks");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("values", agg.getValues());

            final Method method = agg.getMethod();
            if (method != null) {
                writer.writeFieldName(method.name().toLowerCase());
                writer.writeStartObject();
                // these two fields values are mutually exclusive; if one is set, the other is null
                writeFieldValue("compression", agg.getCompression());
                writeFieldValue(
                        "number_of_significant_value_digits",
                        agg.getNumberOfSignificantValueDigits());
                writer.writeEndObject();
            }
            writeFieldValue("keyed", agg.isKeyed());
            writer.writeEndObject(); // percentile_ranks
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterPercentiles(final PercentilesAggregation agg) {
        try {
            writer.writeFieldName("percentiles");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("percents", agg.getPercents());

            final Method method = agg.getMethod();
            if (method != null) {
                writer.writeFieldName(method.name().toLowerCase());
                writer.writeStartObject();
                // these two fields values are mutually exclusive; if one is set, the other is null
                writeFieldValue("compression", agg.getCompression());
                writeFieldValue(
                        "number_of_significant_value_digits",
                        agg.getNumberOfSignificantValueDigits());
                writer.writeEndObject();
            }
            writeFieldValue("keyed", agg.isKeyed());
            writer.writeEndObject(); // percentiles
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterRange(final RangeAggregation agg) {
        try {
            writer.writeFieldName("range");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // range
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterSampler(final SamplerAggregation agg) {
        try {
            writer.writeFieldName("sampler");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("shard_size", agg.getShardSize());
            writer.writeEndObject(); // sampler
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterStats(final StatsAggregation agg) {
        try {
            writer.writeFieldName("stats");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // stats
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterSum(final SumAggregation agg) {
        try {
            writer.writeFieldName("sum");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // missing
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterTerms(final TermsAggregation agg) {
        try {
            writer.writeFieldName("terms");
            writer.writeStartObject();
            writeValueSource(agg);
            writeFieldValue("min_doc_count", agg.getMinDocCount());
            writeFieldValue("shard_min_doc_count", agg.getShardMinDocCount());
            writeFieldValue("show_term_doc_count_error", agg.isShowTermDocCountError());
            writeFieldValue("size", agg.getSize());
            writeFieldValue("shard_size", agg.getShardSize());

            final String include = agg.getInclude();
            if (include != null) {
                // regex
                writeFieldValue("include", include);
            } else {
                // set of values
                writeFieldValue("include", agg.getIncludeValues());
            }

            final String exclude = agg.getExclude();
            if (exclude != null) {
                // regex
                writeFieldValue("exclude", exclude);
            } else {
                // set of values
                writeFieldValue("exclude", agg.getExcludeValues());
            }

            writeOrder(agg.getOrder());
            writer.writeEndObject(); // terms
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    @Override
    public boolean enterValueCount(final ValueCountAggregation agg) {
        try {
            writer.writeFieldName("value_count");
            writer.writeStartObject();
            writeValueSource(agg);
            writer.writeEndObject(); // value_count
        } catch (final IOException e) {
            throw new UncheckedIOException(e);
        }
        return false;
    }

    public JsonGenerator getWriter() {
        return writer;
    }

    /**
     * Serialize an array of sorts
     *
     * @param orders
     *            list of sort fields
     *
     * @throws IOException
     *             if serialization fails
     */
    private void writeOrder(final List orders) throws IOException {
        if (orders.size() == 0) {
            return;
        }
        writer.writeFieldName("order");
        writer.writeStartArray();
        for (final BucketOrder order : orders) {
            writer.writeStartObject();

            String name = order.getFieldName();
            if (StringUtils.equals(name, "_key")) {
                if (!version.atLeast(6, 0, 0)) {
                    name = "_term";
                }
            }

            writer.writeFieldName(name);
            writer.writeString(order.getOrder().name().toLowerCase());
            writer.writeEndObject();
        }
        writer.writeEndArray();
    }

    private void writeValueSource(final ValuesSourceAggregation agg) throws IOException {
        writeFieldValue("field", agg.getField());
        writeFieldValue("format", agg.getFormat());
        writeFieldValue("missing", agg.getMissing());
        writeFieldValue("time_zone", agg.getTimeZone());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy