summaryrefslogtreecommitdiff
path: root/core/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityIT.java
diff options
context:
space:
mode:
authorRyan Ernst <ryan@iernst.net>2015-08-03 14:42:34 -0700
committerRyan Ernst <ryan@iernst.net>2015-08-03 14:42:34 -0700
commit622d8a830e29baab16540ca942a41b646c32aca4 (patch)
tree25a5b4c66cdc57fa5e4681dbf20fb58bfe3ea2c0 /core/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityIT.java
parent22a73d3e65d69a084f320ab86a7fff3ca8f3f877 (diff)
Tests: Rename integ tests to IT suffix
This rename effectively moves all integration tests to be run with `mvn verify`. `mvn test` now runs in about 2 mins. This is a follow up to
Diffstat (limited to 'core/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityIT.java')
-rw-r--r--core/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityIT.java486
1 files changed, 486 insertions, 0 deletions
diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityIT.java b/core/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityIT.java
new file mode 100644
index 0000000000..2fe87192df
--- /dev/null
+++ b/core/src/test/java/org/elasticsearch/search/aggregations/metrics/CardinalityIT.java
@@ -0,0 +1,486 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch 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 org.elasticsearch.search.aggregations.metrics;
+
+import org.elasticsearch.action.index.IndexRequestBuilder;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.script.Script;
+import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode;
+import org.elasticsearch.search.aggregations.bucket.global.Global;
+import org.elasticsearch.search.aggregations.bucket.terms.Terms;
+import org.elasticsearch.search.aggregations.metrics.cardinality.Cardinality;
+import org.elasticsearch.test.ElasticsearchIntegrationTest;
+import org.junit.Test;
+
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
+import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
+import static org.elasticsearch.search.aggregations.AggregationBuilders.cardinality;
+import static org.elasticsearch.search.aggregations.AggregationBuilders.global;
+import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
+import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.notNullValue;
+
+@ElasticsearchIntegrationTest.SuiteScopeTest
+public class CardinalityIT extends ElasticsearchIntegrationTest {
+
+ @Override
+ public Settings indexSettings() {
+ return Settings.builder()
+ .put("index.number_of_shards", numberOfShards())
+ .put("index.number_of_replicas", numberOfReplicas())
+ .build();
+ }
+
+ static long numDocs;
+ static long precisionThreshold;
+
+ @Override
+ public void setupSuiteScopeCluster() throws Exception {
+
+ prepareCreate("idx").addMapping("type",
+ jsonBuilder().startObject().startObject("type").startObject("properties")
+ .startObject("str_value")
+ .field("type", "string")
+ .startObject("fields")
+ .startObject("hash")
+ .field("type", "murmur3")
+ .endObject()
+ .endObject()
+ .endObject()
+ .startObject("str_values")
+ .field("type", "string")
+ .startObject("fields")
+ .startObject("hash")
+ .field("type", "murmur3")
+ .endObject()
+ .endObject()
+ .endObject()
+ .startObject("l_value")
+ .field("type", "long")
+ .startObject("fields")
+ .startObject("hash")
+ .field("type", "murmur3")
+ .endObject()
+ .endObject()
+ .endObject()
+ .startObject("l_values")
+ .field("type", "long")
+ .startObject("fields")
+ .startObject("hash")
+ .field("type", "murmur3")
+ .endObject()
+ .endObject()
+ .endObject()
+ .startObject("d_value")
+ .field("type", "double")
+ .startObject("fields")
+ .startObject("hash")
+ .field("type", "murmur3")
+ .endObject()
+ .endObject()
+ .endObject()
+ .startObject("d_values")
+ .field("type", "double")
+ .startObject("fields")
+ .startObject("hash")
+ .field("type", "murmur3")
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject()
+ .endObject().endObject()).execute().actionGet();
+
+ numDocs = randomIntBetween(2, 100);
+ precisionThreshold = randomIntBetween(0, 1 << randomInt(20));
+ IndexRequestBuilder[] builders = new IndexRequestBuilder[(int) numDocs];
+ for (int i = 0; i < numDocs; ++i) {
+ builders[i] = client().prepareIndex("idx", "type").setSource(jsonBuilder()
+ .startObject()
+ .field("str_value", "s" + i)
+ .field("str_values", new String[]{"s" + (i * 2), "s" + (i * 2 + 1)})
+ .field("l_value", i)
+ .field("l_values", new int[] {i * 2, i * 2 + 1})
+ .field("d_value", i)
+ .field("d_values", new double[]{i * 2, i * 2 + 1})
+ .endObject());
+ }
+ indexRandom(true, builders);
+ createIndex("idx_unmapped");
+
+ IndexRequestBuilder[] dummyDocsBuilder = new IndexRequestBuilder[10];
+ for (int i = 0; i < dummyDocsBuilder.length; i++) {
+ dummyDocsBuilder[i] = client().prepareIndex("idx", "type").setSource("a_field", "1");
+ }
+ indexRandom(true, dummyDocsBuilder);
+
+ ensureSearchable();
+ }
+
+ private void assertCount(Cardinality count, long value) {
+ if (value <= precisionThreshold) {
+ // linear counting should be picked, and should be accurate
+ assertEquals(value, count.getValue());
+ } else {
+ // error is not bound, so let's just make sure it is > 0
+ assertThat(count.getValue(), greaterThan(0L));
+ }
+ }
+ private String singleNumericField(boolean hash) {
+ return (randomBoolean() ? "l_value" : "d_value") + (hash ? ".hash" : "");
+ }
+
+ private String multiNumericField(boolean hash) {
+ return (randomBoolean() ? "l_values" : "d_values") + (hash ? ".hash" : "");
+ }
+
+ @Test
+ public void unmapped() throws Exception {
+ SearchResponse response = client().prepareSearch("idx_unmapped").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_value"))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, 0);
+ }
+
+ @Test
+ public void partiallyUnmapped() throws Exception {
+ SearchResponse response = client().prepareSearch("idx", "idx_unmapped").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_value"))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void singleValuedString() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_value"))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void singleValuedStringHashed() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_value.hash"))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void singleValuedNumeric() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field(singleNumericField(false)))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void singleValuedNumeric_getProperty() throws Exception {
+
+ SearchResponse searchResponse = client().prepareSearch("idx").setQuery(matchAllQuery())
+ .addAggregation(
+ global("global").subAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).field(singleNumericField(false))))
+ .execute().actionGet();
+
+ assertSearchResponse(searchResponse);
+
+ Global global = searchResponse.getAggregations().get("global");
+ assertThat(global, notNullValue());
+ assertThat(global.getName(), equalTo("global"));
+ // assertThat(global.getDocCount(), equalTo(numDocs));
+ assertThat(global.getAggregations(), notNullValue());
+ assertThat(global.getAggregations().asMap().size(), equalTo(1));
+
+ Cardinality cardinality = global.getAggregations().get("cardinality");
+ assertThat(cardinality, notNullValue());
+ assertThat(cardinality.getName(), equalTo("cardinality"));
+ long expectedValue = numDocs;
+ assertCount(cardinality, expectedValue);
+ assertThat((Cardinality) global.getProperty("cardinality"), equalTo(cardinality));
+ assertThat((double) global.getProperty("cardinality.value"), equalTo((double) cardinality.getValue()));
+ assertThat((double) cardinality.getProperty("value"), equalTo((double) cardinality.getValue()));
+ }
+
+ @Test
+ public void singleValuedNumericHashed() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field(singleNumericField(true)))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void multiValuedString() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_values"))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs * 2);
+ }
+
+ @Test
+ public void multiValuedStringHashed() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_values.hash"))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs * 2);
+ }
+
+ @Test
+ public void multiValuedNumeric() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field(multiNumericField(false)))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs * 2);
+ }
+
+ @Test
+ public void multiValuedNumericHashed() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field(multiNumericField(true)))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs * 2);
+ }
+
+ @Test
+ public void singleValuedStringScript() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).script(new Script("doc['str_value'].value")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void multiValuedStringScript() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).script(new Script("doc['str_values'].values")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs * 2);
+ }
+
+ @Test
+ public void singleValuedNumericScript() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).script(
+ new Script("doc['" + singleNumericField(false) + "'].value")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void multiValuedNumericScript() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).script(
+ new Script("doc['" + multiNumericField(false) + "'].values")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs * 2);
+ }
+
+ @Test
+ public void singleValuedStringValueScript() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_value").script(new Script("_value")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void multiValuedStringValueScript() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_values").script(new Script("_value")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs * 2);
+ }
+
+ @Test
+ public void singleValuedNumericValueScript() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).field(singleNumericField(false))
+ .script(new Script("_value")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs);
+ }
+
+ @Test
+ public void multiValuedNumericValueScript() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(
+ cardinality("cardinality").precisionThreshold(precisionThreshold).field(multiNumericField(false))
+ .script(new Script("_value")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Cardinality count = response.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, numDocs * 2);
+ }
+
+ @Test
+ public void asSubAgg() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(terms("terms").field("str_value")
+ .collectMode(randomFrom(SubAggCollectionMode.values()))
+ .subAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_values")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Terms terms = response.getAggregations().get("terms");
+ for (Terms.Bucket bucket : terms.getBuckets()) {
+ Cardinality count = bucket.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, 2);
+ }
+ }
+
+ @Test
+ public void asSubAggHashed() throws Exception {
+ SearchResponse response = client().prepareSearch("idx").setTypes("type")
+ .addAggregation(terms("terms").field("str_value")
+ .collectMode(randomFrom(SubAggCollectionMode.values()))
+ .subAggregation(cardinality("cardinality").precisionThreshold(precisionThreshold).field("str_values.hash")))
+ .execute().actionGet();
+
+ assertSearchResponse(response);
+
+ Terms terms = response.getAggregations().get("terms");
+ for (Terms.Bucket bucket : terms.getBuckets()) {
+ Cardinality count = bucket.getAggregations().get("cardinality");
+ assertThat(count, notNullValue());
+ assertThat(count.getName(), equalTo("cardinality"));
+ assertCount(count, 2);
+ }
+ }
+
+}