Esempio n. 1
0
        private ResourceSearchResults GetSearchResults(BrowseResult result, int skip, int take)
        {
            // TotalMatches

            var searchResults = new ResourceSearchResults {
                TotalMatches = result.getNumHits()
            };

            // ResourceItemIds

            var hits = result.getHits();

            searchResults.ResourceIds = hits
                                        .Skip(skip)
                                        .Take(take)
                                        .Select(hit => new Guid(_browser.doc(hit.getDocid()).get(SearchFieldName.Id)))
                                        .ToArray();

            // Facets

            var facetMap = result.getFacetMap();

            if (facetMap != null && !facetMap.isEmpty())
            {
                var facets = GetFieldHits(facetMap, FieldName.ItemType, v => v.DecodeToResourceType());
                searchResults.ResourceTypeHits = Enum.GetValues(typeof(ResourceType))
                                                 .Cast <ResourceType>()
                                                 .Select(v => new KeyValuePair <ResourceType, int>(v, facets.ContainsKey(v) ? facets[v] : 0))
                                                 .ToList();
            }

            return(searchResults);
        }
Esempio n. 2
0
        private JobAdSearchResults GetSearchResults(BrowseResult result, int skip, int take)
        {
            // TotalMatches

            var searchResults = new JobAdSearchResults {
                TotalMatches = result.getNumHits()
            };

            // JobAdIds

            var hits = result.getHits();

            searchResults.JobAdIds = hits
                                     .Skip(skip)
                                     .Take(take)
                                     .Select(hit => new Guid(_browser.doc(hit.getDocid()).get(SearchFieldName.Id)))
                                     .ToArray();

            // Facets

            var facetMap = result.getFacetMap();

            if (facetMap != null)
            {
                searchResults.IndustryHits = GetFieldHits(facetMap, FieldName.Industries, v => new Guid(v));
                searchResults.JobTypeHits  = GetFieldHits(facetMap, FieldName.JobTypes, v => JobTypesFieldHandler.Decode(v));
            }

            return(searchResults);
        }
        protected virtual BrowseResult BrowseFolder(BrowseOptions options)
        {
            var result = default(BrowseResult);

            Windows.Invoke(() =>
            {
                //TODO: Use only WPF frameworks.
                using (var dialog = new global::System.Windows.Forms.FolderBrowserDialog())
                {
                    dialog.Description = options.Title;
                    if (Directory.Exists(options.Path))
                    {
                        dialog.SelectedPath = options.Path;
                    }
                    var window  = Windows.ActiveWindow;
                    var success = default(bool);
                    switch (dialog.ShowDialog(new Win32Window(window.GetHandle())))
                    {
                    case global::System.Windows.Forms.DialogResult.OK:
                        success = true;
                        break;
                    }
                    result = new BrowseResult(new[] { dialog.SelectedPath }, success);
                }
                //TODO: Bad .Wait().
            }).Wait();
            return(result);
        }
        public static string FormatResults(BrowseResult res)
        {
            var sb = new StringBuilder();

            sb.Append(res.NumHits);
            sb.Append(" hits out of ");
            sb.Append(res.TotalDocs);
            sb.Append(" docs\n");
            BrowseHit[] hits = res.Hits;
            var         map  = res.FacetMap;
            var         keys = map.Keys;

            foreach (string key in keys)
            {
                var fa = map[key];
                sb.AppendLine(key);
                var lf = fa.GetFacets();
                foreach (var bf in lf)
                {
                    sb.AppendLine("\t" + bf);
                }
            }
            foreach (BrowseHit hit in hits)
            {
                sb.AppendLine("------------");
                sb.Append(FormatHit(hit));
                sb.AppendLine();
            }
            sb.Append("*****************************\n");
            return(sb.ToString());
        }
Esempio n. 5
0
        public JsonResult Browse(string path)
        {
            //TODO:Add security checks

            var          files = new FilesRepository();
            BrowseResult result;

            if (string.IsNullOrEmpty(path) || path == "/")
            {
                var root     = files.GetRootFolder();
                var rootPath = VirtualPathUtility.AppendTrailingSlash(root != null ? root.Name : string.Empty);
                result = new BrowseResult
                {
                    Files        = files.Images(root),
                    Directories  = files.Folders(root),
                    Path         = rootPath,
                    ContentPaths = new[] { rootPath }
                };
            }
            else
            {
                result = new BrowseResult
                {
                    Files        = files.Images(path),
                    Directories  = files.Folders(path),
                    Path         = VirtualPathUtility.AppendTrailingSlash(path),
                    ContentPaths = new[] { VirtualPathUtility.AppendTrailingSlash(path) }
                };
            }
            return(Json(result));
        }
        protected virtual BrowseResult BrowseFile(BrowseOptions options)
        {
            var result = default(BrowseResult);

            Windows.Invoke(() =>
            {
                var dialog = new OpenFileDialog()
                {
                    Title       = options.Title,
                    Filter      = GetFilter(options.Filters),
                    Multiselect = options.Flags.HasFlag(BrowseFlags.Multiselect),
                };
                if (File.Exists(options.Path))
                {
                    dialog.InitialDirectory = Path.GetDirectoryName(options.Path);
                    dialog.FileName         = options.Path;
                }
                else if (Directory.Exists(options.Path))
                {
                    dialog.InitialDirectory = options.Path;
                }
                var window  = Windows.ActiveWindow;
                var success = dialog.ShowDialog(window);
                result      = new BrowseResult(dialog.FileNames, success.GetValueOrDefault());
                //TODO: Bad .Wait().
            }).Wait();
            return(result);
        }
Esempio n. 7
0
        public void Test6NonExisitngPropertyDocRetrieval()
        {
            BrowseRequest request = CreateRequest(1, "propMissing");
            BrowseResult  res     = browser.Browse(request);

            Assert.AreEqual(res.NumHits, 0);
        }
 public static string FormatResults(BrowseResult res)
 {
     var sb = new StringBuilder();
     sb.Append(res.NumHits);
     sb.Append(" hits out of ");
     sb.Append(res.TotalDocs);
     sb.Append(" docs\n");
     BrowseHit[] hits = res.Hits;
     var map = res.FacetMap;
     var keys = map.Keys;
     foreach (string key in keys) 
     {
         var fa = map[key];
         sb.AppendLine(key);
         var lf = fa.GetFacets();
         foreach (var bf in lf) 
         {
             sb.AppendLine("\t" + bf);
         }
     }
     foreach (BrowseHit hit in hits) 
     {
         sb.AppendLine("------------");
         sb.Append(FormatHit(hit));
         sb.AppendLine();
     }
     sb.Append("*****************************\n");
     return sb.ToString();
 }
