Beispiel #1
0
        public virtual void TestIsCacheAble()
        {
            Directory         dir    = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(
#if FEATURE_INSTANCE_TESTDATA_INITIALIZATION
                this,
#endif
                Random, dir);

            writer.AddDocument(new Document());
            writer.Dispose();

            IndexReader reader = SlowCompositeReaderWrapper.Wrap(DirectoryReader.Open(dir));

            // not cacheable:
            AssertDocIdSetCacheable(reader, new QueryWrapperFilter(new TermQuery(new Term("test", "value"))), false);
            // returns default empty docidset, always cacheable:
            AssertDocIdSetCacheable(reader, NumericRangeFilter.NewInt32Range("test", Convert.ToInt32(10000), Convert.ToInt32(-10000), true, true), true);
            // is cacheable:
            AssertDocIdSetCacheable(reader, FieldCacheRangeFilter.NewInt32Range("test", Convert.ToInt32(10), Convert.ToInt32(20), true, true), true);
            // a fixedbitset filter is always cacheable
            AssertDocIdSetCacheable(reader, new FilterAnonymousInnerClassHelper3(this), true);

            reader.Dispose();
            dir.Dispose();
        }
Beispiel #2
0
        public virtual void TestInverseRange()
        {
            AtomicReaderContext      context = (AtomicReaderContext)SlowCompositeReaderWrapper.Wrap(Reader).Context;
            NumericRangeFilter <int> f       = NumericRangeFilter.NewInt32Range("field8", 8, 1000, -1000, true, true);

            Assert.IsNull(f.GetDocIdSet(context, (context.AtomicReader).LiveDocs), "A inverse range should return the null instance");
            f = NumericRangeFilter.NewInt32Range("field8", 8, int.MaxValue, null, false, false);
            Assert.IsNull(f.GetDocIdSet(context, (context.AtomicReader).LiveDocs), "A exclusive range starting with Integer.MAX_VALUE should return the null instance");
            f = NumericRangeFilter.NewInt32Range("field8", 8, null, int.MinValue, false, false);
            Assert.IsNull(f.GetDocIdSet(context, (context.AtomicReader).LiveDocs), "A exclusive range ending with Integer.MIN_VALUE should return the null instance");
        }
Beispiel #3
0
        /// <summary>
        /// we fake a float test using int2float conversion of NumericUtils </summary>
        private void TestFloatRange(int precisionStep)
        {
            string    field = "ascfield" + precisionStep;
            const int lower = -1000, upper = +2000;

            Query   tq       = NumericRangeQuery.NewSingleRange(field, precisionStep, NumericUtils.SortableInt32ToSingle(lower), NumericUtils.SortableInt32ToSingle(upper), true, true);
            TopDocs tTopDocs = Searcher.Search(tq, 1);

            Assert.AreEqual(upper - lower + 1, tTopDocs.TotalHits, "Returned count of range query must be equal to inclusive range length");

            Filter tf = NumericRangeFilter.NewSingleRange(field, precisionStep, NumericUtils.SortableInt32ToSingle(lower), NumericUtils.SortableInt32ToSingle(upper), true, true);

            tTopDocs = Searcher.Search(new MatchAllDocsQuery(), tf, 1);
            Assert.AreEqual(upper - lower + 1, tTopDocs.TotalHits, "Returned count of range filter must be equal to inclusive range length");
        }
        public virtual void  TestInverseRange()
        {
            System.Int64       tempAux  = 1000L;
            System.Int64       tempAux2 = -1000L;
            NumericRangeFilter f        = NumericRangeFilter.NewLongRange("field8", 8, tempAux, tempAux2, true, true);

            Assert.AreSame(DocIdSet.EMPTY_DOCIDSET, f.GetDocIdSet(searcher.GetIndexReader()), "A inverse range should return the EMPTY_DOCIDSET instance");
            //UPGRADE_TODO: The 'System.Int64' structure does not have an equivalent to NULL. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1291'"
            System.Int64 tempAux3 = (long)System.Int64.MaxValue;
            f = NumericRangeFilter.NewLongRange("field8", 8, tempAux3, null, false, false);
            Assert.AreSame(DocIdSet.EMPTY_DOCIDSET, f.GetDocIdSet(searcher.GetIndexReader()), "A exclusive range starting with Long.MAX_VALUE should return the EMPTY_DOCIDSET instance");
            //UPGRADE_TODO: The 'System.Int64' structure does not have an equivalent to NULL. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1291'"
            System.Int64 tempAux4 = (long)System.Int64.MinValue;
            f = NumericRangeFilter.NewLongRange("field8", 8, null, tempAux4, false, false);
            Assert.AreSame(DocIdSet.EMPTY_DOCIDSET, f.GetDocIdSet(searcher.GetIndexReader()), "A exclusive range ending with Long.MIN_VALUE should return the EMPTY_DOCIDSET instance");
        }
