DoubleTermsTests.java 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289
  1. /*
  2. * Licensed to Elasticsearch under one or more contributor
  3. * license agreements. See the NOTICE file distributed with
  4. * this work for additional information regarding copyright
  5. * ownership. Elasticsearch licenses this file to you under
  6. * the Apache License, Version 2.0 (the "License"); you may
  7. * not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. package org.elasticsearch.search.aggregations.bucket;
  20. import org.elasticsearch.ElasticsearchException;
  21. import org.elasticsearch.action.index.IndexRequestBuilder;
  22. import org.elasticsearch.action.search.SearchResponse;
  23. import org.elasticsearch.index.query.FilterBuilders;
  24. import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
  25. import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode;
  26. import org.elasticsearch.search.aggregations.bucket.filter.Filter;
  27. import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
  28. import org.elasticsearch.search.aggregations.bucket.terms.Terms;
  29. import org.elasticsearch.search.aggregations.metrics.avg.Avg;
  30. import org.elasticsearch.search.aggregations.metrics.max.Max;
  31. import org.elasticsearch.search.aggregations.metrics.stats.Stats;
  32. import org.elasticsearch.search.aggregations.metrics.stats.extended.ExtendedStats;
  33. import org.elasticsearch.search.aggregations.metrics.sum.Sum;
  34. import org.elasticsearch.test.ElasticsearchIntegrationTest;
  35. import org.hamcrest.Matchers;
  36. import org.junit.Test;
  37. import java.io.IOException;
  38. import java.util.ArrayList;
  39. import java.util.HashMap;
  40. import java.util.Iterator;
  41. import java.util.List;
  42. import java.util.Map;
  43. import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
  44. import static org.elasticsearch.index.query.QueryBuilders.functionScoreQuery;
  45. import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
  46. import static org.elasticsearch.search.aggregations.AggregationBuilders.avg;
  47. import static org.elasticsearch.search.aggregations.AggregationBuilders.extendedStats;
  48. import static org.elasticsearch.search.aggregations.AggregationBuilders.filter;
  49. import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram;
  50. import static org.elasticsearch.search.aggregations.AggregationBuilders.max;
  51. import static org.elasticsearch.search.aggregations.AggregationBuilders.stats;
  52. import static org.elasticsearch.search.aggregations.AggregationBuilders.sum;
  53. import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
  54. import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
  55. import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
  56. import static org.hamcrest.Matchers.equalTo;
  57. import static org.hamcrest.Matchers.is;
  58. import static org.hamcrest.core.IsNull.notNullValue;
  59. /**
  60. *
  61. */
  62. @ElasticsearchIntegrationTest.SuiteScopeTest
  63. public class DoubleTermsTests extends AbstractTermsTests {
  64. private static final int NUM_DOCS = 5; // TODO: randomize the size?
  65. private static final String SINGLE_VALUED_FIELD_NAME = "d_value";
  66. private static final String MULTI_VALUED_FIELD_NAME = "d_values";
  67. private static HashMap<Double, Map<String, Object>> expectedMultiSortBuckets;
  68. public void setupSuiteScopeCluster() throws Exception {
  69. createIndex("idx");
  70. List<IndexRequestBuilder> builders = new ArrayList<>();
  71. for (int i = 0; i < NUM_DOCS; i++) {
  72. builders.add(client().prepareIndex("idx", "type").setSource(jsonBuilder()
  73. .startObject()
  74. .field(SINGLE_VALUED_FIELD_NAME, (double) i)
  75. .field("num_tag", i < NUM_DOCS/2 + 1 ? 1 : 0) // used to test order by single-bucket sub agg
  76. .startArray(MULTI_VALUED_FIELD_NAME).value((double) i).value(i + 1d).endArray()
  77. .endObject()));
  78. }
  79. for (int i = 0; i < 100; i++) {
  80. builders.add(client().prepareIndex("idx", "high_card_type").setSource(jsonBuilder()
  81. .startObject()
  82. .field(SINGLE_VALUED_FIELD_NAME, (double) i)
  83. .startArray(MULTI_VALUED_FIELD_NAME).value((double)i).value(i + 1d).endArray()
  84. .endObject()));
  85. }
  86. createIndex("idx_unmapped");
  87. assertAcked(prepareCreate("empty_bucket_idx").addMapping("type", SINGLE_VALUED_FIELD_NAME, "type=integer"));
  88. for (int i = 0; i < 2; i++) {
  89. builders.add(client().prepareIndex("empty_bucket_idx", "type", ""+i).setSource(jsonBuilder()
  90. .startObject()
  91. .field(SINGLE_VALUED_FIELD_NAME, i*2)
  92. .endObject()));
  93. }
  94. getMultiSortDocs(builders);
  95. indexRandom(true, builders);
  96. ensureSearchable();
  97. }
  98. private void getMultiSortDocs(List<IndexRequestBuilder> builders) throws IOException {
  99. expectedMultiSortBuckets = new HashMap<>();
  100. Map<String, Object> bucketProps = new HashMap<>();
  101. bucketProps.put("_term", 1d);
  102. bucketProps.put("_count", 3l);
  103. bucketProps.put("avg_l", 1d);
  104. bucketProps.put("sum_d", 6d);
  105. expectedMultiSortBuckets.put((Double) bucketProps.get("_term"), bucketProps);
  106. bucketProps = new HashMap<>();
  107. bucketProps.put("_term", 2d);
  108. bucketProps.put("_count", 3l);
  109. bucketProps.put("avg_l", 2d);
  110. bucketProps.put("sum_d", 6d);
  111. expectedMultiSortBuckets.put((Double) bucketProps.get("_term"), bucketProps);
  112. bucketProps = new HashMap<>();
  113. bucketProps.put("_term", 3d);
  114. bucketProps.put("_count", 2l);
  115. bucketProps.put("avg_l", 3d);
  116. bucketProps.put("sum_d", 3d);
  117. expectedMultiSortBuckets.put((Double) bucketProps.get("_term"), bucketProps);
  118. bucketProps = new HashMap<>();
  119. bucketProps.put("_term", 4d);
  120. bucketProps.put("_count", 2l);
  121. bucketProps.put("avg_l", 3d);
  122. bucketProps.put("sum_d", 4d);
  123. expectedMultiSortBuckets.put((Double) bucketProps.get("_term"), bucketProps);
  124. bucketProps = new HashMap<>();
  125. bucketProps.put("_term", 5d);
  126. bucketProps.put("_count", 2l);
  127. bucketProps.put("avg_l", 5d);
  128. bucketProps.put("sum_d", 3d);
  129. expectedMultiSortBuckets.put((Double) bucketProps.get("_term"), bucketProps);
  130. bucketProps = new HashMap<>();
  131. bucketProps.put("_term", 6d);
  132. bucketProps.put("_count", 1l);
  133. bucketProps.put("avg_l", 5d);
  134. bucketProps.put("sum_d", 1d);
  135. expectedMultiSortBuckets.put((Double) bucketProps.get("_term"), bucketProps);
  136. bucketProps = new HashMap<>();
  137. bucketProps.put("_term", 7d);
  138. bucketProps.put("_count", 1l);
  139. bucketProps.put("avg_l", 5d);
  140. bucketProps.put("sum_d", 1d);
  141. expectedMultiSortBuckets.put((Double) bucketProps.get("_term"), bucketProps);
  142. assertAcked(prepareCreate("sort_idx").addMapping("multi_sort_type", SINGLE_VALUED_FIELD_NAME, "type=double"));
  143. for (int i = 1; i <= 3; i++) {
  144. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  145. .startObject()
  146. .field(SINGLE_VALUED_FIELD_NAME, 1)
  147. .field("l", 1)
  148. .field("d", i)
  149. .endObject()));
  150. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  151. .startObject()
  152. .field(SINGLE_VALUED_FIELD_NAME, 2)
  153. .field("l", 2)
  154. .field("d", i)
  155. .endObject()));
  156. }
  157. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  158. .startObject()
  159. .field(SINGLE_VALUED_FIELD_NAME, 3)
  160. .field("l", 3)
  161. .field("d", 1)
  162. .endObject()));
  163. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  164. .startObject()
  165. .field(SINGLE_VALUED_FIELD_NAME, 3)
  166. .field("l", 3)
  167. .field("d", 2)
  168. .endObject()));
  169. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  170. .startObject()
  171. .field(SINGLE_VALUED_FIELD_NAME, 4)
  172. .field("l", 3)
  173. .field("d", 1)
  174. .endObject()));
  175. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  176. .startObject()
  177. .field(SINGLE_VALUED_FIELD_NAME, 4)
  178. .field("l", 3)
  179. .field("d", 3)
  180. .endObject()));
  181. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  182. .startObject()
  183. .field(SINGLE_VALUED_FIELD_NAME, 5)
  184. .field("l", 5)
  185. .field("d", 1)
  186. .endObject()));
  187. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  188. .startObject()
  189. .field(SINGLE_VALUED_FIELD_NAME, 5)
  190. .field("l", 5)
  191. .field("d", 2)
  192. .endObject()));
  193. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  194. .startObject()
  195. .field(SINGLE_VALUED_FIELD_NAME, 6)
  196. .field("l", 5)
  197. .field("d", 1)
  198. .endObject()));
  199. builders.add(client().prepareIndex("sort_idx", "multi_sort_type").setSource(jsonBuilder()
  200. .startObject()
  201. .field(SINGLE_VALUED_FIELD_NAME, 7)
  202. .field("l", 5)
  203. .field("d", 1)
  204. .endObject()));
  205. }
  206. private String key(Terms.Bucket bucket) {
  207. return randomBoolean() ? bucket.getKey() : bucket.getKeyAsText().string();
  208. }
  209. @Test
  210. // the main purpose of this test is to make sure we're not allocating 2GB of memory per shard
  211. public void sizeIsZero() {
  212. SearchResponse response = client().prepareSearch("idx").setTypes("high_card_type")
  213. .addAggregation(terms("terms")
  214. .field(SINGLE_VALUED_FIELD_NAME)
  215. .minDocCount(randomInt(1))
  216. .size(0)
  217. .collectMode(randomFrom(SubAggCollectionMode.values())))
  218. .execute().actionGet();
  219. assertSearchResponse(response);
  220. Terms terms = response.getAggregations().get("terms");
  221. assertThat(terms, notNullValue());
  222. assertThat(terms.getName(), equalTo("terms"));
  223. assertThat(terms.getBuckets().size(), equalTo(100));
  224. }
  225. @Test
  226. public void singleValueField() throws Exception {
  227. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  228. .addAggregation(terms("terms")
  229. .field(SINGLE_VALUED_FIELD_NAME)
  230. .collectMode(randomFrom(SubAggCollectionMode.values())))
  231. .execute().actionGet();
  232. assertSearchResponse(response);
  233. Terms terms = response.getAggregations().get("terms");
  234. assertThat(terms, notNullValue());
  235. assertThat(terms.getName(), equalTo("terms"));
  236. assertThat(terms.getBuckets().size(), equalTo(5));
  237. for (int i = 0; i < 5; i++) {
  238. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  239. assertThat(bucket, notNullValue());
  240. assertThat(key(bucket), equalTo("" + (double)i));
  241. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  242. assertThat(bucket.getDocCount(), equalTo(1l));
  243. }
  244. }
  245. @Test
  246. public void singleValueField_WithMaxSize() throws Exception {
  247. SearchResponse response = client().prepareSearch("idx").setTypes("high_card_type")
  248. .addAggregation(terms("terms")
  249. .field(SINGLE_VALUED_FIELD_NAME)
  250. .size(20)
  251. .collectMode(randomFrom(SubAggCollectionMode.values()))
  252. .order(Terms.Order.term(true))) // we need to sort by terms cause we're checking the first 20 values
  253. .execute().actionGet();
  254. assertSearchResponse(response);
  255. Terms terms = response.getAggregations().get("terms");
  256. assertThat(terms, notNullValue());
  257. assertThat(terms.getName(), equalTo("terms"));
  258. assertThat(terms.getBuckets().size(), equalTo(20));
  259. for (int i = 0; i < 20; i++) {
  260. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  261. assertThat(bucket, notNullValue());
  262. assertThat(key(bucket), equalTo("" + (double) i));
  263. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  264. assertThat(bucket.getDocCount(), equalTo(1l));
  265. }
  266. }
  267. @Test
  268. public void singleValueFieldWithFiltering() throws Exception {
  269. double includes[] = { 1, 2, 3, 98.2 };
  270. double excludes[] = { 2, 4, 99 };
  271. double empty[] = {};
  272. testIncludeExcludeResults(includes, empty, new double[] { 1, 2, 3 });
  273. testIncludeExcludeResults(includes, excludes, new double[] { 1, 3 });
  274. testIncludeExcludeResults(empty, excludes, new double[] { 0, 1, 3 });
  275. }
  276. private void testIncludeExcludeResults(double[] includes, double[] excludes, double[] expecteds) {
  277. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  278. .addAggregation(terms("terms")
  279. .field(SINGLE_VALUED_FIELD_NAME)
  280. .include(includes)
  281. .exclude(excludes)
  282. .collectMode(randomFrom(SubAggCollectionMode.values())))
  283. .execute().actionGet();
  284. assertSearchResponse(response);
  285. Terms terms = response.getAggregations().get("terms");
  286. assertThat(terms, notNullValue());
  287. assertThat(terms.getName(), equalTo("terms"));
  288. assertThat(terms.getBuckets().size(), equalTo(expecteds.length));
  289. for (int i = 0; i < expecteds.length; i++) {
  290. Terms.Bucket bucket = terms.getBucketByKey("" + expecteds[i]);
  291. assertThat(bucket, notNullValue());
  292. assertThat(bucket.getDocCount(), equalTo(1l));
  293. }
  294. }
  295. @Test
  296. public void singleValueField_OrderedByTermAsc() throws Exception {
  297. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  298. .addAggregation(terms("terms")
  299. .field(SINGLE_VALUED_FIELD_NAME)
  300. .collectMode(randomFrom(SubAggCollectionMode.values()))
  301. .order(Terms.Order.term(true)))
  302. .execute().actionGet();
  303. assertSearchResponse(response);
  304. Terms terms = response.getAggregations().get("terms");
  305. assertThat(terms, notNullValue());
  306. assertThat(terms.getName(), equalTo("terms"));
  307. assertThat(terms.getBuckets().size(), equalTo(5));
  308. int i = 0;
  309. for (Terms.Bucket bucket : terms.getBuckets()) {
  310. assertThat(bucket, notNullValue());
  311. assertThat(key(bucket), equalTo("" + (double)i));
  312. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  313. assertThat(bucket.getDocCount(), equalTo(1l));
  314. i++;
  315. }
  316. }
  317. @Test
  318. public void singleValueField_OrderedByTermDesc() throws Exception {
  319. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  320. .addAggregation(terms("terms")
  321. .field(SINGLE_VALUED_FIELD_NAME)
  322. .collectMode(randomFrom(SubAggCollectionMode.values()))
  323. .order(Terms.Order.term(false)))
  324. .execute().actionGet();
  325. assertSearchResponse(response);
  326. Terms terms = response.getAggregations().get("terms");
  327. assertThat(terms, notNullValue());
  328. assertThat(terms.getName(), equalTo("terms"));
  329. assertThat(terms.getBuckets().size(), equalTo(5));
  330. int i = 4;
  331. for (Terms.Bucket bucket : terms.getBuckets()) {
  332. assertThat(bucket, notNullValue());
  333. assertThat(key(bucket), equalTo("" + (double) i));
  334. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  335. assertThat(bucket.getDocCount(), equalTo(1l));
  336. i--;
  337. }
  338. }
  339. @Test
  340. public void singleValuedField_WithSubAggregation() throws Exception {
  341. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  342. .addAggregation(terms("terms")
  343. .field(SINGLE_VALUED_FIELD_NAME)
  344. .collectMode(randomFrom(SubAggCollectionMode.values()))
  345. .subAggregation(sum("sum").field(MULTI_VALUED_FIELD_NAME)))
  346. .execute().actionGet();
  347. assertSearchResponse(response);
  348. Terms terms = response.getAggregations().get("terms");
  349. assertThat(terms, notNullValue());
  350. assertThat(terms.getName(), equalTo("terms"));
  351. assertThat(terms.getBuckets().size(), equalTo(5));
  352. Object[] propertiesKeys = (Object[]) terms.getProperty("_key");
  353. Object[] propertiesDocCounts = (Object[]) terms.getProperty("_count");
  354. Object[] propertiesCounts = (Object[]) terms.getProperty("sum.value");
  355. for (int i = 0; i < 5; i++) {
  356. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  357. assertThat(bucket, notNullValue());
  358. assertThat(key(bucket), equalTo("" + (double) i));
  359. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  360. assertThat(bucket.getDocCount(), equalTo(1l));
  361. Sum sum = bucket.getAggregations().get("sum");
  362. assertThat(sum, notNullValue());
  363. assertThat((long) sum.getValue(), equalTo(i+i+1l));
  364. assertThat((String) propertiesKeys[i], equalTo(String.valueOf((double) i)));
  365. assertThat((long) propertiesDocCounts[i], equalTo(1l));
  366. assertThat((double) propertiesCounts[i], equalTo((double) i + i + 1l));
  367. }
  368. }
  369. @Test
  370. public void singleValuedField_WithSubAggregation_Inherited() throws Exception {
  371. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  372. .addAggregation(terms("terms")
  373. .field(SINGLE_VALUED_FIELD_NAME)
  374. .collectMode(randomFrom(SubAggCollectionMode.values()))
  375. .subAggregation(sum("sum")))
  376. .execute().actionGet();
  377. assertSearchResponse(response);
  378. Terms terms = response.getAggregations().get("terms");
  379. assertThat(terms, notNullValue());
  380. assertThat(terms.getName(), equalTo("terms"));
  381. assertThat(terms.getBuckets().size(), equalTo(5));
  382. for (int i = 0; i < 5; i++) {
  383. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  384. assertThat(bucket, notNullValue());
  385. assertThat(key(bucket), equalTo("" + (double) i));
  386. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  387. assertThat(bucket.getDocCount(), equalTo(1l));
  388. Sum sum = bucket.getAggregations().get("sum");
  389. assertThat(sum, notNullValue());
  390. assertThat(sum.getValue(), equalTo((double) i));
  391. }
  392. }
  393. @Test
  394. public void singleValuedField_WithValueScript() throws Exception {
  395. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  396. .addAggregation(terms("terms")
  397. .field(SINGLE_VALUED_FIELD_NAME)
  398. .collectMode(randomFrom(SubAggCollectionMode.values()))
  399. .script("_value + 1"))
  400. .execute().actionGet();
  401. assertSearchResponse(response);
  402. Terms terms = response.getAggregations().get("terms");
  403. assertThat(terms, notNullValue());
  404. assertThat(terms.getName(), equalTo("terms"));
  405. assertThat(terms.getBuckets().size(), equalTo(5));
  406. for (int i = 0; i < 5; i++) {
  407. Terms.Bucket bucket = terms.getBucketByKey("" + (i + 1d));
  408. assertThat(bucket, notNullValue());
  409. assertThat(key(bucket), equalTo("" + (i+1d)));
  410. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i+1));
  411. assertThat(bucket.getDocCount(), equalTo(1l));
  412. }
  413. }
  414. @Test
  415. public void multiValuedField() throws Exception {
  416. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  417. .addAggregation(terms("terms")
  418. .field(MULTI_VALUED_FIELD_NAME)
  419. .collectMode(randomFrom(SubAggCollectionMode.values())))
  420. .execute().actionGet();
  421. assertSearchResponse(response);
  422. Terms terms = response.getAggregations().get("terms");
  423. assertThat(terms, notNullValue());
  424. assertThat(terms.getName(), equalTo("terms"));
  425. assertThat(terms.getBuckets().size(), equalTo(6));
  426. for (int i = 0; i < 6; i++) {
  427. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  428. assertThat(bucket, notNullValue());
  429. assertThat(key(bucket), equalTo("" + (double) i));
  430. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  431. if (i == 0 || i == 5) {
  432. assertThat(bucket.getDocCount(), equalTo(1l));
  433. } else {
  434. assertThat(bucket.getDocCount(), equalTo(2l));
  435. }
  436. }
  437. }
  438. @Test
  439. public void multiValuedField_WithValueScript() throws Exception {
  440. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  441. .addAggregation(terms("terms")
  442. .field(MULTI_VALUED_FIELD_NAME)
  443. .collectMode(randomFrom(SubAggCollectionMode.values()))
  444. .script("_value + 1"))
  445. .execute().actionGet();
  446. assertSearchResponse(response);
  447. Terms terms = response.getAggregations().get("terms");
  448. assertThat(terms, notNullValue());
  449. assertThat(terms.getName(), equalTo("terms"));
  450. assertThat(terms.getBuckets().size(), equalTo(6));
  451. for (int i = 0; i < 6; i++) {
  452. Terms.Bucket bucket = terms.getBucketByKey("" + (i + 1d));
  453. assertThat(bucket, notNullValue());
  454. assertThat(key(bucket), equalTo("" + (i+1d)));
  455. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i+1));
  456. if (i == 0 || i == 5) {
  457. assertThat(bucket.getDocCount(), equalTo(1l));
  458. } else {
  459. assertThat(bucket.getDocCount(), equalTo(2l));
  460. }
  461. }
  462. }
  463. @Test
  464. public void multiValuedField_WithValueScript_NotUnique() throws Exception {
  465. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  466. .addAggregation(terms("terms")
  467. .field(MULTI_VALUED_FIELD_NAME)
  468. .collectMode(randomFrom(SubAggCollectionMode.values()))
  469. .script("(long) _value / 1000 + 1"))
  470. .execute().actionGet();
  471. assertSearchResponse(response);
  472. Terms terms = response.getAggregations().get("terms");
  473. assertThat(terms, notNullValue());
  474. assertThat(terms.getName(), equalTo("terms"));
  475. assertThat(terms.getBuckets().size(), equalTo(1));
  476. Terms.Bucket bucket = terms.getBucketByKey("1.0");
  477. assertThat(bucket, notNullValue());
  478. assertThat(key(bucket), equalTo("1.0"));
  479. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(1));
  480. assertThat(bucket.getDocCount(), equalTo(5l));
  481. }
  482. /*
  483. [1, 2]
  484. [2, 3]
  485. [3, 4]
  486. [4, 5]
  487. [5, 6]
  488. 1 - count: 1 - sum: 1
  489. 2 - count: 2 - sum: 4
  490. 3 - count: 2 - sum: 6
  491. 4 - count: 2 - sum: 8
  492. 5 - count: 2 - sum: 10
  493. 6 - count: 1 - sum: 6
  494. */
  495. @Test
  496. public void multiValuedField_WithValueScript_WithInheritedSubAggregator() throws Exception {
  497. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  498. .addAggregation(terms("terms")
  499. .field(MULTI_VALUED_FIELD_NAME)
  500. .collectMode(randomFrom(SubAggCollectionMode.values()))
  501. .script("_value + 1")
  502. .subAggregation(sum("sum")))
  503. .execute().actionGet();
  504. assertSearchResponse(response);
  505. Terms terms = response.getAggregations().get("terms");
  506. assertThat(terms, notNullValue());
  507. assertThat(terms.getName(), equalTo("terms"));
  508. assertThat(terms.getBuckets().size(), equalTo(6));
  509. for (int i = 0; i < 6; i++) {
  510. Terms.Bucket bucket = terms.getBucketByKey("" + (i + 1d));
  511. assertThat(bucket, notNullValue());
  512. assertThat(key(bucket), equalTo("" + (i+1d)));
  513. assertThat(bucket.getKeyAsNumber().doubleValue(), equalTo(i+1d));
  514. final long count = i == 0 || i == 5 ? 1 : 2;
  515. double s = 0;
  516. for (int j = 0; j < NUM_DOCS; ++j) {
  517. if (i == j || i == j+1) {
  518. s += j + 1;
  519. s += j+1 + 1;
  520. }
  521. }
  522. assertThat(bucket.getDocCount(), equalTo(count));
  523. Sum sum = bucket.getAggregations().get("sum");
  524. assertThat(sum, notNullValue());
  525. assertThat(sum.getValue(), equalTo(s));
  526. }
  527. }
  528. @Test
  529. public void script_SingleValue() throws Exception {
  530. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  531. .addAggregation(terms("terms")
  532. .collectMode(randomFrom(SubAggCollectionMode.values()))
  533. .script("doc['" + MULTI_VALUED_FIELD_NAME + "'].value"))
  534. .execute().actionGet();
  535. assertSearchResponse(response);
  536. Terms terms = response.getAggregations().get("terms");
  537. assertThat(terms, notNullValue());
  538. assertThat(terms.getName(), equalTo("terms"));
  539. assertThat(terms.getBuckets().size(), equalTo(5));
  540. for (int i = 0; i < 5; i++) {
  541. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  542. assertThat(bucket, notNullValue());
  543. assertThat(key(bucket), equalTo("" + (double) i));
  544. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  545. assertThat(bucket.getDocCount(), equalTo(1l));
  546. }
  547. }
  548. @Test
  549. public void script_SingleValue_WithSubAggregator_Inherited() throws Exception {
  550. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  551. .addAggregation(terms("terms")
  552. .field(SINGLE_VALUED_FIELD_NAME)
  553. .collectMode(randomFrom(SubAggCollectionMode.values()))
  554. .subAggregation(sum("sum")))
  555. .execute().actionGet();
  556. assertSearchResponse(response);
  557. Terms terms = response.getAggregations().get("terms");
  558. assertThat(terms, notNullValue());
  559. assertThat(terms.getName(), equalTo("terms"));
  560. assertThat(terms.getBuckets().size(), equalTo(5));
  561. for (int i = 0; i < 5; i++) {
  562. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  563. assertThat(bucket, notNullValue());
  564. assertThat(key(bucket), equalTo("" + (double) i));
  565. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  566. assertThat(bucket.getDocCount(), equalTo(1l));
  567. Sum sum = bucket.getAggregations().get("sum");
  568. assertThat(sum, notNullValue());
  569. assertThat(sum.getValue(), equalTo((double) i));
  570. }
  571. }
  572. @Test
  573. public void script_MultiValued() throws Exception {
  574. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  575. .addAggregation(terms("terms")
  576. .collectMode(randomFrom(SubAggCollectionMode.values()))
  577. .script("doc['" + MULTI_VALUED_FIELD_NAME + "']"))
  578. .execute().actionGet();
  579. assertSearchResponse(response);
  580. Terms terms = response.getAggregations().get("terms");
  581. assertThat(terms, notNullValue());
  582. assertThat(terms.getName(), equalTo("terms"));
  583. assertThat(terms.getBuckets().size(), equalTo(6));
  584. for (int i = 0; i < 6; i++) {
  585. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  586. assertThat(bucket, notNullValue());
  587. assertThat(key(bucket), equalTo("" + (double) i));
  588. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  589. if (i == 0 || i == 5) {
  590. assertThat(bucket.getDocCount(), equalTo(1l));
  591. } else {
  592. assertThat(bucket.getDocCount(), equalTo(2l));
  593. }
  594. }
  595. }
  596. @Test
  597. public void script_MultiValued_WithAggregatorInherited_NoExplicitType() throws Exception {
  598. // since no type is explicitly defined, es will assume all values returned by the script to be strings (bytes),
  599. // so the aggregation should fail, since the "sum" aggregation can only operation on numeric values.
  600. try {
  601. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  602. .addAggregation(terms("terms")
  603. .collectMode(randomFrom(SubAggCollectionMode.values()))
  604. .script("doc['" + MULTI_VALUED_FIELD_NAME + "']")
  605. .subAggregation(sum("sum")))
  606. .execute().actionGet();
  607. fail("expected to fail as sub-aggregation sum requires a numeric value source context, but there is none");
  608. } catch (Exception e) {
  609. // expected
  610. }
  611. }
  612. @Test
  613. public void script_MultiValued_WithAggregatorInherited_WithExplicitType() throws Exception {
  614. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  615. .addAggregation(terms("terms")
  616. .collectMode(randomFrom(SubAggCollectionMode.values()))
  617. .script("doc['" + MULTI_VALUED_FIELD_NAME + "']")
  618. .valueType(Terms.ValueType.DOUBLE)
  619. .subAggregation(sum("sum")))
  620. .execute().actionGet();
  621. assertSearchResponse(response);
  622. Terms terms = response.getAggregations().get("terms");
  623. assertThat(terms, notNullValue());
  624. assertThat(terms.getName(), equalTo("terms"));
  625. assertThat(terms.getBuckets().size(), equalTo(6));
  626. for (int i = 0; i < 6; i++) {
  627. Terms.Bucket bucket = terms.getBucketByKey("" + i + ".0");
  628. assertThat(bucket, notNullValue());
  629. assertThat(key(bucket), equalTo("" + i + ".0"));
  630. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  631. final long count = i == 0 || i == 5 ? 1 : 2;
  632. double s = 0;
  633. for (int j = 0; j < NUM_DOCS; ++j) {
  634. if (i == j || i == j+1) {
  635. s += j;
  636. s += j+1;
  637. }
  638. }
  639. assertThat(bucket.getDocCount(), equalTo(count));
  640. Sum sum = bucket.getAggregations().get("sum");
  641. assertThat(sum, notNullValue());
  642. assertThat(sum.getValue(), equalTo(s));
  643. }
  644. }
  645. @Test
  646. public void unmapped() throws Exception {
  647. SearchResponse response = client().prepareSearch("idx_unmapped").setTypes("type")
  648. .addAggregation(terms("terms")
  649. .field(SINGLE_VALUED_FIELD_NAME)
  650. .size(randomInt(5))
  651. .collectMode(randomFrom(SubAggCollectionMode.values())))
  652. .execute().actionGet();
  653. assertSearchResponse(response);
  654. Terms terms = response.getAggregations().get("terms");
  655. assertThat(terms, notNullValue());
  656. assertThat(terms.getName(), equalTo("terms"));
  657. assertThat(terms.getBuckets().size(), equalTo(0));
  658. }
  659. @Test
  660. public void partiallyUnmapped() throws Exception {
  661. SearchResponse response = client().prepareSearch("idx_unmapped", "idx").setTypes("type")
  662. .addAggregation(terms("terms")
  663. .field(SINGLE_VALUED_FIELD_NAME)
  664. .collectMode(randomFrom(SubAggCollectionMode.values())))
  665. .execute().actionGet();
  666. assertSearchResponse(response);
  667. Terms terms = response.getAggregations().get("terms");
  668. assertThat(terms, notNullValue());
  669. assertThat(terms.getName(), equalTo("terms"));
  670. assertThat(terms.getBuckets().size(), equalTo(5));
  671. for (int i = 0; i < 5; i++) {
  672. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  673. assertThat(bucket, notNullValue());
  674. assertThat(key(bucket), equalTo("" + (double) i));
  675. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  676. assertThat(bucket.getDocCount(), equalTo(1l));
  677. }
  678. }
  679. @Test
  680. public void emptyAggregation() throws Exception {
  681. SearchResponse searchResponse = client().prepareSearch("empty_bucket_idx")
  682. .setQuery(matchAllQuery())
  683. .addAggregation(histogram("histo").field(SINGLE_VALUED_FIELD_NAME).interval(1l).minDocCount(0)
  684. .subAggregation(terms("terms")))
  685. .execute().actionGet();
  686. assertThat(searchResponse.getHits().getTotalHits(), equalTo(2l));
  687. Histogram histo = searchResponse.getAggregations().get("histo");
  688. assertThat(histo, Matchers.notNullValue());
  689. Histogram.Bucket bucket = histo.getBucketByKey(1l);
  690. assertThat(bucket, Matchers.notNullValue());
  691. Terms terms = bucket.getAggregations().get("terms");
  692. assertThat(terms, Matchers.notNullValue());
  693. assertThat(terms.getName(), equalTo("terms"));
  694. assertThat(terms.getBuckets().isEmpty(), is(true));
  695. }
  696. @Test
  697. public void singleValuedField_OrderedBySingleValueSubAggregationAsc() throws Exception {
  698. boolean asc = true;
  699. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  700. .addAggregation(terms("terms")
  701. .field(SINGLE_VALUED_FIELD_NAME)
  702. .collectMode(randomFrom(SubAggCollectionMode.values()))
  703. .order(Terms.Order.aggregation("avg_i", asc))
  704. .subAggregation(avg("avg_i").field(SINGLE_VALUED_FIELD_NAME))
  705. ).execute().actionGet();
  706. assertSearchResponse(response);
  707. Terms terms = response.getAggregations().get("terms");
  708. assertThat(terms, notNullValue());
  709. assertThat(terms.getName(), equalTo("terms"));
  710. assertThat(terms.getBuckets().size(), equalTo(5));
  711. for (int i = 0; i < 5; i++) {
  712. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  713. assertThat(bucket, notNullValue());
  714. assertThat(key(bucket), equalTo("" + (double)i));
  715. assertThat(bucket.getDocCount(), equalTo(1l));
  716. Avg avg = bucket.getAggregations().get("avg_i");
  717. assertThat(avg, notNullValue());
  718. assertThat(avg.getValue(), equalTo((double) i));
  719. }
  720. }
  721. @Test
  722. public void singleValuedField_OrderedBySingleValueSubAggregationAscWithSubTermsAgg() throws Exception {
  723. boolean asc = true;
  724. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  725. .addAggregation(terms("terms")
  726. .field(SINGLE_VALUED_FIELD_NAME)
  727. .collectMode(randomFrom(SubAggCollectionMode.values()))
  728. .order(Terms.Order.aggregation("avg_i", asc))
  729. .subAggregation(avg("avg_i").field(SINGLE_VALUED_FIELD_NAME)).subAggregation(terms("subTerms").field(MULTI_VALUED_FIELD_NAME)
  730. .collectMode(randomFrom(SubAggCollectionMode.values())))
  731. ).execute().actionGet();
  732. assertSearchResponse(response);
  733. Terms terms = response.getAggregations().get("terms");
  734. assertThat(terms, notNullValue());
  735. assertThat(terms.getName(), equalTo("terms"));
  736. assertThat(terms.getBuckets().size(), equalTo(5));
  737. for (int i = 0; i < 5; i++) {
  738. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  739. assertThat(bucket, notNullValue());
  740. assertThat(key(bucket), equalTo("" + (double)i));
  741. assertThat(bucket.getDocCount(), equalTo(1l));
  742. Avg avg = bucket.getAggregations().get("avg_i");
  743. assertThat(avg, notNullValue());
  744. assertThat(avg.getValue(), equalTo((double) i));
  745. Terms subTermsAgg = bucket.getAggregations().get("subTerms");
  746. assertThat(subTermsAgg, notNullValue());
  747. assertThat(subTermsAgg.getBuckets().size(), equalTo(2));
  748. double j = i;
  749. for (Terms.Bucket subBucket : subTermsAgg.getBuckets()) {
  750. assertThat(subBucket, notNullValue());
  751. assertThat(key(subBucket), equalTo(String.valueOf(j)));
  752. assertThat(subBucket.getDocCount(), equalTo(1l));
  753. j++;
  754. }
  755. }
  756. }
  757. @Test
  758. public void singleValuedField_OrderedBySingleBucketSubAggregationAsc() throws Exception {
  759. boolean asc = randomBoolean();
  760. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  761. .addAggregation(terms("num_tags")
  762. .field("num_tag")
  763. .collectMode(randomFrom(SubAggCollectionMode.values()))
  764. .order(Terms.Order.aggregation("filter", asc))
  765. .subAggregation(filter("filter").filter(FilterBuilders.matchAllFilter()))
  766. ).execute().actionGet();
  767. assertSearchResponse(response);
  768. Terms tags = response.getAggregations().get("num_tags");
  769. assertThat(tags, notNullValue());
  770. assertThat(tags.getName(), equalTo("num_tags"));
  771. assertThat(tags.getBuckets().size(), equalTo(2));
  772. Iterator<Terms.Bucket> iters = tags.getBuckets().iterator();
  773. Terms.Bucket tag = iters.next();
  774. assertThat(tag, notNullValue());
  775. assertThat(key(tag), equalTo(asc ? "0" : "1"));
  776. assertThat(tag.getDocCount(), equalTo(asc ? 2l : 3l));
  777. Filter filter = tag.getAggregations().get("filter");
  778. assertThat(filter, notNullValue());
  779. assertThat(filter.getDocCount(), equalTo(asc ? 2l : 3l));
  780. tag = iters.next();
  781. assertThat(tag, notNullValue());
  782. assertThat(key(tag), equalTo(asc ? "1" : "0"));
  783. assertThat(tag.getDocCount(), equalTo(asc ? 3l : 2l));
  784. filter = tag.getAggregations().get("filter");
  785. assertThat(filter, notNullValue());
  786. assertThat(filter.getDocCount(), equalTo(asc ? 3l : 2l));
  787. }
  788. @Test
  789. public void singleValuedField_OrderedBySubAggregationAsc_MultiHierarchyLevels() throws Exception {
  790. boolean asc = randomBoolean();
  791. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  792. .addAggregation(terms("tags")
  793. .field("num_tag")
  794. .collectMode(randomFrom(SubAggCollectionMode.values()))
  795. .order(Terms.Order.aggregation("filter1>filter2>max", asc))
  796. .subAggregation(filter("filter1").filter(FilterBuilders.matchAllFilter())
  797. .subAggregation(filter("filter2").filter(FilterBuilders.matchAllFilter())
  798. .subAggregation(max("max").field(SINGLE_VALUED_FIELD_NAME))))
  799. ).execute().actionGet();
  800. assertSearchResponse(response);
  801. Terms tags = response.getAggregations().get("tags");
  802. assertThat(tags, notNullValue());
  803. assertThat(tags.getName(), equalTo("tags"));
  804. assertThat(tags.getBuckets().size(), equalTo(2));
  805. Iterator<Terms.Bucket> iters = tags.getBuckets().iterator();
  806. // the max for "1" is 2
  807. // the max for "0" is 4
  808. Terms.Bucket tag = iters.next();
  809. assertThat(tag, notNullValue());
  810. assertThat(key(tag), equalTo(asc ? "1" : "0"));
  811. assertThat(tag.getDocCount(), equalTo(asc ? 3l : 2l));
  812. Filter filter1 = tag.getAggregations().get("filter1");
  813. assertThat(filter1, notNullValue());
  814. assertThat(filter1.getDocCount(), equalTo(asc ? 3l : 2l));
  815. Filter filter2 = filter1.getAggregations().get("filter2");
  816. assertThat(filter2, notNullValue());
  817. assertThat(filter2.getDocCount(), equalTo(asc ? 3l : 2l));
  818. Max max = filter2.getAggregations().get("max");
  819. assertThat(max, notNullValue());
  820. assertThat(max.getValue(), equalTo(asc ? 2.0 : 4.0));
  821. tag = iters.next();
  822. assertThat(tag, notNullValue());
  823. assertThat(key(tag), equalTo(asc ? "0" : "1"));
  824. assertThat(tag.getDocCount(), equalTo(asc ? 2l : 3l));
  825. filter1 = tag.getAggregations().get("filter1");
  826. assertThat(filter1, notNullValue());
  827. assertThat(filter1.getDocCount(), equalTo(asc ? 2l : 3l));
  828. filter2 = filter1.getAggregations().get("filter2");
  829. assertThat(filter2, notNullValue());
  830. assertThat(filter2.getDocCount(), equalTo(asc ? 2l : 3l));
  831. max = filter2.getAggregations().get("max");
  832. assertThat(max, notNullValue());
  833. assertThat(max.getValue(), equalTo(asc ? 4.0 : 2.0));
  834. }
  835. @Test
  836. public void singleValuedField_OrderedByMissingSubAggregation() throws Exception {
  837. try {
  838. client().prepareSearch("idx").setTypes("type")
  839. .addAggregation(terms("terms")
  840. .field(SINGLE_VALUED_FIELD_NAME)
  841. .collectMode(randomFrom(SubAggCollectionMode.values()))
  842. .order(Terms.Order.aggregation("avg_i", true))
  843. ).execute().actionGet();
  844. fail("Expected search to fail when trying to sort terms aggregation by sug-aggregation that doesn't exist");
  845. } catch (ElasticsearchException e) {
  846. // expected
  847. }
  848. }
  849. @Test
  850. public void singleValuedField_OrderedByNonMetricsOrMultiBucketSubAggregation() throws Exception {
  851. try {
  852. client().prepareSearch("idx").setTypes("type")
  853. .addAggregation(terms("terms")
  854. .field(SINGLE_VALUED_FIELD_NAME)
  855. .collectMode(randomFrom(SubAggCollectionMode.values()))
  856. .order(Terms.Order.aggregation("num_tags", true))
  857. .subAggregation(terms("num_tags").field("num_tags")
  858. .collectMode(randomFrom(SubAggCollectionMode.values())))
  859. ).execute().actionGet();
  860. fail("Expected search to fail when trying to sort terms aggregation by sug-aggregation which is not of a metrics type");
  861. } catch (ElasticsearchException e) {
  862. // expected
  863. }
  864. }
  865. @Test
  866. public void singleValuedField_OrderedByMultiValuedSubAggregation_WithUknownMetric() throws Exception {
  867. try {
  868. client().prepareSearch("idx").setTypes("type")
  869. .addAggregation(terms("terms")
  870. .field(SINGLE_VALUED_FIELD_NAME)
  871. .collectMode(randomFrom(SubAggCollectionMode.values()))
  872. .order(Terms.Order.aggregation("stats.foo", true))
  873. .subAggregation(stats("stats").field(SINGLE_VALUED_FIELD_NAME))
  874. ).execute().actionGet();
  875. fail("Expected search to fail when trying to sort terms aggregation by multi-valued sug-aggregation " +
  876. "with an unknown specified metric to order by");
  877. } catch (ElasticsearchException e) {
  878. // expected
  879. }
  880. }
  881. @Test
  882. public void singleValuedField_OrderedByMultiValuedSubAggregation_WithoutMetric() throws Exception {
  883. try {
  884. client().prepareSearch("idx").setTypes("type")
  885. .addAggregation(terms("terms")
  886. .field(SINGLE_VALUED_FIELD_NAME)
  887. .collectMode(randomFrom(SubAggCollectionMode.values()))
  888. .order(Terms.Order.aggregation("stats", true))
  889. .subAggregation(stats("stats").field(SINGLE_VALUED_FIELD_NAME))
  890. ).execute().actionGet();
  891. fail("Expected search to fail when trying to sort terms aggregation by multi-valued sug-aggregation " +
  892. "where the metric name is not specified");
  893. } catch (ElasticsearchException e) {
  894. // expected
  895. }
  896. }
  897. @Test
  898. public void singleValuedField_OrderedBySingleValueSubAggregationDesc() throws Exception {
  899. boolean asc = false;
  900. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  901. .addAggregation(terms("terms")
  902. .field(SINGLE_VALUED_FIELD_NAME)
  903. .collectMode(randomFrom(SubAggCollectionMode.values()))
  904. .order(Terms.Order.aggregation("avg_i", asc))
  905. .subAggregation(avg("avg_i").field(SINGLE_VALUED_FIELD_NAME))
  906. ).execute().actionGet();
  907. assertSearchResponse(response);
  908. Terms terms = response.getAggregations().get("terms");
  909. assertThat(terms, notNullValue());
  910. assertThat(terms.getName(), equalTo("terms"));
  911. assertThat(terms.getBuckets().size(), equalTo(5));
  912. for (int i = 4; i >= 0; i--) {
  913. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  914. assertThat(bucket, notNullValue());
  915. assertThat(key(bucket), equalTo("" + (double)i));
  916. assertThat(bucket.getDocCount(), equalTo(1l));
  917. Avg avg = bucket.getAggregations().get("avg_i");
  918. assertThat(avg, notNullValue());
  919. assertThat(avg.getValue(), equalTo((double) i));
  920. }
  921. }
  922. @Test
  923. public void singleValuedField_OrderedByMultiValueSubAggregationAsc() throws Exception {
  924. boolean asc = true;
  925. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  926. .addAggregation(terms("terms")
  927. .field(SINGLE_VALUED_FIELD_NAME)
  928. .collectMode(randomFrom(SubAggCollectionMode.values()))
  929. .order(Terms.Order.aggregation("stats.avg", asc))
  930. .subAggregation(stats("stats").field(SINGLE_VALUED_FIELD_NAME))
  931. ).execute().actionGet();
  932. assertSearchResponse(response);
  933. Terms terms = response.getAggregations().get("terms");
  934. assertThat(terms, notNullValue());
  935. assertThat(terms.getName(), equalTo("terms"));
  936. assertThat(terms.getBuckets().size(), equalTo(5));
  937. for (int i = 0; i < 5; i++) {
  938. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  939. assertThat(bucket, notNullValue());
  940. assertThat(key(bucket), equalTo("" + (double)i));
  941. assertThat(bucket.getDocCount(), equalTo(1l));
  942. Stats stats = bucket.getAggregations().get("stats");
  943. assertThat(stats, notNullValue());
  944. assertThat(stats.getMax(), equalTo((double) i));
  945. }
  946. }
  947. @Test
  948. public void singleValuedField_OrderedByMultiValueSubAggregationDesc() throws Exception {
  949. boolean asc = false;
  950. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  951. .addAggregation(terms("terms")
  952. .field(SINGLE_VALUED_FIELD_NAME)
  953. .collectMode(randomFrom(SubAggCollectionMode.values()))
  954. .order(Terms.Order.aggregation("stats.avg", asc))
  955. .subAggregation(stats("stats").field(SINGLE_VALUED_FIELD_NAME))
  956. ).execute().actionGet();
  957. assertSearchResponse(response);
  958. Terms terms = response.getAggregations().get("terms");
  959. assertThat(terms, notNullValue());
  960. assertThat(terms.getName(), equalTo("terms"));
  961. assertThat(terms.getBuckets().size(), equalTo(5));
  962. for (int i = 4; i >= 0; i--) {
  963. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  964. assertThat(bucket, notNullValue());
  965. assertThat(key(bucket), equalTo("" + (double)i));
  966. assertThat(bucket.getDocCount(), equalTo(1l));
  967. Stats stats = bucket.getAggregations().get("stats");
  968. assertThat(stats, notNullValue());
  969. assertThat(stats.getMax(), equalTo((double) i));
  970. }
  971. }
  972. @Test
  973. public void singleValuedField_OrderedByMultiValueExtendedStatsAsc() throws Exception {
  974. boolean asc = true;
  975. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  976. .addAggregation(terms("terms")
  977. .field(SINGLE_VALUED_FIELD_NAME)
  978. .collectMode(randomFrom(SubAggCollectionMode.values()))
  979. .order(Terms.Order.aggregation("stats.variance", asc))
  980. .subAggregation(extendedStats("stats").field(SINGLE_VALUED_FIELD_NAME))
  981. ).execute().actionGet();
  982. assertSearchResponse(response);
  983. Terms terms = response.getAggregations().get("terms");
  984. assertThat(terms, notNullValue());
  985. assertThat(terms.getName(), equalTo("terms"));
  986. assertThat(terms.getBuckets().size(), equalTo(5));
  987. for (int i = 0; i < 5; i++) {
  988. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  989. assertThat(bucket, notNullValue());
  990. assertThat(key(bucket), equalTo("" + (double)i));
  991. assertThat(bucket.getDocCount(), equalTo(1l));
  992. ExtendedStats stats = bucket.getAggregations().get("stats");
  993. assertThat(stats, notNullValue());
  994. assertThat(stats.getMax(), equalTo((double) i));
  995. }
  996. }
  997. @Test
  998. public void script_Score() {
  999. SearchResponse response = client().prepareSearch("idx").setTypes("type")
  1000. .setQuery(functionScoreQuery(matchAllQuery()).add(ScoreFunctionBuilders.scriptFunction("doc['" + SINGLE_VALUED_FIELD_NAME + "'].value")))
  1001. .addAggregation(terms("terms")
  1002. .collectMode(randomFrom(SubAggCollectionMode.values()))
  1003. .script("ceil(_score.doubleValue()/3)")
  1004. ).execute().actionGet();
  1005. assertSearchResponse(response);
  1006. Terms terms = response.getAggregations().get("terms");
  1007. assertThat(terms, notNullValue());
  1008. assertThat(terms.getName(), equalTo("terms"));
  1009. assertThat(terms.getBuckets().size(), equalTo(3));
  1010. for (int i = 0; i < 3; i++) {
  1011. Terms.Bucket bucket = terms.getBucketByKey("" + (double) i);
  1012. assertThat(bucket, notNullValue());
  1013. assertThat(key(bucket), equalTo("" + (double)i));
  1014. assertThat(bucket.getKeyAsNumber().intValue(), equalTo(i));
  1015. assertThat(bucket.getDocCount(), equalTo(i == 1 ? 3L : 1L));
  1016. }
  1017. }
  1018. @Test
  1019. public void singleValuedField_OrderedBySingleValueSubAggregationAscAndTermsDesc() throws Exception {
  1020. double[] expectedKeys = new double[] { 1, 2, 4, 3, 7, 6, 5 };
  1021. assertMultiSortResponse(expectedKeys, Terms.Order.aggregation("avg_l", true), Terms.Order.term(false));
  1022. }
  1023. @Test
  1024. public void singleValuedField_OrderedBySingleValueSubAggregationAscAndTermsAsc() throws Exception {
  1025. double[] expectedKeys = new double[] { 1, 2, 3, 4, 5, 6, 7 };
  1026. assertMultiSortResponse(expectedKeys, Terms.Order.aggregation("avg_l", true), Terms.Order.term(true));
  1027. }
  1028. @Test
  1029. public void singleValuedField_OrderedBySingleValueSubAggregationDescAndTermsAsc() throws Exception {
  1030. double[] expectedKeys = new double[] { 5, 6, 7, 3, 4, 2, 1 };
  1031. assertMultiSortResponse(expectedKeys, Terms.Order.aggregation("avg_l", false), Terms.Order.term(true));
  1032. }
  1033. @Test
  1034. public void singleValuedField_OrderedByCountAscAndSingleValueSubAggregationAsc() throws Exception {
  1035. double[] expectedKeys = new double[] { 6, 7, 3, 4, 5, 1, 2 };
  1036. assertMultiSortResponse(expectedKeys, Terms.Order.count(true), Terms.Order.aggregation("avg_l", true));
  1037. }
  1038. @Test
  1039. public void singleValuedField_OrderedBySingleValueSubAggregationAscSingleValueSubAggregationAsc() throws Exception {
  1040. double[] expectedKeys = new double[] { 6, 7, 3, 5, 4, 1, 2 };
  1041. assertMultiSortResponse(expectedKeys, Terms.Order.aggregation("sum_d", true), Terms.Order.aggregation("avg_l", true));
  1042. }
  1043. @Test
  1044. public void singleValuedField_OrderedByThreeCriteria() throws Exception {
  1045. double[] expectedKeys = new double[] { 2, 1, 4, 5, 3, 6, 7 };
  1046. assertMultiSortResponse(expectedKeys, Terms.Order.count(false), Terms.Order.aggregation("sum_d", false), Terms.Order.aggregation("avg_l", false));
  1047. }
  1048. @Test
  1049. public void singleValuedField_OrderedBySingleValueSubAggregationAscAsCompound() throws Exception {
  1050. double[] expectedKeys = new double[] { 1, 2, 3, 4, 5, 6, 7 };
  1051. assertMultiSortResponse(expectedKeys, Terms.Order.aggregation("avg_l", true));
  1052. }
  1053. private void assertMultiSortResponse(double[] expectedKeys, Terms.Order... order) {
  1054. SearchResponse response = client().prepareSearch("sort_idx").setTypes("multi_sort_type")
  1055. .addAggregation(terms("terms")
  1056. .field(SINGLE_VALUED_FIELD_NAME)
  1057. .collectMode(randomFrom(SubAggCollectionMode.values()))
  1058. .order(Terms.Order.compound(order))
  1059. .subAggregation(avg("avg_l").field("l"))
  1060. .subAggregation(sum("sum_d").field("d"))
  1061. ).execute().actionGet();
  1062. assertSearchResponse(response);
  1063. Terms terms = response.getAggregations().get("terms");
  1064. assertThat(terms, notNullValue());
  1065. assertThat(terms.getName(), equalTo("terms"));
  1066. assertThat(terms.getBuckets().size(), equalTo(expectedKeys.length));
  1067. int i = 0;
  1068. for (Terms.Bucket bucket : terms.getBuckets()) {
  1069. assertThat(bucket, notNullValue());
  1070. assertThat(key(bucket), equalTo(String.valueOf(expectedKeys[i])));
  1071. assertThat(bucket.getDocCount(), equalTo(expectedMultiSortBuckets.get(expectedKeys[i]).get("_count")));
  1072. Avg avg = bucket.getAggregations().get("avg_l");
  1073. assertThat(avg, notNullValue());
  1074. assertThat(avg.getValue(), equalTo(expectedMultiSortBuckets.get(expectedKeys[i]).get("avg_l")));
  1075. Sum sum = bucket.getAggregations().get("sum_d");
  1076. assertThat(sum, notNullValue());
  1077. assertThat(sum.getValue(), equalTo(expectedMultiSortBuckets.get(expectedKeys[i]).get("sum_d")));
  1078. i++;
  1079. }
  1080. }
  1081. @Test
  1082. public void otherDocCount() {
  1083. testOtherDocCount(SINGLE_VALUED_FIELD_NAME, MULTI_VALUED_FIELD_NAME);
  1084. }
  1085. }