*41.
public void doTestPrelimSorting(final Client client,final boolean extraAgg,final boolean extraSubFacet) throws Exception {
client.deleteByQuery("*:*",null);
List<SolrClient> clients=client.getClientProvider().all();
final SolrClient shardA=clients.get(0);
final SolrClient shardB=clients.get(clients.size() - 1);
final int numShardsWithData=(shardA == shardB) ? 1 : 2;
int id=0;
for (int i=1; i <= 20; i++) {
for (int j=1; j <= i; j++) {
shardA.add(new SolrInputDocument("id","" + (++id),"foo_s","foo_" + i,"bar_i","1"));
shardB.add(new SolrInputDocument("id","" + (++id),"foo_s","foo_" + i,"bar_i","1"));
}
}
assertEquals(420,id);
client.commit();
DebugAgg.Acc.collectDocs.set(0);
DebugAgg.Acc.collectDocSets.set(0);
final boolean indexSortDebugAggFudge=(1 < numShardsWithData) && (FacetField.FacetMethod.DEFAULT_METHOD.equals(FacetField.FacetMethod.STREAM) || FacetField.FacetMethod.DEFAULT_METHOD.equals(FacetField.FacetMethod.ENUM));
final String common="refine:true, type:field, field:'foo_s', facet: { " + "x: 'debug(wrap,sum(bar_i))' " + (extraAgg ? ", y:'min(bar_i)'" : "") + (extraSubFacet ? ", z:{type:query, q:'bar_i:0'}" : "")+ "}";
final String yz=(extraAgg ? "y:1, " : "") + (extraSubFacet ? "z:{count:0}, " : "");
client.testJQ(params("q","*:*","rows","0","json.facet","{ foo_a:{ " + common + ", limit:5, overrequest:0, "+ " prelim_sort:'count desc', sort:'x asc' }"+ " foo_b:{ "+ common+ ", limit:5, overrequest:0, "+ " prelim_sort:'count asc', sort:'x desc' } }"),"facets=={ 'count':420, " + " 'foo_a':{ 'buckets':[" + " { val:foo_16, count:32, " + yz + "x:32.0},"+ " { val:foo_17, count:34, "+ yz+ "x:34.0},"+ " { val:foo_18, count:36, "+ yz+ "x:36.0},"+ " { val:foo_19, count:38, "+ yz+ "x:38.0},"+ " { val:foo_20, count:40, "+ yz+ "x:40.0},"+ "] },"+ " 'foo_b':{ 'buckets':["+ " { val:foo_5, count:10, "+ yz+ "x:10.0},"+ " { val:foo_4, count:8, "+ yz+ "x:8.0},"+ " { val:foo_3, count:6, "+ yz+ "x:6.0},"+ " { val:foo_2, count:4, "+ yz+ "x:4.0},"+ " { val:foo_1, count:2, "+ yz+ "x:2.0},"+ "] },"+ "}");
assertEqualsAndReset(0,DebugAgg.Acc.collectDocs);
assertEqualsAndReset(numShardsWithData * 2 * 5,DebugAgg.Acc.collectDocSets);
{
final String aout="allBuckets:{ count:420, " + (extraAgg ? "y:1, " : "") + "x:420.0 }";
client.testJQ(params("q","*:*","rows","0","json.facet","{ foo_a:{ " + common + ", allBuckets:true, limit:5, overrequest:0, "+ " prelim_sort:'count desc', sort:'x asc' }"+ " foo_b:{ "+ common+ ", allBuckets:true, limit:5, overrequest:0, "+ " prelim_sort:'count asc', sort:'x desc' } }"),"facets=={ 'count':420, " + " 'foo_a':{ " + aout + " 'buckets':["+ " { val:foo_16, count:32, "+ yz+ "x:32.0},"+ " { val:foo_17, count:34, "+ yz+ "x:34.0},"+ " { val:foo_18, count:36, "+ yz+ "x:36.0},"+ " { val:foo_19, count:38, "+ yz+ "x:38.0},"+ " { val:foo_20, count:40, "+ yz+ "x:40.0},"+ "] },"+ " 'foo_b':{ "+ aout+ " 'buckets':["+ " { val:foo_5, count:10, "+ yz+ "x:10.0},"+ " { val:foo_4, count:8, "+ yz+ "x:8.0},"+ " { val:foo_3, count:6, "+ yz+ "x:6.0},"+ " { val:foo_2, count:4, "+ yz+ "x:4.0},"+ " { val:foo_1, count:2, "+ yz+ "x:2.0},"+ "] },"+ "}");
assertEqualsAndReset(2 * 420,DebugAgg.Acc.collectDocs);
assertEqualsAndReset(numShardsWithData * 2 * 5,DebugAgg.Acc.collectDocSets);
}
client.testJQ(params("q","*:*","rows","0","json.facet","{ foo_a:{ " + common + ", offset:2, limit:3, overrequest:0, "+ " prelim_sort:'count desc', sort:'x asc' }"+ " foo_b:{ "+ common+ ", offset:2, limit:3, overrequest:0, "+ " prelim_sort:'count asc', sort:'x desc' } }"),"facets=={ 'count':420, " + " 'foo_a':{ 'buckets':[" + " { val:foo_18, count:36, " + yz + "x:36.0},"+ " { val:foo_19, count:38, "+ yz+ "x:38.0},"+ " { val:foo_20, count:40, "+ yz+ "x:40.0},"+ "] },"+ " 'foo_b':{ 'buckets':["+ " { val:foo_3, count:6, "+ yz+ "x:6.0},"+ " { val:foo_2, count:4, "+ yz+ "x:4.0},"+ " { val:foo_1, count:2, "+ yz+ "x:2.0},"+ "] },"+ "}");
assertEqualsAndReset(0,DebugAgg.Acc.collectDocs);
assertEqualsAndReset(numShardsWithData * 2 * 5,DebugAgg.Acc.collectDocSets);
client.testJQ(params("q","*:*","rows","0","json.facet","{ foo_a:{ " + common + ", limit:5, overrequest:5, "+ " prelim_sort:'count desc', sort:'x asc' }"+ " foo_b:{ "+ common+ ", limit:5, overrequest:5, "+ " prelim_sort:'count asc', sort:'x desc' } }"),"facets=={ 'count':420, " + " 'foo_a':{ 'buckets':[" + " { val:foo_11, count:22, " + yz + "x:22.0},"+ " { val:foo_12, count:24, "+ yz+ "x:24.0},"+ " { val:foo_13, count:26, "+ yz+ "x:26.0},"+ " { val:foo_14, count:28, "+ yz+ "x:28.0},"+ " { val:foo_15, count:30, "+ yz+ "x:30.0},"+ "] },"+ " 'foo_b':{ 'buckets':["+ " { val:foo_10, count:20, "+ yz+ "x:20.0},"+ " { val:foo_9, count:18, "+ yz+ "x:18.0},"+ " { val:foo_8, count:16, "+ yz+ "x:16.0},"+ " { val:foo_7, count:14, "+ yz+ "x:14.0},"+ " { val:foo_6, count:12, "+ yz+ "x:12.0},"+ "] },"+ "}");
assertEqualsAndReset(0,DebugAgg.Acc.collectDocs);
assertEqualsAndReset(numShardsWithData * 2 * 10,DebugAgg.Acc.collectDocSets);
{
final StringBuilder expected=new StringBuilder("facets=={ 'count':420, 'foo_a':{ 'buckets':[\n");
for (int i=20; 0 < i; i--) {
final int x=i * 2;
expected.append("{ val:foo_" + i + ", count:"+ x+ ", "+ yz+ "x:"+ x+ ".0},\n");
}
expected.append("] } }");
for ( int limit : Arrays.asList(-1,100000)) {
for ( String sortOpts : Arrays.asList("sort:'x desc'","prelim_sort:'count asc', sort:'x desc'","prelim_sort:'index asc', sort:'x desc'")) {
final String snippet="limit: " + limit + ", "+ sortOpts;
client.testJQ(params("q","*:*","rows","0","json.facet","{ foo_a:{ " + common + ", "+ snippet+ "}}"),expected.toString());
if (((0 < limit || extraSubFacet) && snippet.contains("prelim_sort")) && !(indexSortDebugAggFudge && snippet.contains("index asc"))) {
assertEqualsAndReset(snippet,numShardsWithData * 20,DebugAgg.Acc.collectDocSets);
assertEqualsAndReset(snippet,0,DebugAgg.Acc.collectDocs);
}
else {
assertEqualsAndReset(snippet,0,DebugAgg.Acc.collectDocSets);
assertEqualsAndReset(snippet,420,DebugAgg.Acc.collectDocs);
}
}
}
}
for ( String numSort : Arrays.asList("count","x")) {
client.testJQ(params("q","*:*","rows","0","json.facet","{ foo_a:{ " + common + ", limit:10, overrequest:0, "+ " prelim_sort:'"+ numSort+ " asc', sort:'index desc' }"+ " foo_b:{ "+ common+ ", limit:10, overrequest:0, "+ " prelim_sort:'index asc', sort:'"+ numSort+ " desc' } }"),"facets=={ 'count':420, " + " 'foo_a':{ 'buckets':[" + " { val:foo_9, count:18, " + yz + "x:18.0},"+ " { val:foo_8, count:16, "+ yz+ "x:16.0},"+ " { val:foo_7, count:14, "+ yz+ "x:14.0},"+ " { val:foo_6, count:12, "+ yz+ "x:12.0},"+ " { val:foo_5, count:10, "+ yz+ "x:10.0},"+ " { val:foo_4, count:8, "+ yz+ "x:8.0},"+ " { val:foo_3, count:6, "+ yz+ "x:6.0},"+ " { val:foo_2, count:4, "+ yz+ "x:4.0},"+ " { val:foo_10, count:20, "+ yz+ "x:20.0},"+ " { val:foo_1, count:2, "+ yz+ "x:2.0},"+ "] },"+ " 'foo_b':{ 'buckets':["+ " { val:foo_18, count:36, "+ yz+ "x:36.0},"+ " { val:foo_17, count:34, "+ yz+ "x:34.0},"+ " { val:foo_16, count:32, "+ yz+ "x:32.0},"+ " { val:foo_15, count:30, "+ yz+ "x:30.0},"+ " { val:foo_14, count:28, "+ yz+ "x:28.0},"+ " { val:foo_13, count:26, "+ yz+ "x:26.0},"+ " { val:foo_12, count:24, "+ yz+ "x:24.0},"+ " { val:foo_11, count:22, "+ yz+ "x:22.0},"+ " { val:foo_10, count:20, "+ yz+ "x:20.0},"+ " { val:foo_1, count:2, "+ yz+ "x:2.0},"+ "] },"+ "}");
}
assertEqualsAndReset((indexSortDebugAggFudge ? 1 : 3) * numShardsWithData * 10,DebugAgg.Acc.collectDocSets);
assertEqualsAndReset(420 + (indexSortDebugAggFudge ? 2 * numShardsWithData * (1 + 10 + 11+ 12+ 13+ 14+ 15+ 16+ 17+ 18+ 19) : 0),DebugAgg.Acc.collectDocs);
client.testJQ(params("q","*:*","rows","0","json.facet","{ bar:{ type:query, query:'foo_s:[foo_10 TO foo_19]', facet: {" + " foo:{ " + common + ", limit:5, overrequest:0, "+ " prelim_sort:'count desc', sort:'x asc' } } } }"),"facets=={ 'count':420, " + " 'bar':{ 'count':290, " + " 'foo':{ 'buckets':["+ " { val:foo_15, count:30, " + yz + "x:30.0},"+ " { val:foo_16, count:32, "+ yz+ "x:32.0},"+ " { val:foo_17, count:34, "+ yz+ "x:34.0},"+ " { val:foo_18, count:36, "+ yz+ "x:36.0},"+ " { val:foo_19, count:38, "+ yz+ "x:38.0},"+ " ] },"+ " },"+ "}");
assertEqualsAndReset(0,DebugAgg.Acc.collectDocs);
assertEqualsAndReset(numShardsWithData * 5,DebugAgg.Acc.collectDocSets);
{
final List<String> sorts=new ArrayList<String>(Arrays.asList("index asc","count asc"));
if (extraAgg) {
sorts.add("y asc");
}
for ( String s : sorts) {
client.testJQ(params("q","*:*","rows","0","json.facet","{ foo:{ " + common + ", limit:5, overrequest:0, "+ " prelim_sort:'count desc', sort:'"+ s+ "' } }"),"facets=={ 'count':420, " + " 'foo':{ 'buckets':[" + " { val:foo_16, count:32, " + yz + "x:32.0},"+ " { val:foo_17, count:34, "+ yz+ "x:34.0},"+ " { val:foo_18, count:36, "+ yz+ "x:36.0},"+ " { val:foo_19, count:38, "+ yz+ "x:38.0},"+ " { val:foo_20, count:40, "+ yz+ "x:40.0},"+ "] } }");
assertEqualsAndReset(0,DebugAgg.Acc.collectDocs);
assertEqualsAndReset(numShardsWithData * 5,DebugAgg.Acc.collectDocSets);
}
}
}
Parameters to be described: extraAgg
Reference: if an extra aggregation function should be included, this hits slightly diffcode paths
output_1: whether to include an additional aggregation in the test.
output_2: the extraagg to use
output_3: the client to sort