Search in sources :

Example 1 with ExtendedBounds

use of org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds in project elasticsearch by elastic.

the class DateHistogramIT method testSingleValueFieldWithExtendedBoundsTimezone.

/**
     * Test date histogram aggregation with hour interval, timezone shift and
     * extended bounds (see https://github.com/elastic/elasticsearch/issues/12278)
     */
public void testSingleValueFieldWithExtendedBoundsTimezone() throws Exception {
    String index = "test12278";
    prepareCreate(index).setSettings(Settings.builder().put(indexSettings()).put("index.number_of_shards", 1).put("index.number_of_replicas", 0)).execute().actionGet();
    DateMathParser parser = new DateMathParser(Joda.getStrictStandardDateFormatter());
    // we pick a random timezone offset of +12/-12 hours and insert two documents
    // one at 00:00 in that time zone and one at 12:00
    List<IndexRequestBuilder> builders = new ArrayList<>();
    int timeZoneHourOffset = randomIntBetween(-12, 12);
    DateTimeZone timezone = DateTimeZone.forOffsetHours(timeZoneHourOffset);
    DateTime timeZoneStartToday = new DateTime(parser.parse("now/d", System::currentTimeMillis, false, timezone), DateTimeZone.UTC);
    DateTime timeZoneNoonToday = new DateTime(parser.parse("now/d+12h", System::currentTimeMillis, false, timezone), DateTimeZone.UTC);
    builders.add(indexDoc(index, timeZoneStartToday, 1));
    builders.add(indexDoc(index, timeZoneNoonToday, 2));
    indexRandom(true, builders);
    ensureSearchable(index);
    SearchResponse response = null;
    // retrieve those docs with the same time zone and extended bounds
    response = client().prepareSearch(index).setQuery(QueryBuilders.rangeQuery("date").from("now/d").to("now/d").includeLower(true).includeUpper(true).timeZone(timezone.getID())).addAggregation(dateHistogram("histo").field("date").dateHistogramInterval(DateHistogramInterval.hours(1)).timeZone(timezone).minDocCount(0).extendedBounds(new ExtendedBounds("now/d", "now/d+23h"))).execute().actionGet();
    assertSearchResponse(response);
    assertThat("Expected 24 buckets for one day aggregation with hourly interval", response.getHits().getTotalHits(), equalTo(2L));
    Histogram histo = response.getAggregations().get("histo");
    assertThat(histo, notNullValue());
    assertThat(histo.getName(), equalTo("histo"));
    List<? extends Bucket> buckets = histo.getBuckets();
    assertThat(buckets.size(), equalTo(24));
    for (int i = 0; i < buckets.size(); i++) {
        Histogram.Bucket bucket = buckets.get(i);
        assertThat(bucket, notNullValue());
        assertThat("InternalBucket " + i + " had wrong key", (DateTime) bucket.getKey(), equalTo(new DateTime(timeZoneStartToday.getMillis() + (i * 60 * 60 * 1000), DateTimeZone.UTC)));
        if (i == 0 || i == 12) {
            assertThat(bucket.getDocCount(), equalTo(1L));
        } else {
            assertThat(bucket.getDocCount(), equalTo(0L));
        }
    }
    internalCluster().wipeIndices("test12278");
}
Also used : ExtendedBounds(org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds) Histogram(org.elasticsearch.search.aggregations.bucket.histogram.Histogram) AggregationBuilders.dateHistogram(org.elasticsearch.search.aggregations.AggregationBuilders.dateHistogram) Bucket(org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket) ArrayList(java.util.ArrayList) Matchers.containsString(org.hamcrest.Matchers.containsString) DateTimeZone(org.joda.time.DateTimeZone) DateTime(org.joda.time.DateTime) SearchResponse(org.elasticsearch.action.search.SearchResponse) ElasticsearchAssertions.assertSearchResponse(org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse) IndexRequestBuilder(org.elasticsearch.action.index.IndexRequestBuilder) DateMathParser(org.elasticsearch.common.joda.DateMathParser)

Example 2 with ExtendedBounds

use of org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds in project vertexium by visallo.

the class ElasticsearchSearchQueryBase method getElasticsearchHistogramAggregations.

