///<summary>Sets runtime facet handler. If has the same name as a preload handler, for the
 ///duration of this browser, this one will be used.</summary>
 ///<param name="facetHandler">Runtime facet handler </param>
 public virtual void SetFacetHandler(FacetHandler facetHandler)
 {
     List<string> dependsOn = facetHandler.DependsOn;
     BoboIndexReader indexReader = GetIndexReader();
     if (dependsOn.Count > 0)
     {
         List<string>.Enumerator iter = dependsOn.GetEnumerator();
         while (iter.MoveNext())
         {
             string fn = iter.Current;
             FacetHandler f = null;
             if (runtimeFacetHandlerMap.ContainsKey(fn))
             {
                 f = runtimeFacetHandlerMap[fn];
             }
             if (f == null)
             {
                 f = indexReader.GetFacetHandler(fn);
             }
             if (f == null)
             {
                 throw new System.IO.IOException("depended on facet handler: " + fn + ", but is not found");
             }
             facetHandler.PutDependedFacetHandler(f);
         }
     }
     facetHandler.Load(indexReader);
     runtimeFacetHandlerMap.Add(facetHandler.Name, facetHandler);
 }
 /// <summary>
 /// Adds a list of depended facet handlers
 /// </summary>
 /// <param name="facetHandler"></param>
 public void PutDependedFacetHandler(FacetHandler facetHandler)
 {
     this._dependedFacetHandlers[facetHandler.Name] = facetHandler;
 }
        public void TestAutoComplete()
        {
            var query = new MatchAllDocsQuery();
            Console.WriteLine(string.Format("query: <{0}>", query.ToString()));
            var request = new BrowseRequest()
            {
                Count = 10,
                Offset = 0,
                Query = query                
            };

            var prefix = "java";
            Console.WriteLine(string.Format("prefix:{0}", prefix));
            Console.WriteLine("=============================");

            var faceHandlers = new FacetHandler[] { new SimpleFacetHandler("name") };
            var browser = new BoboBrowser(BoboIndexReader.GetInstance(IndexReader.Open(_indexDir, true), faceHandlers));
            var factSpec = new FacetSpec() {Prefix=prefix, OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc };
            request.SetFacetSpec("name", factSpec);

            var result = browser.Browse(request);
            
            foreach (var facet in result.FacetMap["name"].GetFacets())
            {
                Console.WriteLine(facet.ToString());
            }
        }
        public void TestRangeFacetHandler()
        {            
            var query = new MatchAllDocsQuery();
            Console.WriteLine(string.Format("query: <{0}>", query.ToString()));                       

            var testRangeFacetHandlers = new List<FacetHandler>();
            testRangeFacetHandlers.Add(new RangeFacetHandler("year", true));//auto range
            testRangeFacetHandlers.Add(new RangeFacetHandler("year", new List<string>(new string[] { "[* TO 2000]", "[2000 TO 2005]", "[2006 TO 2010]", "[2011 TO *]" })));
            testRangeFacetHandlers.Add(new RangeFacetHandler("price","price", new NumberFieldFactory(), true));

            for (var i = 0; i < testRangeFacetHandlers.Count; i++)
            {
                var request = new BrowseRequest()
                {
                    Count = 100,
                    Offset = 0,
                    Query = query,
                    Sort = new Sort(new SortField("price", SortField.DOUBLE, false)).GetSort()
                };

                var sectionFilter = new BrowseSelection("category");
                sectionFilter.NotValues = new string[] { "5" };
                sectionFilter.SelectionOperation = BrowseSelection.ValueOperation.ValueOperationAnd;
                request.AddSelection(sectionFilter);

                var faceHandler = testRangeFacetHandlers[i];
                var faceHandlers = new FacetHandler[] { faceHandler,new SimpleFacetHandler("category") };
                var browser = new BoboBrowser(BoboIndexReader.GetInstance(IndexReader.Open(_indexDir, true), faceHandlers));
                var factSpec = new FacetSpec() { OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc };
                request.SetFacetSpec(faceHandler.Name, factSpec);
                var result = browser.Browse(request);
                Console.WriteLine(string.Format("total hits:{0}", result.NumHits));
                foreach (var facet in result.FacetMap[faceHandler.Name].GetFacets())
                {
                    Console.WriteLine(facet.ToString());
                }
                Console.WriteLine("");
            }
        }
        public void TestMultiValueFacetHandler()
        {
            var query = new MatchAllDocsQuery();
            Console.WriteLine(string.Format("query: <{0}>", query.ToString()));
            var request = new BrowseRequest()
            {
                Count = 100,
                Offset = 0,
                Query = query,
                Sort = new Sort(new SortField("path", SortField.STRING, false)).GetSort()
            };

            var faceHandlers = new FacetHandler[] { new MultiValueFacetHandler("path") };
            var browser = new BoboBrowser(BoboIndexReader.GetInstance(IndexReader.Open(_indexDir, true), faceHandlers));
            var factSpec = new FacetSpec() { OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc };
            request.SetFacetSpec("path", factSpec);

            var result = browser.Browse(request);
            Console.WriteLine(string.Format("total hits:{0}", result.NumHits));
            Console.WriteLine("===========================");
            foreach (var facet in result.FacetMap["path"].GetFacets())
            {
                Console.WriteLine(facet.ToString());               
            }
            Console.WriteLine("===========================");
            for (var i = 0; i < result.Hits.Length; i++)
            {
                var doc = browser.Doc(result.Hits[i].DocId);
                var category = _categories.First(k => k.Value == int.Parse(doc.GetField("category").StringValue)).Key;
                Console.WriteLine(string.Format("{2} - {0} ${1} by {3}", doc.GetField("name").StringValue, doc.GetField("price").StringValue, category, doc.GetField("author").StringValue));
            }
        }