public void doFilterTest(SolrIndexReader reader) throws IOException { OpenBitSet bs = getRandomSet(reader.maxDoc(), rand.nextInt(reader.maxDoc() + 1)); DocSet a = new BitDocSet(bs); DocSet b = getIntDocSet(bs); Filter fa = a.getTopFilter(); Filter fb = b.getTopFilter(); // test top-level DocIdSet da = fa.getDocIdSet(reader); DocIdSet db = fb.getDocIdSet(reader); doTestIteratorEqual(da, db); // first test in-sequence sub readers for (SolrIndexReader sir : reader.getLeafReaders()) { da = fa.getDocIdSet(sir); db = fb.getDocIdSet(sir); doTestIteratorEqual(da, db); } int nReaders = reader.getLeafReaders().length; // now test out-of-sequence sub readers for (int i = 0; i < nReaders; i++) { SolrIndexReader sir = reader.getLeafReaders()[rand.nextInt(nReaders)]; da = fa.getDocIdSet(sir); db = fb.getDocIdSet(sir); doTestIteratorEqual(da, db); } }
protected void doSingle(int maxSize) { int sz = rand.nextInt(maxSize + 1); int sz2 = rand.nextInt(maxSize); OpenBitSet bs1 = getRandomSet(sz, rand.nextInt(sz + 1)); OpenBitSet bs2 = getRandomSet(sz, rand.nextInt(sz2 + 1)); DocSet a1 = new BitDocSet(bs1); DocSet a2 = new BitDocSet(bs2); DocSet b1 = getDocSet(bs1); DocSet b2 = getDocSet(bs2); checkEqual(bs1, b1); checkEqual(bs2, b2); iter(a1, b1); iter(a2, b2); OpenBitSet a_and = (OpenBitSet) bs1.clone(); a_and.and(bs2); OpenBitSet a_or = (OpenBitSet) bs1.clone(); a_or.or(bs2); // OpenBitSet a_xor = (OpenBitSet)bs1.clone(); a_xor.xor(bs2); OpenBitSet a_andn = (OpenBitSet) bs1.clone(); a_andn.andNot(bs2); checkEqual(a_and, b1.intersection(b2)); checkEqual(a_or, b1.union(b2)); checkEqual(a_andn, b1.andNot(b2)); assertEquals(a_and.cardinality(), b1.intersectionSize(b2)); assertEquals(a_or.cardinality(), b1.unionSize(b2)); assertEquals(a_andn.cardinality(), b1.andNotSize(b2)); }
/** * Iterates DocSets to test for equality - slow and for testing purposes only. * * @lucene.internal */ public static boolean equals(DocSet a, DocSet b) { DocIterator iter1 = a.iterator(); DocIterator iter2 = b.iterator(); for (; ; ) { boolean n1 = iter1.hasNext(); boolean n2 = iter2.hasNext(); if (n1 != n2) { return false; } if (!n1) return true; // made it to end int d1 = iter1.nextDoc(); int d2 = iter2.nextDoc(); if (d1 != d2) { return false; } } }
public void iter(DocSet d1, DocSet d2) { // HashDocSet and DocList doesn't iterate in order. if (d1 instanceof HashDocSet || d2 instanceof HashDocSet || d1 instanceof DocList || d2 instanceof DocList) return; DocIterator i1 = d1.iterator(); DocIterator i2 = d2.iterator(); assert (i1.hasNext() == i2.hasNext()); for (; ; ) { boolean b1 = i1.hasNext(); boolean b2 = i2.hasNext(); assertEquals(b1, b2); if (!b1) break; assertEquals(i1.nextDoc(), i2.nextDoc()); } }
int doSetGen(int iter, Query q) throws Exception { SolrQueryRequest req = lrf.makeRequest(); SolrIndexSearcher searcher = req.getSearcher(); long start = System.currentTimeMillis(); int ret = 0; for (int i = 0; i < iter; i++) { DocSet set = searcher.getDocSetNC(q, null); ret += set.size(); } long end = System.currentTimeMillis(); System.out.println( "ret=" + ret + " time=" + (end - start) + " throughput=" + iter * 1000 / (end - start + 1)); req.close(); assertTrue(ret > 0); // make sure we did some work return ret; }
// implementers of DocSetProducer should not call this with themselves or it will result in an // infinite loop public static DocSet createDocSet(SolrIndexSearcher searcher, Query query, DocSet filter) throws IOException { if (filter != null) { Filter luceneFilter = filter.getTopFilter(); query = new BooleanQuery.Builder() .add(query, BooleanClause.Occur.MUST) .add(luceneFilter, BooleanClause.Occur.FILTER) .build(); } if (query instanceof TermQuery) { DocSet set = createDocSet(searcher, ((TermQuery) query).getTerm()); // assert equals(set, createDocSetGeneric(searcher, query)); return set; } else if (query instanceof DocSetProducer) { DocSet set = ((DocSetProducer) query).createDocSet(searcher); // assert equals(set, createDocSetGeneric(searcher, query)); return set; } return createDocSetGeneric(searcher, query); }
public void checkEqual(OpenBitSet bs, DocSet set) { for (int i = 0; i < bs.capacity(); i++) { assertEquals(bs.get(i), set.exists(i)); } assertEquals(bs.cardinality(), set.size()); }