Esempio n. 9
0
        public void Test1Filter()
        {
            BrowseRequest             request = CreateRequest(1, "prop3");
            FacetCountCollectorSource facetCountCollectorSource = attributesFacetHandler.GetFacetCountCollectorSource(request.GetSelection(AttributeHandlerName), request.GetFacetSpec(AttributeHandlerName));
            RandomAccessFilter        randomAccessFilter        = attributesFacetHandler.BuildFilter(request.GetSelection(AttributeHandlerName));
            DocIdSetIterator          iterator = randomAccessFilter.GetDocIdSet(boboReader).Iterator();
            int docId = iterator.NextDoc();

            int[] docIds = new int[2];
            int   i      = 0;

            while (docId != DocIdSetIterator.NO_MORE_DOCS)
            {
                docIds[i] = docId;
                i++;
                docId = iterator.NextDoc();
            }
            Assert.AreEqual(Arrays.ToString(new int[] { 1, 2 }), Arrays.ToString(docIds));

            BrowseResult res = browser.Browse(request);

            Assert.AreEqual(res.NumHits, 2);
            IFacetAccessible          fa     = res.GetFacetAccessor(AttributeHandlerName);
            IEnumerable <BrowseFacet> facets = fa.GetFacets();

            Console.WriteLine(facets);
            Assert.AreEqual(3, facets.Count());
            BrowseFacet facet = facets.Get(0);

            Assert.AreEqual(1, facet.FacetValueHitCount);
        }
Esempio n. 10
0
        /// <summary>
        /// Converts the BoboBrowse FacetMap object into a list of FacetViews
        /// </summary>
        /// <param name="browseResults">BoboBrowse results</param>
        /// <param name="clientFacetConstraints">facet constraints selected on client side</param>
        /// <returns>A list of facet views</returns>
        private IEnumerable <FacetView> FacetMapToFacetViews(BrowseResult browseResults, IEnumerable <FacetConstraints> clientFacetConstraints)
        {
            var facetViews = new List <FacetView>();

            foreach (var facet in browseResults.FacetMap)
            {
                var facetConstraints = this.FacetToConstraintHits(facet, clientFacetConstraints, browseResults);

                if (facetConstraints.Any())
                {
                    var allConstraintHits = new List <ConstraintHit>();
                    if (facet.Key == FixedFacetsConfiguration.RecordTypeFacetFieldName)
                    {
                        allConstraintHits.Add(
                            new ConstraintHit(
                                string.Empty,
                                facet.Value.GetFacets().Where(h => h.Value != "annotation").Sum(hit => hit.FacetValueHitCount),
                                ResourceManager.GetString("Facet_All")));
                    }


                    allConstraintHits.AddRange(facetConstraints);
                    facetViews.Add(new FacetView(facet.Key, allConstraintHits));
                }
            }
            return(facetViews);
        }
Esempio n. 11
0
 public VMConverter(BrowseResult browseResult)
 {
     treeNodes = new ObservableCollection <TreeNode>();
     foreach (NamespaceNode namespaceNode in browseResult.Namespaces)
     {
         treeNodes.Add(new TreeNode(namespaceNode.Name));
         treeNodes.Last().Nodes = TypesConverter(namespaceNode.TypeNodes);
     }
 }
Esempio n. 12
0
        /// <summary>
        /// Short-cut to convert a given <seealso cref="BrowseRequest"/> into a final
        /// result receipt to support simple closure of requests being full-filled or not etc ...
        /// </summary>
        /// <param name="request"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public static FinalBrowseResult FromRequest(BrowseRequest request, BrowseResult result)
        {
            if (request != null)
            {
                return(new FinalBrowseResult(request.NewLocation, request.RequestId, result));
            }

            return(new FinalBrowseResult(null, default(System.Guid), result));
        }
Esempio n. 13
0
 /// <summary>
 /// Event type class constructor from parameter
 /// </summary>
 public BrowsingEventArgs(IPathModel location,
                          bool isBrowsing,
                          BrowseResult result = BrowseResult.Unknown)
     : this()
 {
     Location   = location;
     IsBrowsing = isBrowsing;
     Result     = result;
 }
Esempio n. 14
0
        public AlbumBrowse EndBrowse(IAsyncResult result)
        {
            BrowseResult browseResult = Internal.ThrowHelper.DownCast <BrowseResult>(result, "result");

            browseResult.WaitForCallbackComplete();
            browseResult.SetCompleted(browseResult.Closure.Error);
            browseResult.CheckPendingException();
            return(browseResult.Closure);
        }
Esempio n. 15
0
 /// <summary>
 /// Event type class constructor from parameter
 /// </summary>
 public BrowsingEventArgs(IDirectoryBrowser location,
                          bool isBrowsing,
                          BrowseResult result = BrowseResult.Unknown)
     : this()
 {
     Location   = location;
     IsBrowsing = isBrowsing;
     Result     = result;
 }
Esempio n. 16
0
        /// <summary>
        /// ShortCut to convert a given <seealso cref="BrowseRequest"/> into a final
        /// result receipt to support simple closure of requests being full-filled or not etc ...
        /// </summary>
        /// <param name="request"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public static FinalBrowseResult <T> FromRequest(BrowseRequest <T> request, BrowseResult result)
        {
            if (request != null)
            {
                return(new FinalBrowseResult <T>(request.NewLocation, request.ActionRequested,
                                                 request.RequestId, result));
            }

            return(new FinalBrowseResult <T>(default(T), RequestType.Navigational, Guid.NewGuid(), result));
        }
Esempio n. 17
0
 /// <summary>
 /// Parameterized class constructor.
 /// </summary>
 public FinalBrowseResult(IPathModel requestedLocation,
                          Guid requestId      = default(System.Guid),
                          BrowseResult result = BrowseResult.Unknown
                          )
     : this()
 {
     RequestedLocation = requestedLocation;
     Result            = result;
     RequestId         = requestId;
 }