protected List<AggregationBuilder> getElasticsearchHistogramAggregations(HistogramAggregation agg) {
    List<AggregationBuilder> aggs = new ArrayList<>();
    PropertyDefinition propertyDefinition = getPropertyDefinition(agg.getFieldName());
    if (propertyDefinition == null) {
        throw new VertexiumException("Could not find mapping for property: " + agg.getFieldName());
    }
    Class propertyDataType = propertyDefinition.getDataType();
    for (String propertyName : getPropertyNames(agg.getFieldName())) {
        String visibilityHash = getSearchIndex().getPropertyVisibilityHashFromPropertyName(propertyName);
        String aggName = createAggregationName(agg.getAggregationName(), visibilityHash);
        if (propertyDataType == Date.class) {
            DateHistogramAggregationBuilder dateAgg = AggregationBuilders.dateHistogram(aggName);
            dateAgg.field(propertyName);
            String interval = agg.getInterval();
            if (Pattern.matches("^[0-9\\.]+$", interval)) {
                interval += "ms";
            }
            dateAgg.dateHistogramInterval(new DateHistogramInterval(interval));
            dateAgg.minDocCount(1L);
            if (agg.getMinDocumentCount() != null) {
                dateAgg.minDocCount(agg.getMinDocumentCount());
            }
            if (agg.getExtendedBounds() != null) {
                HistogramAggregation.ExtendedBounds<?> bounds = agg.getExtendedBounds();
                if (bounds.getMinMaxType().isAssignableFrom(Long.class)) {
                    dateAgg.extendedBounds(new ExtendedBounds((Long) bounds.getMin(), (Long) bounds.getMax()));
                } else if (bounds.getMinMaxType().isAssignableFrom(Date.class)) {
                    dateAgg.extendedBounds(new ExtendedBounds(new DateTime(bounds.getMin()).toString(), new DateTime(bounds.getMax()).toString()));
                } else if (bounds.getMinMaxType().isAssignableFrom(String.class)) {
                    dateAgg.extendedBounds(new ExtendedBounds((String) bounds.getMin(), (String) bounds.getMax()));
                } else {
                    throw new VertexiumException("Unhandled extended bounds type. Expected Long, String, or Date. Found: " + bounds.getMinMaxType().getName());
                }
            }
            for (AggregationBuilder subAgg : getElasticsearchAggregations(agg.getNestedAggregations())) {
                dateAgg.subAggregation(subAgg);
            }
            aggs.add(dateAgg);
        } else {
            HistogramAggregationBuilder histogramAgg = AggregationBuilders.histogram(aggName);
            histogramAgg.field(propertyName);
            histogramAgg.interval(Long.parseLong(agg.getInterval()));
            histogramAgg.minDocCount(1L);
            if (agg.getMinDocumentCount() != null) {
                histogramAgg.minDocCount(agg.getMinDocumentCount());
            }
            if (agg.getExtendedBounds() != null) {
                HistogramAggregation.ExtendedBounds<?> bounds = agg.getExtendedBounds();
                if (bounds.getMinMaxType().isAssignableFrom(Long.class)) {
                    histogramAgg.extendedBounds((Long) bounds.getMin(), (Long) bounds.getMax());
                } else {
                    throw new VertexiumException("Unhandled extended bounds type. Expected Long. Found: " + bounds.getMinMaxType().getName());
                }
            }
            for (AggregationBuilder subAgg : getElasticsearchAggregations(agg.getNestedAggregations())) {
                histogramAgg.subAggregation(subAgg);
            }
            aggs.add(histogramAgg);
        }
    }
    return aggs;
}
Also used : ExtendedBounds(org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds) HistogramAggregationBuilder(org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder) DateHistogramAggregationBuilder(org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder) RangeAggregationBuilder(org.elasticsearch.search.aggregations.bucket.range.RangeAggregationBuilder) GeoGridAggregationBuilder(org.elasticsearch.search.aggregations.bucket.geogrid.GeoGridAggregationBuilder) AbstractAggregationBuilder(org.elasticsearch.search.aggregations.AbstractAggregationBuilder) AggregationBuilder(org.elasticsearch.search.aggregations.AggregationBuilder) DateRangeAggregationBuilder(org.elasticsearch.search.aggregations.bucket.range.date.DateRangeAggregationBuilder) PercentilesAggregationBuilder(org.elasticsearch.search.aggregations.metrics.percentiles.PercentilesAggregationBuilder) ExtendedStatsAggregationBuilder(org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStatsAggregationBuilder) TermsAggregationBuilder(org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder) HistogramAggregationBuilder(org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder) DateHistogramAggregationBuilder(org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder) DateHistogramAggregationBuilder(org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder) DateHistogramInterval(org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval) DateTime(org.joda.time.DateTime)

Example 3 with ExtendedBounds

use of org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds in project elasticsearch by elastic.

the class DateHistogramIT method testSingleValueFieldWithExtendedBounds.

