public virtual void TestBooleanQuery()
{
TermQuery aQuery = new TermQuery(new Term("f", "a"));
TermQuery dQuery = new TermQuery(new Term("f", "d"));
TermQuery cQuery = new TermQuery(new Term("f", "c"));
TermQuery yQuery = new TermQuery(new Term("f", "y"));
BooleanQuery query = new BooleanQuery();
BooleanQuery inner = new BooleanQuery();
inner.Add(cQuery, Occur.SHOULD);
inner.Add(yQuery, Occur.MUST_NOT);
query.Add(inner, Occur.MUST);
query.Add(aQuery, Occur.MUST);
query.Add(dQuery, Occur.MUST);
// Only needed in Java6; Java7+ has a @SafeVarargs annotated Arrays#asList()!
// see http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html
IEnumerable<ISet<string>> occurList = Arrays.AsList(Collections.Singleton("MUST"), new HashSet<string>(Arrays.AsList("MUST", "SHOULD")));
foreach (HashSet<string> occur in occurList)
{
CountingCollector c = new CountingCollector(TopScoreDocCollector.Create(10, true), occur);
s.Search(query, null, c);
int maxDocs = s.IndexReader.MaxDoc;
Assert.AreEqual(maxDocs, c.DocCounts.Count);
bool includeOptional = occur.Contains("SHOULD");
for (int i = 0; i < maxDocs; i++)
{
IDictionary<Query, float?> doc0 = c.DocCounts[i];
Assert.AreEqual(includeOptional ? 5 : 4, doc0.Count);
Assert.AreEqual(1.0F, doc0[aQuery], FLOAT_TOLERANCE);
Assert.AreEqual(4.0F, doc0[dQuery], FLOAT_TOLERANCE);
if (includeOptional)
{
Assert.AreEqual(3.0F, doc0[cQuery], FLOAT_TOLERANCE);
}
IDictionary<Query, float?> doc1 = c.DocCounts[++i];
Assert.AreEqual(includeOptional ? 5 : 4, doc1.Count);
Assert.AreEqual(1.0F, doc1[aQuery], FLOAT_TOLERANCE);
Assert.AreEqual(1.0F, doc1[dQuery], FLOAT_TOLERANCE);
if (includeOptional)
{
Assert.AreEqual(1.0F, doc1[cQuery], FLOAT_TOLERANCE);
}
}
}
}