Revert "Begin moving date_histogram to offset rounding (backport of #50873) (#50978)" (#51239)

This reverts commit 9a3d4db840a038474dd7275cf8124f396d4eec26. It was
subtly broken in ways we didn't have tests for.
This commit is contained in:
Nik Everett 2020-01-21 08:50:02 -05:00 committed by GitHub
parent 0fa7db9a95
commit 788836ea3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 33 additions and 77 deletions

View File

@ -164,19 +164,6 @@ public abstract class Rounding implements Writeable {
*/ */
public abstract long nextRoundingValue(long value); public abstract long nextRoundingValue(long value);
/**
* How "offset" this rounding is from the traditional "start" of the period.
* @deprecated We're in the process of abstracting offset *into* Rounding
* so keep any usage to migratory shims
*/
@Deprecated
public abstract long offset();
/**
* Strip the {@code offset} from these bounds.
*/
public abstract Rounding withoutOffset();
@Override @Override
public abstract boolean equals(Object obj); public abstract boolean equals(Object obj);
@ -438,16 +425,6 @@ public abstract class Rounding implements Writeable {
} }
} }
@Override
public long offset() {
return 0;
}
@Override
public Rounding withoutOffset() {
return this;
}
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(unit, timeZone); return Objects.hash(unit, timeZone);
@ -579,16 +556,6 @@ public abstract class Rounding implements Writeable {
.toInstant().toEpochMilli(); .toInstant().toEpochMilli();
} }
@Override
public long offset() {
return 0;
}
@Override
public Rounding withoutOffset() {
return this;
}
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(interval, timeZone); return Objects.hash(interval, timeZone);
@ -650,17 +617,8 @@ public abstract class Rounding implements Writeable {
@Override @Override
public long nextRoundingValue(long value) { public long nextRoundingValue(long value) {
return delegate.nextRoundingValue(value - offset) + offset; // This isn't needed by the current users. We'll implement it when we migrate other users to it.
} throw new UnsupportedOperationException("not yet supported");
@Override
public long offset() {
return offset;
}
@Override
public Rounding withoutOffset() {
return delegate;
} }
@Override @Override

View File

@ -500,13 +500,13 @@ public class DateHistogramAggregationBuilder extends ValuesSourceAggregationBuil
Builder subFactoriesBuilder) throws IOException { Builder subFactoriesBuilder) throws IOException {
final ZoneId tz = timeZone(); final ZoneId tz = timeZone();
// TODO use offset here rather than explicitly in the aggregation // TODO use offset here rather than explicitly in the aggregation
final Rounding rounding = dateHistogramInterval.createRounding(tz, offset); final Rounding rounding = dateHistogramInterval.createRounding(tz, 0);
final ZoneId rewrittenTimeZone = rewriteTimeZone(queryShardContext); final ZoneId rewrittenTimeZone = rewriteTimeZone(queryShardContext);
final Rounding shardRounding; final Rounding shardRounding;
if (tz == rewrittenTimeZone) { if (tz == rewrittenTimeZone) {
shardRounding = rounding; shardRounding = rounding;
} else { } else {
shardRounding = dateHistogramInterval.createRounding(rewrittenTimeZone, offset); shardRounding = dateHistogramInterval.createRounding(rewrittenTimeZone, 0);
} }
ExtendedBounds roundedBounds = null; ExtendedBounds roundedBounds = null;
@ -514,7 +514,7 @@ public class DateHistogramAggregationBuilder extends ValuesSourceAggregationBuil
// parse any string bounds to longs and round // parse any string bounds to longs and round
roundedBounds = this.extendedBounds.parseAndValidate(name, queryShardContext, config.format()).round(rounding); roundedBounds = this.extendedBounds.parseAndValidate(name, queryShardContext, config.format()).round(rounding);
} }
return new DateHistogramAggregatorFactory(name, config, order, keyed, minDocCount, return new DateHistogramAggregatorFactory(name, config, offset, order, keyed, minDocCount,
rounding, shardRounding, roundedBounds, queryShardContext, parent, subFactoriesBuilder, metaData); rounding, shardRounding, roundedBounds, queryShardContext, parent, subFactoriesBuilder, metaData);
} }

View File