Esempio n. 18
0
        public IAsyncResult BeginBrowse(Session session, AsyncCallback userCallback, object state)
        {
            Internal.ThrowHelper.ThrowIfNull(session, "session");
            Internal.ThrowHelper.ThrowIfNull(userCallback, "userCallback");

            BrowseResult browseResult = new BrowseResult(userCallback, state);

            LibSpotify.sp_albumbrowse_create_r(session.Handle, Handle, browseResult.Complete, IntPtr.Zero);

            return(browseResult);
        }
Esempio n. 19
0
        public void TestLogging()
        {
            // Set up a simple Log4Net configuration that logs in memory.
            var memAppend = new log4net.Appender.MemoryAppender();

#if NETCOREAPP1_0
            var repository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            BasicConfigurator.Configure(repository, memAppend);
#else
            BasicConfigurator.Configure(memAppend);
#endif

            BrowseRequest br = new BrowseRequest();
            br.Count  = 20;
            br.Offset = 0;

            BrowseSelection colorSel = new BrowseSelection("mycolor");
            colorSel.AddValue("yellow");
            br.AddSelection(colorSel);

            BrowseSelection makeSel = new BrowseSelection("make");
            makeSel.AddValue("rav4");
            br.AddSelection(makeSel);

            FacetSpec spec = new FacetSpec();
            spec.ExpandSelection = true;
            spec.OrderBy         = FacetSpec.FacetSortSpec.OrderHitsDesc;
            spec.MaxCount        = 15;

            br.SetFacetSpec("mycolor", spec);
            br.SetFacetSpec("id", spec);
            br.SetFacetSpec("make", spec);

            Directory ramIndexDir = CreateIndex();
            using (DirectoryReader srcReader = DirectoryReader.Open(ramIndexDir))
            {
                using (BoboMultiReader boboReader = BoboMultiReader.GetInstance(srcReader, _facetHandlers))
                {
                    using (BoboBrowser boboBrowser = new BoboBrowser(boboReader))
                    {
                        using (BrowseResult result = boboBrowser.Browse(br))
                        {
                        }
                    }
                }
            }

            var events = memAppend.GetEvents();

            Assert.AreEqual(3, events.Length);
            StringAssert.StartsWith("facetHandler loaded: id, took:", events[0].RenderedMessage);
            StringAssert.StartsWith("facetHandler loaded: make, took:", events[1].RenderedMessage);
            StringAssert.StartsWith("facetHandler loaded: mycolor, took:", events[2].RenderedMessage);
        }
Esempio n. 20
0
 /// <summary>
 /// Parameterized class constructor.
 /// </summary>
 public FinalBrowseResult(T requestedLocation,
                          RequestType typeOfRequest,
                          Guid requestId      = default(System.Guid),
                          BrowseResult result = BrowseResult.Unknown
                          )
     : this()
 {
     RequestedLocation = requestedLocation;
     RequestedAction   = typeOfRequest;
     Result            = result;
     RequestId         = requestId;
 }
Esempio n. 21
0
        public void Test4PropertyInFirstDocRetrieval()
        {
            BrowseRequest request = CreateRequest(1, "prop5");
            BrowseResult  res     = browser.Browse(request);

            Assert.AreEqual(res.NumHits, 1);
            Assert.AreEqual(res.Hits[0].DocId, 0);

            IEnumerable <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets();

            Assert.AreEqual(facets.Count(), 1);
            Assert.AreEqual(facets.Get(0).Value, "prop5=val1");
            Assert.AreEqual(facets.Get(0).FacetValueHitCount, 1);
        }
Esempio n. 22
0
        public void TestNotValuesForSimpleFacetHandler()
        {
            BrowseRequest br = new BrowseRequest();

            br.Count  = 20;
            br.Offset = 0;

            BrowseSelection colorSel = new BrowseSelection("color");

            colorSel.AddValue("red");
            br.AddSelection(colorSel);

            BrowseSelection idSel = new BrowseSelection("id");

            idSel.AddNotValue("0");
            br.AddSelection(idSel);

            BrowseResult result         = null;
            BoboBrowser  boboBrowser    = null;
            int          expectedHitNum = (_documentSize / 2) - 1;

            using (Directory ramIndexDir = CreateIndex())
            {
                using (IndexReader srcReader = IndexReader.Open(ramIndexDir, true))
                {
                    using (boboBrowser = new BoboBrowser(BoboIndexReader.GetInstance(srcReader, _facetHandlers, null)))
                    {
                        result = boboBrowser.Browse(br);

                        Assert.AreEqual(expectedHitNum, result.NumHits);

                        StringBuilder buffer = new StringBuilder();
                        BrowseHit[]   hits   = result.Hits;

                        for (int i = 0; i < hits.Length; ++i)
                        {
                            int expectedID = (i + 1) * 2;
                            Assert.AreEqual(expectedID, int.Parse(hits[i].GetField("id")));
                            if (i != 0)
                            {
                                buffer.Append('\n');
                            }
                            buffer.Append("id=" + hits[i].GetField("id") + "," + "color=" + hits[i].GetField("color"));
                        }
                        log.Info(buffer.ToString());
                    }
                }
            }
        }
        public void Test3PropertyInEachDocRetrieval()
        {
            BrowseRequest request = CreateRequest(1, "prop1");
            BrowseResult  res     = browser.Browse(request);

            Assert.AreEqual(res.NumHits, 6);
            Assert.AreEqual(res.Hits[0].DocId, 0);
            Assert.AreEqual(res.Hits[5].DocId, 5);
            ICollection <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets();

            Assert.AreEqual(facets.Count, 2);
            Assert.AreEqual(facets.Get(0).Value, "prop1=val1");
            Assert.AreEqual(facets.Get(0).FacetValueHitCount, 4);
            Assert.AreEqual(facets.Get(1).Value, "prop1=val2");
            Assert.AreEqual(facets.Get(1).FacetValueHitCount, 2);
        }
        public void Test2PropertyRetrieval()
        {
            BrowseRequest request = CreateRequest(1, "prop3");
            BrowseResult  res     = browser.Browse(request);

            Assert.AreEqual(res.NumHits, 2);
            Assert.AreEqual(res.Hits[0].DocId, 1);
            Assert.AreEqual(res.Hits[1].DocId, 2);
            ICollection <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets();

            Assert.AreEqual(facets.Count, 3);
            Assert.AreEqual(facets.Get(0).Value, "prop3=val1");
            Assert.AreEqual(facets.Get(0).FacetValueHitCount, 1);
            Assert.AreEqual(facets.Get(2).Value, "prop3=val3");
            Assert.AreEqual(facets.Get(2).FacetValueHitCount, 1);
        }
