package com.pearson.entech.elasticsearch.search.facet.approx.date;
import static com.google.common.collect.Maps.newHashMap;
import static org.junit.Assert.assertEquals;
import java.util.List;
import java.util.Map;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.BoolFilterBuilder;
import org.elasticsearch.index.query.FilterBuilders;
import org.elasticsearch.search.facet.terms.TermsFacet;
import org.elasticsearch.search.facet.terms.TermsFacet.Entry;
import com.pearson.entech.elasticsearch.search.facet.approx.date.external.DateFacet;
import com.pearson.entech.elasticsearch.search.facet.approx.date.external.Slice;
import com.pearson.entech.elasticsearch.search.facet.approx.date.external.TimePeriod;
import com.pearson.entech.elasticsearch.search.facet.approx.date.external.XContentEnabledList;
import com.pearson.entech.elasticsearch.search.facet.approx.date.internal.MediumDataSetPerformanceTest.RandomSlicedDateFacetQuery;
public class SlicedQueryResultChecker extends CountingQueryResultChecker {
private final String _sliceField;
private final RandomSlicedDateFacetQuery _query;
public SlicedQueryResultChecker(final String index, final String dtField, final String sliceField, final Client client,
final RandomSlicedDateFacetQuery query) {
super(index, dtField, client);
_sliceField = sliceField;
_query = query;
}
@Override
protected BucketSpecifier buildBucketSpecifier(final String field, final long startTime, final long endTime, final long count) {
return new BucketSpecifier(field, startTime, endTime, count, _query.facetName());
}
public class BucketSpecifier extends CountingQueryResultChecker.BucketSpecifier {
private final String _origFacetName;
protected BucketSpecifier(final String field, final long startTime, final long endTime, final long count, final String origFacetName) {
super(field, startTime, endTime, count);
_origFacetName = origFacetName;
}
@Override
protected int termLimit() {
return Integer.MAX_VALUE;
}
@Override
protected BoolFilterBuilder makeFilter() {
return super.makeFilter()
.must(FilterBuilders.existsFilter(getField()));
}
@Override
protected void injectAdditionalChecks(final TermsFacet facet) {
final DateFacet<TimePeriod<XContentEnabledList<Slice<String>>>> original =
_query.getSearchResponse().getFacets().facet(_origFacetName);
final List<Slice<String>> period = findPeriod(original, getStartTime());
assertEquals("Number of terms in facet does not match what we'd expect",
facet.getEntries().size(), period.size());
// Get terms from terms list in validation query for this bucket
final List<? extends Entry> entries = facet.getEntries();
final Map<String, Integer> entryCounts = newHashMap();
for(final Entry entry : entries) {
entryCounts.put(entry.getTerm().string(), entry.getCount());
}
// Compare to terms in this period from original facet that we're checking
for(final Slice<String> slice : period) {
final String term = slice.getLabel();
final long expectedCount = entryCounts.get(term).longValue();
final long actualCount = slice.getTotalCount();
assertEquals("Counts for term " + term + " don't match what we'd expect",
expectedCount, actualCount);
}
}
private List<Slice<String>> findPeriod(final DateFacet<TimePeriod<XContentEnabledList<Slice<String>>>> original, final long startTime) {
for(final TimePeriod<XContentEnabledList<Slice<String>>> period : original.entries()) {
if(period.getTime() == startTime)
return period.getEntry();
}
throw new IllegalArgumentException("Couldn't locate time period starting at " + startTime + " in facet provided");
}
}
}