@ -64,9 +64,10 @@ class DateHistogramAggregator extends BucketsAggregator {
private final ExtendedBounds extendedBounds; private final ExtendedBounds extendedBounds;
private final LongHash bucketOrds; private final LongHash bucketOrds;
private long offset;
DateHistogramAggregator(String name, AggregatorFactories factories, Rounding rounding, Rounding shardRounding, DateHistogramAggregator(String name, AggregatorFactories factories, Rounding rounding, Rounding shardRounding,
BucketOrder order, boolean keyed, long offset, BucketOrder order, boolean keyed,
long minDocCount, @Nullable ExtendedBounds extendedBounds, @Nullable ValuesSource.Numeric valuesSource, long minDocCount, @Nullable ExtendedBounds extendedBounds, @Nullable ValuesSource.Numeric valuesSource,
DocValueFormat formatter, SearchContext aggregationContext, DocValueFormat formatter, SearchContext aggregationContext,
Aggregator parent, List<PipelineAggregator> pipelineAggregators, Map<String, Object> metaData) throws IOException { Aggregator parent, List<PipelineAggregator> pipelineAggregators, Map<String, Object> metaData) throws IOException {
@ -74,6 +75,7 @@ class DateHistogramAggregator extends BucketsAggregator {
super(name, factories, aggregationContext, parent, pipelineAggregators, metaData); super(name, factories, aggregationContext, parent, pipelineAggregators, metaData);
this.rounding = rounding; this.rounding = rounding;
this.shardRounding = shardRounding; this.shardRounding = shardRounding;
this.offset = offset;
this.order = InternalOrder.validate(order, this); this.order = InternalOrder.validate(order, this);
this.keyed = keyed; this.keyed = keyed;
this.minDocCount = minDocCount; this.minDocCount = minDocCount;
@ -111,7 +113,7 @@ class DateHistogramAggregator extends BucketsAggregator {
long value = values.nextValue(); long value = values.nextValue();
// We can use shardRounding here, which is sometimes more efficient // We can use shardRounding here, which is sometimes more efficient
// if daylight saving times are involved. // if daylight saving times are involved.
long rounded = shardRounding.round(value); long rounded = shardRounding.round(value - offset) + offset;
assert rounded >= previousRounded; assert rounded >= previousRounded;
if (rounded == previousRounded) { if (rounded == previousRounded) {
continue; continue;
@ -148,7 +150,7 @@ class DateHistogramAggregator extends BucketsAggregator {
InternalDateHistogram.EmptyBucketInfo emptyBucketInfo = minDocCount == 0 InternalDateHistogram.EmptyBucketInfo emptyBucketInfo = minDocCount == 0
? new InternalDateHistogram.EmptyBucketInfo(rounding, buildEmptySubAggregations(), extendedBounds) ? new InternalDateHistogram.EmptyBucketInfo(rounding, buildEmptySubAggregations(), extendedBounds)
: null; : null;
return new InternalDateHistogram(name, buckets, order, minDocCount, rounding.offset(), emptyBucketInfo, formatter, keyed, return new InternalDateHistogram(name, buckets, order, minDocCount, offset, emptyBucketInfo, formatter, keyed,
pipelineAggregators(), metaData()); pipelineAggregators(), metaData());
} }
@ -157,8 +159,8 @@ class DateHistogramAggregator extends BucketsAggregator {
InternalDateHistogram.EmptyBucketInfo emptyBucketInfo = minDocCount == 0 InternalDateHistogram.EmptyBucketInfo emptyBucketInfo = minDocCount == 0
? new InternalDateHistogram.EmptyBucketInfo(rounding, buildEmptySubAggregations(), extendedBounds) ? new InternalDateHistogram.EmptyBucketInfo(rounding, buildEmptySubAggregations(), extendedBounds)
: null; : null;
return new InternalDateHistogram(name, Collections.emptyList(), order, minDocCount, rounding.offset(), emptyBucketInfo, formatter, return new InternalDateHistogram(name, Collections.emptyList(), order, minDocCount, offset, emptyBucketInfo, formatter, keyed,
keyed, pipelineAggregators(), metaData()); pipelineAggregators(), metaData());
} }
@Override @Override

View File

@ -39,6 +39,7 @@ import java.util.Map;
public final class DateHistogramAggregatorFactory public final class DateHistogramAggregatorFactory
extends ValuesSourceAggregatorFactory<ValuesSource> { extends ValuesSourceAggregatorFactory<ValuesSource> {
private final long offset;
private final BucketOrder order; private final BucketOrder order;
private final boolean keyed; private final boolean keyed;
private final long minDocCount; private final long minDocCount;
@ -47,11 +48,12 @@ public final class DateHistogramAggregatorFactory
private final Rounding shardRounding; private final Rounding shardRounding;
public DateHistogramAggregatorFactory(String name, ValuesSourceConfig<ValuesSource> config, public DateHistogramAggregatorFactory(String name, ValuesSourceConfig<ValuesSource> config,
BucketOrder order, boolean keyed, long minDocCount, long offset, BucketOrder order, boolean keyed, long minDocCount,
Rounding rounding, Rounding shardRounding, ExtendedBounds extendedBounds, QueryShardContext queryShardContext, Rounding rounding, Rounding shardRounding, ExtendedBounds extendedBounds, QueryShardContext queryShardContext,
AggregatorFactory parent, AggregatorFactories.Builder subFactoriesBuilder, AggregatorFactory parent, AggregatorFactories.Builder subFactoriesBuilder,
Map<String, Object> metaData) throws IOException { Map<String, Object> metaData) throws IOException {
super(name, config, queryShardContext, parent, subFactoriesBuilder, metaData); super(name, config, queryShardContext, parent, subFactoriesBuilder, metaData);
this.offset = offset;
this.order = order; this.order = order;
this.keyed = keyed; this.keyed = keyed;
this.minDocCount = minDocCount; this.minDocCount = minDocCount;
@ -102,7 +104,7 @@ public final class DateHistogramAggregatorFactory
private Aggregator createAggregator(ValuesSource.Numeric valuesSource, SearchContext searchContext, private Aggregator createAggregator(ValuesSource.Numeric valuesSource, SearchContext searchContext,
Aggregator parent, List<PipelineAggregator> pipelineAggregators, Aggregator parent, List<PipelineAggregator> pipelineAggregators,
Map<String, Object> metaData) throws IOException { Map<String, Object> metaData) throws IOException {
return new DateHistogramAggregator(name, factories, rounding, shardRounding, order, keyed, minDocCount, extendedBounds, return new DateHistogramAggregator(name, factories, rounding, shardRounding, offset, order, keyed, minDocCount, extendedBounds,
valuesSource, config.format(), searchContext, parent, pipelineAggregators, metaData); valuesSource, config.format(), searchContext, parent, pipelineAggregators, metaData);
} }
@ -111,7 +113,7 @@ public final class DateHistogramAggregatorFactory
Aggregator parent, Aggregator parent,
List<PipelineAggregator> pipelineAggregators, List<PipelineAggregator> pipelineAggregators,
Map<String, Object> metaData) throws IOException { Map<String, Object> metaData) throws IOException {
return new DateRangeHistogramAggregator(name, factories, rounding, shardRounding, order, keyed, minDocCount, extendedBounds, return new DateRangeHistogramAggregator(name, factories, rounding, shardRounding, offset, order, keyed, minDocCount, extendedBounds,
valuesSource, config.format(), searchContext, parent, pipelineAggregators, metaData); valuesSource, config.format(), searchContext, parent, pipelineAggregators, metaData);
} }

View File

@ -67,9 +67,10 @@ class DateRangeHistogramAggregator extends BucketsAggregator {
private final ExtendedBounds extendedBounds; private final ExtendedBounds extendedBounds;
private final LongHash bucketOrds; private final LongHash bucketOrds;
private long offset;
DateRangeHistogramAggregator(String name, AggregatorFactories factories, Rounding rounding, Rounding shardRounding, DateRangeHistogramAggregator(String name, AggregatorFactories factories, Rounding rounding, Rounding shardRounding,
BucketOrder order, boolean keyed, long offset, BucketOrder order, boolean keyed,
long minDocCount, @Nullable ExtendedBounds extendedBounds, @Nullable ValuesSource.Range valuesSource, long minDocCount, @Nullable ExtendedBounds extendedBounds, @Nullable ValuesSource.Range valuesSource,
DocValueFormat formatter, SearchContext aggregationContext, DocValueFormat formatter, SearchContext aggregationContext,
Aggregator parent, List<PipelineAggregator> pipelineAggregators, Aggregator parent, List<PipelineAggregator> pipelineAggregators,
@ -78,6 +79,7 @@ class DateRangeHistogramAggregator extends BucketsAggregator {
super(name, factories, aggregationContext, parent, pipelineAggregators, metaData); super(name, factories, aggregationContext, parent, pipelineAggregators, metaData);
this.rounding = rounding; this.rounding = rounding;
this.shardRounding = shardRounding; this.shardRounding = shardRounding;
this.offset = offset;
this.order = InternalOrder.validate(order, this); this.order = InternalOrder.validate(order, this);
this.keyed = keyed; this.keyed = keyed;
this.minDocCount = minDocCount; this.minDocCount = minDocCount;
@ -124,8 +126,8 @@ class DateRangeHistogramAggregator extends BucketsAggregator {
// The encoding should ensure that this assert is always true. // The encoding should ensure that this assert is always true.
assert from >= previousFrom : "Start of range not >= previous start"; assert from >= previousFrom : "Start of range not >= previous start";
final Long to = (Long) range.getTo(); final Long to = (Long) range.getTo();
final long startKey = shardRounding.round(from); final long startKey = offsetAwareRounding(shardRounding, from, offset);
final long endKey = shardRounding.round(to); final long endKey = offsetAwareRounding(shardRounding, to, offset);
for (long key = startKey > previousKey ? startKey : previousKey; key <= endKey; for (long key = startKey > previousKey ? startKey : previousKey; key <= endKey;
key = shardRounding.nextRoundingValue(key)) { key = shardRounding.nextRoundingValue(key)) {
if (key == previousKey) { if (key == previousKey) {
@ -151,6 +153,10 @@ class DateRangeHistogramAggregator extends BucketsAggregator {
}; };
} }
private long offsetAwareRounding(Rounding rounding, long value, long offset) {
return rounding.round(value - offset) + offset;
}
@Override @Override
public InternalAggregation buildAggregation(long owningBucketOrdinal) throws IOException { public InternalAggregation buildAggregation(long owningBucketOrdinal) throws IOException {
assert owningBucketOrdinal == 0; assert owningBucketOrdinal == 0;
@ -169,7 +175,7 @@ class DateRangeHistogramAggregator extends BucketsAggregator {
InternalDateHistogram.EmptyBucketInfo emptyBucketInfo = minDocCount == 0 InternalDateHistogram.EmptyBucketInfo emptyBucketInfo = minDocCount == 0
? new InternalDateHistogram.EmptyBucketInfo(rounding, buildEmptySubAggregations(), extendedBounds) ? new InternalDateHistogram.EmptyBucketInfo(rounding, buildEmptySubAggregations(), extendedBounds)
: null; : null;
return new InternalDateHistogram(name, buckets, order, minDocCount, rounding.offset(), emptyBucketInfo, formatter, keyed, return new InternalDateHistogram(name, buckets, order, minDocCount, offset, emptyBucketInfo, formatter, keyed,
pipelineAggregators(), metaData()); pipelineAggregators(), metaData());
} }
@ -178,8 +184,8 @@ class DateRangeHistogramAggregator extends BucketsAggregator {
InternalDateHistogram.EmptyBucketInfo emptyBucketInfo = minDocCount == 0 InternalDateHistogram.EmptyBucketInfo emptyBucketInfo = minDocCount == 0
? new InternalDateHistogram.EmptyBucketInfo(rounding, buildEmptySubAggregations(), extendedBounds) ? new InternalDateHistogram.EmptyBucketInfo(rounding, buildEmptySubAggregations(), extendedBounds)
: null; : null;
return new InternalDateHistogram(name, Collections.emptyList(), order, minDocCount, rounding.offset(), emptyBucketInfo, formatter, return new InternalDateHistogram(name, Collections.emptyList(), order, minDocCount, offset, emptyBucketInfo, formatter, keyed,
keyed, pipelineAggregators(), metaData()); pipelineAggregators(), metaData());
} }
@Override @Override

View File

@ -166,11 +166,7 @@ public class ExtendedBounds implements ToXContentFragment, Writeable {
} }
ExtendedBounds round(Rounding rounding) { ExtendedBounds round(Rounding rounding) {
// Extended bounds shouldn't be effected by the offset return new ExtendedBounds(min != null ? rounding.round(min) : null, max != null ? rounding.round(max) : null);
Rounding effectiveRounding = rounding.withoutOffset();
return new ExtendedBounds(
min != null ? effectiveRounding.round(min) : null,
max != null ? effectiveRounding.round(max) : null);
} }
@Override @Override

View File

@ -497,7 +497,7 @@ public final class InternalDateHistogram extends InternalMultiBucketAggregation<
@Override @Override
public Number nextKey(Number key) { public Number nextKey(Number key) {
return emptyBucketInfo.rounding.nextRoundingValue(key.longValue()); return emptyBucketInfo.rounding.nextRoundingValue(key.longValue() - offset) + offset;
} }
@Override @Override

View File

@ -201,18 +201,10 @@ public class RoundingTests extends ESTestCase {
Rounding rounding = Rounding.builder(Rounding.DateTimeUnit.DAY_OF_MONTH).offset(twoHours).build(); Rounding rounding = Rounding.builder(Rounding.DateTimeUnit.DAY_OF_MONTH).offset(twoHours).build();
assertThat(rounding.round(0), equalTo(-oneDay + twoHours)); assertThat(rounding.round(0), equalTo(-oneDay + twoHours));
assertThat(rounding.round(twoHours), equalTo(twoHours)); assertThat(rounding.round(twoHours), equalTo(twoHours));
assertThat(rounding.nextRoundingValue(-oneDay), equalTo(-oneDay + twoHours));
assertThat(rounding.nextRoundingValue(0), equalTo(twoHours));
assertThat(rounding.withoutOffset().round(0), equalTo(0L));
assertThat(rounding.withoutOffset().nextRoundingValue(0), equalTo(oneDay));
rounding = Rounding.builder(Rounding.DateTimeUnit.DAY_OF_MONTH).offset(-twoHours).build(); rounding = Rounding.builder(Rounding.DateTimeUnit.DAY_OF_MONTH).offset(-twoHours).build();
assertThat(rounding.round(0), equalTo(-twoHours)); assertThat(rounding.round(0), equalTo(-twoHours));
assertThat(rounding.round(oneDay - twoHours), equalTo(oneDay - twoHours)); assertThat(rounding.round(oneDay - twoHours), equalTo(oneDay - twoHours));
assertThat(rounding.nextRoundingValue(-oneDay), equalTo(-twoHours));
assertThat(rounding.nextRoundingValue(0), equalTo(oneDay - twoHours));
assertThat(rounding.withoutOffset().round(0), equalTo(0L));
assertThat(rounding.withoutOffset().nextRoundingValue(0), equalTo(oneDay));
} }
/** /**

View File

@ -164,7 +164,7 @@ public class PipelineAggregationHelperTests extends ESTestCase {
new AggregatorFactories.Builder(), Collections.emptyMap()); new AggregatorFactories.Builder(), Collections.emptyMap());
break; break;
case 1: case 1:
factory = new DateHistogramAggregatorFactory("name", mock(ValuesSourceConfig.class), factory = new DateHistogramAggregatorFactory("name", mock(ValuesSourceConfig.class), 0L,
mock(InternalOrder.class), false, 0L, mock(Rounding.class), mock(Rounding.class), mock(InternalOrder.class), false, 0L, mock(Rounding.class), mock(Rounding.class),
mock(ExtendedBounds.class), mock(QueryShardContext.class), mock(AggregatorFactory.class), mock(ExtendedBounds.class), mock(QueryShardContext.class), mock(AggregatorFactory.class),
new AggregatorFactories.Builder(), Collections.emptyMap()); new AggregatorFactories.Builder(), Collections.emptyMap());

View File

@ -131,7 +131,7 @@ public class CumulativeCardinalityAggregatorTests extends AggregatorTestCase {
// Date Histogram // Date Histogram
aggBuilders.clear(); aggBuilders.clear();
aggBuilders.add(new CumulativeCardinalityPipelineAggregationBuilder("cumulative_card", "sum")); aggBuilders.add(new CumulativeCardinalityPipelineAggregationBuilder("cumulative_card", "sum"));
parent = new DateHistogramAggregatorFactory("name", valuesSourceConfig, parent = new DateHistogramAggregatorFactory("name", valuesSourceConfig, 0L,
mock(InternalOrder.class), false, 0L, mock(Rounding.class), mock(Rounding.class), mock(InternalOrder.class), false, 0L, mock(Rounding.class), mock(Rounding.class),
mock(ExtendedBounds.class), mock(QueryShardContext.class), mock(AggregatorFactory.class), mock(ExtendedBounds.class), mock(QueryShardContext.class), mock(AggregatorFactory.class),
new AggregatorFactories.Builder(), Collections.emptyMap()); new AggregatorFactories.Builder(), Collections.emptyMap());