Esempio n. 25
0
        /// <summary>
        /// Converts the BoboBrowse BrowseResult object into the generic RawSearchResultSet for processing.
        /// </summary>
        /// <param name="browseResults">The BoboBrowse BrowseResult for the search</param>
        /// <param name="offset">The numbers of results to skip since they've already been processed</param>
        /// <param name="facetConstraints">The constraint hit map given by BoboBrowse.</param>
        /// <returns>The converted raw search result set.</returns>
        private RawSearchResultSet ConvertBoboBrowseResultsToRawSearchResultSet(BrowseResult browseResults, int offset, IEnumerable <FacetConstraints> facetConstraints)
        {
            List <RawSearchResult> rawSearchResults = new List <RawSearchResult>();

            for (int i = offset; i < browseResults.Hits.Length; i++)
            {
                rawSearchResults.Add(new RawSearchResult(browseResults.Hits[i].DocId, browseResults.Hits[i].Score));
            }

            // transform the BoboBrowse-specific facet map to our more general data structure
            var facetViews = this.FacetMapToFacetViews(browseResults, facetConstraints ?? Enumerable.Empty <FacetConstraints>());

            var sortingOptions = this.GetSortingOptions(facetViews, facetConstraints);

            return(new RawSearchResultSet(rawSearchResults, browseResults.NumHits, facetViews, sortingOptions));
        }
Esempio n. 26
0
        public void Test5PropertyInLastDocRetrieval()
        {
            BrowseRequest request = CreateRequest(1, "prop4");
            BrowseResult  res     = browser.Browse(request);

            Console.WriteLine(res);
            Assert.AreEqual(res.NumHits, 1);
            Assert.AreEqual(res.Hits[0].DocId, 5);

            IEnumerable <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets();

            Assert.AreEqual(facets.Count(), 2);
            Assert.AreEqual(facets.Get(0).Value, "prop4=val2");
            Assert.AreEqual(facets.Get(0).FacetValueHitCount, 1);
            Assert.AreEqual(facets.Get(1).Value, "prop4=val3");
            Assert.AreEqual(facets.Get(1).FacetValueHitCount, 1);
        }
Esempio n. 27
0
        /// <summary>
        /// Follows hierarchial references from the current node and updates the tree.
        /// </summary>
        private void Browse(TreeNode parent)
        {
            parent.Nodes.Clear();

            ReferenceDescription start = parent.Tag as ReferenceDescription;

            ListOfBrowseDescription nodesToBrowse = new ListOfBrowseDescription();

            BrowseDescription nodeToBrowse = new BrowseDescription();

            nodeToBrowse.NodeId          = new NodeId(start.NodeId);
            nodeToBrowse.BrowseDirection = BrowseDirection.Forward_0;
            nodeToBrowse.ReferenceTypeId = new NodeId(ReferenceTypes.HierarchicalReferences);
            nodeToBrowse.IncludeSubtypes = true;
            nodeToBrowse.ResultMask      = (uint)DataTypes.EnumToMask(BrowseResultMask.All_63);
            nodeToBrowse.NodeClassMask   = 0;

            nodesToBrowse.Add(nodeToBrowse);

            ListOfBrowseResult   results;
            ListOfDiagnosticInfo diagnosticInfos;

            m_client.Browse(
                m_client.CreateRequestHeader(),
                null,
                0,
                nodesToBrowse,
                out results,
                out diagnosticInfos);

            if (results != null && results.Count > 0)
            {
                BrowseResult result = results[0];

                if (result.References != null)
                {
                    foreach (ReferenceDescription reference in result.References)
                    {
                        TreeNode child = new TreeNode(reference.DisplayName.Text);
                        child.Tag = reference;
                        child.Nodes.Add(new TreeNode());
                        parent.Nodes.Add(child);
                    }
                }
            }
        }
Esempio n. 28
0
        public void Test7AndProperties()
        {
            BrowseRequest request = CreateRequest(1, BrowseSelection.ValueOperation.ValueOperationAnd, "prop1", "prop3");
            BrowseResult  res     = browser.Browse(request);

            Console.WriteLine(res);
            Assert.AreEqual(res.NumHits, 2);
            Assert.AreEqual(res.Hits[0].DocId, 1);
            Assert.AreEqual(res.Hits[1].DocId, 2);
            IEnumerable <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets();

            Assert.AreEqual(facets.Count(), 4);
            Assert.AreEqual(facets.Get(0).Value, "prop1=val2");
            Assert.AreEqual(facets.Get(0).FacetValueHitCount, 2);
            Assert.AreEqual(facets.Get(1).Value, "prop3=val1");
            Assert.AreEqual(facets.Get(1).FacetValueHitCount, 1);
        }
Esempio n. 29
0
        public void TestFacetNameForSimpleFacetHandler()
        {
            BrowseRequest br = new BrowseRequest();

            br.Count  = 20;
            br.Offset = 0;

            BrowseSelection colorSel = new BrowseSelection("mycolor");

            colorSel.AddValue("yellow");
            br.AddSelection(colorSel);

            BrowseSelection makeSel = new BrowseSelection("make");

            makeSel.AddValue("rav4");
            br.AddSelection(makeSel);

            FacetSpec spec = new FacetSpec();

            spec.ExpandSelection = true;
            spec.OrderBy         = FacetSpec.FacetSortSpec.OrderHitsDesc;
            spec.MaxCount        = 15;

            br.SetFacetSpec("mycolor", spec);
            br.SetFacetSpec("id", spec);
            br.SetFacetSpec("make", spec);

            int expectedHitNum = 3;

            Directory ramIndexDir = CreateIndex();

            using (DirectoryReader srcReader = DirectoryReader.Open(ramIndexDir))
            {
                using (BoboMultiReader boboReader = BoboMultiReader.GetInstance(srcReader, _facetHandlers))
                {
                    using (BoboBrowser boboBrowser = new BoboBrowser(boboReader))
                    {
                        using (BrowseResult result = boboBrowser.Browse(br))
                        {
                            Assert.AreEqual(expectedHitNum, result.NumHits);
                        }
                    }
                }
            }
        }
