You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by sy...@apache.org on 2014/12/31 20:12:08 UTC
[02/14] lucenenet git commit: Moving Lucene.Net.Facet tests to their
appropriate place
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/68aa9728/src/Lucene.Net.Tests/core/Facet/Taxonomy/WriterCache/TestCompactLabelToOrdinal.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Tests/core/Facet/Taxonomy/WriterCache/TestCompactLabelToOrdinal.cs b/src/Lucene.Net.Tests/core/Facet/Taxonomy/WriterCache/TestCompactLabelToOrdinal.cs
deleted file mode 100644
index 549bf09..0000000
--- a/src/Lucene.Net.Tests/core/Facet/Taxonomy/WriterCache/TestCompactLabelToOrdinal.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Lucene.Net.Support;
-using NUnit.Framework;
-
-namespace Lucene.Net.Facet.Taxonomy.WriterCache
-{
-
-
- using TestUtil = Lucene.Net.Util.TestUtil;
-
- /*
- * 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.
- */
- [TestFixture]
- public class TestCompactLabelToOrdinal : FacetTestCase
- {
- /* not finished to porting yet because of missing decoder implementation */
- /*
- public virtual void TestL2O()
- {
- LabelToOrdinal map = new LabelToOrdinalMap();
-
- CompactLabelToOrdinal compact = new CompactLabelToOrdinal(2000000, 0.15f, 3);
-
- int n = AtLeast(10 * 1000);
- const int numUniqueValues = 50 * 1000;
-
- string[] uniqueValues = new string[numUniqueValues];
- byte[] buffer = new byte[50];
-
- Random random = Random();
- for (int i = 0; i < numUniqueValues; )
- {
- random.NextBytes(buffer);
- int size = 1 + random.Next(buffer.Length);
-
- // This test is turning random bytes into a string,
- // this is asking for trouble.
- CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder().onUnmappableCharacter(CodingErrorAction.REPLACE).onMalformedInput(CodingErrorAction.REPLACE);
- uniqueValues[i] = decoder.decode(ByteBuffer.Wrap(buffer, 0, size)).ToString();
- // we cannot have empty path components, so eliminate all prefix as well
- // as middle consecutive delimiter chars.
- uniqueValues[i] = uniqueValues[i].replaceAll("/+", "/");
- if (uniqueValues[i].StartsWith("/", StringComparison.Ordinal))
- {
- uniqueValues[i] = uniqueValues[i].Substring(1);
- }
- if (uniqueValues[i].IndexOf(CompactLabelToOrdinal.TERMINATOR_CHAR) == -1)
- {
- i++;
- }
- }
-
- var tmpDir = CreateTempDir("testLableToOrdinal");
- var f = new File(tmpDir, "CompactLabelToOrdinalTest.tmp");
- int flushInterval = 10;
-
- for (int i = 0; i < n; i++)
- {
- if (i > 0 && i % flushInterval == 0)
- {
- compact.Flush(f);
- compact = CompactLabelToOrdinal.open(f, 0.15f, 3);
- Assert.True(f.delete());
- if (flushInterval < (n / 10))
- {
- flushInterval *= 10;
- }
- }
-
- int index = random.Next(numUniqueValues);
- FacetLabel label;
- string s = uniqueValues[index];
- if (s.Length == 0)
- {
- label = new FacetLabel();
- }
- else
- {
- label = new FacetLabel(s.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
- }
-
- int ord1 = map.GetOrdinal(label);
- int ord2 = compact.GetOrdinal(label);
-
- Assert.AreEqual(ord1, ord2);
-
- if (ord1 == LabelToOrdinal.INVALID_ORDINAL)
- {
- ord1 = compact.NextOrdinal;
- map.AddLabel(label, ord1);
- compact.AddLabel(label, ord1);
- }
- }
-
- for (int i = 0; i < numUniqueValues; i++)
- {
- FacetLabel label;
- string s = uniqueValues[i];
- if (s.Length == 0)
- {
- label = new FacetLabel();
- }
- else
- {
- label = new FacetLabel(s.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
- }
- int ord1 = map.GetOrdinal(label);
- int ord2 = compact.GetOrdinal(label);
- Assert.AreEqual(ord1, ord2);
- }
- }
-
- private class LabelToOrdinalMap : LabelToOrdinal
- {
- internal IDictionary<FacetLabel, int?> map = new Dictionary<FacetLabel, int?>();
-
- internal LabelToOrdinalMap()
- {
- }
-
- public override void AddLabel(FacetLabel label, int ordinal)
- {
- map[label] = ordinal;
- }
-
- public override int GetOrdinal(FacetLabel label)
- {
- int? value = map[label];
- return (value != null) ? (int)value : LabelToOrdinal.INVALID_ORDINAL;
- }
-
- } */
-
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/68aa9728/src/Lucene.Net.Tests/core/Facet/TestDrillDownQuery.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Tests/core/Facet/TestDrillDownQuery.cs b/src/Lucene.Net.Tests/core/Facet/TestDrillDownQuery.cs
deleted file mode 100644
index 49ce90a..0000000
--- a/src/Lucene.Net.Tests/core/Facet/TestDrillDownQuery.cs
+++ /dev/null
@@ -1,282 +0,0 @@
-using System;
-using System.Diagnostics;
-using Lucene.Net.Randomized.Generators;
-using NUnit.Framework;
-
-namespace Lucene.Net.Facet
-{
-
- /*
- * 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 MockAnalyzer = Lucene.Net.Analysis.MockAnalyzer;
- using MockTokenizer = Lucene.Net.Analysis.MockTokenizer;
- using Document = Lucene.Net.Documents.Document;
- using Field = Lucene.Net.Documents.Field;
- using TextField = Lucene.Net.Documents.TextField;
- using TaxonomyWriter = Lucene.Net.Facet.Taxonomy.TaxonomyWriter;
- using DirectoryTaxonomyReader = Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyReader;
- using DirectoryTaxonomyWriter = Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyWriter;
- using IndexReader = Lucene.Net.Index.IndexReader;
- using RandomIndexWriter = Lucene.Net.Index.RandomIndexWriter;
- using Term = Lucene.Net.Index.Term;
- using IndexSearcher = Lucene.Net.Search.IndexSearcher;
- using MatchAllDocsQuery = Lucene.Net.Search.MatchAllDocsQuery;
- using Query = Lucene.Net.Search.Query;
- using QueryUtils = Lucene.Net.Search.QueryUtils;
- using ScoreDoc = Lucene.Net.Search.ScoreDoc;
- using TermQuery = Lucene.Net.Search.TermQuery;
- using TopDocs = Lucene.Net.Search.TopDocs;
- using Directory = Lucene.Net.Store.Directory;
- using IOUtils = Lucene.Net.Util.IOUtils;
-
- [TestFixture]
- public class TestDrillDownQuery : FacetTestCase
- {
-
- private static IndexReader reader;
- private static DirectoryTaxonomyReader taxo;
- private static Directory dir;
- private static Directory taxoDir;
- private static FacetsConfig config;
-
-
- [TestFixtureTearDown]
- public static void AfterClassDrillDownQueryTest()
- {
- IOUtils.Close(reader, taxo, dir, taxoDir);
- reader = null;
- taxo = null;
- dir = null;
- taxoDir = null;
- config = null;
- }
-
- [TestFixtureSetUp]
- public static void BeforeClassDrillDownQueryTest()
- {
- dir = NewDirectory();
- Random r = Random();
- RandomIndexWriter writer = new RandomIndexWriter(r, dir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(r, MockTokenizer.KEYWORD, false)));
-
- taxoDir = NewDirectory();
- TaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir);
- config = new FacetsConfig();
-
- // Randomize the per-dim config:
- config.SetHierarchical("a", Random().NextBoolean());
- config.SetMultiValued("a", Random().NextBoolean());
- if (Random().NextBoolean())
- {
- config.SetIndexFieldName("a", "$a");
- }
- config.SetRequireDimCount("a", true);
-
- config.SetHierarchical("b", Random().NextBoolean());
- config.SetMultiValued("b", Random().NextBoolean());
- if (Random().NextBoolean())
- {
- config.SetIndexFieldName("b", "$b");
- }
- config.SetRequireDimCount("b", true);
-
- for (int i = 0; i < 100; i++)
- {
- Document doc = new Document();
- if (i % 2 == 0) // 50
- {
- doc.Add(new TextField("content", "foo", Field.Store.NO));
- }
- if (i % 3 == 0) // 33
- {
- doc.Add(new TextField("content", "bar", Field.Store.NO));
- }
- if (i % 4 == 0) // 25
- {
- if (r.NextBoolean())
- {
- doc.Add(new FacetField("a", "1"));
- }
- else
- {
- doc.Add(new FacetField("a", "2"));
- }
- }
- if (i % 5 == 0) // 20
- {
- doc.Add(new FacetField("b", "1"));
- }
- writer.AddDocument(config.Build(taxoWriter, doc));
- }
-
- taxoWriter.Dispose();
- reader = writer.Reader;
- writer.Dispose();
-
- taxo = new DirectoryTaxonomyReader(taxoDir);
- }
-
- [Test]
- public virtual void TestAndOrs()
- {
- IndexSearcher searcher = NewSearcher(reader);
-
- // test (a/1 OR a/2) AND b/1
- DrillDownQuery q = new DrillDownQuery(config);
- q.Add("a", "1");
- q.Add("a", "2");
- q.Add("b", "1");
- TopDocs docs = searcher.Search(q, 100);
- Assert.AreEqual(5, docs.TotalHits);
- }
-
- [Test]
- public virtual void TestQuery()
- {
- IndexSearcher searcher = NewSearcher(reader);
-
- // Making sure the query yields 25 documents with the facet "a"
- DrillDownQuery q = new DrillDownQuery(config);
- q.Add("a");
- QueryUtils.Check(q);
- TopDocs docs = searcher.Search(q, 100);
- Assert.AreEqual(25, docs.TotalHits);
-
- // Making sure the query yields 5 documents with the facet "b" and the
- // previous (facet "a") query as a base query
- DrillDownQuery q2 = new DrillDownQuery(config, q);
- q2.Add("b");
- docs = searcher.Search(q2, 100);
- Assert.AreEqual(5, docs.TotalHits);
-
- // Making sure that a query of both facet "a" and facet "b" yields 5 results
- DrillDownQuery q3 = new DrillDownQuery(config);
- q3.Add("a");
- q3.Add("b");
- docs = searcher.Search(q3, 100);
-
- Assert.AreEqual(5, docs.TotalHits);
- // Check that content:foo (which yields 50% results) and facet/b (which yields 20%)
- // would gather together 10 results (10%..)
- Query fooQuery = new TermQuery(new Term("content", "foo"));
- DrillDownQuery q4 = new DrillDownQuery(config, fooQuery);
- q4.Add("b");
- docs = searcher.Search(q4, 100);
- Assert.AreEqual(10, docs.TotalHits);
- }
-
- [Test]
- public virtual void TestQueryImplicitDefaultParams()
- {
- IndexSearcher searcher = NewSearcher(reader);
-
- // Create the base query to start with
- DrillDownQuery q = new DrillDownQuery(config);
- q.Add("a");
-
- // Making sure the query yields 5 documents with the facet "b" and the
- // previous (facet "a") query as a base query
- DrillDownQuery q2 = new DrillDownQuery(config, q);
- q2.Add("b");
- TopDocs docs = searcher.Search(q2, 100);
- Assert.AreEqual(5, docs.TotalHits);
-
- // Check that content:foo (which yields 50% results) and facet/b (which yields 20%)
- // would gather together 10 results (10%..)
- Query fooQuery = new TermQuery(new Term("content", "foo"));
- DrillDownQuery q4 = new DrillDownQuery(config, fooQuery);
- q4.Add("b");
- docs = searcher.Search(q4, 100);
- Assert.AreEqual(10, docs.TotalHits);
- }
-
- [Test]
- public virtual void TestScoring()
- {
- // verify that drill-down queries do not modify scores
- IndexSearcher searcher = NewSearcher(reader);
-
- float[] scores = new float[reader.MaxDoc];
-
- Query q = new TermQuery(new Term("content", "foo"));
- TopDocs docs = searcher.Search(q, reader.MaxDoc); // fetch all available docs to this query
- foreach (ScoreDoc sd in docs.ScoreDocs)
- {
- scores[sd.Doc] = sd.Score;
- }
-
- // create a drill-down query with category "a", scores should not change
- DrillDownQuery q2 = new DrillDownQuery(config, q);
- q2.Add("a");
- docs = searcher.Search(q2, reader.MaxDoc); // fetch all available docs to this query
- foreach (ScoreDoc sd in docs.ScoreDocs)
- {
- Assert.AreEqual(scores[sd.Doc], sd.Score, 0f, "score of doc=" + sd.Doc + " modified");
- }
- }
-
- [Test]
- public virtual void TestScoringNoBaseQuery()
- {
- // verify that drill-down queries (with no base query) returns 0.0 score
- IndexSearcher searcher = NewSearcher(reader);
-
- DrillDownQuery q = new DrillDownQuery(config);
- q.Add("a");
- TopDocs docs = searcher.Search(q, reader.MaxDoc); // fetch all available docs to this query
- foreach (ScoreDoc sd in docs.ScoreDocs)
- {
- Assert.AreEqual(0f, sd.Score, 0f);
- }
- }
-
- [Test]
- public virtual void TestTermNonDefault()
- {
- string aField = config.GetDimConfig("a").IndexFieldName;
- Term termA = DrillDownQuery.Term(aField, "a");
- Assert.AreEqual(new Term(aField, "a"), termA);
-
- string bField = config.GetDimConfig("b").IndexFieldName;
- Term termB = DrillDownQuery.Term(bField, "b");
- Assert.AreEqual(new Term(bField, "b"), termB);
- }
-
- [Test]
- public virtual void TestClone()
- {
- var q = new DrillDownQuery(config, new MatchAllDocsQuery());
- q.Add("a");
-
- var clone = q.Clone() as DrillDownQuery;
- Assert.NotNull(clone);
- clone.Add("b");
- Assert.False(q.ToString().Equals(clone.ToString()), "query wasn't cloned: source=" + q + " clone=" + clone);
- }
-
- [Test]
- public virtual void TestNoDrillDown()
- {
- Query @base = new MatchAllDocsQuery();
- DrillDownQuery q = new DrillDownQuery(config, @base);
- Query rewrite = q.Rewrite(reader).Rewrite(reader);
- Assert.AreSame(@base, rewrite);
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/68aa9728/src/Lucene.Net.Tests/core/Facet/TestDrillSideways.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Tests/core/Facet/TestDrillSideways.cs b/src/Lucene.Net.Tests/core/Facet/TestDrillSideways.cs
deleted file mode 100644
index 00cb772..0000000
--- a/src/Lucene.Net.Tests/core/Facet/TestDrillSideways.cs
+++ /dev/null
@@ -1,1332 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.Collections.Generic;
-using System.Linq;
-using Lucene.Net.Randomized.Generators;
-using Lucene.Net.Support;
-
-namespace Lucene.Net.Facet
-{
-
- /*
- * 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 MockAnalyzer = Lucene.Net.Analysis.MockAnalyzer;
- using Document = Lucene.Net.Documents.Document;
- using Field = Lucene.Net.Documents.Field;
- using StringField = Lucene.Net.Documents.StringField;
- using DrillSidewaysResult = Lucene.Net.Facet.DrillSideways.DrillSidewaysResult;
- using DefaultSortedSetDocValuesReaderState = Lucene.Net.Facet.SortedSet.DefaultSortedSetDocValuesReaderState;
- using SortedSetDocValuesFacetField = Lucene.Net.Facet.SortedSet.SortedSetDocValuesFacetField;
- using SortedSetDocValuesReaderState = Lucene.Net.Facet.SortedSet.SortedSetDocValuesReaderState;
- using TaxonomyReader = Lucene.Net.Facet.Taxonomy.TaxonomyReader;
- using DirectoryTaxonomyReader = Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyReader;
- using DirectoryTaxonomyWriter = Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyWriter;
- using AtomicReaderContext = Lucene.Net.Index.AtomicReaderContext;
- using IndexReader = Lucene.Net.Index.IndexReader;
- using IndexWriterConfig = Lucene.Net.Index.IndexWriterConfig;
- using RandomIndexWriter = Lucene.Net.Index.RandomIndexWriter;
- using Term = Lucene.Net.Index.Term;
- using Collector = Lucene.Net.Search.Collector;
- using DocIdSet = Lucene.Net.Search.DocIdSet;
- using Filter = Lucene.Net.Search.Filter;
- using IndexSearcher = Lucene.Net.Search.IndexSearcher;
- using MatchAllDocsQuery = Lucene.Net.Search.MatchAllDocsQuery;
- using Query = Lucene.Net.Search.Query;
- using ScoreDoc = Lucene.Net.Search.ScoreDoc;
- using Scorer = Lucene.Net.Search.Scorer;
- using Sort = Lucene.Net.Search.Sort;
- using SortField = Lucene.Net.Search.SortField;
- using TermQuery = Lucene.Net.Search.TermQuery;
- using TopDocs = Lucene.Net.Search.TopDocs;
- using Directory = Lucene.Net.Store.Directory;
- using Bits = Lucene.Net.Util.Bits;
- using BytesRef = Lucene.Net.Util.BytesRef;
- using FixedBitSet = Lucene.Net.Util.FixedBitSet;
- using IOUtils = Lucene.Net.Util.IOUtils;
- using InPlaceMergeSorter = Lucene.Net.Util.InPlaceMergeSorter;
- using InfoStream = Lucene.Net.Util.InfoStream;
- using TestUtil = Lucene.Net.Util.TestUtil;
- using NUnit.Framework;
-
- [TestFixture]
- public class TestDrillSideways : FacetTestCase
- {
-
- [Test]
- public virtual void TestBasic()
- {
- Directory dir = NewDirectory();
- Directory taxoDir = NewDirectory();
-
- // Writes facet ords to a separate directory from the
- // main index:
- var taxoWriter = new DirectoryTaxonomyWriter(taxoDir, IndexWriterConfig.OpenMode_e.CREATE);
-
- FacetsConfig config = new FacetsConfig();
- config.SetHierarchical("Publish Date", true);
-
- RandomIndexWriter writer = new RandomIndexWriter(Random(), dir);
-
- Document doc = new Document();
- doc.Add(new FacetField("Author", "Bob"));
- doc.Add(new FacetField("Publish Date", "2010", "10", "15"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("Author", "Lisa"));
- doc.Add(new FacetField("Publish Date", "2010", "10", "20"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("Author", "Lisa"));
- doc.Add(new FacetField("Publish Date", "2012", "1", "1"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("Author", "Susan"));
- doc.Add(new FacetField("Publish Date", "2012", "1", "7"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("Author", "Frank"));
- doc.Add(new FacetField("Publish Date", "1999", "5", "5"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- // NRT open
- IndexSearcher searcher = NewSearcher(writer.Reader);
-
- //System.out.println("searcher=" + searcher);
-
- // NRT open
- var taxoReader = new DirectoryTaxonomyReader(taxoWriter);
-
- DrillSideways ds = new DrillSideways(searcher, config, taxoReader);
-
- // case: drill-down on a single field; in this
- // case the drill-sideways + drill-down counts ==
- // drill-down of just the query:
- DrillDownQuery ddq = new DrillDownQuery(config);
- ddq.Add("Author", "Lisa");
- DrillSidewaysResult r = ds.Search(null, ddq, 10);
- Assert.AreEqual(2, r.Hits.TotalHits);
- // Publish Date is only drill-down, and Lisa published
- // one in 2012 and one in 2010:
- Assert.AreEqual("dim=Publish Date path=[] value=2 childCount=2\n 2010 (1)\n 2012 (1)\n", r.Facets.GetTopChildren(10, "Publish Date").ToString());
-
- // Author is drill-sideways + drill-down: Lisa
- // (drill-down) published twice, and Frank/Susan/Bob
- // published once:
- Assert.AreEqual("dim=Author path=[] value=5 childCount=4\n Lisa (2)\n Bob (1)\n Susan (1)\n Frank (1)\n", r.Facets.GetTopChildren(10, "Author").ToString());
-
- // Same simple case, but no baseQuery (pure browse):
- // drill-down on a single field; in this case the
- // drill-sideways + drill-down counts == drill-down of
- // just the query:
- ddq = new DrillDownQuery(config);
- ddq.Add("Author", "Lisa");
- r = ds.Search(null, ddq, 10);
-
- Assert.AreEqual(2, r.Hits.TotalHits);
- // Publish Date is only drill-down, and Lisa published
- // one in 2012 and one in 2010:
- Assert.AreEqual("dim=Publish Date path=[] value=2 childCount=2\n 2010 (1)\n 2012 (1)\n", r.Facets.GetTopChildren(10, "Publish Date").ToString());
-
- // Author is drill-sideways + drill-down: Lisa
- // (drill-down) published twice, and Frank/Susan/Bob
- // published once:
- Assert.AreEqual("dim=Author path=[] value=5 childCount=4\n Lisa (2)\n Bob (1)\n Susan (1)\n Frank (1)\n", r.Facets.GetTopChildren(10, "Author").ToString());
-
- // Another simple case: drill-down on single fields
- // but OR of two values
- ddq = new DrillDownQuery(config);
- ddq.Add("Author", "Lisa");
- ddq.Add("Author", "Bob");
- r = ds.Search(null, ddq, 10);
- Assert.AreEqual(3, r.Hits.TotalHits);
- // Publish Date is only drill-down: Lisa and Bob
- // (drill-down) published twice in 2010 and once in 2012:
- Assert.AreEqual("dim=Publish Date path=[] value=3 childCount=2\n 2010 (2)\n 2012 (1)\n", r.Facets.GetTopChildren(10, "Publish Date").ToString());
- // Author is drill-sideways + drill-down: Lisa
- // (drill-down) published twice, and Frank/Susan/Bob
- // published once:
- Assert.AreEqual("dim=Author path=[] value=5 childCount=4\n Lisa (2)\n Bob (1)\n Susan (1)\n Frank (1)\n", r.Facets.GetTopChildren(10, "Author").ToString());
-
- Assert.True(r.Facets is MultiFacets);
- IList<FacetResult> allResults = r.Facets.GetAllDims(10);
- Assert.AreEqual(2, allResults.Count);
- Assert.AreEqual("dim=Author path=[] value=5 childCount=4\n Lisa (2)\n Bob (1)\n Susan (1)\n Frank (1)\n", allResults[0].ToString());
- Assert.AreEqual("dim=Publish Date path=[] value=3 childCount=2\n 2010 (2)\n 2012 (1)\n", allResults[1].ToString());
-
- // More interesting case: drill-down on two fields
- ddq = new DrillDownQuery(config);
- ddq.Add("Author", "Lisa");
- ddq.Add("Publish Date", "2010");
- r = ds.Search(null, ddq, 10);
- Assert.AreEqual(1, r.Hits.TotalHits);
- // Publish Date is drill-sideways + drill-down: Lisa
- // (drill-down) published once in 2010 and once in 2012:
- Assert.AreEqual("dim=Publish Date path=[] value=2 childCount=2\n 2010 (1)\n 2012 (1)\n", r.Facets.GetTopChildren(10, "Publish Date").ToString());
- // Author is drill-sideways + drill-down:
- // only Lisa & Bob published (once each) in 2010:
- Assert.AreEqual("dim=Author path=[] value=2 childCount=2\n Bob (1)\n Lisa (1)\n", r.Facets.GetTopChildren(10, "Author").ToString());
-
- // Even more interesting case: drill down on two fields,
- // but one of them is OR
- ddq = new DrillDownQuery(config);
-
- // Drill down on Lisa or Bob:
- ddq.Add("Author", "Lisa");
- ddq.Add("Publish Date", "2010");
- ddq.Add("Author", "Bob");
- r = ds.Search(null, ddq, 10);
- Assert.AreEqual(2, r.Hits.TotalHits);
- // Publish Date is both drill-sideways + drill-down:
- // Lisa or Bob published twice in 2010 and once in 2012:
- Assert.AreEqual("dim=Publish Date path=[] value=3 childCount=2\n 2010 (2)\n 2012 (1)\n", r.Facets.GetTopChildren(10, "Publish Date").ToString());
- // Author is drill-sideways + drill-down:
- // only Lisa & Bob published (once each) in 2010:
- Assert.AreEqual("dim=Author path=[] value=2 childCount=2\n Bob (1)\n Lisa (1)\n", r.Facets.GetTopChildren(10, "Author").ToString());
-
- // Test drilling down on invalid field:
- ddq = new DrillDownQuery(config);
- ddq.Add("Foobar", "Baz");
- r = ds.Search(null, ddq, 10);
- Assert.AreEqual(0, r.Hits.TotalHits);
- Assert.Null(r.Facets.GetTopChildren(10, "Publish Date"));
- Assert.Null(r.Facets.GetTopChildren(10, "Foobar"));
-
- // Test drilling down on valid term or'd with invalid term:
- ddq = new DrillDownQuery(config);
- ddq.Add("Author", "Lisa");
- ddq.Add("Author", "Tom");
- r = ds.Search(null, ddq, 10);
- Assert.AreEqual(2, r.Hits.TotalHits);
- // Publish Date is only drill-down, and Lisa published
- // one in 2012 and one in 2010:
- Assert.AreEqual("dim=Publish Date path=[] value=2 childCount=2\n 2010 (1)\n 2012 (1)\n", r.Facets.GetTopChildren(10, "Publish Date").ToString());
- // Author is drill-sideways + drill-down: Lisa
- // (drill-down) published twice, and Frank/Susan/Bob
- // published once:
- Assert.AreEqual("dim=Author path=[] value=5 childCount=4\n Lisa (2)\n Bob (1)\n Susan (1)\n Frank (1)\n", r.Facets.GetTopChildren(10, "Author").ToString());
-
- // LUCENE-4915: test drilling down on a dimension but
- // NOT facet counting it:
- ddq = new DrillDownQuery(config);
- ddq.Add("Author", "Lisa");
- ddq.Add("Author", "Tom");
- r = ds.Search(null, ddq, 10);
- Assert.AreEqual(2, r.Hits.TotalHits);
- // Publish Date is only drill-down, and Lisa published
- // one in 2012 and one in 2010:
- Assert.AreEqual("dim=Publish Date path=[] value=2 childCount=2\n 2010 (1)\n 2012 (1)\n", r.Facets.GetTopChildren(10, "Publish Date").ToString());
-
- // Test main query gets null scorer:
- ddq = new DrillDownQuery(config, new TermQuery(new Term("foobar", "baz")));
- ddq.Add("Author", "Lisa");
- r = ds.Search(null, ddq, 10);
-
- Assert.AreEqual(0, r.Hits.TotalHits);
- Assert.Null(r.Facets.GetTopChildren(10, "Publish Date"));
- Assert.Null(r.Facets.GetTopChildren(10, "Author"));
- IOUtils.Close(searcher.IndexReader, taxoReader, writer, taxoWriter, dir, taxoDir);
- }
-
- [Test]
- public virtual void TestSometimesInvalidDrillDown()
- {
- Directory dir = NewDirectory();
- Directory taxoDir = NewDirectory();
- RandomIndexWriter writer = new RandomIndexWriter(Random(), dir);
-
- // Writes facet ords to a separate directory from the
- // main index:
- DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir, IndexWriterConfig.OpenMode_e.CREATE);
-
- FacetsConfig config = new FacetsConfig();
- config.SetHierarchical("Publish Date", true);
-
- Document doc = new Document();
- doc.Add(new FacetField("Author", "Bob"));
- doc.Add(new FacetField("Publish Date", "2010", "10", "15"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("Author", "Lisa"));
- doc.Add(new FacetField("Publish Date", "2010", "10", "20"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- writer.Commit();
-
- // 2nd segment has no Author:
- doc = new Document();
- doc.Add(new FacetField("Foobar", "Lisa"));
- doc.Add(new FacetField("Publish Date", "2012", "1", "1"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- // NRT open
- IndexSearcher searcher = NewSearcher(writer.Reader);
-
- //System.out.println("searcher=" + searcher);
-
- // NRT open
- var taxoReader = new DirectoryTaxonomyReader(taxoWriter);
-
- DrillDownQuery ddq = new DrillDownQuery(config);
- ddq.Add("Author", "Lisa");
- DrillSidewaysResult r = (new DrillSideways(searcher, config, taxoReader)).Search(null, ddq, 10);
-
- Assert.AreEqual(1, r.Hits.TotalHits);
- // Publish Date is only drill-down, and Lisa published
- // one in 2012 and one in 2010:
- Assert.AreEqual("dim=Publish Date path=[] value=1 childCount=1\n 2010 (1)\n", r.Facets.GetTopChildren(10, "Publish Date").ToString());
- // Author is drill-sideways + drill-down: Lisa
- // (drill-down) published once, and Bob
- // published once:
- Assert.AreEqual("dim=Author path=[] value=2 childCount=2\n Bob (1)\n Lisa (1)\n", r.Facets.GetTopChildren(10, "Author").ToString());
-
- IOUtils.Close(searcher.IndexReader, taxoReader, writer, taxoWriter, dir, taxoDir);
- }
-
- [Test]
- public virtual void TestMultipleRequestsPerDim()
- {
- Directory dir = NewDirectory();
- Directory taxoDir = NewDirectory();
- RandomIndexWriter writer = new RandomIndexWriter(Random(), dir);
-
- // Writes facet ords to a separate directory from the
- // main index:
- var taxoWriter = new DirectoryTaxonomyWriter(taxoDir, IndexWriterConfig.OpenMode_e.CREATE);
-
- FacetsConfig config = new FacetsConfig();
- config.SetHierarchical("dim", true);
-
- Document doc = new Document();
- doc.Add(new FacetField("dim", "a", "x"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("dim", "a", "y"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("dim", "a", "z"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("dim", "b"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("dim", "c"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- doc = new Document();
- doc.Add(new FacetField("dim", "d"));
- writer.AddDocument(config.Build(taxoWriter, doc));
-
- // NRT open
- IndexSearcher searcher = NewSearcher(writer.Reader);
-
- //System.out.println("searcher=" + searcher);
-
- // NRT open
- var taxoReader = new DirectoryTaxonomyReader(taxoWriter);
-
- DrillDownQuery ddq = new DrillDownQuery(config);
- ddq.Add("dim", "a");
- DrillSidewaysResult r = (new DrillSideways(searcher, config, taxoReader)).Search(null, ddq, 10);
-
- Assert.AreEqual(3, r.Hits.TotalHits);
- Assert.AreEqual("dim=dim path=[] value=6 childCount=4\n a (3)\n b (1)\n c (1)\n d (1)\n", r.Facets.GetTopChildren(10, "dim").ToString());
- Assert.AreEqual("dim=dim path=[a] value=3 childCount=3\n x (1)\n y (1)\n z (1)\n", r.Facets.GetTopChildren(10, "dim", "a").ToString());
-
- IOUtils.Close(searcher.IndexReader, taxoReader, writer, taxoWriter, dir, taxoDir);
- }
-
- internal class Doc : IComparable<Doc>
- {
- internal string id;
- internal string contentToken;
-
- public Doc()
- {
- }
-
- // -1 if the doc is missing this dim, else the index
- // -into the values for this dim:
- internal int[] dims;
-
- // 2nd value per dim for the doc (so we test
- // multi-valued fields):
- internal int[] dims2;
- internal bool deleted;
-
- public virtual int CompareTo(Doc other)
- {
- return id.CompareTo(other.id);
- }
- }
-
- private double aChance, bChance, cChance;
-
- private string randomContentToken(bool isQuery)
- {
- double d = Random().NextDouble();
- if (isQuery)
- {
- if (d < 0.33)
- {
- return "a";
- }
- else if (d < 0.66)
- {
- return "b";
- }
- else
- {
- return "c";
- }
- }
- else
- {
- if (d <= aChance)
- {
- return "a";
- }
- else if (d < aChance + bChance)
- {
- return "b";
- }
- else
- {
- return "c";
- }
- }
- }
-
- [Test]
- public virtual void TestRandom()
- {
-
- bool canUseDV = DefaultCodecSupportsSortedSet();
-
- while (aChance == 0.0)
- {
- aChance = Random().NextDouble();
- }
- while (bChance == 0.0)
- {
- bChance = Random().NextDouble();
- }
- while (cChance == 0.0)
- {
- cChance = Random().NextDouble();
- }
- //aChance = .01;
- //bChance = 0.5;
- //cChance = 1.0;
- double sum = aChance + bChance + cChance;
- aChance /= sum;
- bChance /= sum;
- cChance /= sum;
-
- int numDims = TestUtil.NextInt(Random(), 2, 5);
- //int numDims = 3;
- int numDocs = AtLeast(3000);
- //int numDocs = 20;
- if (VERBOSE)
- {
- Console.WriteLine("numDims=" + numDims + " numDocs=" + numDocs + " aChance=" + aChance + " bChance=" + bChance + " cChance=" + cChance);
- }
- string[][] dimValues = new string[numDims][];
- int valueCount = 2;
-
- for (int dim = 0; dim < numDims; dim++)
- {
- var values = new HashSet<string>();
- while (values.Count < valueCount)
- {
- var str = TestUtil.RandomRealisticUnicodeString(Random());
- //String s = TestUtil.randomString(Random());
- if (str.Length > 0)
- {
- values.Add(str);
- }
- }
- dimValues[dim] = values.ToArray();
- valueCount *= 2;
- }
-
- IList<Doc> docs = new List<Doc>();
- for (int i = 0; i < numDocs; i++)
- {
- Doc doc = new Doc();
- doc.id = "" + i;
- doc.contentToken = randomContentToken(false);
- doc.dims = new int[numDims];
- doc.dims2 = new int[numDims];
- for (int dim = 0; dim < numDims; dim++)
- {
- if (Random().Next(5) == 3)
- {
- // This doc is missing this dim:
- doc.dims[dim] = -1;
- }
- else if (dimValues[dim].Length <= 4)
- {
- int dimUpto = 0;
- doc.dims[dim] = dimValues[dim].Length - 1;
- while (dimUpto < dimValues[dim].Length)
- {
- if (Random().NextBoolean())
- {
- doc.dims[dim] = dimUpto;
- break;
- }
- dimUpto++;
- }
- }
- else
- {
- doc.dims[dim] = Random().Next(dimValues[dim].Length);
- }
-
- if (Random().Next(5) == 3)
- {
- // 2nd value:
- doc.dims2[dim] = Random().Next(dimValues[dim].Length);
- }
- else
- {
- doc.dims2[dim] = -1;
- }
- }
- docs.Add(doc);
- }
-
- Directory d = NewDirectory();
- Directory td = NewDirectory();
-
- IndexWriterConfig iwc = NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random()));
- iwc.SetInfoStream(InfoStream.NO_OUTPUT);
- var w = new RandomIndexWriter(Random(), d, iwc);
- var tw = new DirectoryTaxonomyWriter(td, IndexWriterConfig.OpenMode_e.CREATE);
- FacetsConfig config = new FacetsConfig();
- for (int i = 0; i < numDims; i++)
- {
- config.SetMultiValued("dim" + i, true);
- }
-
- bool doUseDV = canUseDV && Random().NextBoolean();
-
- foreach (Doc rawDoc in docs)
- {
- Document doc = new Document();
- doc.Add(NewStringField("id", rawDoc.id, Field.Store.YES));
- doc.Add(NewStringField("content", rawDoc.contentToken, Field.Store.NO));
-
- if (VERBOSE)
- {
- Console.WriteLine(" doc id=" + rawDoc.id + " token=" + rawDoc.contentToken);
- }
- for (int dim = 0; dim < numDims; dim++)
- {
- int dimValue = rawDoc.dims[dim];
- if (dimValue != -1)
- {
- if (doUseDV)
- {
- doc.Add(new SortedSetDocValuesFacetField("dim" + dim, dimValues[dim][dimValue]));
- }
- else
- {
- doc.Add(new FacetField("dim" + dim, dimValues[dim][dimValue]));
- }
- doc.Add(new StringField("dim" + dim, dimValues[dim][dimValue], Field.Store.YES));
- if (VERBOSE)
- {
- Console.WriteLine(" dim" + dim + "=" + new BytesRef(dimValues[dim][dimValue]));
- }
- }
- int dimValue2 = rawDoc.dims2[dim];
- if (dimValue2 != -1)
- {
- if (doUseDV)
- {
- doc.Add(new SortedSetDocValuesFacetField("dim" + dim, dimValues[dim][dimValue2]));
- }
- else
- {
- doc.Add(new FacetField("dim" + dim, dimValues[dim][dimValue2]));
- }
- doc.Add(new StringField("dim" + dim, dimValues[dim][dimValue2], Field.Store.YES));
- if (VERBOSE)
- {
- Console.WriteLine(" dim" + dim + "=" + new BytesRef(dimValues[dim][dimValue2]));
- }
- }
- }
-
- w.AddDocument(config.Build(tw, doc));
- }
-
- if (Random().NextBoolean())
- {
- // Randomly delete a few docs:
- int numDel = TestUtil.NextInt(Random(), 1, (int)(numDocs * 0.05));
- if (VERBOSE)
- {
- Console.WriteLine("delete " + numDel);
- }
- int delCount = 0;
- while (delCount < numDel)
- {
- Doc doc = docs[Random().Next(docs.Count)];
- if (!doc.deleted)
- {
- if (VERBOSE)
- {
- Console.WriteLine(" delete id=" + doc.id);
- }
- doc.deleted = true;
- w.DeleteDocuments(new Term("id", doc.id));
- delCount++;
- }
- }
- }
-
- if (Random().NextBoolean())
- {
- if (VERBOSE)
- {
- Console.WriteLine("TEST: forceMerge(1)...");
- }
- w.ForceMerge(1);
- }
- IndexReader r = w.Reader;
-
- SortedSetDocValuesReaderState sortedSetDVState;
- IndexSearcher s = NewSearcher(r);
-
- if (doUseDV)
- {
- sortedSetDVState = new DefaultSortedSetDocValuesReaderState(s.IndexReader);
- }
- else
- {
- sortedSetDVState = null;
- }
-
- if (VERBOSE)
- {
- Console.WriteLine("r.numDocs() = " + r.NumDocs);
- }
-
- // NRT open
- var tr = new DirectoryTaxonomyReader(tw);
-
- int numIters = AtLeast(10);
-
- for (int iter = 0; iter < numIters; iter++)
- {
-
- string contentToken = Random().Next(30) == 17 ? null : randomContentToken(true);
- int numDrillDown = TestUtil.NextInt(Random(), 1, Math.Min(4, numDims));
- if (VERBOSE)
- {
- Console.WriteLine("\nTEST: iter=" + iter + " baseQuery=" + contentToken + " numDrillDown=" + numDrillDown + " useSortedSetDV=" + doUseDV);
- }
-
- string[][] drillDowns = new string[numDims][];
-
- int count = 0;
- bool anyMultiValuedDrillDowns = false;
- while (count < numDrillDown)
- {
- int dim = Random().Next(numDims);
- if (drillDowns[dim] == null)
- {
- if (Random().NextBoolean())
- {
- // Drill down on one value:
- drillDowns[dim] = new string[] { dimValues[dim][Random().Next(dimValues[dim].Length)] };
- }
- else
- {
- int orCount = TestUtil.NextInt(Random(), 1, Math.Min(5, dimValues[dim].Length));
- drillDowns[dim] = new string[orCount];
- anyMultiValuedDrillDowns |= orCount > 1;
- for (int i = 0; i < orCount; i++)
- {
- while (true)
- {
- string value = dimValues[dim][Random().Next(dimValues[dim].Length)];
- for (int j = 0; j < i; j++)
- {
- if (value.Equals(drillDowns[dim][j]))
- {
- value = null;
- break;
- }
- }
- if (value != null)
- {
- drillDowns[dim][i] = value;
- break;
- }
- }
- }
- }
- if (VERBOSE)
- {
- BytesRef[] values = new BytesRef[drillDowns[dim].Length];
- for (int i = 0; i < values.Length; i++)
- {
- values[i] = new BytesRef(drillDowns[dim][i]);
- }
- Console.WriteLine(" dim" + dim + "=" + Arrays.ToString(values));
- }
- count++;
- }
- }
-
- Query baseQuery;
- if (contentToken == null)
- {
- baseQuery = new MatchAllDocsQuery();
- }
- else
- {
- baseQuery = new TermQuery(new Term("content", contentToken));
- }
-
- DrillDownQuery ddq = new DrillDownQuery(config, baseQuery);
-
- for (int dim = 0; dim < numDims; dim++)
- {
- if (drillDowns[dim] != null)
- {
- foreach (string value in drillDowns[dim])
- {
- ddq.Add("dim" + dim, value);
- }
- }
- }
-
- Filter filter;
- if (Random().Next(7) == 6)
- {
- if (VERBOSE)
- {
- Console.WriteLine(" only-even filter");
- }
- filter = new FilterAnonymousInnerClassHelper(this);
- }
- else
- {
- filter = null;
- }
-
- // Verify docs are always collected in order. If we
- // had an AssertingScorer it could catch it when
- // Weight.scoresDocsOutOfOrder lies!:
- (new DrillSideways(s, config, tr)).Search(ddq, new CollectorAnonymousInnerClassHelper(this, s));
-
- // Also separately verify that DS respects the
- // scoreSubDocsAtOnce method, to ensure that all
- // subScorers are on the same docID:
- if (!anyMultiValuedDrillDowns)
- {
- // Can only do this test when there are no OR'd
- // drill-down values, because in that case it's
- // easily possible for one of the DD terms to be on
- // a future docID:
- new DrillSidewaysAnonymousInnerClassHelper(this, s, config, tr)
- .Search(ddq, new AssertingSubDocsAtOnceCollector());
- }
-
- TestFacetResult expected = slowDrillSidewaysSearch(s, docs, contentToken, drillDowns, dimValues, filter);
-
- Sort sort = new Sort(new SortField("id", SortField.Type_e.STRING));
- DrillSideways ds;
- if (doUseDV)
- {
- ds = new DrillSideways(s, config, sortedSetDVState);
- }
- else
- {
- ds = new DrillSidewaysAnonymousInnerClassHelper2(this, s, config, tr, drillDowns);
- }
-
- // Retrieve all facets:
- DrillSidewaysResult actual = ds.Search(ddq, filter, null, numDocs, sort, true, true);
-
- TopDocs hits = s.Search(baseQuery, numDocs);
- IDictionary<string, float?> scores = new Dictionary<string, float?>();
- foreach (ScoreDoc sd in hits.ScoreDocs)
- {
- scores[s.Doc(sd.Doc).Get("id")] = sd.Score;
- }
- if (VERBOSE)
- {
- Console.WriteLine(" verify all facets");
- }
- VerifyEquals(dimValues, s, expected, actual, scores, doUseDV);
-
- // Make sure drill down doesn't change score:
- TopDocs ddqHits = s.Search(ddq, filter, numDocs);
- Assert.AreEqual(expected.Hits.Count, ddqHits.TotalHits);
- for (int i = 0; i < expected.Hits.Count; i++)
- {
- // Score should be IDENTICAL:
- Assert.AreEqual(scores[expected.Hits[i].id], ddqHits.ScoreDocs[i].Score);
- }
- }
-
- IOUtils.Close(r, tr, w, tw, d, td);
- }
-
- private class FilterAnonymousInnerClassHelper : Filter
- {
- private readonly TestDrillSideways outerInstance;
-
- public FilterAnonymousInnerClassHelper(TestDrillSideways outerInstance)
- {
- this.outerInstance = outerInstance;
- }
-
- public override DocIdSet GetDocIdSet(AtomicReaderContext context, Bits acceptDocs)
- {
- int maxDoc = context.Reader.MaxDoc;
- FixedBitSet bits = new FixedBitSet(maxDoc);
- for (int docID = 0; docID < maxDoc; docID++)
- {
- // Keeps only the even ids:
- if ((acceptDocs == null || acceptDocs.Get(docID)) && (Convert.ToInt32(context.Reader.Document(docID).Get("id")) & 1) == 0)
- {
- bits.Set(docID);
- }
- }
- return bits;
- }
- }
-
- private class CollectorAnonymousInnerClassHelper : Collector
- {
- private readonly TestDrillSideways outerInstance;
-
- private IndexSearcher s;
-
- public CollectorAnonymousInnerClassHelper(TestDrillSideways outerInstance, IndexSearcher s)
- {
- this.outerInstance = outerInstance;
- this.s = s;
- }
-
- internal int lastDocID;
-
- public override Scorer Scorer
- {
- set
- {
- }
- }
-
- public override void Collect(int doc)
- {
- Debug.Assert(doc > lastDocID);
- lastDocID = doc;
- }
-
- public override AtomicReaderContext NextReader
- {
- set
- {
- lastDocID = -1;
- }
- }
-
- public override bool AcceptsDocsOutOfOrder()
- {
- return false;
- }
- }
-
- private class DrillSidewaysAnonymousInnerClassHelper : DrillSideways
- {
- private readonly TestDrillSideways outerInstance;
-
- public DrillSidewaysAnonymousInnerClassHelper(TestDrillSideways outerInstance, IndexSearcher s, Lucene.Net.Facet.FacetsConfig config, TaxonomyReader tr)
- : base(s, config, tr)
- {
- this.outerInstance = outerInstance;
- }
-
- protected override bool ScoreSubDocsAtOnce()
- {
- return true;
- }
- }
-
- private class DrillSidewaysAnonymousInnerClassHelper2 : DrillSideways
- {
- private readonly TestDrillSideways outerInstance;
-
- private new Lucene.Net.Facet.FacetsConfig config;
- private string[][] drillDowns;
-
- public DrillSidewaysAnonymousInnerClassHelper2(TestDrillSideways outerInstance, IndexSearcher s, Lucene.Net.Facet.FacetsConfig config, TaxonomyReader tr, string[][] drillDowns)
- : base(s, config, tr)
- {
- this.outerInstance = outerInstance;
- this.config = config;
- this.drillDowns = drillDowns;
- }
-
- protected override Facets BuildFacetsResult(FacetsCollector drillDowns, FacetsCollector[] drillSideways, string[] drillSidewaysDims)
- {
- IDictionary<string, Facets> drillSidewaysFacets = new Dictionary<string, Facets>();
- Facets drillDownFacets = outerInstance.GetTaxonomyFacetCounts(taxoReader, config, drillDowns);
- if (drillSideways != null)
- {
- for (int i = 0; i < drillSideways.Length; i++)
- {
- drillSidewaysFacets[drillSidewaysDims[i]] = outerInstance.GetTaxonomyFacetCounts(taxoReader, config, drillSideways[i]);
- }
- }
-
- if (drillSidewaysFacets.Count == 0)
- {
- return drillDownFacets;
- }
- else
- {
- return new MultiFacets(drillSidewaysFacets, drillDownFacets);
- }
-
- }
- }
-
- private class Counters
- {
- internal int[][] counts;
-
- public Counters(string[][] dimValues)
- {
- counts = new int[dimValues.Length][];
- for (int dim = 0; dim < dimValues.Length; dim++)
- {
- counts[dim] = new int[dimValues[dim].Length];
- }
- }
-
- public virtual void Inc(int[] dims, int[] dims2)
- {
- Inc(dims, dims2, -1);
- }
-
- public virtual void Inc(int[] dims, int[] dims2, int onlyDim)
- {
- Debug.Assert(dims.Length == counts.Length);
- Debug.Assert(dims2.Length == counts.Length);
- for (int dim = 0; dim < dims.Length; dim++)
- {
- if (onlyDim == -1 || dim == onlyDim)
- {
- if (dims[dim] != -1)
- {
- counts[dim][dims[dim]]++;
- }
- if (dims2[dim] != -1 && dims2[dim] != dims[dim])
- {
- counts[dim][dims2[dim]]++;
- }
- }
- }
- }
- }
-
- internal class TestFacetResult
- {
- internal IList<Doc> Hits;
- internal int[][] Counts;
- internal int[] UniqueCounts;
- public TestFacetResult()
- {
- }
- }
-
- private int[] GetTopNOrds(int[] counts, string[] values, int topN)
- {
- int[] ids = new int[counts.Length];
- for (int i = 0; i < ids.Length; i++)
- {
- ids[i] = i;
- }
-
- // Naive (on purpose, to reduce bug in tester/gold):
- // sort all ids, then return top N slice:
- new InPlaceMergeSorterAnonymousInnerClassHelper(this, counts, values, ids).Sort(0, ids.Length);
-
- if (topN > ids.Length)
- {
- topN = ids.Length;
- }
-
- int numSet = topN;
- for (int i = 0; i < topN; i++)
- {
- if (counts[ids[i]] == 0)
- {
- numSet = i;
- break;
- }
- }
-
- int[] topNIDs = new int[numSet];
- Array.Copy(ids, 0, topNIDs, 0, topNIDs.Length);
- return topNIDs;
- }
-
- private class InPlaceMergeSorterAnonymousInnerClassHelper : InPlaceMergeSorter
- {
- private readonly TestDrillSideways outerInstance;
-
- private int[] counts;
- private string[] values;
- private int[] ids;
-
- public InPlaceMergeSorterAnonymousInnerClassHelper(TestDrillSideways outerInstance, int[] counts, string[] values, int[] ids)
- {
- this.outerInstance = outerInstance;
- this.counts = counts;
- this.values = values;
- this.ids = ids;
- }
-
-
- protected override void Swap(int i, int j)
- {
- int id = ids[i];
- ids[i] = ids[j];
- ids[j] = id;
- }
-
- protected override int Compare(int i, int j)
- {
- int counti = counts[ids[i]];
- int countj = counts[ids[j]];
- // Sort by count descending...
- if (counti > countj)
- {
- return -1;
- }
- else if (counti < countj)
- {
- return 1;
- }
- else
- {
- // ... then by label ascending:
- return (new BytesRef(values[ids[i]])).CompareTo(new BytesRef(values[ids[j]]));
- }
- }
-
- }
-
- private TestFacetResult slowDrillSidewaysSearch(IndexSearcher s, IList<Doc> docs, string contentToken, string[][] drillDowns, string[][] dimValues, Filter onlyEven)
- {
- int numDims = dimValues.Length;
-
- IList<Doc> hits = new List<Doc>();
- Counters drillDownCounts = new Counters(dimValues);
- Counters[] drillSidewaysCounts = new Counters[dimValues.Length];
- for (int dim = 0; dim < numDims; dim++)
- {
- drillSidewaysCounts[dim] = new Counters(dimValues);
- }
-
- if (VERBOSE)
- {
- Console.WriteLine(" compute expected");
- }
-
- foreach (Doc doc in docs)
- {
- if (doc.deleted)
- {
- continue;
- }
- if (onlyEven != null & (Convert.ToInt32(doc.id) & 1) != 0)
- {
- continue;
- }
- if (contentToken == null || doc.contentToken.Equals(contentToken))
- {
- int failDim = -1;
- for (int dim = 0; dim < numDims; dim++)
- {
- if (drillDowns[dim] != null)
- {
- string docValue = doc.dims[dim] == -1 ? null : dimValues[dim][doc.dims[dim]];
- string docValue2 = doc.dims2[dim] == -1 ? null : dimValues[dim][doc.dims2[dim]];
- bool matches = false;
- foreach (string value in drillDowns[dim])
- {
- if (value.Equals(docValue) || value.Equals(docValue2))
- {
- matches = true;
- break;
- }
- }
- if (!matches)
- {
- if (failDim == -1)
- {
- // Doc could be a near-miss, if no other dim fails
- failDim = dim;
- }
- else
- {
- // Doc isn't a hit nor a near-miss
- goto nextDocContinue;
- }
- }
- }
- }
-
- if (failDim == -1)
- {
- if (VERBOSE)
- {
- Console.WriteLine(" exp: id=" + doc.id + " is a hit");
- }
- // Hit:
- hits.Add(doc);
- drillDownCounts.Inc(doc.dims, doc.dims2);
- for (int dim = 0; dim < dimValues.Length; dim++)
- {
- drillSidewaysCounts[dim].Inc(doc.dims, doc.dims2);
- }
- }
- else
- {
- if (VERBOSE)
- {
- Console.WriteLine(" exp: id=" + doc.id + " is a near-miss on dim=" + failDim);
- }
- drillSidewaysCounts[failDim].Inc(doc.dims, doc.dims2, failDim);
- }
- }
- nextDocContinue: ;
- }
- nextDocBreak:
-
- IDictionary<string, int?> idToDocID = new Dictionary<string, int?>();
- for (int i = 0; i < s.IndexReader.MaxDoc; i++)
- {
- idToDocID[s.Doc(i).Get("id")] = i;
- }
-
- var hitsSorted = hits.ToArray();
- Array.Sort(hitsSorted);
- hits = hitsSorted.ToList();
-
- TestFacetResult res = new TestFacetResult();
- res.Hits = hits;
- res.Counts = new int[numDims][];
- res.UniqueCounts = new int[numDims];
- for (int dim = 0; dim < numDims; dim++)
- {
- if (drillDowns[dim] != null)
- {
- res.Counts[dim] = drillSidewaysCounts[dim].counts[dim];
- }
- else
- {
- res.Counts[dim] = drillDownCounts.counts[dim];
- }
- int uniqueCount = 0;
- for (int j = 0; j < res.Counts[dim].Length; j++)
- {
- if (res.Counts[dim][j] != 0)
- {
- uniqueCount++;
- }
- }
- res.UniqueCounts[dim] = uniqueCount;
- }
-
- return res;
- }
-
- internal virtual void VerifyEquals(string[][] dimValues, IndexSearcher s, TestFacetResult expected, DrillSidewaysResult actual, IDictionary<string, float?> scores, bool isSortedSetDV)
- {
- if (VERBOSE)
- {
- Console.WriteLine(" verify totHits=" + expected.Hits.Count);
- }
- Assert.AreEqual(expected.Hits.Count, actual.Hits.TotalHits);
- Assert.AreEqual(expected.Hits.Count, actual.Hits.ScoreDocs.Length);
- for (int i = 0; i < expected.Hits.Count; i++)
- {
- if (VERBOSE)
- {
- Console.WriteLine(" hit " + i + " expected=" + expected.Hits[i].id);
- }
- Assert.AreEqual(expected.Hits[i].id, s.Doc(actual.Hits.ScoreDocs[i].Doc).Get("id"));
- // Score should be IDENTICAL:
- Assert.AreEqual(scores[expected.Hits[i].id], actual.Hits.ScoreDocs[i].Score);
- }
-
- for (int dim = 0; dim < expected.Counts.Length; dim++)
- {
- int topN = Random().NextBoolean() ? dimValues[dim].Length : TestUtil.NextInt(Random(), 1, dimValues[dim].Length);
- FacetResult fr = actual.Facets.GetTopChildren(topN, "dim" + dim);
- if (VERBOSE)
- {
- Console.WriteLine(" dim" + dim + " topN=" + topN + " (vs " + dimValues[dim].Length + " unique values)");
- Console.WriteLine(" actual");
- }
-
- int idx = 0;
- IDictionary<string, int?> actualValues = new Dictionary<string, int?>();
-
- if (fr != null)
- {
- foreach (LabelAndValue labelValue in fr.LabelValues)
- {
- actualValues[labelValue.label] = (int)labelValue.value;
- if (VERBOSE)
- {
- Console.WriteLine(" " + idx + ": " + new BytesRef(labelValue.label) + ": " + labelValue.value);
- idx++;
- }
- }
- Assert.AreEqual(expected.UniqueCounts[dim], fr.ChildCount, "dim=" + dim);
- }
-
- if (topN < dimValues[dim].Length)
- {
- int[] topNIDs = GetTopNOrds(expected.Counts[dim], dimValues[dim], topN);
- if (VERBOSE)
- {
- idx = 0;
- Console.WriteLine(" expected (sorted)");
- for (int i = 0; i < topNIDs.Length; i++)
- {
- int expectedOrd = topNIDs[i];
- string value = dimValues[dim][expectedOrd];
- Console.WriteLine(" " + idx + ": " + new BytesRef(value) + ": " + expected.Counts[dim][expectedOrd]);
- idx++;
- }
- }
- if (VERBOSE)
- {
- Console.WriteLine(" topN=" + topN + " expectedTopN=" + topNIDs.Length);
- }
-
- if (fr != null)
- {
- Assert.AreEqual(topNIDs.Length, fr.LabelValues.Length);
- }
- else
- {
- Assert.AreEqual(0, topNIDs.Length);
- }
- for (int i = 0; i < topNIDs.Length; i++)
- {
- int expectedOrd = topNIDs[i];
- Assert.AreEqual(expected.Counts[dim][expectedOrd], (int)fr.LabelValues[i].value);
- if (isSortedSetDV)
- {
- // Tie-break facet labels are only in unicode
- // order with SortedSetDVFacets:
- Assert.AreEqual("value @ idx=" + i, dimValues[dim][expectedOrd], fr.LabelValues[i].label);
- }
- }
- }
- else
- {
-
- if (VERBOSE)
- {
- idx = 0;
- Console.WriteLine(" expected (unsorted)");
- for (int i = 0; i < dimValues[dim].Length; i++)
- {
- string value = dimValues[dim][i];
- if (expected.Counts[dim][i] != 0)
- {
- Console.WriteLine(" " + idx + ": " + new BytesRef(value) + ": " + expected.Counts[dim][i]);
- idx++;
- }
- }
- }
-
- int setCount = 0;
- for (int i = 0; i < dimValues[dim].Length; i++)
- {
- string value = dimValues[dim][i];
- if (expected.Counts[dim][i] != 0)
- {
- Assert.True(actualValues.ContainsKey(value));
- Assert.AreEqual(expected.Counts[dim][i], (int)actualValues[value]);
- setCount++;
- }
- else
- {
- Assert.False(actualValues.ContainsKey(value));
- }
- }
- Assert.AreEqual(setCount, actualValues.Count);
- }
- }
- }
-
- [Test]
- public virtual void TestEmptyIndex()
- {
- // LUCENE-5045: make sure DrillSideways works with an empty index
- Directory dir = NewDirectory();
- Directory taxoDir = NewDirectory();
- var writer = new RandomIndexWriter(Random(), dir);
- var taxoWriter = new DirectoryTaxonomyWriter(taxoDir, IndexWriterConfig.OpenMode_e.CREATE);
- IndexSearcher searcher = NewSearcher(writer.Reader);
- var taxoReader = new DirectoryTaxonomyReader(taxoWriter);
-
- // Count "Author"
- FacetsConfig config = new FacetsConfig();
- DrillSideways ds = new DrillSideways(searcher, config, taxoReader);
- DrillDownQuery ddq = new DrillDownQuery(config);
- ddq.Add("Author", "Lisa");
-
- DrillSidewaysResult r = ds.Search(ddq, 10); // this used to fail on IllegalArgEx
- Assert.AreEqual(0, r.Hits.TotalHits);
-
- r = ds.Search(ddq, null, null, 10, new Sort(new SortField("foo", SortField.Type_e.INT)), false, false); // this used to fail on IllegalArgEx
- Assert.AreEqual(0, r.Hits.TotalHits);
-
- IOUtils.Close(writer, taxoWriter, searcher.IndexReader, taxoReader, dir, taxoDir);
- }
- }
-
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/68aa9728/src/Lucene.Net.Tests/core/Facet/TestFacetsConfig.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Tests/core/Facet/TestFacetsConfig.cs b/src/Lucene.Net.Tests/core/Facet/TestFacetsConfig.cs
deleted file mode 100644
index 9c14f79..0000000
--- a/src/Lucene.Net.Tests/core/Facet/TestFacetsConfig.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-using Lucene.Net.Support;
-using NUnit.Framework;
-
-namespace Lucene.Net.Facet
-{
-
- /*
- * 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 MockAnalyzer = Lucene.Net.Analysis.MockAnalyzer;
- using Document = Lucene.Net.Documents.Document;
- using DirectoryTaxonomyReader = Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyReader;
- using DirectoryTaxonomyWriter = Lucene.Net.Facet.Taxonomy.Directory.DirectoryTaxonomyWriter;
- using DirectoryReader = Lucene.Net.Index.DirectoryReader;
- using IndexWriter = Lucene.Net.Index.IndexWriter;
- using IndexSearcher = Lucene.Net.Search.IndexSearcher;
- using MatchAllDocsQuery = Lucene.Net.Search.MatchAllDocsQuery;
- using Directory = Lucene.Net.Store.Directory;
- using IOUtils = Lucene.Net.Util.IOUtils;
- using TestUtil = Lucene.Net.Util.TestUtil;
-
- public class TestFacetsConfig : FacetTestCase
- {
-
- [Test]
- public virtual void TestPathToStringAndBack()
- {
- int iters = AtLeast(1000);
- for (int i = 0; i < iters; i++)
- {
- int numParts = TestUtil.NextInt(Random(), 1, 6);
- string[] parts = new string[numParts];
- for (int j = 0; j < numParts; j++)
- {
- string s;
- while (true)
- {
- s = TestUtil.RandomUnicodeString(Random());
- if (s.Length > 0)
- {
- break;
- }
- }
- parts[j] = s;
- }
-
- string s1 = FacetsConfig.PathToString(parts);
- string[] parts2 = FacetsConfig.StringToPath(s1);
- Assert.True(Arrays.Equals(parts, parts2));
- }
- }
-
- [Test]
- public virtual void TestAddSameDocTwice()
- {
- // LUCENE-5367: this was a problem with the previous code, making sure it
- // works with the new code.
- Directory indexDir = NewDirectory(), taxoDir = NewDirectory();
- IndexWriter indexWriter = new IndexWriter(indexDir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random())));
- DirectoryTaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir);
- FacetsConfig facetsConfig = new FacetsConfig();
- Document doc = new Document();
- doc.Add(new FacetField("a", "b"));
- doc = facetsConfig.Build(taxoWriter, doc);
- // these two addDocument() used to fail
- indexWriter.AddDocument(doc);
- indexWriter.AddDocument(doc);
- IOUtils.Close(indexWriter, taxoWriter);
-
- DirectoryReader indexReader = DirectoryReader.Open(indexDir);
- DirectoryTaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoDir);
- IndexSearcher searcher = NewSearcher(indexReader);
- FacetsCollector fc = new FacetsCollector();
- searcher.Search(new MatchAllDocsQuery(), fc);
-
- Facets facets = GetTaxonomyFacetCounts(taxoReader, facetsConfig, fc);
- FacetResult res = facets.GetTopChildren(10, "a");
- Assert.AreEqual(1, res.LabelValues.Length);
- Assert.AreEqual(2, res.LabelValues[0].value);
- IOUtils.Close(indexReader, taxoReader);
-
- IOUtils.Close(indexDir, taxoDir);
- }
-
- /// <summary>
- /// LUCENE-5479
- /// </summary>
- [Test]
- public virtual void TestCustomDefault()
- {
- FacetsConfig config = new FacetsConfigAnonymousInnerClassHelper(this);
-
- Assert.True(config.GetDimConfig("foobar").Hierarchical);
- }
-
- private class FacetsConfigAnonymousInnerClassHelper : FacetsConfig
- {
- private readonly TestFacetsConfig outerInstance;
-
- public FacetsConfigAnonymousInnerClassHelper(TestFacetsConfig outerInstance)
- {
- this.outerInstance = outerInstance;
- }
-
- protected override DimConfig DefaultDimConfig
- {
- get
- {
- DimConfig config = new DimConfig();
- config.Hierarchical = true;
- return config;
- }
- }
- }
- }
-
-}
\ No newline at end of file