package com.pearson.entech.elasticsearch.search.facet.approx.date; import static com.google.common.collect.Sets.newHashSet; import static org.junit.Assert.assertEquals; import java.util.List; import java.util.Set; import org.elasticsearch.client.Client; 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.DistinctTimePeriod; import com.pearson.entech.elasticsearch.search.facet.approx.date.external.NullEntry; import com.pearson.entech.elasticsearch.search.facet.approx.date.external.TimePeriod; public class DistinctQueryResultChecker extends CountingQueryResultChecker { private final double _tolerance; public DistinctQueryResultChecker(final String index, final String dtField, final Client client, final double tolerance) { super(index, dtField, client); _tolerance = tolerance; } @Override public BucketSpecifier specifier(final String field, final DateFacet<TimePeriod<NullEntry>> facet, final int idx) { final List<? extends TimePeriod<?>> entries = facet.getEntries(); final DistinctTimePeriod<?> entry = (DistinctTimePeriod<?>) entries.get(idx); final long startTime = entry.getTime(); final long endTime = (idx + 1 < entries.size()) ? entries.get(idx + 1).getTime() : Long.MAX_VALUE; final long count = entry.getTotalCount(); final long distinctCount = entry.getDistinctCount(); final BucketSpecifier spec = new BucketSpecifier(field, startTime, endTime, count, distinctCount); getSpecs().add(spec); return spec; } public void checkTotalDistinctCount(final long totalDistinctCount) { final Set<String> terms = newHashSet(); for(final Object o : getSpecs()) { final BucketSpecifier spec = (BucketSpecifier) o; final TermsFacet facet = spec.getResponse().getFacets().facet("bucket_check"); for(final Entry entry : facet.getEntries()) terms.add(entry.getTerm().string()); } final double expectedSize = terms.size(); final double tolerance = expectedSize * _tolerance; assertEquals(terms.size(), totalDistinctCount, tolerance); } public class BucketSpecifier extends CountingQueryResultChecker.BucketSpecifier { private final long _distinctCount; protected BucketSpecifier(final String field, final long startTime, final long endTime, final long count, final long distinctCount) { super(field, startTime, endTime, count); _distinctCount = distinctCount; } @Override protected void injectAdditionalChecks(final TermsFacet facet) { final int facetSize = facet.getEntries().size(); final double tolerance = facetSize * _tolerance; assertEquals("Distinct count not equal to number of terms received by terms facet on field " + getField(), facetSize, _distinctCount, tolerance); } @Override protected int termLimit() { return Integer.MAX_VALUE; } } }