[TESTS] randomize metric type, better naming, fix gap handling

- Randomizes the metric type between min/max/avg.  Should have identical behavior, but good to test
- Fixes improper handling of gaps due to a bug in the production of the "expected" dataset. Due to this fix,
randomization of gap policy was re-enabled
- Bunch of renaming to be more descriptive and less verbose
This commit is contained in:
Zachary Tong 2015-04-22 18:40:34 -04:00
parent a03cefcece
commit 2a74f2ce0f
1 changed files with 263 additions and 201 deletions

View File

@ -21,7 +21,6 @@ package org.elasticsearch.search.aggregations.reducers.moving.avg;
import com.google.common.collect.EvictingQueue; import com.google.common.collect.EvictingQueue;
import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchPhaseExecutionException; import org.elasticsearch.action.search.SearchPhaseExecutionException;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
@ -30,22 +29,21 @@ import org.elasticsearch.search.aggregations.bucket.filter.InternalFilter;
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
import org.elasticsearch.search.aggregations.bucket.histogram.InternalHistogram; import org.elasticsearch.search.aggregations.bucket.histogram.InternalHistogram;
import org.elasticsearch.search.aggregations.bucket.histogram.InternalHistogram.Bucket; import org.elasticsearch.search.aggregations.bucket.histogram.InternalHistogram.Bucket;
import org.elasticsearch.search.aggregations.metrics.ValuesSourceMetricsAggregationBuilder;
import org.elasticsearch.search.aggregations.reducers.BucketHelpers; import org.elasticsearch.search.aggregations.reducers.BucketHelpers;
import org.elasticsearch.search.aggregations.reducers.SimpleValue; import org.elasticsearch.search.aggregations.reducers.SimpleValue;
import org.elasticsearch.search.aggregations.reducers.movavg.models.*; import org.elasticsearch.search.aggregations.reducers.movavg.models.*;
import org.elasticsearch.test.ElasticsearchIntegrationTest; import org.elasticsearch.test.ElasticsearchIntegrationTest;
import org.hamcrest.Matchers;
import org.junit.Test; import org.junit.Test;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram; import static org.elasticsearch.search.aggregations.AggregationBuilders.*;
import static org.elasticsearch.search.aggregations.AggregationBuilders.sum; import static org.elasticsearch.search.aggregations.reducers.ReducerBuilders.movingAvg;
import static org.elasticsearch.search.aggregations.reducers.ReducerBuilders.smooth;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.*;
import static org.hamcrest.core.IsNull.notNullValue; import static org.hamcrest.core.IsNull.notNullValue;
@ElasticsearchIntegrationTest.SuiteScopeTest @ElasticsearchIntegrationTest.SuiteScopeTest
@ -62,16 +60,16 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
static BucketHelpers.GapPolicy gapPolicy; static BucketHelpers.GapPolicy gapPolicy;
static long[] docCounts; static long[] docCounts;
static long[] valueCounts; static long[] docValues;
static Double[] simpleMovAvgCounts; static Double[] simpleDocCounts;
static Double[] linearMovAvgCounts; static Double[] linearDocCounts;
static Double[] singleExpMovAvgCounts; static Double[] singleDocCounts;
static Double[] doubleExpMovAvgCounts; static Double[] doubleDocCounts;
static Double[] simpleMovAvgValueCounts; static Double[] simpleDocValues;
static Double[] linearMovAvgValueCounts; static Double[] linearDocValues;
static Double[] singleExpMovAvgValueCounts; static Double[] singleDocValues;
static Double[] doubleExpMovAvgValueCounts; static Double[] doubleDocValues;
@Override @Override
public void setupSuiteScopeCluster() throws Exception { public void setupSuiteScopeCluster() throws Exception {
@ -83,13 +81,14 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
numValueBuckets = randomIntBetween(6, 80); numValueBuckets = randomIntBetween(6, 80);
numFilledValueBuckets = numValueBuckets; numFilledValueBuckets = numValueBuckets;
windowSize = randomIntBetween(3,10); windowSize = randomIntBetween(3,10);
gapPolicy = BucketHelpers.GapPolicy.INSERT_ZEROS; // TODO randomBoolean() ? BucketHelpers.GapPolicy.IGNORE : BucketHelpers.GapPolicy.INSERT_ZEROS; gapPolicy = randomBoolean() ? BucketHelpers.GapPolicy.IGNORE : BucketHelpers.GapPolicy.INSERT_ZEROS;
docCounts = new long[numValueBuckets]; docCounts = new long[numValueBuckets];
valueCounts = new long[numValueBuckets]; docValues = new long[numValueBuckets];
for (int i = 0; i < numValueBuckets; i++) { for (int i = 0; i < numValueBuckets; i++) {
docCounts[i] = randomIntBetween(0, 20); docCounts[i] = randomIntBetween(0, 20);
valueCounts[i] = randomIntBetween(1,20); //this will be used as a constant for all values within a bucket docValues[i] = randomIntBetween(1,20); //this will be used as a constant for all values within a bucket
} }
// Used for the gap tests // Used for the gap tests
@ -104,14 +103,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
this.setupLinear(); this.setupLinear();
this.setupSingle(); this.setupSingle();
this.setupDouble(); this.setupDouble();
for (int i = 0; i < numValueBuckets; i++) { for (int i = 0; i < numValueBuckets; i++) {
for (int docs = 0; docs < docCounts[i]; docs++) { for (int docs = 0; docs < docCounts[i]; docs++) {
builders.add(client().prepareIndex("idx", "type").setSource(jsonBuilder().startObject() builders.add(client().prepareIndex("idx", "type").setSource(jsonBuilder().startObject()
.field(SINGLE_VALUED_FIELD_NAME, i * interval) .field(SINGLE_VALUED_FIELD_NAME, i * interval)
.field(SINGLE_VALUED_VALUE_FIELD_NAME, 1).endObject())); .field(SINGLE_VALUED_VALUE_FIELD_NAME, docValues[i]).endObject()));
} }
} }
@ -120,24 +117,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
} }
private void setupSimple() { private void setupSimple() {
simpleMovAvgCounts = new Double[numValueBuckets]; simpleDocCounts = new Double[numValueBuckets];
EvictingQueue<Double> window = EvictingQueue.create(windowSize); EvictingQueue<Double> window = EvictingQueue.create(windowSize);
for (int i = 0; i < numValueBuckets; i++) { for (int i = 0; i < numValueBuckets; i++) {
double thisValue = docCounts[i]; if (docCounts[i] == 0 && gapPolicy.equals(BucketHelpers.GapPolicy.IGNORE)) {
window.offer(thisValue); continue;
double movAvg = 0;
for (double value : window) {
movAvg += value;
} }
movAvg /= window.size();
simpleMovAvgCounts[i] = movAvg;
}
window.clear();
simpleMovAvgValueCounts = new Double[numValueBuckets];
for (int i = 0; i < numValueBuckets; i++) {
window.offer((double)docCounts[i]); window.offer((double)docCounts[i]);
double movAvg = 0; double movAvg = 0;
@ -146,7 +131,34 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
} }
movAvg /= window.size(); movAvg /= window.size();
simpleMovAvgValueCounts[i] = movAvg; simpleDocCounts[i] = movAvg;
}
window.clear();
simpleDocValues = new Double[numValueBuckets];
for (int i = 0; i < numValueBuckets; i++) {
if (docCounts[i] == 0) {
// If there was a gap in doc counts and we are ignoring, just skip this bucket
if (gapPolicy.equals(BucketHelpers.GapPolicy.IGNORE)) {
continue;
} else if (gapPolicy.equals(BucketHelpers.GapPolicy.INSERT_ZEROS)) {
// otherwise insert a zero instead of the true value
window.offer(0.0);
} else {
window.offer((double) docValues[i]);
}
} else {
//if there are docs in this bucket, insert the regular value
window.offer((double) docValues[i]);
}
double movAvg = 0;
for (double value : window) {
movAvg += value;
}
movAvg /= window.size();
simpleDocValues[i] = movAvg;
} }
@ -154,14 +166,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
private void setupLinear() { private void setupLinear() {
EvictingQueue<Double> window = EvictingQueue.create(windowSize); EvictingQueue<Double> window = EvictingQueue.create(windowSize);
linearMovAvgCounts = new Double[numValueBuckets]; linearDocCounts = new Double[numValueBuckets];
window.clear(); window.clear();
for (int i = 0; i < numValueBuckets; i++) { for (int i = 0; i < numValueBuckets; i++) {
double thisValue = docCounts[i]; if (docCounts[i] == 0 && gapPolicy.equals(BucketHelpers.GapPolicy.IGNORE)) {
if (thisValue == -1) { continue;
thisValue = 0;
} }
window.offer(thisValue); window.offer((double)docCounts[i]);
double avg = 0; double avg = 0;
long totalWeight = 1; long totalWeight = 1;
@ -172,15 +183,27 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
totalWeight += current; totalWeight += current;
current += 1; current += 1;
} }
linearMovAvgCounts[i] = avg / totalWeight; linearDocCounts[i] = avg / totalWeight;
} }
window.clear(); window.clear();
linearMovAvgValueCounts = new Double[numValueBuckets]; linearDocValues = new Double[numValueBuckets];
for (int i = 0; i < numValueBuckets; i++) { for (int i = 0; i < numValueBuckets; i++) {
double thisValue = docCounts[i]; if (docCounts[i] == 0) {
window.offer(thisValue); // If there was a gap in doc counts and we are ignoring, just skip this bucket
if (gapPolicy.equals(BucketHelpers.GapPolicy.IGNORE)) {
continue;
} else if (gapPolicy.equals(BucketHelpers.GapPolicy.INSERT_ZEROS)) {
// otherwise insert a zero instead of the true value
window.offer(0.0);
} else {
window.offer((double) docValues[i]);
}
} else {
//if there are docs in this bucket, insert the regular value
window.offer((double) docValues[i]);
}
double avg = 0; double avg = 0;
long totalWeight = 1; long totalWeight = 1;
@ -191,39 +214,17 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
totalWeight += current; totalWeight += current;
current += 1; current += 1;
} }
linearMovAvgValueCounts[i] = avg / totalWeight; linearDocValues[i] = avg / totalWeight;
} }
} }
private void setupSingle() { private void setupSingle() {
EvictingQueue<Double> window = EvictingQueue.create(windowSize); EvictingQueue<Double> window = EvictingQueue.create(windowSize);
singleExpMovAvgCounts = new Double[numValueBuckets]; singleDocCounts = new Double[numValueBuckets];
for (int i = 0; i < numValueBuckets; i++) { for (int i = 0; i < numValueBuckets; i++) {
double thisValue = docCounts[i]; if (docCounts[i] == 0 && gapPolicy.equals(BucketHelpers.GapPolicy.IGNORE)) {
if (thisValue == -1) { continue;
thisValue = 0;
} }
window.offer(thisValue);
double avg = 0;
double alpha = 0.5;
boolean first = true;
for (double value : window) {
if (first) {
avg = value;
first = false;
} else {
avg = (value * alpha) + (avg * (1 - alpha));
}
}
singleExpMovAvgCounts[i] = avg ;
}
singleExpMovAvgValueCounts = new Double[numValueBuckets];
window.clear();
for (int i = 0; i < numValueBuckets; i++) {
window.offer((double)docCounts[i]); window.offer((double)docCounts[i]);
double avg = 0; double avg = 0;
@ -238,56 +239,53 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
avg = (value * alpha) + (avg * (1 - alpha)); avg = (value * alpha) + (avg * (1 - alpha));
} }
} }
singleExpMovAvgCounts[i] = avg ; singleDocCounts[i] = avg ;
}
singleDocValues = new Double[numValueBuckets];
window.clear();
for (int i = 0; i < numValueBuckets; i++) {
if (docCounts[i] == 0) {
// If there was a gap in doc counts and we are ignoring, just skip this bucket
if (gapPolicy.equals(BucketHelpers.GapPolicy.IGNORE)) {
continue;
} else if (gapPolicy.equals(BucketHelpers.GapPolicy.INSERT_ZEROS)) {
// otherwise insert a zero instead of the true value
window.offer(0.0);
} else {
window.offer((double) docValues[i]);
}
} else {
//if there are docs in this bucket, insert the regular value
window.offer((double) docValues[i]);
}
double avg = 0;
double alpha = 0.5;
boolean first = true;
for (double value : window) {
if (first) {
avg = value;
first = false;
} else {
avg = (value * alpha) + (avg * (1 - alpha));
}
}
singleDocValues[i] = avg ;
} }
} }
private void setupDouble() { private void setupDouble() {
EvictingQueue<Double> window = EvictingQueue.create(windowSize); EvictingQueue<Double> window = EvictingQueue.create(windowSize);
doubleExpMovAvgCounts = new Double[numValueBuckets]; doubleDocCounts = new Double[numValueBuckets];
for (int i = 0; i < numValueBuckets; i++) { for (int i = 0; i < numValueBuckets; i++) {
double thisValue = docCounts[i]; if (docCounts[i] == 0 && gapPolicy.equals(BucketHelpers.GapPolicy.IGNORE)) {
if (thisValue == -1) { continue;
thisValue = 0;
} }
window.offer(thisValue);
double s = 0;
double last_s = 0;
// Trend value
double b = 0;
double last_b = 0;
double alpha = 0.5;
double beta = 0.5;
int counter = 0;
double last;
for (double value : window) {
last = value;
if (counter == 1) {
s = value;
b = value - last;
} else {
s = alpha * value + (1.0d - alpha) * (last_s + last_b);
b = beta * (s - last_s) + (1 - beta) * last_b;
}
counter += 1;
last_s = s;
last_b = b;
}
doubleExpMovAvgCounts[i] = s + (0 * b) ;
}
doubleExpMovAvgValueCounts = new Double[numValueBuckets];
window.clear();
for (int i = 0; i < numValueBuckets; i++) {
window.offer((double)docCounts[i]); window.offer((double)docCounts[i]);
double s = 0; double s = 0;
@ -317,7 +315,56 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
last_b = b; last_b = b;
} }
doubleExpMovAvgValueCounts[i] = s + (0 * b) ; doubleDocCounts[i] = s + (0 * b) ;
}
doubleDocValues = new Double[numValueBuckets];
window.clear();
for (int i = 0; i < numValueBuckets; i++) {
if (docCounts[i] == 0) {
// If there was a gap in doc counts and we are ignoring, just skip this bucket
if (gapPolicy.equals(BucketHelpers.GapPolicy.IGNORE)) {
continue;
} else if (gapPolicy.equals(BucketHelpers.GapPolicy.INSERT_ZEROS)) {
// otherwise insert a zero instead of the true value
window.offer(0.0);
} else {
window.offer((double) docValues[i]);
}
} else {
//if there are docs in this bucket, insert the regular value
window.offer((double) docValues[i]);
}
double s = 0;
double last_s = 0;
// Trend value
double b = 0;
double last_b = 0;
double alpha = 0.5;
double beta = 0.5;
int counter = 0;
double last;
for (double value : window) {
last = value;
if (counter == 1) {
s = value;
b = value - last;
} else {
s = alpha * value + (1.0d - alpha) * (last_s + last_b);
b = beta * (s - last_s) + (1 - beta) * last_b;
}
counter += 1;
last_s = s;
last_b = b;
}
doubleDocValues[i] = s + (0 * b) ;
} }
} }
@ -332,8 +379,8 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0) histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(new SimpleModel.SimpleModelBuilder()) .modelBuilder(new SimpleModel.SimpleModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
@ -342,7 +389,7 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.window(windowSize) .window(windowSize)
.modelBuilder(new SimpleModel.SimpleModelBuilder()) .modelBuilder(new SimpleModel.SimpleModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
assertSearchResponse(response); assertSearchResponse(response);
@ -356,13 +403,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
for (int i = 0; i < numValueBuckets; ++i) { for (int i = 0; i < numValueBuckets; ++i) {
Histogram.Bucket bucket = buckets.get(i); Histogram.Bucket bucket = buckets.get(i);
checkBucketKeyAndDocCount("Bucket " + i, bucket, i * interval, docCounts[i]); checkBucketKeyAndDocCount("Bucket " + i, bucket, i * interval, docCounts[i]);
SimpleValue docCountMovAvg = bucket.getAggregations().get("movingAvg"); SimpleValue docCountMovAvg = bucket.getAggregations().get("movavg_counts");
assertThat(docCountMovAvg, notNullValue()); assertThat(docCountMovAvg, notNullValue());
assertThat(docCountMovAvg.value(), equalTo(simpleMovAvgCounts[i])); assertThat(docCountMovAvg.value(), equalTo(simpleDocCounts[i]));
SimpleValue valuesMovAvg = bucket.getAggregations().get("movavg_values"); SimpleValue valuesMovAvg = bucket.getAggregations().get("movavg_values");
assertThat(valuesMovAvg, notNullValue()); assertThat(valuesMovAvg, notNullValue());
assertThat(valuesMovAvg.value(), equalTo(simpleMovAvgCounts[i])); assertThat(valuesMovAvg.value(), equalTo(simpleDocValues[i]));
} }
} }
@ -377,8 +424,8 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0) histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(new LinearModel.LinearModelBuilder()) .modelBuilder(new LinearModel.LinearModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
@ -387,7 +434,7 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.window(windowSize) .window(windowSize)
.modelBuilder(new LinearModel.LinearModelBuilder()) .modelBuilder(new LinearModel.LinearModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
assertSearchResponse(response); assertSearchResponse(response);
@ -401,13 +448,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
for (int i = 0; i < numValueBuckets; ++i) { for (int i = 0; i < numValueBuckets; ++i) {
Histogram.Bucket bucket = buckets.get(i); Histogram.Bucket bucket = buckets.get(i);
checkBucketKeyAndDocCount("Bucket " + i, bucket, i * interval, docCounts[i]); checkBucketKeyAndDocCount("Bucket " + i, bucket, i * interval, docCounts[i]);
SimpleValue docCountMovAvg = bucket.getAggregations().get("movingAvg"); SimpleValue docCountMovAvg = bucket.getAggregations().get("movavg_counts");
assertThat(docCountMovAvg, notNullValue()); assertThat(docCountMovAvg, notNullValue());
assertThat(docCountMovAvg.value(), equalTo(linearMovAvgCounts[i])); assertThat(docCountMovAvg.value(), equalTo(linearDocCounts[i]));
SimpleValue valuesMovAvg = bucket.getAggregations().get("movavg_values"); SimpleValue valuesMovAvg = bucket.getAggregations().get("movavg_values");
assertThat(valuesMovAvg, notNullValue()); assertThat(valuesMovAvg, notNullValue());
assertThat(valuesMovAvg.value(), equalTo(linearMovAvgCounts[i])); assertThat(valuesMovAvg.value(), equalTo(linearDocValues[i]));
} }
} }
@ -422,8 +469,8 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0) histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(new SingleExpModel.SingleExpModelBuilder().alpha(0.5)) .modelBuilder(new SingleExpModel.SingleExpModelBuilder().alpha(0.5))
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
@ -432,7 +479,7 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.window(windowSize) .window(windowSize)
.modelBuilder(new SingleExpModel.SingleExpModelBuilder().alpha(0.5)) .modelBuilder(new SingleExpModel.SingleExpModelBuilder().alpha(0.5))
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
assertSearchResponse(response); assertSearchResponse(response);
@ -446,13 +493,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
for (int i = 0; i < numValueBuckets; ++i) { for (int i = 0; i < numValueBuckets; ++i) {
Histogram.Bucket bucket = buckets.get(i); Histogram.Bucket bucket = buckets.get(i);
checkBucketKeyAndDocCount("Bucket " + i, bucket, i * interval, docCounts[i]); checkBucketKeyAndDocCount("Bucket " + i, bucket, i * interval, docCounts[i]);
SimpleValue docCountMovAvg = bucket.getAggregations().get("movingAvg"); SimpleValue docCountMovAvg = bucket.getAggregations().get("movavg_counts");
assertThat(docCountMovAvg, notNullValue()); assertThat(docCountMovAvg, notNullValue());
assertThat(docCountMovAvg.value(), equalTo(singleExpMovAvgCounts[i])); assertThat(docCountMovAvg.value(), equalTo(singleDocCounts[i]));
SimpleValue valuesMovAvg = bucket.getAggregations().get("movavg_values"); SimpleValue valuesMovAvg = bucket.getAggregations().get("movavg_values");
assertThat(valuesMovAvg, notNullValue()); assertThat(valuesMovAvg, notNullValue());
assertThat(valuesMovAvg.value(), equalTo(singleExpMovAvgCounts[i])); assertThat(valuesMovAvg.value(), equalTo(singleDocValues[i]));
} }
} }
@ -467,8 +514,8 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0) histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(new DoubleExpModel.DoubleExpModelBuilder().alpha(0.5).beta(0.5)) .modelBuilder(new DoubleExpModel.DoubleExpModelBuilder().alpha(0.5).beta(0.5))
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
@ -477,7 +524,7 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.window(windowSize) .window(windowSize)
.modelBuilder(new DoubleExpModel.DoubleExpModelBuilder().alpha(0.5).beta(0.5)) .modelBuilder(new DoubleExpModel.DoubleExpModelBuilder().alpha(0.5).beta(0.5))
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
assertSearchResponse(response); assertSearchResponse(response);
@ -491,13 +538,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
for (int i = 0; i < numValueBuckets; ++i) { for (int i = 0; i < numValueBuckets; ++i) {
Histogram.Bucket bucket = buckets.get(i); Histogram.Bucket bucket = buckets.get(i);
checkBucketKeyAndDocCount("Bucket " + i, bucket, i * interval, docCounts[i]); checkBucketKeyAndDocCount("Bucket " + i, bucket, i * interval, docCounts[i]);
SimpleValue docCountMovAvg = bucket.getAggregations().get("movingAvg"); SimpleValue docCountMovAvg = bucket.getAggregations().get("movavg_counts");
assertThat(docCountMovAvg, notNullValue()); assertThat(docCountMovAvg, notNullValue());
assertThat(docCountMovAvg.value(), equalTo(doubleExpMovAvgCounts[i])); assertThat(docCountMovAvg.value(), equalTo(doubleDocCounts[i]));
SimpleValue valuesMovAvg = bucket.getAggregations().get("movavg_values"); SimpleValue valuesMovAvg = bucket.getAggregations().get("movavg_values");
assertThat(valuesMovAvg, notNullValue()); assertThat(valuesMovAvg, notNullValue());
assertThat(valuesMovAvg.value(), equalTo(doubleExpMovAvgCounts[i])); assertThat(valuesMovAvg.value(), equalTo(doubleDocValues[i]));
} }
} }
@ -509,12 +556,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0) histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(0) .window(0)
.modelBuilder(new SimpleModel.SimpleModelBuilder()) .modelBuilder(new SimpleModel.SimpleModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
fail("MovingAvg should not accept a window that is zero"); fail("MovingAvg should not accept a window that is zero");
@ -531,13 +578,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
client() client()
.prepareSearch("idx") .prepareSearch("idx")
.addAggregation( .addAggregation(
range("histo").field(SINGLE_VALUED_FIELD_NAME).addRange(0,10) range("histo").field(SINGLE_VALUED_FIELD_NAME).addRange(0, 10)
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(0) .window(0)
.modelBuilder(new SimpleModel.SimpleModelBuilder()) .modelBuilder(new SimpleModel.SimpleModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
fail("MovingAvg should not accept non-histogram as parent"); fail("MovingAvg should not accept non-histogram as parent");
@ -554,8 +601,8 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0) histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(-10) .window(-10)
.modelBuilder(new SimpleModel.SimpleModelBuilder()) .modelBuilder(new SimpleModel.SimpleModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
@ -578,12 +625,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field("test").interval(interval).minDocCount(0) histogram("histo").field("test").interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(new SimpleModel.SimpleModelBuilder()) .modelBuilder(new SimpleModel.SimpleModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
assertSearchResponse(response); assertSearchResponse(response);
@ -603,13 +650,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0) histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(randomModelBuilder()) .modelBuilder(randomModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.predict(0) .predict(0)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
fail("MovingAvg should not accept a prediction size that is zero"); fail("MovingAvg should not accept a prediction size that is zero");
@ -626,13 +673,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0) histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(SINGLE_VALUED_VALUE_FIELD_NAME)) .subAggregation(randomMetric("the_metric", SINGLE_VALUED_VALUE_FIELD_NAME))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(randomModelBuilder()) .modelBuilder(randomModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.predict(-10) .predict(-10)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
fail("MovingAvg should not accept a prediction size that is negative"); fail("MovingAvg should not accept a prediction size that is negative");
@ -655,12 +702,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
.addAggregation( .addAggregation(
histogram("histo").field("gap_test").interval(interval).minDocCount(0) histogram("histo").field("gap_test").interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(GAP_FIELD)) .subAggregation(randomMetric("the_metric", GAP_FIELD))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(randomModelBuilder()) .modelBuilder(randomModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
assertSearchResponse(response); assertSearchResponse(response);
@ -671,12 +718,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
List<? extends Bucket> buckets = histo.getBuckets(); List<? extends Bucket> buckets = histo.getBuckets();
assertThat(buckets.size(), equalTo(numValueBuckets)); assertThat(buckets.size(), equalTo(numValueBuckets));
double lastValue = ((SimpleValue)(buckets.get(0).getAggregations().get("movingAvg"))).value(); double lastValue = ((SimpleValue)(buckets.get(0).getAggregations().get("movavg_counts"))).value();
assertThat(Double.compare(lastValue, 0.0d), greaterThanOrEqualTo(0)); assertThat(Double.compare(lastValue, 0.0d), greaterThanOrEqualTo(0));
double currentValue; double currentValue;
for (int i = 1; i < numValueBuckets - 2; i++) { for (int i = 1; i < numValueBuckets - 2; i++) {
currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movingAvg"))).value(); currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movavg_counts"))).value();
// Since there are only two values in this test, at the beginning and end, the moving average should // Since there are only two values in this test, at the beginning and end, the moving average should
// decrease every step (until it reaches zero). Crude way to check that it's doing the right thing // decrease every step (until it reaches zero). Crude way to check that it's doing the right thing
@ -687,7 +734,7 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
} }
// The last bucket has a real value, so this should always increase the moving avg // The last bucket has a real value, so this should always increase the moving avg
currentValue = ((SimpleValue)(buckets.get(numValueBuckets - 1).getAggregations().get("movingAvg"))).value(); currentValue = ((SimpleValue)(buckets.get(numValueBuckets - 1).getAggregations().get("movavg_counts"))).value();
assertThat(Double.compare(lastValue, currentValue), equalTo(-1)); assertThat(Double.compare(lastValue, currentValue), equalTo(-1));
} }
@ -698,19 +745,19 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
public void testGiantGapWithPredict() { public void testGiantGapWithPredict() {
MovAvgModelBuilder model = randomModelBuilder(); MovAvgModelBuilder model = randomModelBuilder();
int numPredictions = randomIntBetween(0, 10); int numPredictions = randomIntBetween(1, 10);
SearchResponse response = client() SearchResponse response = client()
.prepareSearch("idx") .prepareSearch("idx")
.addAggregation( .addAggregation(
histogram("histo").field("gap_test").interval(interval).minDocCount(0) histogram("histo").field("gap_test").interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(GAP_FIELD)) .subAggregation(randomMetric("the_metric", GAP_FIELD))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(model) .modelBuilder(model)
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.predict(numPredictions) .predict(numPredictions)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
).execute().actionGet(); ).execute().actionGet();
assertSearchResponse(response); assertSearchResponse(response);
@ -721,12 +768,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
List<? extends Bucket> buckets = histo.getBuckets(); List<? extends Bucket> buckets = histo.getBuckets();
assertThat(buckets.size(), equalTo(numValueBuckets + numPredictions)); assertThat(buckets.size(), equalTo(numValueBuckets + numPredictions));
double lastValue = ((SimpleValue)(buckets.get(0).getAggregations().get("movingAvg"))).value(); double lastValue = ((SimpleValue)(buckets.get(0).getAggregations().get("movavg_counts"))).value();
assertThat(Double.compare(lastValue, 0.0d), greaterThanOrEqualTo(0)); assertThat(Double.compare(lastValue, 0.0d), greaterThanOrEqualTo(0));
double currentValue; double currentValue;
for (int i = 1; i < numValueBuckets - 2; i++) { for (int i = 1; i < numValueBuckets - 2; i++) {
currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movingAvg"))).value(); currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movavg_counts"))).value();
// Since there are only two values in this test, at the beginning and end, the moving average should // Since there are only two values in this test, at the beginning and end, the moving average should
// decrease every step (until it reaches zero). Crude way to check that it's doing the right thing // decrease every step (until it reaches zero). Crude way to check that it's doing the right thing
@ -737,15 +784,15 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
} }
// The last bucket has a real value, so this should always increase the moving avg // The last bucket has a real value, so this should always increase the moving avg
currentValue = ((SimpleValue)(buckets.get(numValueBuckets - 1).getAggregations().get("movingAvg"))).value(); currentValue = ((SimpleValue)(buckets.get(numValueBuckets - 1).getAggregations().get("movavg_counts"))).value();
assertThat(Double.compare(lastValue, currentValue), equalTo(-1)); assertThat(Double.compare(lastValue, currentValue), equalTo(-1));
// Now check predictions // Now check predictions
for (int i = numValueBuckets; i < numValueBuckets + numPredictions; i++) { for (int i = numValueBuckets; i < numValueBuckets + numPredictions; i++) {
// Unclear at this point which direction the predictions will go, just verify they are // Unclear at this point which direction the predictions will go, just verify they are
// not null, and that we don't have the_sum anymore // not null, and that we don't have the_metric anymore
assertThat((buckets.get(i).getAggregations().get("movingAvg")), notNullValue()); assertThat((buckets.get(i).getAggregations().get("movavg_counts")), notNullValue());
assertThat((buckets.get(i).getAggregations().get("the_sum")), nullValue()); assertThat((buckets.get(i).getAggregations().get("the_metric")), nullValue());
} }
} }
@ -763,12 +810,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
filter("filtered").filter(new RangeFilterBuilder("gap_test").from(1)).subAggregation( filter("filtered").filter(new RangeFilterBuilder("gap_test").from(1)).subAggregation(
histogram("histo").field("gap_test").interval(interval).minDocCount(0) histogram("histo").field("gap_test").interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(GAP_FIELD)) .subAggregation(randomMetric("the_metric", GAP_FIELD))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(randomModelBuilder()) .modelBuilder(randomModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
) )
).execute().actionGet(); ).execute().actionGet();
@ -789,7 +836,7 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
double currentValue; double currentValue;
double lastValue = 0.0; double lastValue = 0.0;
for (int i = 0; i < numValueBuckets - 1; i++) { for (int i = 0; i < numValueBuckets - 1; i++) {
currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movingAvg"))).value(); currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movavg_counts"))).value();
assertThat(Double.compare(lastValue, currentValue), lessThanOrEqualTo(0)); assertThat(Double.compare(lastValue, currentValue), lessThanOrEqualTo(0));
lastValue = currentValue; lastValue = currentValue;
@ -808,13 +855,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
filter("filtered").filter(new RangeFilterBuilder("gap_test").from(1)).subAggregation( filter("filtered").filter(new RangeFilterBuilder("gap_test").from(1)).subAggregation(
histogram("histo").field("gap_test").interval(interval).minDocCount(0) histogram("histo").field("gap_test").interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(GAP_FIELD)) .subAggregation(randomMetric("the_metric", GAP_FIELD))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(randomModelBuilder()) .modelBuilder(randomModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.predict(numPredictions) .predict(numPredictions)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
) )
).execute().actionGet(); ).execute().actionGet();
@ -835,7 +882,7 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
double currentValue; double currentValue;
double lastValue = 0.0; double lastValue = 0.0;
for (int i = 0; i < numValueBuckets - 1; i++) { for (int i = 0; i < numValueBuckets - 1; i++) {
currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movingAvg"))).value(); currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movavg_counts"))).value();
assertThat(Double.compare(lastValue, currentValue), lessThanOrEqualTo(0)); assertThat(Double.compare(lastValue, currentValue), lessThanOrEqualTo(0));
lastValue = currentValue; lastValue = currentValue;
@ -844,9 +891,9 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
// Now check predictions // Now check predictions
for (int i = numValueBuckets; i < numValueBuckets + numPredictions; i++) { for (int i = numValueBuckets; i < numValueBuckets + numPredictions; i++) {
// Unclear at this point which direction the predictions will go, just verify they are // Unclear at this point which direction the predictions will go, just verify they are
// not null, and that we don't have the_sum anymore // not null, and that we don't have the_metric anymore
assertThat((buckets.get(i).getAggregations().get("movingAvg")), notNullValue()); assertThat((buckets.get(i).getAggregations().get("movavg_counts")), notNullValue());
assertThat((buckets.get(i).getAggregations().get("the_sum")), nullValue()); assertThat((buckets.get(i).getAggregations().get("the_metric")), nullValue());
} }
} }
@ -864,12 +911,12 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
filter("filtered").filter(new RangeFilterBuilder("gap_test").to((interval * (numValueBuckets - 1) - interval))).subAggregation( filter("filtered").filter(new RangeFilterBuilder("gap_test").to((interval * (numValueBuckets - 1) - interval))).subAggregation(
histogram("histo").field("gap_test").interval(interval).minDocCount(0) histogram("histo").field("gap_test").interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(GAP_FIELD)) .subAggregation(randomMetric("the_metric", GAP_FIELD))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(randomModelBuilder()) .modelBuilder(randomModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
) )
).execute().actionGet(); ).execute().actionGet();
@ -888,9 +935,9 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
assertThat(buckets.size(), equalTo(numValueBuckets)); assertThat(buckets.size(), equalTo(numValueBuckets));
double currentValue; double currentValue;
double lastValue = ((SimpleValue)(buckets.get(0).getAggregations().get("movingAvg"))).value(); double lastValue = ((SimpleValue)(buckets.get(0).getAggregations().get("movavg_counts"))).value();
for (int i = 1; i < numValueBuckets - 1; i++) { for (int i = 1; i < numValueBuckets - 1; i++) {
currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movingAvg"))).value(); currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movavg_counts"))).value();
assertThat(Double.compare(lastValue, currentValue), greaterThanOrEqualTo(0)); assertThat(Double.compare(lastValue, currentValue), greaterThanOrEqualTo(0));
lastValue = currentValue; lastValue = currentValue;
@ -909,13 +956,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
filter("filtered").filter(new RangeFilterBuilder("gap_test").to((interval * (numValueBuckets - 1) - interval))).subAggregation( filter("filtered").filter(new RangeFilterBuilder("gap_test").to((interval * (numValueBuckets - 1) - interval))).subAggregation(
histogram("histo").field("gap_test").interval(interval).minDocCount(0) histogram("histo").field("gap_test").interval(interval).minDocCount(0)
.extendedBounds(0L, (long) (interval * (numValueBuckets - 1))) .extendedBounds(0L, (long) (interval * (numValueBuckets - 1)))
.subAggregation(sum("the_sum").field(GAP_FIELD)) .subAggregation(randomMetric("the_metric", GAP_FIELD))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(randomModelBuilder()) .modelBuilder(randomModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.predict(numPredictions) .predict(numPredictions)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
) )
).execute().actionGet(); ).execute().actionGet();
@ -934,9 +981,9 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
assertThat(buckets.size(), equalTo(numValueBuckets + numPredictions)); assertThat(buckets.size(), equalTo(numValueBuckets + numPredictions));
double currentValue; double currentValue;
double lastValue = ((SimpleValue)(buckets.get(0).getAggregations().get("movingAvg"))).value(); double lastValue = ((SimpleValue)(buckets.get(0).getAggregations().get("movavg_counts"))).value();
for (int i = 1; i < numValueBuckets - 1; i++) { for (int i = 1; i < numValueBuckets - 1; i++) {
currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movingAvg"))).value(); currentValue = ((SimpleValue)(buckets.get(i).getAggregations().get("movavg_counts"))).value();
assertThat(Double.compare(lastValue, currentValue), greaterThanOrEqualTo(0)); assertThat(Double.compare(lastValue, currentValue), greaterThanOrEqualTo(0));
lastValue = currentValue; lastValue = currentValue;
@ -945,9 +992,9 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
// Now check predictions // Now check predictions
for (int i = numValueBuckets; i < numValueBuckets + numPredictions; i++) { for (int i = numValueBuckets; i < numValueBuckets + numPredictions; i++) {
// Unclear at this point which direction the predictions will go, just verify they are // Unclear at this point which direction the predictions will go, just verify they are
// not null, and that we don't have the_sum anymore // not null, and that we don't have the_metric anymore
assertThat((buckets.get(i).getAggregations().get("movingAvg")), notNullValue()); assertThat((buckets.get(i).getAggregations().get("movavg_counts")), notNullValue());
assertThat((buckets.get(i).getAggregations().get("the_sum")), nullValue()); assertThat((buckets.get(i).getAggregations().get("the_metric")), nullValue());
} }
} }
@ -962,13 +1009,13 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
// Filter so we are above all values // Filter so we are above all values
filter("filtered").filter(new RangeFilterBuilder("gap_test").from((interval * (numValueBuckets - 1) + interval))).subAggregation( filter("filtered").filter(new RangeFilterBuilder("gap_test").from((interval * (numValueBuckets - 1) + interval))).subAggregation(
histogram("histo").field("gap_test").interval(interval).minDocCount(0) histogram("histo").field("gap_test").interval(interval).minDocCount(0)
.subAggregation(sum("the_sum").field(GAP_FIELD)) .subAggregation(randomMetric("the_metric", GAP_FIELD))
.subAggregation(movingAvg("movingAvg") .subAggregation(movingAvg("movavg_counts")
.window(windowSize) .window(windowSize)
.modelBuilder(randomModelBuilder()) .modelBuilder(randomModelBuilder())
.gapPolicy(gapPolicy) .gapPolicy(gapPolicy)
.predict(numPredictions) .predict(numPredictions)
.setBucketsPaths("the_sum")) .setBucketsPaths("the_metric"))
) )
).execute().actionGet(); ).execute().actionGet();
@ -1014,5 +1061,20 @@ public class MovAvgTests extends ElasticsearchIntegrationTest {
return new SimpleModel.SimpleModelBuilder(); return new SimpleModel.SimpleModelBuilder();
} }
} }
private ValuesSourceMetricsAggregationBuilder randomMetric(String name, String field) {
int rand = randomIntBetween(0,3);
switch (rand) {
case 0:
return min(name).field(field);
case 2:
return max(name).field(field);
case 3:
return avg(name).field(field);
default:
return avg(name).field(field);
}
}
} }