Beispiel #5
0
        /// <summary>
        /// test for both constant score and boolean query, the other tests only use the constant score mode </summary>
        private void TestRange(int precisionStep)
        {
            string field = "field" + precisionStep;
            int    count = 3000;
            int    lower = (Distance * 3 / 2) + StartOffset, upper = lower + count * Distance + (Distance / 3);
            NumericRangeQuery <int>  q = NumericRangeQuery.NewInt32Range(field, precisionStep, lower, upper, true, true);
            NumericRangeFilter <int> f = NumericRangeFilter.NewInt32Range(field, precisionStep, lower, upper, true, true);

            for (sbyte i = 0; i < 3; i++)
            {
                TopDocs topDocs;
                string  type;
                switch (i)
                {
                case 0:
                    type = " (constant score filter rewrite)";
                    q.MultiTermRewriteMethod = MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE;
                    topDocs = Searcher.Search(q, null, NoDocs, Sort.INDEXORDER);
                    break;

                case 1:
                    type = " (constant score boolean rewrite)";
                    q.MultiTermRewriteMethod = MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE;
                    topDocs = Searcher.Search(q, null, NoDocs, Sort.INDEXORDER);
                    break;

                case 2:
                    type    = " (filter)";
                    topDocs = Searcher.Search(new MatchAllDocsQuery(), f, NoDocs, Sort.INDEXORDER);
                    break;

                default:
                    return;
                }
                ScoreDoc[] sd = topDocs.ScoreDocs;
                Assert.IsNotNull(sd);
                Assert.AreEqual(count, sd.Length, "Score doc count" + type);
                Document doc = Searcher.Doc(sd[0].Doc);
                Assert.AreEqual(2 * Distance + StartOffset, doc.GetField(field).GetInt32Value().Value, "First doc" + type);
                doc = Searcher.Doc(sd[sd.Length - 1].Doc);
                Assert.AreEqual((1 + count) * Distance + StartOffset, doc.GetField(field).GetInt32Value().Value, "Last doc" + type);
            }
        }