Esempio n. 30
0
        public void Test9ModifiedNumberOfFacetsPerKey()
        {
            ModifiedSetup();
            BrowseRequest request = CreateRequest(1, BrowseSelection.ValueOperation.ValueOperationOr);

            request.GetFacetSpec(AttributeHandlerName).OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc;
            BrowseResult res = browser.Browse(request);

            Console.WriteLine(res);
            IEnumerable <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets();

            Assert.AreEqual(facets.Count(), 6);
            Assert.AreEqual(facets.Get(0).Value, "prop1=val1");
            Assert.AreEqual(facets.Get(0).FacetValueHitCount, 4);
            Assert.AreEqual(facets.Get(1).Value, "prop2=val1");
            Assert.AreEqual(facets.Get(1).FacetValueHitCount, 4);
            Assert.AreEqual(facets.Get(2).Value, "prop3=val1");
            Assert.AreEqual(facets.Get(2).FacetValueHitCount, 1);
        }
Esempio n. 31
0
        /// <summary>
        /// Returns the references that meet the filter criteria for one or more nodes.
        /// </summary>
        public BrowseResponseMessage Browse(BrowseMessage request)
        {
            try
            {
                lock (m_lock)
                {
                    // verify the session.
                    VerifySession(request.RequestHeader, false);

                    // process each node being browsed.
                    ListOfBrowseResult   results         = new ListOfBrowseResult();
                    ListOfDiagnosticInfo diagnosticInfos = new ListOfDiagnosticInfo();

                    for (int ii = 0; ii < request.NodesToBrowse.Count; ii++)
                    {
                        BrowseResult   result         = new BrowseResult();
                        DiagnosticInfo diagnosticInfo = new DiagnosticInfo();

                        m_nodeManager.Browse(
                            request.NodesToBrowse[ii],
                            result,
                            diagnosticInfo);

                        results.Add(result);
                        diagnosticInfos.Add(diagnosticInfo);
                    }

                    // return the response.
                    BrowseResponseMessage response = new BrowseResponseMessage();

                    response.ResponseHeader  = CreateResponseHeader(request.RequestHeader);
                    response.Results         = results;
                    response.DiagnosticInfos = diagnosticInfos;

                    return(response);
                }
            }
            catch (Exception e)
            {
                throw CreateSoapFault(request.RequestHeader, e);
            }
        }
Esempio n. 32
0
        /// <summary>
        /// Returns the set of references that meet the filter criteria.
        /// </summary>
        public virtual void Browse(
            OperationContext             context,
            ViewDescription              view,
            uint                         maxReferencesPerNode,
            BrowseDescriptionCollection  nodesToBrowse,
            out BrowseResultCollection   results,
            out DiagnosticInfoCollection diagnosticInfos)
        {
            if (context == null) throw new ArgumentNullException("context");
            if (nodesToBrowse == null) throw new ArgumentNullException("nodesToBrowse");

            if (view != null && !NodeId.IsNull(view.ViewId))
            {
                INodeManager viewManager = null;
                object viewHandle = GetManagerHandle(view.ViewId, out viewManager);

                if (viewHandle == null)
                {
                    throw new ServiceResultException(StatusCodes.BadViewIdUnknown);
                }

                NodeMetadata metadata = viewManager.GetNodeMetadata(context, viewHandle, BrowseResultMask.NodeClass);

                if (metadata == null || metadata.NodeClass != NodeClass.View)
                {
                    throw new ServiceResultException(StatusCodes.BadViewIdUnknown);
                }

                view.Handle = viewHandle;
            }

            bool diagnosticsExist = false;
            results = new BrowseResultCollection(nodesToBrowse.Count);
            diagnosticInfos = new DiagnosticInfoCollection(nodesToBrowse.Count);

            uint continuationPointsAssigned = 0;

            for (int ii = 0; ii < nodesToBrowse.Count; ii++)
            {
                // check if request has timed out or been cancelled.
                if (StatusCode.IsBad(context.OperationStatus))
                {
                    // release all allocated continuation points.
                    foreach (BrowseResult current in results)
                    {
                        if (current != null && current.ContinuationPoint != null && current.ContinuationPoint.Length > 0)
                        {
                            ContinuationPoint cp = context.Session.RestoreContinuationPoint(current.ContinuationPoint);
                            cp.Dispose();
                        }
                    }

                    throw new ServiceResultException(context.OperationStatus);
                }
                
                BrowseDescription nodeToBrowse = nodesToBrowse[ii];                   
                
                // initialize result.
                BrowseResult result = new BrowseResult();
                result.StatusCode = StatusCodes.Good;                
                results.Add(result);
                                
                ServiceResult error = null;
               
                // need to trap unexpected exceptions to handle bugs in the node managers.
                try
                {
                    error = Browse(
                        context, 
                        view, 
                        maxReferencesPerNode, 
                        continuationPointsAssigned < m_maxContinuationPointsPerBrowse, 
                        nodeToBrowse, 
                        result);
                }
                catch (Exception e)
                {
                    error = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, "Unexpected error browsing node.");
                }

                // check for continuation point.
                if (result.ContinuationPoint != null && result.ContinuationPoint.Length > 0)
                {
                    continuationPointsAssigned++;
                }

                // check for error.   
                result.StatusCode = error.StatusCode;

                if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0)
                {
                    DiagnosticInfo diagnosticInfo = null;

                    if (error != null && error.Code != StatusCodes.Good)
                    {
                        diagnosticInfo = ServerUtils.CreateDiagnosticInfo(m_server, context, error);
                        diagnosticsExist = true;
                    }
                        
                    diagnosticInfos.Add(diagnosticInfo);
                }
            }

            // clear the diagnostics array if no diagnostics requested or no errors occurred.
            UpdateDiagnostics(context, diagnosticsExist, ref diagnosticInfos);
        }
