|
@@ -18,6 +18,7 @@
|
|
|
*/
|
|
|
package org.elasticsearch.search.aggregations.bucket;
|
|
|
|
|
|
+import org.apache.lucene.search.join.ScoreMode;
|
|
|
import org.elasticsearch.action.index.IndexRequestBuilder;
|
|
|
import org.elasticsearch.action.search.SearchPhaseExecutionException;
|
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
@@ -44,6 +45,7 @@ import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF
|
|
|
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS;
|
|
|
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
|
|
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
|
|
+import static org.elasticsearch.index.query.QueryBuilders.nestedQuery;
|
|
|
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
|
|
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
|
|
|
import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
|
|
@@ -62,15 +64,12 @@ import static org.hamcrest.Matchers.is;
|
|
|
import static org.hamcrest.Matchers.sameInstance;
|
|
|
import static org.hamcrest.core.IsNull.notNullValue;
|
|
|
|
|
|
-/**
|
|
|
- *
|
|
|
- */
|
|
|
@ESIntegTestCase.SuiteScopeTestCase
|
|
|
public class NestedIT extends ESIntegTestCase {
|
|
|
|
|
|
- static int numParents;
|
|
|
- static int[] numChildren;
|
|
|
- static SubAggCollectionMode aggCollectionMode;
|
|
|
+ private static int numParents;
|
|
|
+ private static int[] numChildren;
|
|
|
+ private static SubAggCollectionMode aggCollectionMode;
|
|
|
|
|
|
@Override
|
|
|
public void setupSuiteScopeCluster() throws Exception {
|
|
@@ -245,7 +244,7 @@ public class NestedIT extends ESIntegTestCase {
|
|
|
assertThat(nested, notNullValue());
|
|
|
assertThat(nested.getName(), equalTo("nested"));
|
|
|
assertThat(nested.getDocCount(), equalTo(docCount));
|
|
|
- assertThat((long) nested.getProperty("_count"), equalTo(docCount));
|
|
|
+ assertThat(nested.getProperty("_count"), equalTo(docCount));
|
|
|
assertThat(nested.getAggregations().asList().isEmpty(), is(false));
|
|
|
|
|
|
LongTerms values = nested.getAggregations().get("values");
|
|
@@ -263,7 +262,7 @@ public class NestedIT extends ESIntegTestCase {
|
|
|
assertEquals(counts[i], bucket.getDocCount());
|
|
|
}
|
|
|
}
|
|
|
- assertThat((LongTerms) nested.getProperty("values"), sameInstance(values));
|
|
|
+ assertThat(nested.getProperty("values"), sameInstance(values));
|
|
|
}
|
|
|
|
|
|
public void testNestedAsSubAggregation() throws Exception {
|
|
@@ -544,4 +543,126 @@ public class NestedIT extends ESIntegTestCase {
|
|
|
assertThat(propertyId.getBucketByKey("2").getDocCount(), equalTo(1L));
|
|
|
assertThat(propertyId.getBucketByKey("3").getDocCount(), equalTo(1L));
|
|
|
}
|
|
|
+
|
|
|
+ public void testFilterAggInsideNestedAgg() throws Exception {
|
|
|
+ assertAcked(prepareCreate("classes")
|
|
|
+ .addMapping("class", jsonBuilder().startObject().startObject("class").startObject("properties")
|
|
|
+ .startObject("name").field("type", "text").endObject()
|
|
|
+ .startObject("methods")
|
|
|
+ .field("type", "nested")
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("name").field("type", "text").endObject()
|
|
|
+ .startObject("return_type").field("type", "keyword").endObject()
|
|
|
+ .startObject("parameters")
|
|
|
+ .field("type", "nested")
|
|
|
+ .startObject("properties")
|
|
|
+ .startObject("name").field("type", "text").endObject()
|
|
|
+ .startObject("type").field("type", "keyword").endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject()
|
|
|
+ .endObject().endObject().endObject().endObject()));
|
|
|
+
|
|
|
+ client().prepareIndex("classes", "class", "1").setSource(jsonBuilder().startObject()
|
|
|
+ .field("name", "QueryBuilder")
|
|
|
+ .startArray("methods")
|
|
|
+ .startObject()
|
|
|
+ .field("name", "toQuery")
|
|
|
+ .field("return_type", "Query")
|
|
|
+ .startArray("parameters")
|
|
|
+ .startObject()
|
|
|
+ .field("name", "context")
|
|
|
+ .field("type", "QueryShardContext")
|
|
|
+ .endObject()
|
|
|
+ .endArray()
|
|
|
+ .endObject()
|
|
|
+ .startObject()
|
|
|
+ .field("name", "queryName")
|
|
|
+ .field("return_type", "QueryBuilder")
|
|
|
+ .startArray("parameters")
|
|
|
+ .startObject()
|
|
|
+ .field("name", "queryName")
|
|
|
+ .field("type", "String")
|
|
|
+ .endObject()
|
|
|
+ .endArray()
|
|
|
+ .endObject()
|
|
|
+ .startObject()
|
|
|
+ .field("name", "boost")
|
|
|
+ .field("return_type", "QueryBuilder")
|
|
|
+ .startArray("parameters")
|
|
|
+ .startObject()
|
|
|
+ .field("name", "boost")
|
|
|
+ .field("type", "float")
|
|
|
+ .endObject()
|
|
|
+ .endArray()
|
|
|
+ .endObject()
|
|
|
+ .endArray()
|
|
|
+ .endObject()).get();
|
|
|
+ client().prepareIndex("classes", "class", "2").setSource(jsonBuilder().startObject()
|
|
|
+ .field("name", "Document")
|
|
|
+ .startArray("methods")
|
|
|
+ .startObject()
|
|
|
+ .field("name", "add")
|
|
|
+ .field("return_type", "void")
|
|
|
+ .startArray("parameters")
|
|
|
+ .startObject()
|
|
|
+ .field("name", "field")
|
|
|
+ .field("type", "IndexableField")
|
|
|
+ .endObject()
|
|
|
+ .endArray()
|
|
|
+ .endObject()
|
|
|
+ .startObject()
|
|
|
+ .field("name", "removeField")
|
|
|
+ .field("return_type", "void")
|
|
|
+ .startArray("parameters")
|
|
|
+ .startObject()
|
|
|
+ .field("name", "name")
|
|
|
+ .field("type", "String")
|
|
|
+ .endObject()
|
|
|
+ .endArray()
|
|
|
+ .endObject()
|
|
|
+ .startObject()
|
|
|
+ .field("name", "removeFields")
|
|
|
+ .field("return_type", "void")
|
|
|
+ .startArray("parameters")
|
|
|
+ .startObject()
|
|
|
+ .field("name", "name")
|
|
|
+ .field("type", "String")
|
|
|
+ .endObject()
|
|
|
+ .endArray()
|
|
|
+ .endObject()
|
|
|
+ .endArray()
|
|
|
+ .endObject()).get();
|
|
|
+ refresh();
|
|
|
+
|
|
|
+ SearchResponse response = client().prepareSearch("classes").addAggregation(nested("to_method", "methods")
|
|
|
+ .subAggregation(filter("num_string_params",
|
|
|
+ nestedQuery("methods.parameters", termQuery("methods.parameters.type", "String"), ScoreMode.None)))
|
|
|
+ ).get();
|
|
|
+ Nested toMethods = response.getAggregations().get("to_method");
|
|
|
+ Filter numStringParams = toMethods.getAggregations().get("num_string_params");
|
|
|
+ assertThat(numStringParams.getDocCount(), equalTo(3L));
|
|
|
+
|
|
|
+ response = client().prepareSearch("classes").addAggregation(nested("to_method", "methods")
|
|
|
+ .subAggregation(terms("return_type").field("methods.return_type").subAggregation(
|
|
|
+ filter("num_string_params", nestedQuery("methods.parameters", termQuery("methods.parameters.type", "String"), ScoreMode.None))
|
|
|
+ )
|
|
|
+ )).get();
|
|
|
+ toMethods = response.getAggregations().get("to_method");
|
|
|
+ Terms terms = toMethods.getAggregations().get("return_type");
|
|
|
+ Bucket bucket = terms.getBucketByKey("void");
|
|
|
+ assertThat(bucket.getDocCount(), equalTo(3L));
|
|
|
+ numStringParams = bucket.getAggregations().get("num_string_params");
|
|
|
+ assertThat(numStringParams.getDocCount(), equalTo(2L));
|
|
|
+
|
|
|
+ bucket = terms.getBucketByKey("QueryBuilder");
|
|
|
+ assertThat(bucket.getDocCount(), equalTo(2L));
|
|
|
+ numStringParams = bucket.getAggregations().get("num_string_params");
|
|
|
+ assertThat(numStringParams.getDocCount(), equalTo(1L));
|
|
|
+
|
|
|
+ bucket = terms.getBucketByKey("Query");
|
|
|
+ assertThat(bucket.getDocCount(), equalTo(1L));
|
|
|
+ numStringParams = bucket.getAggregations().get("num_string_params");
|
|
|
+ assertThat(numStringParams.getDocCount(), equalTo(0L));
|
|
|
+ }
|
|
|
}
|