Beispiel #6
0
        public void TestIsCacheable()
        {
            Directory   dir    = new RAMDirectory();
            IndexWriter writer = new IndexWriter(dir, new KeywordAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);

            writer.Close();

            IndexReader reader = IndexReader.Open(dir, true);

            // not cacheable:
            assertDocIdSetCacheable(reader, new QueryWrapperFilter(new TermQuery(new Term("test", "value"))), false);
            // returns default empty docidset, always cacheable:
            assertDocIdSetCacheable(reader, NumericRangeFilter.NewIntRange("test", 10000, -10000, true, true), true);
            // is cacheable:
            assertDocIdSetCacheable(reader, FieldCacheRangeFilter.NewIntRange("test", 10, 20, true, true), true);
            // a openbitset filter is always cacheable
            assertDocIdSetCacheable(reader, new AnonymousFilter3(), true);

            reader.Close();
        }
        /// <summary>we fake a double test using long2double conversion of NumericUtils </summary>
        private void  TestDoubleRange(int precisionStep)
        {
            System.String field = "ascfield" + precisionStep;
            long          lower = -1000L;
            long          upper = +2000L;

            System.Double tempAux  = (double)NumericUtils.SortableLongToDouble(lower);
            System.Double tempAux2 = (double)NumericUtils.SortableLongToDouble(upper);
            Query         tq       = NumericRangeQuery.NewDoubleRange(field, precisionStep, tempAux, tempAux2, true, true);
            TopDocs       tTopDocs = searcher.Search(tq, 1);

            Assert.AreEqual(upper - lower + 1, tTopDocs.totalHits, "Returned count of range query must be equal to inclusive range length");

            System.Double tempAux3 = (double)NumericUtils.SortableLongToDouble(lower);
            System.Double tempAux4 = (double)NumericUtils.SortableLongToDouble(upper);
            Filter        tf       = NumericRangeFilter.NewDoubleRange(field, precisionStep, tempAux3, tempAux4, true, true);

            tTopDocs = searcher.Search(new MatchAllDocsQuery(), tf, 1);
            Assert.AreEqual(upper - lower + 1, tTopDocs.totalHits, "Returned count of range filter must be equal to inclusive range length");
        }
        /// <summary>we fake a float test using int2float conversion of NumericUtils </summary>
        private void  TestFloatRange(int precisionStep)
        {
            System.String field = "ascfield" + precisionStep;
            int           lower = -1000;
            int           upper = +2000;

            System.Single tempAux  = (float)NumericUtils.SortableIntToFloat(lower);
            System.Single tempAux2 = (float)NumericUtils.SortableIntToFloat(upper);
            Query         tq       = NumericRangeQuery.NewFloatRange(field, precisionStep, tempAux, tempAux2, true, true);
            TopDocs       tTopDocs = searcher.Search(tq, 1, null);

            Assert.AreEqual(upper - lower + 1, tTopDocs.TotalHits, "Returned count of range query must be equal to inclusive range length");

            System.Single tempAux3 = (float)NumericUtils.SortableIntToFloat(lower);
            System.Single tempAux4 = (float)NumericUtils.SortableIntToFloat(upper);
            Filter        tf       = NumericRangeFilter.NewFloatRange(field, precisionStep, tempAux3, tempAux4, true, true);

            tTopDocs = searcher.Search((Query) new MatchAllDocsQuery(), tf, (int)1, (IState)null);
            Assert.AreEqual(upper - lower + 1, tTopDocs.TotalHits, "Returned count of range filter must be equal to inclusive range length");
        }
        /// <summary>test for constant score + boolean query + filter, the other tests only use the constant score mode </summary>
        private void  TestRange(int precisionStep)
        {
            System.String field = "field" + precisionStep;
            int           count = 3000;
            long          lower = (distance * 3 / 2) + startOffset, upper = lower + count * distance + (distance / 3);

            System.Int64      tempAux  = (long)lower;
            System.Int64      tempAux2 = (long)upper;
            NumericRangeQuery q        = NumericRangeQuery.NewLongRange(field, precisionStep, tempAux, tempAux2, true, true);

            System.Int64       tempAux3 = (long)lower;
            System.Int64       tempAux4 = (long)upper;
            NumericRangeFilter f        = NumericRangeFilter.NewLongRange(field, precisionStep, tempAux3, tempAux4, true, true);
            int lastTerms = 0;

            for (sbyte i = 0; i < 3; i++)
            {
                TopDocs       topDocs;
                int           terms;
                System.String type;
                q.ClearTotalNumberOfTerms();
                f.ClearTotalNumberOfTerms();
                switch (i)
                {
                case 0:
                    type = " (constant score filter rewrite)";
                    q.SetRewriteMethod(MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE);
                    topDocs = searcher.Search(q, null, noDocs, Sort.INDEXORDER);
                    terms   = q.GetTotalNumberOfTerms();
                    break;

                case 1:
                    type = " (constant score boolean rewrite)";
                    q.SetRewriteMethod(MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE);
                    topDocs = searcher.Search(q, null, noDocs, Sort.INDEXORDER);
                    terms   = q.GetTotalNumberOfTerms();
                    break;

                case 2:
                    type    = " (filter)";
                    topDocs = searcher.Search(new MatchAllDocsQuery(), f, noDocs, Sort.INDEXORDER);
                    terms   = f.GetTotalNumberOfTerms();
                    break;

                default:
                    return;
                }
                System.Console.Out.WriteLine("Found " + terms + " distinct terms in range for field '" + field + "'" + type + ".");
                ScoreDoc[] sd = topDocs.scoreDocs;
                Assert.IsNotNull(sd);
                Assert.AreEqual(count, sd.Length, "Score doc count" + type);
                Document doc = searcher.Doc(sd[0].doc);
                Assert.AreEqual(2 * distance + startOffset, System.Int64.Parse(doc.Get(field)), "First doc" + type);
                doc = searcher.Doc(sd[sd.Length - 1].doc);
                Assert.AreEqual((1 + count) * distance + startOffset, System.Int64.Parse(doc.Get(field)), "Last doc" + type);
                if (i > 0)
                {
                    Assert.AreEqual(lastTerms, terms, "Distinct term number is equal for all query types");
                }
                lastTerms = terms;
            }
        }