Esempio n. 33
0
        /// <summary>
        /// Returns the set of references that meet the filter criteria.
        /// </summary>
        private ServiceResult Browse(
            OperationContext  context,
            ViewDescription   view,
            uint              maxReferencesPerNode,
            bool              assignContinuationPoint,
            BrowseDescription nodeToBrowse,
            BrowseResult      result)
        {
            Debug.Assert(context != null);
            Debug.Assert(nodeToBrowse != null);
            Debug.Assert(result != null);

            // find node manager that owns the node.
            INodeManager nodeManager = null; 
               
            object handle = GetManagerHandle(nodeToBrowse.NodeId, out nodeManager);

            if (handle == null)
            {
                return StatusCodes.BadNodeIdUnknown;
            }

            if (!NodeId.IsNull(nodeToBrowse.ReferenceTypeId) && !m_server.TypeTree.IsKnown(nodeToBrowse.ReferenceTypeId))
            {
                return StatusCodes.BadReferenceTypeIdInvalid;
            }

            if (nodeToBrowse.BrowseDirection < BrowseDirection.Forward || nodeToBrowse.BrowseDirection > BrowseDirection.Both)
            {
                return StatusCodes.BadBrowseDirectionInvalid;
            }
        
            // create a continuation point.
            ContinuationPoint cp = new ContinuationPoint();

            cp.Manager            = nodeManager;
            cp.View               = view;
            cp.NodeToBrowse       = handle;
            cp.MaxResultsToReturn = maxReferencesPerNode;
            cp.BrowseDirection    = nodeToBrowse.BrowseDirection;
            cp.ReferenceTypeId    = nodeToBrowse.ReferenceTypeId;
            cp.IncludeSubtypes    = nodeToBrowse.IncludeSubtypes;
            cp.NodeClassMask      = nodeToBrowse.NodeClassMask;
            cp.ResultMask         = (BrowseResultMask)nodeToBrowse.ResultMask;
            cp.Index              = 0;
            cp.Data               = null;

            // check if reference type left unspecified.
            if (NodeId.IsNull(cp.ReferenceTypeId))
            {
                cp.ReferenceTypeId = ReferenceTypeIds.References;
                cp.IncludeSubtypes = true;
            }

            // loop until browse is complete or max results.
            ReferenceDescriptionCollection references = result.References;
            ServiceResult error = FetchReferences(context, assignContinuationPoint, ref cp, ref references);
            result.References = references;

            // save continuation point.
            if (cp != null)
            {
                result.StatusCode = StatusCodes.Good;
                result.ContinuationPoint = cp.Id.ToByteArray();
            }

            // all is good.
            return error;
        }
Esempio n. 34
0
        /// <summary>
        /// Continues a browse operation that was previously halted.
        /// </summary>
        public virtual void BrowseNext(
            OperationContext             context,
            bool                         releaseContinuationPoints,
            ByteStringCollection         continuationPoints,
            out BrowseResultCollection   results,
            out DiagnosticInfoCollection diagnosticInfos)
        {            
            if (context == null) throw new ArgumentNullException("context");
            if (continuationPoints == null) throw new ArgumentNullException("continuationPoints");

            bool diagnosticsExist = false;
            results = new BrowseResultCollection(continuationPoints.Count);
            diagnosticInfos = new DiagnosticInfoCollection(continuationPoints.Count);

            uint continuationPointsAssigned = 0;

            for (int ii = 0; ii < continuationPoints.Count; ii++)
            {
                ContinuationPoint cp = null;

                // check if request has timed out or been cancelled.
                if (StatusCode.IsBad(context.OperationStatus))
                {
                    // release all allocated continuation points.
                    foreach (BrowseResult current in results)
                    {
                        if (current != null && current.ContinuationPoint != null && current.ContinuationPoint.Length > 0)
                        {
                            cp = context.Session.RestoreContinuationPoint(current.ContinuationPoint);
                            cp.Dispose();
                        }
                    }

                    throw new ServiceResultException(context.OperationStatus);
                }

                // find the continuation point.
                cp = context.Session.RestoreContinuationPoint(continuationPoints[ii]);

                // initialize result.    
                BrowseResult result = new BrowseResult();
                result.StatusCode = StatusCodes.Good;
                results.Add(result);

                // check if simply releasing the continuation point.
                if (releaseContinuationPoints)
                {
                    if (cp != null)
                    {
                        cp.Dispose();
                        cp = null;
                    }

                    continue;
                }
                
                ServiceResult error = null;

                // check if continuation point has expired.
                if (cp == null)
                {
                    error = StatusCodes.BadContinuationPointInvalid;
                }

                if (cp != null)
                {
                    // need to trap unexpected exceptions to handle bugs in the node managers.
                    try
                    {
                        ReferenceDescriptionCollection references = result.References;

                        error = FetchReferences(
                            context,
                            continuationPointsAssigned < m_maxContinuationPointsPerBrowse,
                            ref cp,
                            ref references);

                        result.References = references;
                    }
                    catch (Exception e)
                    {
                        error = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, "Unexpected error browsing node.");
                    }

                    // check for continuation point.
                    if (result.ContinuationPoint != null && result.ContinuationPoint.Length > 0)
                    {
                        continuationPointsAssigned++;
                    }
                }

                // check for error.
                result.StatusCode = error.StatusCode;
                
                if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0)
                {
                    DiagnosticInfo diagnosticInfo = null;

                    if (error != null && error.Code != StatusCodes.Good)
                    {
                        diagnosticInfo = ServerUtils.CreateDiagnosticInfo(m_server, context, error);
                        diagnosticsExist = true;
                    }
                        
                    diagnosticInfos.Add(diagnosticInfo);
                }

                // check for continuation point.
                if (cp != null)
                {
                    result.StatusCode = StatusCodes.Good;
                    result.ContinuationPoint = cp.Id.ToByteArray();
                    continue;
                }
            }

            // clear the diagnostics array if no diagnostics requested or no errors occurred.
            UpdateDiagnostics(context, diagnosticsExist, ref diagnosticInfos);
        }        
