/// <summary> Merge results of two searches
 /// </summary>
 /// <param name="another">Full text search result to merge with this result</param>
 /// <returns>Result set containing documents present in both result sets</returns>
 public FullTextSearchResult Merge(FullTextSearchResult another) 
 {
     if (Hits.Length == 0 || another.Hits.Length == 0) 
     {
         return new FullTextSearchResult(new FullTextSearchHit[0], 0);
     }
     FullTextSearchHit[] joinHits = new FullTextSearchHit[Hits.Length + another.Hits.Length];
     Array.Copy(Hits, 0, joinHits, 0, Hits.Length);
     Array.Copy(another.Hits, 0, joinHits, Hits.Length, another.Hits.Length);
     Array.Sort(joinHits, new OidComparer());
     int n = 0;
     for (int i = 1; i < joinHits.Length; i++) 
     { 
         if (joinHits[i-1].oid == joinHits[i].oid) 
         {      
             joinHits[i].Rank += joinHits[i-1].Rank;
             joinHits[n++] = joinHits[i];
             i += 1;
         } 
     }
     FullTextSearchHit[] mergeHits = new FullTextSearchHit[n];
     Array.Copy(joinHits, 0, mergeHits, 0, n);
     Array.Sort(joinHits);
     return new FullTextSearchResult(joinHits, Math.Min(Estimation*n/Hits.Length, another.Estimation*n/another.Hits.Length));
 }
        /// <summary> Merge results of two searches
        /// </summary>
        /// <param name="another">Full text search result to merge with this result</param>
        /// <returns>Result set containing documents present in both result sets</returns>
        public FullTextSearchResult Merge(FullTextSearchResult another)
        {
            if (Hits.Length == 0 || another.Hits.Length == 0)
            {
                return(new FullTextSearchResult(new FullTextSearchHit[0], 0));
            }
            FullTextSearchHit[] joinHits = new FullTextSearchHit[Hits.Length + another.Hits.Length];
            Array.Copy(Hits, 0, joinHits, 0, Hits.Length);
            Array.Copy(another.Hits, 0, joinHits, Hits.Length, another.Hits.Length);
            Array.Sort(joinHits, new OidComparer());
            int n = 0;

            for (int i = 1; i < joinHits.Length; i++)
            {
                if (joinHits[i - 1].oid == joinHits[i].oid)
                {
                    joinHits[i].Rank += joinHits[i - 1].Rank;
                    joinHits[n++]     = joinHits[i];
                    i += 1;
                }
            }
            FullTextSearchHit[] mergeHits = new FullTextSearchHit[n];
            Array.Copy(joinHits, 0, mergeHits, 0, n);
            Array.Sort(joinHits);
            return(new FullTextSearchResult(joinHits, Math.Min(Estimation * n / Hits.Length, another.Estimation * n / another.Hits.Length)));
        }
 public FullTextSearchResult(FullTextSearchHit[] hits, int estimation)
 {
     Hits = hits;
     Estimation = estimation;
 }