You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ar...@apache.org on 2007/08/11 18:56:44 UTC
svn commit: r564939 [5/8] - in /incubator/lucene.net/trunk/C#/src: ./ Demo/
Demo/DeleteFiles/ Demo/DemoLib/ Demo/IndexFiles/ Demo/IndexHtml/
Demo/SearchFiles/ Lucene.Net/ Lucene.Net/Analysis/Standard/
Lucene.Net/Document/ Lucene.Net/Index/ Lucene.Net/Q...
Modified: incubator/lucene.net/trunk/C#/src/Test/QueryParser/TestQueryParser.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/QueryParser/TestQueryParser.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/QueryParser/TestQueryParser.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/QueryParser/TestQueryParser.cs Sat Aug 11 09:56:37 2007
@@ -16,7 +16,9 @@
*/
using System;
+
using NUnit.Framework;
+
using Analyzer = Lucene.Net.Analysis.Analyzer;
using LowerCaseTokenizer = Lucene.Net.Analysis.LowerCaseTokenizer;
using SimpleAnalyzer = Lucene.Net.Analysis.SimpleAnalyzer;
@@ -26,16 +28,15 @@
using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
using StandardAnalyzer = Lucene.Net.Analysis.Standard.StandardAnalyzer;
using DateField = Lucene.Net.Documents.DateField;
-using ParseException = Lucene.Net.QueryParsers.ParseException;
-using QueryParser = Lucene.Net.QueryParsers.QueryParser;
-using BooleanQuery = Lucene.Net.Search.BooleanQuery;
-using FuzzyQuery = Lucene.Net.Search.FuzzyQuery;
-using PhraseQuery = Lucene.Net.Search.PhraseQuery;
-using PrefixQuery = Lucene.Net.Search.PrefixQuery;
-using Query = Lucene.Net.Search.Query;
-using RangeQuery = Lucene.Net.Search.RangeQuery;
-using TermQuery = Lucene.Net.Search.TermQuery;
-using WildcardQuery = Lucene.Net.Search.WildcardQuery;
+using DateTools = Lucene.Net.Documents.DateTools;
+using Document = Lucene.Net.Documents.Document;
+using Field = Lucene.Net.Documents.Field;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using Term = Lucene.Net.Index.Term;
+using Lucene.Net.Search;
+using Searchable = Lucene.Net.Search.Searchable;
+using RAMDirectory = Lucene.Net.Store.RAMDirectory;
+using ParseException = Lucene.Net.Analysis.Standard.ParseException;
namespace Lucene.Net.QueryParser
{
@@ -44,6 +45,46 @@
[TestFixture]
public class TestQueryParser
{
+ public class AnonymousClassQueryParser : Lucene.Net.QueryParsers.QueryParser
+ {
+ private void InitBlock(int[] type, TestQueryParser enclosingInstance)
+ {
+ this.type = type;
+ this.enclosingInstance = enclosingInstance;
+ }
+ private int[] type;
+ private TestQueryParser enclosingInstance;
+ public TestQueryParser Enclosing_Instance
+ {
+ get
+ {
+ return enclosingInstance;
+ }
+
+ }
+ internal AnonymousClassQueryParser(int[] type, TestQueryParser enclosingInstance, System.String Param1, Lucene.Net.Analysis.Analyzer Param2):base(Param1, Param2)
+ {
+ InitBlock(type, enclosingInstance);
+ }
+ public override Lucene.Net.Search.Query GetWildcardQuery(System.String field, System.String termStr)
+ {
+ // override error checking of superclass
+ type[0] = 1;
+ return new TermQuery(new Term(field, termStr));
+ }
+ public Lucene.Net.Search.Query GetPrefixQuery(System.String field, System.String termStr)
+ {
+ // override error checking of superclass
+ type[0] = 2;
+ return new TermQuery(new Term(field, termStr));
+ }
+
+ public Lucene.Net.Search.Query GetFieldQuery(System.String field, System.String queryText)
+ {
+ type[0] = 3;
+ return base.GetFieldQuery(field, queryText);
+ }
+ }
public static Analyzer qpAnalyzer = new QPTestAnalyzer();
@@ -99,12 +140,12 @@
{
}
- protected override Query GetFuzzyQuery(System.String field, System.String termStr, float minSimilarity)
+ public override Query GetFuzzyQuery(System.String field, System.String termStr, float minSimilarity)
{
throw new ParseException("Fuzzy queries not allowed");
}
- protected override Query GetWildcardQuery(System.String field, System.String termStr)
+ public override Query GetWildcardQuery(System.String field, System.String termStr)
{
throw new ParseException("Wildcard queries not allowed");
}
@@ -142,6 +183,16 @@
}
}
+ public virtual void AssertQueryEquals(Lucene.Net.QueryParsers.QueryParser qp, System.String field, System.String query, System.String result)
+ {
+ Query q = qp.Parse(query);
+ System.String s = q.ToString(field);
+ if (!s.Equals(result))
+ {
+ Assert.Fail("Query /" + query + "/ yielded /" + s + "/, expecting /" + result + "/");
+ }
+ }
+
public virtual void AssertEscapedQueryEquals(System.String query, Analyzer a, System.String result)
{
System.String escapedQuery = Lucene.Net.QueryParsers.QueryParser.Escape(query);
@@ -151,11 +202,12 @@
}
}
- public virtual void AssertWildcardQueryEquals(System.String query, bool lowercase, System.String result)
+ public virtual void AssertWildcardQueryEquals(System.String query, bool lowercase, System.String result, bool allowLeadingWildcard)
{
Lucene.Net.QueryParsers.QueryParser qp = GetParser(null);
qp.SetLowercaseExpandedTerms(lowercase);
- Query q = qp.Parse(query);
+ qp.SetAllowLeadingWildcard(allowLeadingWildcard);
+ Query q = qp.Parse(query);
System.String s = q.ToString("field");
if (!s.Equals(result))
{
@@ -163,7 +215,12 @@
}
}
- public virtual void AssertWildcardQueryEquals(System.String query, System.String result)
+ public virtual void AssertWildcardQueryEquals(System.String query, bool lowercase, System.String result)
+ {
+ AssertWildcardQueryEquals(query, lowercase, result, false);
+ }
+
+ public virtual void AssertWildcardQueryEquals(System.String query, System.String result)
{
Lucene.Net.QueryParsers.QueryParser qp = GetParser(null);
Query q = qp.Parse(query);
@@ -346,7 +403,29 @@
AssertWildcardQueryEquals("[A TO C]", "[a TO c]");
AssertWildcardQueryEquals("[A TO C]", true, "[a TO c]");
AssertWildcardQueryEquals("[A TO C]", false, "[A TO C]");
- }
+ // Test suffix queries: first disallow
+ try
+ {
+ AssertWildcardQueryEquals("*Term", true, "*term");
+ Assert.Fail();
+ }
+ catch (ParseException pe)
+ {
+ // expected exception
+ }
+ try
+ {
+ AssertWildcardQueryEquals("?Term", true, "?term");
+ Assert.Fail();
+ }
+ catch (ParseException pe)
+ {
+ // expected exception
+ }
+ // Test suffix queries: then allow
+ AssertWildcardQueryEquals("*Term", true, "*term", true);
+ AssertWildcardQueryEquals("?Term", true, "?term", true);
+ }
[Test]
public virtual void TestQPA()
@@ -365,19 +444,51 @@
[Test]
public virtual void TestRange()
{
- AssertQueryEquals("[ a TO z]", null, "[a TO z]");
- Assert.IsTrue(GetQuery("[ a TO z]", null) is RangeQuery);
- AssertQueryEquals("[ a TO z ]", null, "[a TO z]");
- AssertQueryEquals("{ a TO z}", null, "{a TO z}");
- AssertQueryEquals("{ a TO z }", null, "{a TO z}");
- AssertQueryEquals("{ a TO z }^2.0", null, "{a TO z}^2.0");
- AssertQueryEquals("[ a TO z] OR bar", null, "[a TO z] bar");
- AssertQueryEquals("[ a TO z] AND bar", null, "+[a TO z] +bar");
- AssertQueryEquals("( bar blar { a TO z}) ", null, "bar blar {a TO z}");
- AssertQueryEquals("gack ( bar blar { a TO z}) ", null, "gack (bar blar {a TO z})");
- }
+ AssertQueryEquals("[ a TO z]", null, "[a TO z]");
+ Assert.IsTrue(GetQuery("[ a TO z]", null) is ConstantScoreRangeQuery);
+
+ Lucene.Net.QueryParsers.QueryParser qp = new Lucene.Net.QueryParsers.QueryParser("field", new SimpleAnalyzer());
+ qp.SetUseOldRangeQuery(true);
+ Assert.IsTrue(qp.Parse("[ a TO z]") is RangeQuery);
+
+ AssertQueryEquals("[ a TO z ]", null, "[a TO z]");
+ AssertQueryEquals("{ a TO z}", null, "{a TO z}");
+ AssertQueryEquals("{ a TO z }", null, "{a TO z}");
+ AssertQueryEquals("{ a TO z }^2.0", null, "{a TO z}^2.0");
+ AssertQueryEquals("[ a TO z] OR bar", null, "[a TO z] bar");
+ AssertQueryEquals("[ a TO z] AND bar", null, "+[a TO z] +bar");
+ AssertQueryEquals("( bar blar { a TO z}) ", null, "bar blar {a TO z}");
+ AssertQueryEquals("gack ( bar blar { a TO z}) ", null, "gack (bar blar {a TO z})");
+ }
+
+ /// <summary>for testing legacy DateField support </summary>
+ private System.String GetLegacyDate(System.String s)
+ {
+ System.DateTime tempAux = System.DateTime.Parse(s, System.Globalization.CultureInfo.CurrentCulture);
+ return DateField.DateToString(tempAux);
+ }
+
+ /// <summary>for testing DateTools support </summary>
+ private System.String GetDate(System.String s, DateTools.Resolution resolution)
+ {
+ System.DateTime tempAux = System.DateTime.Parse(s, System.Globalization.CultureInfo.CurrentCulture);
+ return GetDate(tempAux, resolution);
+ }
+
+ /// <summary>for testing DateTools support </summary>
+ private System.String GetDate(System.DateTime d, DateTools.Resolution resolution)
+ {
+ if (resolution == null)
+ {
+ return DateField.DateToString(d);
+ }
+ else
+ {
+ return DateTools.DateToString(d, resolution);
+ }
+ }
- public virtual System.String GetDate(System.String s)
+ public virtual System.String GetDate(System.String s)
{
System.DateTime tempAux = System.DateTime.Parse(s);
return DateField.DateToString(tempAux);
@@ -396,18 +507,67 @@
return temp.ToString("MM/d/yyy");
}
- [Test]
+ /// <summary>for testing legacy DateField support </summary>
+ [Test]
+ public virtual void TestLegacyDateRange()
+ {
+ System.String startDate = GetLocalizedDate(2002, 2, 1, false);
+ System.String endDate = GetLocalizedDate(2002, 2, 4, false);
+ System.Globalization.Calendar endDateExpected = new System.Globalization.GregorianCalendar();
+ // endDateExpected should be set to: "2002, 1, 4, 23, 59, 59, 999" otherwise what's the point of useing GregorianCalendar() // {{Aroush-2.1}}
+ System.DateTime tempAux = new System.DateTime(2002, 1, 4, 23, 59, 59, 999);
+ AssertQueryEquals("[ " + startDate + " TO " + endDate + "]", null, "[" + GetLegacyDate(startDate) + " TO " + DateField.DateToString(tempAux) + "]");
+ AssertQueryEquals("{ " + startDate + " " + endDate + " }", null, "{" + GetLegacyDate(startDate) + " TO " + GetLegacyDate(endDate) + "}");
+ }
+
+ [Test]
public virtual void TestDateRange()
{
System.String startDate = GetLocalizedDate(2002, 2, 1, false);
System.String endDate = GetLocalizedDate(2002, 2, 4, false);
- System.DateTime endDateExpected = new System.DateTime(2002, 2, 4, 23, 59, 59);
- endDateExpected = endDateExpected.AddMilliseconds(999);
- AssertQueryEquals("[ " + startDate + " TO " + endDate + "]", null, "[" + GetDate(startDate) + " TO " + DateField.DateToString(endDateExpected) + "]");
- AssertQueryEquals("{ " + startDate + " " + endDate + " }", null, "{" + GetDate(startDate) + " TO " + GetDate(endDate) + "}");
+ System.DateTime endDateExpected = new System.DateTime(2002, 2, 4, 23, 59, 59, 999);
+ System.String defaultField = "default";
+ System.String monthField = "month";
+ System.String hourField = "hour";
+ Lucene.Net.QueryParsers.QueryParser qp = new Lucene.Net.QueryParsers.QueryParser("field", new SimpleAnalyzer());
+
+ // Don't set any date resolution and verify if DateField is used
+ System.DateTime tempAux = endDateExpected;
+ AssertDateRangeQueryEquals(qp, defaultField, startDate, endDate, tempAux, null);
+
+ // set a field specific date resolution
+ qp.SetDateResolution(monthField, DateTools.Resolution.MONTH);
+
+ // DateField should still be used for defaultField
+ System.DateTime tempAux2 = endDateExpected;
+ AssertDateRangeQueryEquals(qp, defaultField, startDate, endDate, tempAux2, null);
+
+ // set default date resolution to MILLISECOND
+ qp.SetDateResolution(DateTools.Resolution.MILLISECOND);
+
+ // set second field specific date resolution
+ qp.SetDateResolution(hourField, DateTools.Resolution.HOUR);
+
+ // for this field no field specific date resolution has been set,
+ // so verify if the default resolution is used
+ System.DateTime tempAux3 = endDateExpected;
+ AssertDateRangeQueryEquals(qp, defaultField, startDate, endDate, tempAux3, DateTools.Resolution.MILLISECOND);
+
+ // verify if field specific date resolutions are used for these two fields
+ System.DateTime tempAux4 = endDateExpected;
+ AssertDateRangeQueryEquals(qp, monthField, startDate, endDate, tempAux4, DateTools.Resolution.MONTH);
+
+ System.DateTime tempAux5 = endDateExpected;
+ AssertDateRangeQueryEquals(qp, hourField, startDate, endDate, tempAux5, DateTools.Resolution.HOUR);
}
- [Test]
+ public virtual void AssertDateRangeQueryEquals(Lucene.Net.QueryParsers.QueryParser qp, System.String field, System.String startDate, System.String endDate, System.DateTime endDateInclusive, DateTools.Resolution resolution)
+ {
+ AssertQueryEquals(qp, field, field + ":[" + startDate + " TO " + endDate + "]", "[" + GetDate(startDate, resolution) + " TO " + GetDate(endDateInclusive, resolution) + "]");
+ AssertQueryEquals(qp, field, field + ":{" + startDate + " TO " + endDate + "}", "{" + GetDate(startDate, resolution) + " TO " + GetDate(endDate, resolution) + "}");
+ }
+
+ [Test]
public virtual void TestEscaped()
{
Analyzer a = new WhitespaceAnalyzer();
@@ -466,7 +626,51 @@
AssertQueryEquals("[ a\\- TO a\\+ ]", null, "[a- TO a+]");
AssertQueryEquals("[ a\\: TO a\\~ ]", null, "[a: TO a~]");
AssertQueryEquals("[ a\\\\ TO a\\* ]", null, "[a\\ TO a*]");
- }
+
+ AssertQueryEquals("[\"c\\:\\\\temp\\\\\\~foo0.txt\" TO \"c\\:\\\\temp\\\\\\~foo9.txt\"]", a, "[c:\\temp\\~foo0.txt TO c:\\temp\\~foo9.txt]");
+
+ AssertQueryEquals("a\\\\\\+b", a, "a\\+b");
+
+ AssertQueryEquals("a \\\"b c\\\" d", a, "a \"b c\" d");
+ AssertQueryEquals("\"a \\\"b c\\\" d\"", a, "\"a \"b c\" d\"");
+ AssertQueryEquals("\"a \\+b c d\"", a, "\"a +b c d\"");
+
+ AssertQueryEquals("c\\:\\\\temp\\\\\\~foo.txt", a, "c:\\temp\\~foo.txt");
+
+
+ try
+ {
+ AssertQueryEquals("XY\\", a, "XYZ");
+ Assert.Fail("ParseException expected, not thrown");
+ }
+ catch (ParseException expected)
+ {
+ }
+
+ // test unicode escaping
+ AssertQueryEquals("a\\u0062c", a, "abc");
+ AssertQueryEquals("XY\\u005a", a, "XYZ");
+ AssertQueryEquals("XY\\u005A", a, "XYZ");
+ AssertQueryEquals("\"a \\\\\\u0028\\u0062\\\" c\"", a, "\"a \\(b\" c\"");
+
+ try
+ {
+ AssertQueryEquals("XY\\u005G", a, "XYZ");
+ Assert.Fail("ParseException expected, not thrown");
+ }
+ catch (ParseException expected)
+ {
+ }
+
+ try
+ {
+ AssertQueryEquals("XY\\u005", a, "XYZ");
+ Assert.Fail("ParseException expected, not thrown");
+ }
+ catch (ParseException expected)
+ {
+ }
+ }
[Test]
public virtual void TestQueryStringEscaping()
@@ -645,6 +849,59 @@
AssertHits(1, "{12/1/2005 TO 12/4/2005}", is_Renamed);
AssertHits(0, "{12/3/2005 TO 12/4/2005}", is_Renamed);
is_Renamed.Close();
+ }
+
+ [Test]
+ public virtual void TestStarParsing()
+ {
+ int[] type = new int[1];
+ Lucene.Net.QueryParsers.QueryParser qp = new AnonymousClassQueryParser(type, this, "field", new WhitespaceAnalyzer());
+
+ TermQuery tq;
+
+ tq = (TermQuery) qp.Parse("foo:zoo*");
+ Assert.AreEqual("zoo", tq.GetTerm().Text());
+ Assert.AreEqual(2, type[0]);
+
+ tq = (TermQuery) qp.Parse("foo:zoo*^2");
+ Assert.AreEqual("zoo", tq.GetTerm().Text());
+ Assert.AreEqual(2, type[0]);
+ Assert.AreEqual(tq.GetBoost(), 2, 0);
+
+ tq = (TermQuery) qp.Parse("foo:*");
+ Assert.AreEqual("*", tq.GetTerm().Text());
+ Assert.AreEqual(1, type[0]); // could be a valid prefix query in the future too
+
+ tq = (TermQuery) qp.Parse("foo:*^2");
+ Assert.AreEqual("*", tq.GetTerm().Text());
+ Assert.AreEqual(1, type[0]);
+ Assert.AreEqual(tq.GetBoost(), 2, 0);
+
+ tq = (TermQuery) qp.Parse("*:foo");
+ Assert.AreEqual("*", tq.GetTerm().Field());
+ Assert.AreEqual("foo", tq.GetTerm().Text());
+ Assert.AreEqual(3, type[0]);
+
+ tq = (TermQuery) qp.Parse("*:*");
+ Assert.AreEqual("*", tq.GetTerm().Field());
+ Assert.AreEqual("*", tq.GetTerm().Text());
+ Assert.AreEqual(1, type[0]); // could be handled as a prefix query in the future
+
+ tq = (TermQuery) qp.Parse("(*:*)");
+ Assert.AreEqual("*", tq.GetTerm().Field());
+ Assert.AreEqual("*", tq.GetTerm().Text());
+ Assert.AreEqual(1, type[0]);
+ }
+
+ [Test]
+ public virtual void TestMatchAllDocs()
+ {
+ Lucene.Net.QueryParsers.QueryParser qp = new Lucene.Net.QueryParsers.QueryParser("field", new WhitespaceAnalyzer());
+ Assert.AreEqual(new MatchAllDocsQuery(), qp.Parse("*:*"));
+ Assert.AreEqual(new MatchAllDocsQuery(), qp.Parse("(*:*)"));
+ BooleanQuery bq = (BooleanQuery) qp.Parse("+*:* -*:*");
+ Assert.IsTrue(bq.GetClauses()[0].GetQuery() is MatchAllDocsQuery);
+ Assert.IsTrue(bq.GetClauses()[1].GetQuery() is MatchAllDocsQuery);
}
private void AssertHits(int expected, System.String query, Lucene.Net.Search.IndexSearcher is_Renamed)
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/BaseTestRangeFilter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/BaseTestRangeFilter.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/BaseTestRangeFilter.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/BaseTestRangeFilter.cs Sat Aug 11 09:56:37 2007
@@ -16,7 +16,9 @@
*/
using System;
+
using NUnit.Framework;
+
using SimpleAnalyzer = Lucene.Net.Analysis.SimpleAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/CheckHits.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/CheckHits.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/CheckHits.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/CheckHits.cs Sat Aug 11 09:56:37 2007
@@ -16,48 +16,142 @@
*/
using System;
+
using NUnit.Framework;
+using Directory = Lucene.Net.Store.Directory;
+using IndexReader = Lucene.Net.Index.IndexReader;
+
namespace Lucene.Net.Search
{
public class CheckHits
{
- /// <summary>Tests that a query has expected document number results.</summary>
- public static void CheckHits_Renamed_Method(Query query, System.String defaultFieldName, Searcher searcher, int[] results)
- {
- Hits hits = searcher.Search(query);
+ private class AnonymousClassHitCollector : HitCollector
+ {
+ public AnonymousClassHitCollector(System.Collections.Hashtable actual)
+ {
+ InitBlock(actual);
+ }
+ private void InitBlock(System.Collections.Hashtable actual)
+ {
+ this.actual = actual;
+ }
+ private System.Collections.Hashtable actual;
+ public override void Collect(int doc, float score)
+ {
+ actual.Add((System.Int32) doc, (System.Int32) doc);
+ }
+ }
+
+ /// <summary> Tests that all documents up to maxDoc which are *not* in the
+ /// expected result set, have an explanation which indicates no match
+ /// (ie: Explanation value of 0.0f)
+ /// </summary>
+ public static void CheckNoMatchExplanations(Query q, System.String defaultFieldName, Searcher searcher, int[] results)
+ {
- System.Collections.Hashtable correct = new System.Collections.Hashtable();
- for (int i = 0; i < results.Length; i++)
- {
- correct.Add((System.Int32) results[i], (System.Int32) results[i]);
- }
+ System.String d = q.ToString(defaultFieldName);
+ System.Collections.Hashtable ignore = new System.Collections.Hashtable();
+ for (int i = 0; i < results.Length; i++)
+ {
+ ignore.Add((System.Int32) results[i], (System.Int32) results[i]);
+ }
- System.Collections.Hashtable actual = new System.Collections.Hashtable();
- for (int i = 0; i < hits.Length(); i++)
- {
- actual.Add((System.Int32) hits.Id(i), (System.Int32) hits.Id(i));
- }
+ int maxDoc = searcher.MaxDoc();
+ for (int doc = 0; doc < maxDoc; doc++)
+ {
+ if (ignore.Contains((System.Int32) doc))
+ continue;
+
+ Explanation exp = searcher.Explain(q, doc);
+ Assert.IsNotNull(exp, "Explanation of [[" + d + "]] for #" + doc + " is null");
+ Assert.AreEqual(0.0f, exp.GetValue(), 0.0f, "Explanation of [[" + d + "]] for #" + doc + " doesn't indicate non-match: " + exp.ToString());
+ }
+ }
+
+ /// <summary> Tests that a query matches the an expected set of documents using a
+ /// HitCollector.
+ ///
+ /// <p>
+ /// Note that when using the HitCollector API, documents will be collected
+ /// if they "match" regardless of what their score is.
+ /// </p>
+ /// </summary>
+ /// <param name="query">the query to test
+ /// </param>
+ /// <param name="searcher">the searcher to test the query against
+ /// </param>
+ /// <param name="defaultFieldName">used for displaing the query in assertion messages
+ /// </param>
+ /// <param name="results">a list of documentIds that must match the query
+ /// </param>
+ /// <seealso cref="Searcher.Search(Query,HitCollector)">
+ /// </seealso>
+ /// <seealso cref="checkHits">
+ /// </seealso>
+ public static void CheckHitCollector(Query query, System.String defaultFieldName, Searcher searcher, int[] results)
+ {
- if (correct.Count != 0)
+ System.Collections.Hashtable correct = new System.Collections.Hashtable();
+ for (int i = 0; i < results.Length; i++)
{
- System.Collections.IDictionaryEnumerator iter = correct.GetEnumerator();
- System.Collections.IDictionaryEnumerator iter2 = actual.GetEnumerator();
- bool status = true;
- while (iter2.MoveNext() && iter.MoveNext())
- {
- if (iter2.Key.ToString() != iter.Key.ToString())
- {
- status = false;
- break;
- }
- }
- Assert.IsTrue(status, query.ToString(defaultFieldName));
+ correct.Add((System.Int32) results[i], (System.Int32) results[i]);
}
- }
+
+ System.Collections.Hashtable actual = new System.Collections.Hashtable();
+ searcher.Search(query, new AnonymousClassHitCollector(actual));
+ Assert.AreEqual(correct, actual, query.ToString(defaultFieldName));
+
+ QueryUtils.Check(query, searcher);
+ }
+
+ /// <summary> Tests that a query matches the an expected set of documents using Hits.
+ ///
+ /// <p>
+ /// Note that when using the Hits API, documents will only be returned
+ /// if they have a positive normalized score.
+ /// </p>
+ /// </summary>
+ /// <param name="query">the query to test
+ /// </param>
+ /// <param name="searcher">the searcher to test the query against
+ /// </param>
+ /// <param name="defaultFieldName">used for displaing the query in assertion messages
+ /// </param>
+ /// <param name="results">a list of documentIds that must match the query
+ /// </param>
+ /// <seealso cref="Searcher.Search(Query)">
+ /// </seealso>
+ /// <seealso cref="CheckHitCollector">
+ /// </seealso>
+ public static void CheckHits_Renamed(Query query, System.String defaultFieldName, Searcher searcher, int[] results)
+ {
+ if (searcher is IndexSearcher)
+ {
+ QueryUtils.Check(query, (IndexSearcher) searcher);
+ }
+
+ Hits hits = searcher.Search(query);
+
+ System.Collections.Hashtable correct = new System.Collections.Hashtable();
+ for (int i = 0; i < results.Length; i++)
+ {
+ correct.Add((System.Int32) results[i], (System.Int32) results[i]);
+ }
+
+ System.Collections.Hashtable actual = new System.Collections.Hashtable();
+ for (int i = 0; i < hits.Length(); i++)
+ {
+ actual.Add((System.Int32) hits.Id(i), (System.Int32) hits.Id(i));
+ }
+
+ Assert.AreEqual(correct, actual, query.ToString(defaultFieldName));
+
+ QueryUtils.Check(query, searcher);
+ }
- /// <summary>Tests that a Hits has an expected order of documents </summary>
+ /// <summary>Tests that a Hits has an expected order of documents </summary>
public static void CheckDocIds(System.String mes, int[] results, Hits hits)
{
Assert.AreEqual(results.Length, hits.Length(), mes + " nr of hits");
@@ -154,5 +248,119 @@
}
return sb.ToString();
}
- }
+
+ /// <summary> Asserts that the score explanation for every document matching a
+ /// query corrisponds with the true score.
+ ///
+ /// </summary>
+ /// <seealso cref="ExplanationAsserter">
+ /// </seealso>
+ /// <param name="query">the query to test
+ /// </param>
+ /// <param name="searcher">the searcher to test the query against
+ /// </param>
+ /// <param name="defaultFieldName">used for displaing the query in assertion messages
+ /// </param>
+ public static void CheckExplanations(Query query, System.String defaultFieldName, Searcher searcher)
+ {
+
+ searcher.Search(query, new ExplanationAsserter(query, defaultFieldName, searcher));
+ }
+
+ /// <summary> an IndexSearcher that implicitly checks hte explanation of every match
+ /// whenever it executes a search
+ /// </summary>
+ public class ExplanationAssertingSearcher : IndexSearcher
+ {
+ public ExplanationAssertingSearcher(Directory d) : base(d)
+ {
+ }
+ public ExplanationAssertingSearcher(IndexReader r) : base(r)
+ {
+ }
+ protected internal virtual void CheckExplanations(Query q)
+ {
+ base.Search(q, null, new ExplanationAsserter(q, null, this));
+ }
+ public virtual Hits search(Query query, Filter filter)
+ {
+ CheckExplanations(query);
+ return base.Search(query, filter);
+ }
+ public override Hits Search(Query query, Sort sort)
+ {
+ CheckExplanations(query);
+ return base.Search(query, sort);
+ }
+ public override Hits Search(Query query, Filter filter, Sort sort)
+ {
+ CheckExplanations(query);
+ return base.Search(query, filter, sort);
+ }
+ public override TopFieldDocs Search(Query query, Filter filter, int n, Sort sort)
+ {
+
+ CheckExplanations(query);
+ return base.Search(query, filter, n, sort);
+ }
+ public override void Search(Query query, HitCollector results)
+ {
+ CheckExplanations(query);
+ base.Search(query, results);
+ }
+ public override void Search(Query query, Filter filter, HitCollector results)
+ {
+ CheckExplanations(query);
+ base.Search(query, filter, results);
+ }
+ public override TopDocs Search(Query query, Filter filter, int n)
+ {
+
+ CheckExplanations(query);
+ return base.Search(query, filter, n);
+ }
+ }
+
+ /// <summary> Asserts that the score explanation for every document matching a
+ /// query corrisponds with the true score.
+ ///
+ /// NOTE: this HitCollector should only be used with the Query and Searcher
+ /// specified at when it is constructed.
+ /// </summary>
+ public class ExplanationAsserter : HitCollector
+ {
+
+ /// <summary> Some explains methods calculate their vlaues though a slightly
+ /// differnet order of operations from the acctaul scoring method ...
+ /// this allows for a small amount of variation
+ /// </summary>
+ public static float SCORE_TOLERANCE_DELTA = 0.00005f;
+
+ internal Query q;
+ internal Searcher s;
+ internal System.String d;
+ public ExplanationAsserter(Query q, System.String defaultFieldName, Searcher s)
+ {
+ this.q = q;
+ this.s = s;
+ this.d = q.ToString(defaultFieldName);
+ }
+ public override void Collect(int doc, float score)
+ {
+ Explanation exp = null;
+
+ try
+ {
+ exp = s.Explain(q, doc);
+ }
+ catch (System.IO.IOException e)
+ {
+ throw new System.SystemException("exception in hitcollector of [[" + d + "]] for #" + doc, e);
+ }
+
+ Assert.IsNotNull(exp, "Explanation of [[" + d + "]] for #" + doc + " is null");
+ Assert.AreEqual(score, exp.GetValue(), SCORE_TOLERANCE_DELTA, "Score of [[" + d + "]] for #" + doc + " does not match explanation: " + exp.ToString());
+ }
+ }
+ }
}
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/MockFilter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/MockFilter.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/MockFilter.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/MockFilter.cs Sat Aug 11 09:56:37 2007
@@ -16,6 +16,7 @@
*/
using System;
+
using IndexReader = Lucene.Net.Index.IndexReader;
namespace Lucene.Net.Search
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/QueryUtils.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/QueryUtils.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/QueryUtils.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/QueryUtils.cs Sat Aug 11 09:56:37 2007
@@ -36,8 +36,51 @@
return null;
}
}
+
+ private class AnonymousClassHitCollector : HitCollector
+ {
+ public AnonymousClassHitCollector(int[] which, Lucene.Net.Search.Scorer scorer, int[] sdoc, float maxDiff, Lucene.Net.Search.Query q, Lucene.Net.Search.IndexSearcher s)
+ {
+ InitBlock(which, scorer, sdoc, maxDiff, q, s);
+ }
+ private void InitBlock(int[] which, Lucene.Net.Search.Scorer scorer, int[] sdoc, float maxDiff, Lucene.Net.Search.Query q, Lucene.Net.Search.IndexSearcher s)
+ {
+ this.which = which;
+ this.scorer = scorer;
+ this.sdoc = sdoc;
+ this.maxDiff = maxDiff;
+ this.q = q;
+ this.s = s;
+ }
+ private int[] which;
+ private Lucene.Net.Search.Scorer scorer;
+ private int[] sdoc;
+ private float maxDiff;
+ private Lucene.Net.Search.Query q;
+ private Lucene.Net.Search.IndexSearcher s;
+ public override void Collect(int doc, float score)
+ {
+ try
+ {
+ bool more = (which[0]++ & 0x02) == 0?scorer.SkipTo(sdoc[0] + 1):scorer.Next();
+ sdoc[0] = scorer.Doc();
+ float scorerScore = scorer.Score();
+ float scoreDiff = System.Math.Abs(score - scorerScore);
+ scoreDiff = 0; // TODO: remove this go get LUCENE-697
+ // failures
+ if (more == false || doc != sdoc[0] || scoreDiff > maxDiff)
+ {
+ throw new System.SystemException("ERROR matching docs:" + "\n\tscorer.more=" + more + " doc=" + sdoc[0] + " score=" + scorerScore + "\n\thitCollector.doc=" + doc + " score=" + score + "\n\t Scorer=" + scorer + "\n\t Query=" + q + "\n\t Searcher=" + s);
+ }
+ }
+ catch (System.IO.IOException e)
+ {
+ throw new System.SystemException("", e);
+ }
+ }
+ }
- /// <summary>Check the types of things query objects should be able to do. </summary>
+ /// <summary>Check the types of things query objects should be able to do. </summary>
public static void Check(Query q)
{
CheckHashEquals(q);
@@ -75,5 +118,46 @@
// happens, please change test to use a different example.
Assert.IsTrue(q1.GetHashCode() != q2.GetHashCode());
}
- }
+
+ /// <summary>various query sanity checks on a searcher </summary>
+ public static void Check(Query q1, Searcher s)
+ {
+ try
+ {
+ Check(q1);
+ if (s != null && s is IndexSearcher)
+ {
+ IndexSearcher is_Renamed = (IndexSearcher) s;
+ CheckSkipTo(q1, is_Renamed);
+ }
+ }
+ catch (System.IO.IOException e)
+ {
+ throw new System.SystemException("", e);
+ }
+ }
+
+ /// <summary> alternate scorer skipTo(),skipTo(),next(),next(),skipTo(),skipTo(), etc
+ /// and ensure a hitcollector receives same docs and scores
+ /// </summary>
+ public static void CheckSkipTo(Query q, IndexSearcher s)
+ {
+ // System.out.println("Checking "+q);
+ Weight w = q.Weight(s);
+ Scorer scorer = w.Scorer(s.GetIndexReader());
+
+ // FUTURE: ensure scorer.doc()==-1
+
+ if (BooleanQuery.GetUseScorer14())
+ return ; // 1.4 doesn't support skipTo
+
+ int[] which = new int[1];
+ int[] sdoc = new int[]{- 1};
+ float maxDiff = 1e-5f;
+ s.Search(q, new AnonymousClassHitCollector(which, scorer, sdoc, maxDiff, q, s));
+
+ // make sure next call to scorer is false.
+ Assert.IsFalse((which[0]++ & 0x02) == 0 ? scorer.SkipTo(sdoc[0] + 1) : scorer.Next());
+ }
+ }
}
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/SampleComparable.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/SampleComparable.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/SampleComparable.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/SampleComparable.cs Sat Aug 11 09:56:37 2007
@@ -16,6 +16,7 @@
*/
using System;
+
using IndexReader = Lucene.Net.Index.IndexReader;
using Term = Lucene.Net.Index.Term;
using TermDocs = Lucene.Net.Index.TermDocs;
@@ -43,8 +44,8 @@
/// </summary>
/// <author> Tim Jones
/// </author>
- /// <version> $Id: SampleComparable.java 150348 2004-05-19 23:05:27Z tjones $
- /// </version>
+ /// <version> $Id: SampleComparable.java 472959 2006-11-09 16:21:50Z yonik $
+ /// </version>
/// <since> 1.4
/// </since>
[Serializable]
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/SingleDocTestFilter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/SingleDocTestFilter.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/SingleDocTestFilter.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/SingleDocTestFilter.cs Sat Aug 11 09:56:37 2007
@@ -16,6 +16,7 @@
*/
using System;
+
using IndexReader = Lucene.Net.Index.IndexReader;
namespace Lucene.Net.search
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestBasics.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/Spans/TestBasics.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestBasics.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestBasics.cs Sat Aug 11 09:56:37 2007
@@ -16,16 +16,18 @@
*/
using System;
+
using NUnit.Framework;
+
+using English = Lucene.Net.Util.English;
using SimpleAnalyzer = Lucene.Net.Analysis.SimpleAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
using IndexWriter = Lucene.Net.Index.IndexWriter;
using Term = Lucene.Net.Index.Term;
+using RAMDirectory = Lucene.Net.Store.RAMDirectory;
using Lucene.Net.Search;
using Searchable = Lucene.Net.Search.Searchable;
-using RAMDirectory = Lucene.Net.Store.RAMDirectory;
-using English = Lucene.Net.Util.English;
namespace Lucene.Net.Search.Spans
{
@@ -330,8 +332,7 @@
private void CheckHits(Query query, int[] results)
{
- Lucene.Net.Search.CheckHits.CheckHits_Renamed_Method(query, "field", searcher, results);
- QueryUtils.Check(query);
+ Lucene.Net.Search.CheckHits.CheckHits_Renamed(query, "field", searcher, results);
}
}
}
Added: incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestNearSpansOrdered.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/Spans/TestNearSpansOrdered.cs?view=auto&rev=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestNearSpansOrdered.cs (added)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestNearSpansOrdered.cs Sat Aug 11 09:56:37 2007
@@ -0,0 +1,197 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+
+using NUnit.Framework;
+
+using Explanation = Lucene.Net.Search.Explanation;
+using IndexSearcher = Lucene.Net.Search.IndexSearcher;
+using Scorer = Lucene.Net.Search.Scorer;
+using Weight = Lucene.Net.Search.Weight;
+using CheckHits = Lucene.Net.Search.CheckHits;
+using RAMDirectory = Lucene.Net.Store.RAMDirectory;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using Term = Lucene.Net.Index.Term;
+using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
+using Document = Lucene.Net.Documents.Document;
+using Field = Lucene.Net.Documents.Field;
+using QueryParser = Lucene.Net.QueryParsers.QueryParser;
+
+namespace Lucene.Net.Search.Spans
+{
+
+ [TestFixture]
+ public class TestNearSpansOrdered
+ {
+ protected internal IndexSearcher searcher;
+
+ public const System.String FIELD = "field";
+ public static readonly Lucene.Net.QueryParsers.QueryParser qp = new Lucene.Net.QueryParsers.QueryParser(FIELD, new WhitespaceAnalyzer());
+
+ [TearDown]
+ public virtual void TearDown()
+ {
+ searcher.Close();
+ }
+
+ [SetUp]
+ public virtual void SetUp()
+ {
+ RAMDirectory directory = new RAMDirectory();
+ IndexWriter writer = new IndexWriter(directory, new WhitespaceAnalyzer(), true);
+ for (int i = 0; i < docFields.Length; i++)
+ {
+ Document doc = new Document();
+ doc.Add(new Field(FIELD, docFields[i], Field.Store.NO, Field.Index.TOKENIZED));
+ writer.AddDocument(doc);
+ }
+ writer.Close();
+ searcher = new IndexSearcher(directory);
+ }
+
+ protected internal System.String[] docFields = new System.String[]{"w1 w2 w3 w4 w5", "w1 w3 w2 w3 zz", "w1 xx w2 yy w3", "w1 w3 xx w2 yy w3 zz"};
+
+ protected internal virtual SpanNearQuery MakeQuery(System.String s1, System.String s2, System.String s3, int slop, bool inOrder)
+ {
+ return new SpanNearQuery(new SpanQuery[]{new SpanTermQuery(new Term(FIELD, s1)), new SpanTermQuery(new Term(FIELD, s2)), new SpanTermQuery(new Term(FIELD, s3))}, slop, inOrder);
+ }
+
+ protected internal virtual SpanNearQuery MakeQuery()
+ {
+ return MakeQuery("w1", "w2", "w3", 1, true);
+ }
+
+ [Test]
+ public virtual void TestSpanNearQuery()
+ {
+ SpanNearQuery q = MakeQuery();
+ CheckHits.CheckHits_Renamed(q, FIELD, searcher, new int[]{0, 1});
+ }
+
+ public virtual System.String S(Spans span)
+ {
+ return S(span.Doc(), span.Start(), span.End());
+ }
+
+ public virtual System.String S(int doc, int start, int end)
+ {
+ return "s(" + doc + "," + start + "," + end + ")";
+ }
+
+ [Test]
+ public virtual void TestNearSpansNext()
+ {
+ SpanNearQuery q = MakeQuery();
+ Spans span = q.GetSpans(searcher.GetIndexReader());
+ Assert.AreEqual(true, span.Next());
+ Assert.AreEqual(S(0, 0, 3), S(span));
+ Assert.AreEqual(true, span.Next());
+ Assert.AreEqual(S(1, 0, 4), S(span));
+ Assert.AreEqual(false, span.Next());
+ }
+
+ /// <summary> test does not imply that skipTo(doc+1) should work exactly the
+ /// same as next -- it's only applicable in this case since we know doc
+ /// does not contain more than one span
+ /// </summary>
+ [Test]
+ public virtual void TestNearSpansSkipToLikeNext()
+ {
+ SpanNearQuery q = MakeQuery();
+ Spans span = q.GetSpans(searcher.GetIndexReader());
+ Assert.AreEqual(true, span.SkipTo(0));
+ Assert.AreEqual(S(0, 0, 3), S(span));
+ Assert.AreEqual(true, span.SkipTo(1));
+ Assert.AreEqual(S(1, 0, 4), S(span));
+ Assert.AreEqual(false, span.SkipTo(2));
+ }
+
+ [Test]
+ public virtual void TestNearSpansNextThenSkipTo()
+ {
+ SpanNearQuery q = MakeQuery();
+ Spans span = q.GetSpans(searcher.GetIndexReader());
+ Assert.AreEqual(true, span.Next());
+ Assert.AreEqual(S(0, 0, 3), S(span));
+ Assert.AreEqual(true, span.SkipTo(1));
+ Assert.AreEqual(S(1, 0, 4), S(span));
+ Assert.AreEqual(false, span.Next());
+ }
+
+ [Test]
+ public virtual void TestNearSpansNextThenSkipPast()
+ {
+ SpanNearQuery q = MakeQuery();
+ Spans span = q.GetSpans(searcher.GetIndexReader());
+ Assert.AreEqual(true, span.Next());
+ Assert.AreEqual(S(0, 0, 3), S(span));
+ Assert.AreEqual(false, span.SkipTo(2));
+ }
+
+ [Test]
+ public virtual void TestNearSpansSkipPast()
+ {
+ SpanNearQuery q = MakeQuery();
+ Spans span = q.GetSpans(searcher.GetIndexReader());
+ Assert.AreEqual(false, span.SkipTo(2));
+ }
+
+ [Test]
+ public virtual void TestNearSpansSkipTo0()
+ {
+ SpanNearQuery q = MakeQuery();
+ Spans span = q.GetSpans(searcher.GetIndexReader());
+ Assert.AreEqual(true, span.SkipTo(0));
+ Assert.AreEqual(S(0, 0, 3), S(span));
+ }
+
+ [Test]
+ public virtual void TestNearSpansSkipTo1()
+ {
+ SpanNearQuery q = MakeQuery();
+ Spans span = q.GetSpans(searcher.GetIndexReader());
+ Assert.AreEqual(true, span.SkipTo(1));
+ Assert.AreEqual(S(1, 0, 4), S(span));
+ }
+
+ /// <summary> not a direct test of NearSpans, but a demonstration of how/when
+ /// this causes problems
+ /// </summary>
+ [Test]
+ public virtual void TestSpanNearScorerSkipTo1()
+ {
+ SpanNearQuery q = MakeQuery();
+ Weight w = q.CreateWeight_ForNUnitTest(searcher);
+ Scorer s = w.Scorer(searcher.GetIndexReader());
+ Assert.AreEqual(true, s.SkipTo(1));
+ Assert.AreEqual(1, s.Doc());
+ }
+ /// <summary> not a direct test of NearSpans, but a demonstration of how/when
+ /// this causes problems
+ /// </summary>
+ [Test]
+ public virtual void TestSpanNearScorerExplain()
+ {
+ SpanNearQuery q = MakeQuery();
+ Weight w = q.CreateWeight_ForNUnitTest(searcher);
+ Scorer s = w.Scorer(searcher.GetIndexReader());
+ Explanation e = s.Explain(1);
+ Assert.IsTrue(0.0f < e.GetValue(), "Scorer explanation value for doc#1 isn't positive: " + e.ToString());
+ }
+ }
+}
\ No newline at end of file
Added: incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpanExplanations.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/Spans/TestSpanExplanations.cs?view=auto&rev=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpanExplanations.cs (added)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpanExplanations.cs Sat Aug 11 09:56:37 2007
@@ -0,0 +1,274 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+
+using NUnit.Framework;
+
+using Lucene.Net.Search;
+using Searchable = Lucene.Net.Search.Searchable;
+using RAMDirectory = Lucene.Net.Store.RAMDirectory;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using IndexReader = Lucene.Net.Index.IndexReader;
+using Term = Lucene.Net.Index.Term;
+using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
+using Document = Lucene.Net.Documents.Document;
+using Field = Lucene.Net.Documents.Field;
+using QueryParser = Lucene.Net.QueryParsers.QueryParser;
+using ParseException = Lucene.Net.QueryParsers.ParseException;
+
+namespace Lucene.Net.Search.Spans
+{
+
+ /// <summary> TestExplanations subclass focusing on span queries</summary>
+ [TestFixture]
+ public class TestSpanExplanations : TestExplanations
+ {
+
+ /* simple SpanTermQueries */
+ [Test]
+ public virtual void TestST1()
+ {
+ SpanQuery q = St("w1");
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestST2()
+ {
+ SpanQuery q = St("w1");
+ q.SetBoost(1000);
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestST4()
+ {
+ SpanQuery q = St("xx");
+ Qtest(q, new int[]{2, 3});
+ }
+
+ [Test]
+ public virtual void TestST5()
+ {
+ SpanQuery q = St("xx");
+ q.SetBoost(1000);
+ Qtest(q, new int[]{2, 3});
+ }
+
+ /* some SpanFirstQueries */
+
+ [Test]
+ public virtual void TestSF1()
+ {
+ SpanQuery q = Sf(("w1"), 1);
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSF2()
+ {
+ SpanQuery q = Sf(("w1"), 1);
+ q.SetBoost(1000);
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSF4()
+ {
+ SpanQuery q = Sf(("xx"), 2);
+ Qtest(q, new int[]{2});
+ }
+
+ [Test]
+ public virtual void TestSF5()
+ {
+ SpanQuery q = Sf(("yy"), 2);
+ Qtest(q, new int[]{});
+ }
+
+ [Test]
+ public virtual void TestSF6()
+ {
+ SpanQuery q = Sf(("yy"), 4);
+ q.SetBoost(1000);
+ Qtest(q, new int[]{2});
+ }
+
+ /* some SpanOrQueries */
+
+ [Test]
+ public virtual void TestSO1()
+ {
+ SpanQuery q = Sor("w1", "QQ");
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSO2()
+ {
+ SpanQuery q = Sor("w1", "w3", "zz");
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSO3()
+ {
+ SpanQuery q = Sor("w5", "QQ", "yy");
+ Qtest(q, new int[]{0, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSO4()
+ {
+ SpanQuery q = Sor("w5", "QQ", "yy");
+ Qtest(q, new int[]{0, 2, 3});
+ }
+
+
+
+ /* some SpanNearQueries */
+
+ [Test]
+ public virtual void TestSNear1()
+ {
+ SpanQuery q = Snear("w1", "QQ", 100, true);
+ Qtest(q, new int[]{});
+ }
+
+ [Test]
+ public virtual void TestSNear2()
+ {
+ SpanQuery q = Snear("w1", "xx", 100, true);
+ Qtest(q, new int[]{2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNear3()
+ {
+ SpanQuery q = Snear("w1", "xx", 0, true);
+ Qtest(q, new int[]{2});
+ }
+
+ [Test]
+ public virtual void TestSNear4()
+ {
+ SpanQuery q = Snear("w1", "xx", 1, true);
+ Qtest(q, new int[]{2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNear5()
+ {
+ SpanQuery q = Snear("xx", "w1", 0, false);
+ Qtest(q, new int[]{2});
+ }
+
+ [Test]
+ public virtual void TestSNear6()
+ {
+ SpanQuery q = Snear("w1", "w2", "QQ", 100, true);
+ Qtest(q, new int[]{});
+ }
+
+ [Test]
+ public virtual void TestSNear7()
+ {
+ SpanQuery q = Snear("w1", "xx", "w2", 100, true);
+ Qtest(q, new int[]{2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNear8()
+ {
+ SpanQuery q = Snear("w1", "xx", "w2", 0, true);
+ Qtest(q, new int[]{2});
+ }
+
+ [Test]
+ public virtual void TestSNear9()
+ {
+ SpanQuery q = Snear("w1", "xx", "w2", 1, true);
+ Qtest(q, new int[]{2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNear10()
+ {
+ SpanQuery q = Snear("xx", "w1", "w2", 0, false);
+ Qtest(q, new int[]{2});
+ }
+
+ [Test]
+ public virtual void TestSNear11()
+ {
+ SpanQuery q = Snear("w1", "w2", "w3", 1, true);
+ Qtest(q, new int[]{0, 1});
+ }
+
+
+ /* some SpanNotQueries */
+
+ [Test]
+ public virtual void TestSNot1()
+ {
+ SpanQuery q = Snot(Sf("w1", 10), St("QQ"));
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot2()
+ {
+ SpanQuery q = Snot(Sf("w1", 10), St("QQ"));
+ q.SetBoost(1000);
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot4()
+ {
+ SpanQuery q = Snot(Sf("w1", 10), St("xx"));
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot5()
+ {
+ SpanQuery q = Snot(Sf("w1", 10), St("xx"));
+ q.SetBoost(1000);
+ Qtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot7()
+ {
+ SpanQuery f = Snear("w1", "w3", 10, true);
+ f.SetBoost(1000);
+ SpanQuery q = Snot(f, St("xx"));
+ Qtest(q, new int[]{0, 1, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot10()
+ {
+ SpanQuery t = St("xx");
+ t.SetBoost(10000);
+ SpanQuery q = Snot(Snear("w1", "w3", 10, true), t);
+ Qtest(q, new int[]{0, 1, 3});
+ }
+ }
+}
\ No newline at end of file
Added: incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpanExplanationsOfNonMatches.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/Spans/TestSpanExplanationsOfNonMatches.cs?view=auto&rev=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpanExplanationsOfNonMatches.cs (added)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpanExplanationsOfNonMatches.cs Sat Aug 11 09:56:37 2007
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+
+using Query = Lucene.Net.Search.Query;
+using CheckHits = Lucene.Net.Search.CheckHits;
+
+namespace Lucene.Net.Search.Spans
+{
+
+
+ /// <summary> subclass of TestSimpleExplanations that verifies non matches.</summary>
+ public class TestSpanExplanationsOfNonMatches : TestSpanExplanations
+ {
+
+ /// <summary> Overrides superclass to ignore matches and focus on non-matches
+ ///
+ /// </summary>
+ /// <seealso cref="CheckHits.checkNoMatchExplanations">
+ /// </seealso>
+ public override void Qtest(Query q, int[] expDocNrs)
+ {
+ CheckHits.CheckNoMatchExplanations(q, FIELD, searcher, expDocNrs);
+ }
+ }
+}
\ No newline at end of file
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpans.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/Spans/TestSpans.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpans.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpans.cs Sat Aug 11 09:56:37 2007
@@ -16,16 +16,18 @@
*/
using System;
-using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
-using Document = Lucene.Net.Documents.Document;
-using Field = Lucene.Net.Documents.Field;
-using IndexWriter = Lucene.Net.Index.IndexWriter;
-using Term = Lucene.Net.Index.Term;
-using CheckHits = Lucene.Net.Search.CheckHits;
+
+using NUnit.Framework;
+
using IndexSearcher = Lucene.Net.Search.IndexSearcher;
using Query = Lucene.Net.Search.Query;
+using CheckHits = Lucene.Net.Search.CheckHits;
using RAMDirectory = Lucene.Net.Store.RAMDirectory;
-using NUnit.Framework;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using Term = Lucene.Net.Index.Term;
+using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
+using Document = Lucene.Net.Documents.Document;
+using Field = Lucene.Net.Documents.Field;
namespace Lucene.Net.Search.Spans
{
@@ -61,7 +63,7 @@
private void CheckHits(Query query, int[] results)
{
- Lucene.Net.Search.CheckHits.CheckHits_Renamed_Method(query, field, searcher, results);
+ Lucene.Net.Search.CheckHits.CheckHits_Renamed(query, field, searcher, results);
}
private void OrderedSlopTest3SQ(SpanQuery q1, SpanQuery q2, SpanQuery q3, int slop, int[] expectedDocs)
@@ -190,5 +192,86 @@
Assert.IsFalse(spans.Next(), "third range");
}
- }
+
+
+ private Spans OrSpans(System.String[] terms)
+ {
+ SpanQuery[] sqa = new SpanQuery[terms.Length];
+ for (int i = 0; i < terms.Length; i++)
+ {
+ sqa[i] = MakeSpanTermQuery(terms[i]);
+ }
+ return (new SpanOrQuery(sqa)).GetSpans(searcher.GetIndexReader());
+ }
+
+ private void TstNextSpans(Spans spans, int doc, int start, int end)
+ {
+ Assert.IsTrue(spans.Next(), "next");
+ Assert.AreEqual(doc, spans.Doc(), "doc");
+ Assert.AreEqual(start, spans.Start(), "start");
+ Assert.AreEqual(end, spans.End(), "end");
+ }
+
+ [Test]
+ public virtual void TestSpanOrEmpty()
+ {
+ Spans spans = OrSpans(new System.String[0]);
+ Assert.IsFalse(spans.Next(), "empty next");
+ }
+
+ [Test]
+ public virtual void TestSpanOrSingle()
+ {
+ Spans spans = OrSpans(new System.String[]{"w5"});
+ TstNextSpans(spans, 0, 4, 5);
+ Assert.IsFalse(spans.Next(), "final next");
+ }
+
+ [Test]
+ public virtual void TestSpanOrDouble()
+ {
+ Spans spans = OrSpans(new System.String[]{"w5", "yy"});
+ TstNextSpans(spans, 0, 4, 5);
+ TstNextSpans(spans, 2, 3, 4);
+ TstNextSpans(spans, 3, 4, 5);
+ TstNextSpans(spans, 7, 3, 4);
+ Assert.IsFalse(spans.Next(), "final next");
+ }
+
+ [Test]
+ public virtual void TestSpanOrDoubleSkip()
+ {
+ Spans spans = OrSpans(new System.String[]{"w5", "yy"});
+ Assert.IsTrue(spans.SkipTo(3), "initial skipTo");
+ Assert.AreEqual(3, spans.Doc(), "doc");
+ Assert.AreEqual(4, spans.Start(), "start");
+ Assert.AreEqual(5, spans.End(), "end");
+ TstNextSpans(spans, 7, 3, 4);
+ Assert.IsFalse(spans.Next(), "final next");
+ }
+
+ [Test]
+ public virtual void TestSpanOrUnused()
+ {
+ Spans spans = OrSpans(new System.String[]{"w5", "unusedTerm", "yy"});
+ TstNextSpans(spans, 0, 4, 5);
+ TstNextSpans(spans, 2, 3, 4);
+ TstNextSpans(spans, 3, 4, 5);
+ TstNextSpans(spans, 7, 3, 4);
+ Assert.IsFalse(spans.Next(), "final next");
+ }
+
+ [Test]
+ public virtual void TestSpanOrTripleSameDoc()
+ {
+ Spans spans = OrSpans(new System.String[]{"t1", "t2", "t3"});
+ TstNextSpans(spans, 11, 0, 1);
+ TstNextSpans(spans, 11, 1, 2);
+ TstNextSpans(spans, 11, 2, 3);
+ TstNextSpans(spans, 11, 3, 4);
+ TstNextSpans(spans, 11, 4, 5);
+ TstNextSpans(spans, 11, 5, 6);
+ Assert.IsFalse(spans.Next(), "final next");
+ }
+ }
}
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpansAdvanced.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/Spans/TestSpansAdvanced.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpansAdvanced.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpansAdvanced.cs Sat Aug 11 09:56:37 2007
@@ -16,17 +16,16 @@
*/
using System;
+
using NUnit.Framework;
+
using StandardAnalyzer = Lucene.Net.Analysis.Standard.StandardAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
using IndexWriter = Lucene.Net.Index.IndexWriter;
using Term = Lucene.Net.Index.Term;
-using BooleanClause = Lucene.Net.Search.BooleanClause;
-using BooleanQuery = Lucene.Net.Search.BooleanQuery;
-using Hits = Lucene.Net.Search.Hits;
-using IndexSearcher = Lucene.Net.Search.IndexSearcher;
-using Query = Lucene.Net.Search.Query;
+using Lucene.Net.Search;
+using Searchable = Lucene.Net.Search.Searchable;
using Directory = Lucene.Net.Store.Directory;
using RAMDirectory = Lucene.Net.Store.RAMDirectory;
@@ -139,6 +138,8 @@
/// <throws> IOException </throws>
protected internal virtual void AssertHits(Searcher s, Query query, System.String description, System.String[] expectedIds, float[] expectedScores)
{
+ QueryUtils.Check(query, s);
+
float tolerance = 1e-5f;
// Hits hits = searcher.search(query);
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpansAdvanced2.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/Spans/TestSpansAdvanced2.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpansAdvanced2.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/Spans/TestSpansAdvanced2.cs Sat Aug 11 09:56:37 2007
@@ -16,15 +16,15 @@
*/
using System;
+
using NUnit.Framework;
+
using StandardAnalyzer = Lucene.Net.Analysis.Standard.StandardAnalyzer;
using IndexReader = Lucene.Net.Index.IndexReader;
using IndexWriter = Lucene.Net.Index.IndexWriter;
using Term = Lucene.Net.Index.Term;
-using BooleanClause = Lucene.Net.Search.BooleanClause;
-using BooleanQuery = Lucene.Net.Search.BooleanQuery;
-using Hits = Lucene.Net.Search.Hits;
-using Query = Lucene.Net.Search.Query;
+using Lucene.Net.Search;
+using Searchable = Lucene.Net.Search.Searchable;
namespace Lucene.Net.Search.Spans
{
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestBoolean2.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestBoolean2.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestBoolean2.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestBoolean2.cs Sat Aug 11 09:56:37 2007
@@ -16,15 +16,17 @@
*/
using System;
+
+using NUnit.Framework;
+
+using RAMDirectory = Lucene.Net.Store.RAMDirectory;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using Term = Lucene.Net.Index.Term;
using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
-using IndexWriter = Lucene.Net.Index.IndexWriter;
-using Term = Lucene.Net.Index.Term;
-using ParseException = Lucene.Net.QueryParsers.ParseException;
using QueryParser = Lucene.Net.QueryParsers.QueryParser;
-using RAMDirectory = Lucene.Net.Store.RAMDirectory;
-using NUnit.Framework;
+using ParseException = Lucene.Net.QueryParsers.ParseException;
namespace Lucene.Net.Search
{
@@ -84,7 +86,8 @@
public virtual Query MakeQuery(System.String queryText)
{
- return (new Lucene.Net.QueryParsers.QueryParser(field, new WhitespaceAnalyzer())).Parse(queryText);
+ Query q = (new Lucene.Net.QueryParsers.QueryParser(field, new WhitespaceAnalyzer())).Parse(queryText);
+ return q;
}
public virtual void QueriesTest(System.String queryText, int[] expDocNrs)
@@ -214,7 +217,10 @@
Sort sort = Sort.INDEXORDER;
BooleanQuery.SetUseScorer14(false);
- Hits hits1 = searcher.Search(q1, sort);
+
+ QueryUtils.Check(q1, searcher);
+
+ Hits hits1 = searcher.Search(q1, sort);
if (hits1.Length() > 0)
hits1.Id(hits1.Length() - 1);
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanMinShouldMatch.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestBooleanMinShouldMatch.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanMinShouldMatch.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanMinShouldMatch.cs Sat Aug 11 09:56:37 2007
@@ -16,17 +16,17 @@
*/
using System;
+
+using NUnit.Framework;
+
using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
using IndexReader = Lucene.Net.Index.IndexReader;
using IndexWriter = Lucene.Net.Index.IndexWriter;
using Term = Lucene.Net.Index.Term;
-using ParseException = Lucene.Net.QueryParsers.ParseException;
-using QueryParser = Lucene.Net.QueryParsers.QueryParser;
using Directory = Lucene.Net.Store.Directory;
using RAMDirectory = Lucene.Net.Store.RAMDirectory;
-using NUnit.Framework;
namespace Lucene.Net.Search
{
@@ -116,7 +116,8 @@
PrintHits("TestBooleanMinShouldMatch", h); // PrintHits(NUnit.Framework.TestCase.GetName(), h); // {{Aroush-1.9}} 'GetName()' gives us the name of the test in JUnit, how is it done in NUnit?
}
Assert.AreEqual(expected, h.Length(), "result count");
- }
+ QueryUtils.Check(q, s);
+ }
[Test]
public virtual void TestAllOptional()
@@ -369,7 +370,10 @@
TopDocs top1 = s.Search(q1, null, 100);
TopDocs top2 = s.Search(q2, null, 100);
- // The constrained query
+ QueryUtils.Check(q1, s);
+ QueryUtils.Check(q2, s);
+
+ // The constrained query
// should be a superset to the unconstrained query.
if (top2.totalHits > top1.totalHits)
{
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanOr.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestBooleanOr.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanOr.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanOr.cs Sat Aug 11 09:56:37 2007
@@ -16,7 +16,9 @@
*/
using System;
+
using NUnit.Framework;
+
using StandardAnalyzer = Lucene.Net.Analysis.Standard.StandardAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
@@ -48,8 +50,9 @@
private int Search(Query q)
{
- return searcher.Search(q).Length();
- }
+ QueryUtils.Check(q, searcher);
+ return searcher.Search(q).Length();
+ }
[Test]
public virtual void TestElements()
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanPrefixQuery.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestBooleanPrefixQuery.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanPrefixQuery.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanPrefixQuery.cs Sat Aug 11 09:56:37 2007
@@ -16,22 +16,24 @@
*/
using System;
+
using NUnit.Framework;
+
+using RAMDirectory = Lucene.Net.Store.RAMDirectory;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using Term = Lucene.Net.Index.Term;
+using IndexReader = Lucene.Net.Index.IndexReader;
using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
-using IndexReader = Lucene.Net.Index.IndexReader;
-using IndexWriter = Lucene.Net.Index.IndexWriter;
-using Term = Lucene.Net.Index.Term;
-using RAMDirectory = Lucene.Net.Store.RAMDirectory;
namespace Lucene.Net.Search
{
/// <author> schnee
/// </author>
- /// <version> $Id: TestBooleanPrefixQuery.java 150492 2004-09-06 22:01:49Z dnaber $
- ///
+ /// <version> $Id: TestBooleanPrefixQuery.java 472959 2006-11-09 16:21:50Z yonik $
+ ///
/// </version>
[TestFixture]
public class TestBooleanPrefixQuery
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanQuery.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestBooleanQuery.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanQuery.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanQuery.cs Sat Aug 11 09:56:37 2007
@@ -16,7 +16,9 @@
*/
using System;
+
using NUnit.Framework;
+
using Term = Lucene.Net.Index.Term;
namespace Lucene.Net.Search
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanScorer.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestBooleanScorer.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanScorer.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestBooleanScorer.cs Sat Aug 11 09:56:37 2007
@@ -16,21 +16,23 @@
*/
using System;
+
+using NUnit.Framework;
+
using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
using IndexWriter = Lucene.Net.Index.IndexWriter;
using Term = Lucene.Net.Index.Term;
using RAMDirectory = Lucene.Net.Store.RAMDirectory;
-using NUnit.Framework;
namespace Lucene.Net.Search
{
/// <author> Christoph Goller
/// </author>
- /// <version> $rcs = ' $Id: TestBooleanScorer.java 150700 2004-12-10 19:36:40Z goller $ ' ;
- /// </version>
+ /// <version> $rcs = ' $Id: TestBooleanScorer.java 472959 2006-11-09 16:21:50Z yonik $ ' ;
+ /// </version>
[TestFixture]
public class TestBooleanScorer
{
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestCachingWrapperFilter.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestCachingWrapperFilter.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestCachingWrapperFilter.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestCachingWrapperFilter.cs Sat Aug 11 09:56:37 2007
@@ -16,12 +16,14 @@
*/
using System;
+
using NUnit.Framework;
-using StandardAnalyzer = Lucene.Net.Analysis.Standard.StandardAnalyzer;
-using IndexReader = Lucene.Net.Index.IndexReader;
-using IndexWriter = Lucene.Net.Index.IndexWriter;
+
using Directory = Lucene.Net.Store.Directory;
using RAMDirectory = Lucene.Net.Store.RAMDirectory;
+using IndexReader = Lucene.Net.Index.IndexReader;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using StandardAnalyzer = Lucene.Net.Analysis.Standard.StandardAnalyzer;
namespace Lucene.Net.Search
{
Added: incubator/lucene.net/trunk/C#/src/Test/Search/TestComplexExplanations.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestComplexExplanations.cs?view=auto&rev=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestComplexExplanations.cs (added)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestComplexExplanations.cs Sat Aug 11 09:56:37 2007
@@ -0,0 +1,326 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+
+using NUnit.Framework;
+
+using Occur = Lucene.Net.Search.BooleanClause.Occur;
+using Lucene.Net.Search.Spans;
+using RAMDirectory = Lucene.Net.Store.RAMDirectory;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using IndexReader = Lucene.Net.Index.IndexReader;
+using Term = Lucene.Net.Index.Term;
+using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
+using Document = Lucene.Net.Documents.Document;
+using Field = Lucene.Net.Documents.Field;
+using QueryParser = Lucene.Net.QueryParsers.QueryParser;
+using ParseException = Lucene.Net.QueryParsers.ParseException;
+
+namespace Lucene.Net.Search
+{
+
+ /// <summary> TestExplanations subclass that builds up super crazy complex queries
+ /// on the assumption that if the explanations work out right for them,
+ /// they should work for anything.
+ /// </summary>
+ [TestFixture]
+ public class TestComplexExplanations : TestExplanations
+ {
+ [Serializable]
+ private class AnonymousClassDefaultSimilarity : DefaultSimilarity
+ {
+ public AnonymousClassDefaultSimilarity(TestComplexExplanations enclosingInstance)
+ {
+ InitBlock(enclosingInstance);
+ }
+ private void InitBlock(TestComplexExplanations enclosingInstance)
+ {
+ this.enclosingInstance = enclosingInstance;
+ }
+ private TestComplexExplanations enclosingInstance;
+ public TestComplexExplanations Enclosing_Instance
+ {
+ get
+ {
+ return enclosingInstance;
+ }
+
+ }
+ public override float QueryNorm(float sumOfSquaredWeights)
+ {
+ return 1.0f; // / (float) Math.sqrt(1.0f + sumOfSquaredWeights);
+ }
+ }
+
+ /// <summary> Override the Similarity used in our searcher with one that plays
+ /// nice with boosts of 0.0
+ /// </summary>
+ [SetUp]
+ public override void SetUp()
+ {
+ searcher.SetSimilarity(new AnonymousClassDefaultSimilarity(this));
+ }
+
+
+ [Test]
+ public virtual void Test1()
+ {
+
+ BooleanQuery q = new BooleanQuery();
+
+ q.Add(qp.Parse("\"w1 w2\"~1"), Occur.MUST);
+ q.Add(Snear(St("w2"), Sor("w5", "zz"), 4, true), Occur.SHOULD);
+ q.Add(Snear(Sf("w3", 2), St("w2"), St("w3"), 5, true), Occur.SHOULD);
+
+ Query t = new FilteredQuery(qp.Parse("xx"), new ItemizedFilter(new int[]{1, 3}));
+ t.SetBoost(1000);
+ q.Add(t, Occur.SHOULD);
+
+ t = new ConstantScoreQuery(new ItemizedFilter(new int[]{0, 2}));
+ t.SetBoost(30);
+ q.Add(t, Occur.SHOULD);
+
+ DisjunctionMaxQuery dm = new DisjunctionMaxQuery(0.2f);
+ dm.Add(Snear(St("w2"), Sor("w5", "zz"), 4, true));
+ dm.Add(qp.Parse("QQ"));
+ dm.Add(qp.Parse("xx yy -zz"));
+ dm.Add(qp.Parse("-xx -w1"));
+
+ DisjunctionMaxQuery dm2 = new DisjunctionMaxQuery(0.5f);
+ dm2.Add(qp.Parse("w1"));
+ dm2.Add(qp.Parse("w2"));
+ dm2.Add(qp.Parse("w3"));
+ dm.Add(dm2);
+
+ q.Add(dm, Occur.SHOULD);
+
+ BooleanQuery b = new BooleanQuery();
+ b.SetMinimumNumberShouldMatch(2);
+ b.Add(Snear("w1", "w2", 1, true), Occur.SHOULD);
+ b.Add(Snear("w2", "w3", 1, true), Occur.SHOULD);
+ b.Add(Snear("w1", "w3", 3, true), Occur.SHOULD);
+
+ q.Add(b, Occur.SHOULD);
+
+ Qtest(q, new int[]{0, 1, 2});
+ }
+
+ [Test]
+ public virtual void Test2()
+ {
+
+ BooleanQuery q = new BooleanQuery();
+
+ q.Add(qp.Parse("\"w1 w2\"~1"), Occur.MUST);
+ q.Add(Snear(St("w2"), Sor("w5", "zz"), 4, true), Occur.SHOULD);
+ q.Add(Snear(Sf("w3", 2), St("w2"), St("w3"), 5, true), Occur.SHOULD);
+
+ Query t = new FilteredQuery(qp.Parse("xx"), new ItemizedFilter(new int[]{1, 3}));
+ t.SetBoost(1000);
+ q.Add(t, Occur.SHOULD);
+
+ t = new ConstantScoreQuery(new ItemizedFilter(new int[]{0, 2}));
+ t.SetBoost(- 20.0f);
+ q.Add(t, Occur.SHOULD);
+
+ DisjunctionMaxQuery dm = new DisjunctionMaxQuery(0.2f);
+ dm.Add(Snear(St("w2"), Sor("w5", "zz"), 4, true));
+ dm.Add(qp.Parse("QQ"));
+ dm.Add(qp.Parse("xx yy -zz"));
+ dm.Add(qp.Parse("-xx -w1"));
+
+ DisjunctionMaxQuery dm2 = new DisjunctionMaxQuery(0.5f);
+ dm2.Add(qp.Parse("w1"));
+ dm2.Add(qp.Parse("w2"));
+ dm2.Add(qp.Parse("w3"));
+ dm.Add(dm2);
+
+ q.Add(dm, Occur.SHOULD);
+
+ BooleanQuery b = new BooleanQuery();
+ b.SetMinimumNumberShouldMatch(2);
+ b.Add(Snear("w1", "w2", 1, true), Occur.SHOULD);
+ b.Add(Snear("w2", "w3", 1, true), Occur.SHOULD);
+ b.Add(Snear("w1", "w3", 3, true), Occur.SHOULD);
+ b.SetBoost(0.0f);
+
+ q.Add(b, Occur.SHOULD);
+
+ Qtest(q, new int[]{0, 1, 2});
+ }
+
+ // :TODO: we really need more crazy complex cases.
+
+
+ // //////////////////////////////////////////////////////////////////
+
+ // The rest of these aren't that complex, but they are <i>somewhat</i>
+ // complex, and they expose weakness in dealing with queries that match
+ // with scores of 0 wrapped in other queries
+
+ [Test]
+ public virtual void TestT3()
+ {
+ Bqtest("w1^0.0", new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestMA3()
+ {
+ Query q = new MatchAllDocsQuery();
+ q.SetBoost(0);
+ Bqtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestFQ5()
+ {
+ Bqtest(new FilteredQuery(qp.Parse("xx^0"), new ItemizedFilter(new int[]{1, 3})), new int[]{3});
+ }
+
+ [Test]
+ public virtual void TestCSQ4()
+ {
+ Query q = new ConstantScoreQuery(new ItemizedFilter(new int[]{3}));
+ q.SetBoost(0);
+ Bqtest(q, new int[]{3});
+ }
+
+ [Test]
+ public virtual void TestDMQ10()
+ {
+ DisjunctionMaxQuery q = new DisjunctionMaxQuery(0.5f);
+ q.Add(qp.Parse("yy w5^100"));
+ q.Add(qp.Parse("xx^0"));
+ q.SetBoost(0.0f);
+ Bqtest(q, new int[]{0, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestMPQ7()
+ {
+ MultiPhraseQuery q = new MultiPhraseQuery();
+ q.Add(Ta(new System.String[]{"w1"}));
+ q.Add(Ta(new System.String[]{"w2"}));
+ q.SetSlop(1);
+ q.SetBoost(0.0f);
+ Bqtest(q, new int[]{0, 1, 2});
+ }
+
+ [Test]
+ public virtual void TestBQ12()
+ {
+ // NOTE: using qtest not bqtest
+ Qtest("w1 w2^0.0", new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestBQ13()
+ {
+ // NOTE: using qtest not bqtest
+ Qtest("w1 -w5^0.0", new int[]{1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestBQ18()
+ {
+ // NOTE: using qtest not bqtest
+ Qtest("+w1^0.0 w2", new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestBQ21()
+ {
+ Bqtest("(+w1 w2)^0.0", new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestBQ22()
+ {
+ Bqtest("(+w1^0.0 w2)^0.0", new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestST3()
+ {
+ SpanQuery q = St("w1");
+ q.SetBoost(0);
+ Bqtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestST6()
+ {
+ SpanQuery q = St("xx");
+ q.SetBoost(0);
+ Qtest(q, new int[]{2, 3});
+ }
+
+ [Test]
+ public virtual void TestSF3()
+ {
+ SpanQuery q = Sf(("w1"), 1);
+ q.SetBoost(0);
+ Bqtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSF7()
+ {
+ SpanQuery q = Sf(("xx"), 3);
+ q.SetBoost(0);
+ Bqtest(q, new int[]{2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot3()
+ {
+ SpanQuery q = Snot(Sf("w1", 10), St("QQ"));
+ q.SetBoost(0);
+ Bqtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot6()
+ {
+ SpanQuery q = Snot(Sf("w1", 10), St("xx"));
+ q.SetBoost(0);
+ Bqtest(q, new int[]{0, 1, 2, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot8()
+ {
+ // NOTE: using qtest not bqtest
+ SpanQuery f = Snear("w1", "w3", 10, true);
+ f.SetBoost(0);
+ SpanQuery q = Snot(f, St("xx"));
+ Qtest(q, new int[]{0, 1, 3});
+ }
+
+ [Test]
+ public virtual void TestSNot9()
+ {
+ // NOTE: using qtest not bqtest
+ SpanQuery t = St("xx");
+ t.SetBoost(0);
+ SpanQuery q = Snot(Snear("w1", "w3", 10, true), t);
+ Qtest(q, new int[]{0, 1, 3});
+ }
+ }
+}
\ No newline at end of file
Added: incubator/lucene.net/trunk/C#/src/Test/Search/TestComplexExplanationsOfNonMatches.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestComplexExplanationsOfNonMatches.cs?view=auto&rev=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestComplexExplanationsOfNonMatches.cs (added)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestComplexExplanationsOfNonMatches.cs Sat Aug 11 09:56:37 2007
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+
+using NUnit.Framework;
+
+using RAMDirectory = Lucene.Net.Store.RAMDirectory;
+using IndexWriter = Lucene.Net.Index.IndexWriter;
+using IndexReader = Lucene.Net.Index.IndexReader;
+using Term = Lucene.Net.Index.Term;
+using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
+using Document = Lucene.Net.Documents.Document;
+using Field = Lucene.Net.Documents.Field;
+using QueryParser = Lucene.Net.QueryParsers.QueryParser;
+using ParseException = Lucene.Net.QueryParsers.ParseException;
+
+namespace Lucene.Net.Search
+{
+
+ /// <summary> subclass of TestSimpleExplanations that verifies non matches.</summary>
+ public class TestComplexExplanationsOfNonMatches : TestComplexExplanations
+ {
+
+ /// <summary> Overrides superclass to ignore matches and focus on non-matches
+ ///
+ /// </summary>
+ /// <seealso cref="CheckHits.checkNoMatchExplanations">
+ /// </seealso>
+ public override void Qtest(Query q, int[] expDocNrs)
+ {
+ CheckHits.CheckNoMatchExplanations(q, FIELD, searcher, expDocNrs);
+ }
+ }
+}
\ No newline at end of file
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestConstantScoreRangeQuery.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestConstantScoreRangeQuery.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestConstantScoreRangeQuery.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestConstantScoreRangeQuery.cs Sat Aug 11 09:56:37 2007
@@ -16,7 +16,9 @@
*/
using System;
+
using NUnit.Framework;
+
using WhitespaceAnalyzer = Lucene.Net.Analysis.WhitespaceAnalyzer;
using Document = Lucene.Net.Documents.Document;
using Field = Lucene.Net.Documents.Field;
@@ -73,6 +75,11 @@
{
Assert.AreEqual(e, a, m, SCORE_COMP_THRESH);
}
+
+ static public void AssertEquals(System.String m, int e, int a)
+ {
+ Assert.AreEqual(e, a, m);
+ }
[SetUp]
public virtual void SetUp()
Modified: incubator/lucene.net/trunk/C#/src/Test/Search/TestCustomSearcherSort.cs
URL: http://svn.apache.org/viewvc/incubator/lucene.net/trunk/C%23/src/Test/Search/TestCustomSearcherSort.cs?view=diff&rev=564939&r1=564938&r2=564939
==============================================================================
--- incubator/lucene.net/trunk/C#/src/Test/Search/TestCustomSearcherSort.cs (original)
+++ incubator/lucene.net/trunk/C#/src/Test/Search/TestCustomSearcherSort.cs Sat Aug 11 09:56:37 2007
@@ -16,7 +16,9 @@
*/
using System;
+
using NUnit.Framework;
+
using StandardAnalyzer = Lucene.Net.Analysis.Standard.StandardAnalyzer;
using DateTools = Lucene.Net.Documents.DateTools;
using Document = Lucene.Net.Documents.Document;