Esempio n. 35
0
        /// <summary>
        /// Browses the references for the specified node.
        /// </summary>
        public void Browse(
            BrowseDescription request,
            BrowseResult result,
            DiagnosticInfo diagnosticInfo)
        {
            lock (m_lock)
            {
                // find the starting nodes.
                Node source = m_nodes.Find(request.NodeId);

                if (source == null)
                {
                    result.StatusCode = new StatusCode(StatusCodes.BadNodeIdUnknown);
                    return;
                }

                result.References = new ListOfReferenceDescription();

                // return all of the references that meet the filter criteria.
                foreach (ReferenceNode reference in source.References)
                {
                    if (reference.IsInverse && request.BrowseDirection == BrowseDirection.Forward_0)
                    {
                        continue;
                    }

                    if (!reference.IsInverse && request.BrowseDirection == BrowseDirection.Inverse_1)
                    {
                        continue;
                    }

                    // the reference type filter can be an exact match or it can be for any subtype.
                    if (reference.ReferenceTypeId != request.ReferenceTypeId)
                    {
                        if (!request.IncludeSubtypes)
                        {
                            continue;
                        }

                        if (!IsTypeOf(reference.ReferenceTypeId, request.ReferenceTypeId))
                        {
                            continue;
                        }
                    }

                    // need to look up the target to find the attributes.
                    // note that the result filter mask is being ignored. production servers only need to 
                    // look up the attributes requested by the client.
                    Node target = m_nodes.Find(reference.TargetId);

                    if (target != null)
                    {
                        ReferenceDescription description = new ReferenceDescription();

                        description.NodeId = reference.TargetId;
                        description.IsForward = !reference.IsInverse;
                        description.ReferenceTypeId = reference.ReferenceTypeId;
                        description.BrowseName = target.BrowseName;
                        description.DisplayName = target.DisplayName;
                        description.NodeClass = target.NodeClass;
                        description.TypeDefinition = GetTypeDefinition(target);

                        result.References.Add(description);
                    }
                }
            }
        }
Esempio n. 36
0
            public override string Control(MiniWebServer.Request request, int service_index)
            {
                if (service_index >= root_device.Services.Count)
                    return ("");//TODO put a real error message in here
                SubDevice.Service control_service = root_device.Services[service_index];
                //Console.WriteLine("opened control url of service :" + control_service.ServiceType);
                //Console.WriteLine("body:" + request.Body);
                //Console.WriteLine("soap action:" + request.Headers.Get("SOAPACTION"));
                char[] trims = { '"'};
                if (request.Headers.Get("SOAPACTION").Trim().Trim(trims) == "urn:schemas-upnp-org:service:ContentDirectory:1#Browse")
                {
                    string soap_answer = "";
                    soap_answer += "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
                    soap_answer += "<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
                    soap_answer += "<s:Body>";
                    soap_answer += "<u:Browse xmlns:u=\"urn:" + control_service.ServiceType + "\">";
                    //soap_answer += "<ObjectID>0</ObjectID>";
                    //soap_answer += "<BrowseFlag>BrowseDirectChildren</BrowseFlag>";
                    //soap_answer += "<Filter>*</Filter>";
                    //soap_answer += "<StartingIndex>0</StartingIndex>";
                    //soap_answer += "<RequestedCount>10</RequestedCount>";
                    //soap_answer += "<SortCriteria />";
                    //input values
                    string object_id = UPnP.GetStringInbetween(request.Body, "<ObjectID>", "</ObjectID>");
                    string browse_flag = UPnP.GetStringInbetween(request.Body, "<BrowseFlag>", "</BrowseFlag>");
                    string filter = UPnP.GetStringInbetween(request.Body, "<Filter>", "</Filter>");
                    int starting_index = UPnP.GetIntInbetween(request.Body, "<StartingIndex>", "</StartingIndex>");
                    int requested_count = UPnP.GetIntInbetween(request.Body, "<RequestedCount>", "</RequestedCount>");
                    string sort_criteria = UPnP.GetStringInbetween(request.Body, "<SortCriteria>", "</SortCriteria>");
                    if (starting_index == -1)
                        starting_index = 0;
                    if (requested_count == -1)
                        requested_count = 0;
                    //output values
                    string didl = "";
                    int total_matches = 0;
                    int number_returned = 0;
                    int update_id = 0;

                    if (BrowseRequestReceived != null)
                    {
                        BrowseResult result = new BrowseResult();
                        result = BrowseRequestReceived(this, object_id, browse_flag, starting_index, requested_count, sort_criteria);
                        if (result.AutoIndex)
                        {
                            total_matches = result.NumberReturned;
                            didl = result.GetIndexedDidl(starting_index, requested_count);
                        }
                        else
                        {
                            didl = result.Didl;
                            total_matches = result.TotalMatches;
                        }
                        didl = XmlStrings.ToXmlString(didl);
                        number_returned = result.NumberReturned;
                        update_id = result.UpdateID;
                    }

                    soap_answer += "<Result>" + didl + "</Result>";
                    soap_answer += "<NumberReturned>" + number_returned + "</NumberReturned>";
                    soap_answer += "<TotalMatches>" + total_matches + "</TotalMatches>";
                    soap_answer += "<UpdateID>" + update_id + "</UpdateID>";
                    soap_answer += "</u:Browse>";
                    soap_answer += "</s:Body>";
                    soap_answer += "</s:Envelope>";
                    return (soap_answer);
                }
                //TODO add a real soap error response here
                return("");
            }
Esempio n. 37
0
        /// <summary>
        /// Returns the references that meet the filter criteria for one or more nodes.
        /// </summary>
        public BrowseResponseMessage Browse(BrowseMessage request)
        {
            try
            {
                lock (m_lock)
                {
                    // verify the session.
                    VerifySession(request.RequestHeader, false);

                    // process each node being browsed.
                    ListOfBrowseResult results = new ListOfBrowseResult();
                    ListOfDiagnosticInfo diagnosticInfos = new ListOfDiagnosticInfo();

                    for (int ii = 0; ii < request.NodesToBrowse.Count; ii++)
                    {
                        BrowseResult result = new BrowseResult();
                        DiagnosticInfo diagnosticInfo = new DiagnosticInfo();

                        m_nodeManager.Browse(
                            request.NodesToBrowse[ii],
                            result,
                            diagnosticInfo);

                        results.Add(result);
                        diagnosticInfos.Add(diagnosticInfo);
                    }

                    // return the response.
                    BrowseResponseMessage response = new BrowseResponseMessage();

                    response.ResponseHeader = CreateResponseHeader(request.RequestHeader);
                    response.Results = results;
                    response.DiagnosticInfos = diagnosticInfos;

                    return response;
                }
            }
            catch (Exception e)
            {
                throw CreateSoapFault(request.RequestHeader, e);
            }
        }