public void testSingleValueFieldWithExtendedBounds() throws Exception {
    String pattern = "yyyy-MM-dd";
    // we're testing on days, so the base must be rounded to a day
    // in days
    int interval = randomIntBetween(1, 2);
    long intervalMillis = interval * 24 * 60 * 60 * 1000;
    DateTime base = new DateTime(DateTimeZone.UTC).dayOfMonth().roundFloorCopy();
    DateTime baseKey = new DateTime(intervalMillis * (base.getMillis() / intervalMillis), DateTimeZone.UTC);
    prepareCreate("idx2").setSettings(Settings.builder().put(indexSettings()).put("index.number_of_shards", 1).put("index.number_of_replicas", 0)).execute().actionGet();
    int numOfBuckets = randomIntBetween(3, 6);
    // should be in the middle
    int emptyBucketIndex = randomIntBetween(1, numOfBuckets - 2);
    long[] docCounts = new long[numOfBuckets];
    List<IndexRequestBuilder> builders = new ArrayList<>();
    for (int i = 0; i < numOfBuckets; i++) {
        if (i == emptyBucketIndex) {
            docCounts[i] = 0;
        } else {
            int docCount = randomIntBetween(1, 3);
            for (int j = 0; j < docCount; j++) {
                DateTime date = baseKey.plusDays(i * interval + randomIntBetween(0, interval - 1));
                builders.add(indexDoc("idx2", date, j));
            }
            docCounts[i] = docCount;
        }
    }
    indexRandom(true, builders);
    ensureSearchable("idx2");
    DateTime lastDataBucketKey = baseKey.plusDays((numOfBuckets - 1) * interval);
    // randomizing the number of buckets on the min bound
    // (can sometimes fall within the data range, but more frequently will fall before the data range)
    int addedBucketsLeft = randomIntBetween(0, numOfBuckets);
    DateTime boundsMinKey;
    if (frequently()) {
        boundsMinKey = baseKey.minusDays(addedBucketsLeft * interval);
    } else {
        boundsMinKey = baseKey.plusDays(addedBucketsLeft * interval);
        addedBucketsLeft = 0;
    }
    DateTime boundsMin = boundsMinKey.plusDays(randomIntBetween(0, interval - 1));
    // randomizing the number of buckets on the max bound
    // (can sometimes fall within the data range, but more frequently will fall after the data range)
    int addedBucketsRight = randomIntBetween(0, numOfBuckets);
    int boundsMaxKeyDelta = addedBucketsRight * interval;
    if (rarely()) {
        addedBucketsRight = 0;
        boundsMaxKeyDelta = -boundsMaxKeyDelta;
    }
    DateTime boundsMaxKey = lastDataBucketKey.plusDays(boundsMaxKeyDelta);
    DateTime boundsMax = boundsMaxKey.plusDays(randomIntBetween(0, interval - 1));
    // it could be that the random bounds.min we chose ended up greater than
    // bounds.max - this should
    // trigger an error
    boolean invalidBoundsError = boundsMin.isAfter(boundsMax);
    // constructing the newly expected bucket list
    int bucketsCount = numOfBuckets + addedBucketsLeft + addedBucketsRight;
    long[] extendedValueCounts = new long[bucketsCount];
    System.arraycopy(docCounts, 0, extendedValueCounts, addedBucketsLeft, docCounts.length);
    SearchResponse response = null;
    try {
        response = client().prepareSearch("idx2").addAggregation(dateHistogram("histo").field("date").dateHistogramInterval(DateHistogramInterval.days(interval)).minDocCount(0).extendedBounds(new ExtendedBounds(format(boundsMin, pattern), format(boundsMax, pattern))).format(pattern)).execute().actionGet();
        if (invalidBoundsError) {
            fail("Expected an exception to be thrown when bounds.min is greater than bounds.max");
            return;
        }
    } catch (Exception e) {
        if (invalidBoundsError) {
            // expected
            return;
        } else {
            throw e;
        }
    }
    assertSearchResponse(response);
    Histogram histo = response.getAggregations().get("histo");
    assertThat(histo, notNullValue());
    assertThat(histo.getName(), equalTo("histo"));
    List<? extends Bucket> buckets = histo.getBuckets();
    assertThat(buckets.size(), equalTo(bucketsCount));
    DateTime key = baseKey.isBefore(boundsMinKey) ? baseKey : boundsMinKey;
    for (int i = 0; i < bucketsCount; i++) {
        Histogram.Bucket bucket = buckets.get(i);
        assertThat(bucket, notNullValue());
        assertThat(((DateTime) bucket.getKey()), equalTo(key));
        assertThat(bucket.getKeyAsString(), equalTo(format(key, pattern)));
        assertThat(bucket.getDocCount(), equalTo(extendedValueCounts[i]));
        key = key.plusDays(interval);
    }
}
Also used : ExtendedBounds(org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds) Histogram(org.elasticsearch.search.aggregations.bucket.histogram.Histogram) AggregationBuilders.dateHistogram(org.elasticsearch.search.aggregations.AggregationBuilders.dateHistogram) Bucket(org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket) ArrayList(java.util.ArrayList) Matchers.containsString(org.hamcrest.Matchers.containsString) DateTime(org.joda.time.DateTime) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) SearchResponse(org.elasticsearch.action.search.SearchResponse) ElasticsearchAssertions.assertSearchResponse(org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse) IndexRequestBuilder(org.elasticsearch.action.index.IndexRequestBuilder)