Esempio n. 38
0
        /// <summary>
        /// Sends the browse request to the server.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="nodesToBrowse">The nodes to browse.</param>
        /// <returns></returns>
        private BrowseResultCollection BrowseBlock(Session session, BrowseDescriptionCollection nodesToBrowse)
        {
            try
            {
                // Utils.Trace("Browsing {0} Nodes", nodesToBrowse.Count);

                ViewDescription view = new ViewDescription();
                Dictionary<int,BrowseResult> combinedResults = new Dictionary<int, BrowseResult>();

                // initialize the table of indexes used to correlate results.   
                BrowseDescriptionCollection browseOperations = nodesToBrowse;             
                List<int> browseIndexes = new List<int>();

                for (int ii = 0; ii < nodesToBrowse.Count; ii++)
                {
                    browseIndexes.Add(ii);
                }

                BrowseDescriptionCollection unprocessedOperations = new BrowseDescriptionCollection();
                List<int> unprocessedBrowseIndexes = new List<int>();

                while (browseOperations.Count > 0)
                {
                    // start the browse operation.
                    BrowseResultCollection results = null;
                    DiagnosticInfoCollection diagnosticInfos = null;

                    session.Browse(
                        null,
                        view,
                        0,
                        browseOperations,
                        out results,
                        out diagnosticInfos);

                    ClientBase.ValidateResponse(results, browseOperations);
                    ClientBase.ValidateDiagnosticInfos(diagnosticInfos, browseOperations);

                    unprocessedOperations.Clear();
                    unprocessedBrowseIndexes.Clear();

                    ByteStringCollection continuationPoints = new ByteStringCollection();
                    List<int> continuationPointIndexes = new List<int>();

                    for (int ii = 0; ii < browseOperations.Count; ii++)
                    {
                        int index = browseIndexes[ii];

                        // Utils.Trace("{0}/{1}/{2}", browseOperations[ii].NodeId, browseOperations[ii].ReferenceTypeId, results[ii].References.Count);

                        // look up results.
                        BrowseResult combinedResult = null;

                        if (!combinedResults.TryGetValue(index, out combinedResult))
                        {
                            combinedResults[index] = combinedResult = new BrowseResult();
                        }

                        // check for error.
                        if (StatusCode.IsBad(results[ii].StatusCode))
                        {
                            // this error indicates that the server does not have enough simultaneously active 
                            // continuation points. This request will need to be resent after the other operations
                            // have been completed and their continuation points released.
                            if (results[ii].StatusCode == StatusCodes.BadNoContinuationPoints)
                            {
                                unprocessedOperations.Add(browseOperations[ii]);
                                unprocessedBrowseIndexes.Add(index);
                                continue;
                            }

                            // save error.
                            if (StatusCode.IsGood(combinedResult.StatusCode))
                            {
                                combinedResult.StatusCode = results[ii].StatusCode;
                            }

                            continue;
                        }

                        // check if all references have been fetched.
                        if (results[ii].References.Count == 0)
                        {
                            continue;
                        }

                        // save results.
                        combinedResult.References.AddRange(results[ii].References);

                        // check for continuation point.
                        if (results[ii].ContinuationPoint != null && results[ii].ContinuationPoint.Length > 0)
                        {
                            continuationPoints.Add(results[ii].ContinuationPoint);
                            continuationPointIndexes.Add(index);
                        }
                    }

                    // process continuation points.
                    ByteStringCollection revisedContinuationPoints = new ByteStringCollection();
                    List<int> revisedContinuationPointIndexes = new List<int>();

                    while (continuationPoints.Count > 0)
                    {
                        bool releaseContinuationPoints = false;

                        // continue browse operation.
                        session.BrowseNext(
                            null,
                            releaseContinuationPoints,
                            continuationPoints,
                            out results,
                            out diagnosticInfos);

                        ClientBase.ValidateResponse(results, continuationPoints);
                        ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints);

                        revisedContinuationPoints.Clear();
                        revisedContinuationPointIndexes.Clear();

                        for (int ii = 0; ii < continuationPoints.Count; ii++)
                        {
                            int index = continuationPointIndexes[ii];

                            // look up results.
                            BrowseResult combinedResult = null;

                            if (!combinedResults.TryGetValue(index, out combinedResult))
                            {
                                combinedResults[index] = new BrowseResult();
                            }

                            // check for error.
                            if (StatusCode.IsBad(results[ii].StatusCode))
                            {
                                // save error.
                                if (StatusCode.IsGood(combinedResult.StatusCode))
                                {
                                    combinedResult.StatusCode = results[ii].StatusCode;
                                }

                                continue;
                            }

                            // check if all references have been fetched.
                            if (results[ii].References.Count == 0)
                            {
                                continue;
                            }

                            // save results.
                            combinedResult.References.AddRange(results[ii].References);

                            // check for continuation point.
                            if (results[ii].ContinuationPoint != null && results[ii].ContinuationPoint.Length > 0)
                            {
                                revisedContinuationPoints.Add(results[ii].ContinuationPoint);
                                revisedContinuationPointIndexes.Add(index);
                            }
                        }

                        // check if browsing must continue;
                        continuationPoints = revisedContinuationPoints;
                        continuationPointIndexes = revisedContinuationPointIndexes;
                    }

                    // check if unprocessed results exist.
                    browseOperations = unprocessedOperations;
                    browseIndexes = unprocessedBrowseIndexes;
                }

                // reconstruct list of combined results.
                BrowseResultCollection finalResults = new BrowseResultCollection();

                for (int ii = 0; ii < nodesToBrowse.Count; ii++)
                {
                    BrowseResult combinedResult = null;

                    if (!combinedResults.TryGetValue(ii, out combinedResult))
                    {
                        combinedResult = new BrowseResult();
                    }

                    finalResults.Add(combinedResult);
                }

                // return complete list.
                return finalResults;
            }
            catch (Exception e)
            {
                throw ComUtils.CreateComException(e, ResultIds.E_FAIL);
            }
        }
        private void PopulateModelResult(Models.Search model, BrowseResult result)
        {
            // Clear the input fields
            model.SelectionGroups.Clear();
            model.Phrase = string.Empty;

            // Get the facets and return them in compact format
            if (result.FacetMap.Count() > 0)
            {
                foreach (var map in result.FacetMap)
                {
                    var group = new Models.FacetGroup();

                    group.Name = map.Key;

                    foreach (var f in map.Value.GetFacets())
                    {
                        var facet = new Models.Facet();

                        facet.Name = f.Value.ToString();
                        facet.Count = f.HitCount;

                        group.Facets.Add(facet);
                    }

                    model.FacetGroups.Add(group);
                }
            }

            // Get the results

            foreach (var doc in result.Hits)
            {
                model.Results.Add(doc.StoredFields.GetField("title").StringValue());
            }
        }