Example 4 with ExtendedBounds

use of org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds in project elasticsearch by elastic.

the class DateHistogramIT method testDSTEndTransition.

/**
     * When DST ends, local time turns back one hour, so between 2am and 4am wall time we should have four buckets:
     * "2015-10-25T02:00:00.000+02:00",
     * "2015-10-25T02:00:00.000+01:00",
     * "2015-10-25T03:00:00.000+01:00",
     * "2015-10-25T04:00:00.000+01:00".
     */
public void testDSTEndTransition() throws Exception {
    SearchResponse response = client().prepareSearch("idx").setQuery(new MatchNoneQueryBuilder()).addAggregation(dateHistogram("histo").field("date").timeZone(DateTimeZone.forID("Europe/Oslo")).dateHistogramInterval(DateHistogramInterval.HOUR).minDocCount(0).extendedBounds(new ExtendedBounds("2015-10-25T02:00:00.000+02:00", "2015-10-25T04:00:00.000+01:00"))).execute().actionGet();
    Histogram histo = response.getAggregations().get("histo");
    List<? extends Bucket> buckets = histo.getBuckets();
    assertThat(buckets.size(), equalTo(4));
    assertThat(((DateTime) buckets.get(1).getKey()).getMillis() - ((DateTime) buckets.get(0).getKey()).getMillis(), equalTo(3600000L));
    assertThat(((DateTime) buckets.get(2).getKey()).getMillis() - ((DateTime) buckets.get(1).getKey()).getMillis(), equalTo(3600000L));
    assertThat(((DateTime) buckets.get(3).getKey()).getMillis() - ((DateTime) buckets.get(2).getKey()).getMillis(), equalTo(3600000L));
}
Also used : MatchNoneQueryBuilder(org.elasticsearch.index.query.MatchNoneQueryBuilder) ExtendedBounds(org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds) Histogram(org.elasticsearch.search.aggregations.bucket.histogram.Histogram) AggregationBuilders.dateHistogram(org.elasticsearch.search.aggregations.AggregationBuilders.dateHistogram) DateTime(org.joda.time.DateTime) SearchResponse(org.elasticsearch.action.search.SearchResponse) ElasticsearchAssertions.assertSearchResponse(org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse)

Aggregations

ExtendedBounds (org.elasticsearch.search.aggregations.bucket.histogram.ExtendedBounds)4 DateTime (org.joda.time.DateTime)4 SearchResponse (org.elasticsearch.action.search.SearchResponse)3 AggregationBuilders.dateHistogram (org.elasticsearch.search.aggregations.AggregationBuilders.dateHistogram)3 Histogram (org.elasticsearch.search.aggregations.bucket.histogram.Histogram)3 ElasticsearchAssertions.assertSearchResponse (org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse)3 ArrayList (java.util.ArrayList)2 IndexRequestBuilder (org.elasticsearch.action.index.IndexRequestBuilder)2 Bucket (org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket)2 Matchers.containsString (org.hamcrest.Matchers.containsString)2 IOException (java.io.IOException)1 ExecutionException (java.util.concurrent.ExecutionException)1 DateMathParser (org.elasticsearch.common.joda.DateMathParser)1 MatchNoneQueryBuilder (org.elasticsearch.index.query.MatchNoneQueryBuilder)1 AbstractAggregationBuilder (org.elasticsearch.search.aggregations.AbstractAggregationBuilder)1 AggregationBuilder (org.elasticsearch.search.aggregations.AggregationBuilder)1 GeoGridAggregationBuilder (org.elasticsearch.search.aggregations.bucket.geogrid.GeoGridAggregationBuilder)1 DateHistogramAggregationBuilder (org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramAggregationBuilder)1 DateHistogramInterval (org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval)1 HistogramAggregationBuilder (org.elasticsearch.search.aggregations.bucket.histogram.HistogramAggregationBuilder)1