public HitSnippet[] GetSnippets(GetSnippetsRequest req) { HitSnippet[] response; if (req.searchToken == null | req.searchToken == "") { response = new HitSnippet[0]; return(response); } remoteChannel.Register(); if (remoteObj == null) { remoteObj = new WebServiceBackEnd(); } bool isLocalReq = HttpContext.Current.Request.Url.IsLoopback; if ((remoteObj == null) || !(remoteObj.allowGlobalAccess || isLocalReq)) { response = new HitSnippet[0]; return(response); } if (req.hitHashCodes.Length < 1) { response = new HitSnippet[0]; } else { response = remoteObj.getSnippets(req); } return(response); }
public HitSnippet[] getSnippets(GetSnippetsRequest req) { HitSnippet[] response; string searchToken = req.searchToken; int[] hitHashCodes = req.hitHashCodes; if (!sessionTable.ContainsKey(searchToken)) { response = new HitSnippet[0]; Logger.Log.Warn("GetSnippets: Invalid Search Token received "); return(response); } ArrayList results = ((SessionData)sessionTable[searchToken]).results; if ((results == null) || (results.Count == 0)) { response = new HitSnippet[0]; Logger.Log.Warn("GetSnippets: Invalid Search Token received "); return(response); } int i = 0; ArrayList hashCodeList = new ArrayList(); hashCodeList.AddRange(hitHashCodes); response = new HitSnippet[hitHashCodes.Length]; Logger.Log.Debug("GetSnippets invoked with {0} hitHashCodes", hitHashCodes.Length); Query query = ((SessionData)sessionTable[searchToken]).query; lock (results.SyncRoot) { string snippet = null; foreach (Hit h in results) { int hashCode = h.GetHashCode(); if (hashCodeList.Contains(hashCode)) { hashCodeList.Remove(hashCode); //Queryable queryable = h.SourceObject as Queryable; Queryable queryable = QueryDriver.GetQueryable(h.SourceObjectName); if (queryable == null) { snippet = "ERROR: hit.SourceObject is null, uri=" + h.Uri; } else { snippet = queryable.GetSnippet(ICollection2StringList(query.StemmedText), h); } //GetSnippets always invoked on Target Beagle Node where hits originate: if (snippet == null) { snippet = ""; } HitSnippet hs = new HitSnippet(); hs.hashCode = hashCode; hs.snippet = snippet.Trim(); response[i++] = hs; if ((hashCodeList.Count == 0) || (i == hitHashCodes.Length)) { return(response); } } } //end foreach } //end lock foreach (int hashCode in hashCodeList) { HitSnippet hs = new HitSnippet(); hs.hashCode = hashCode; hs.snippet = InvalidHitSnippetError; response[i++] = hs; if (i == hitHashCodes.Length) { break; } } Logger.Log.Warn("GetSnippets invoked some invalid hitIds"); return(response); }
private bool tenHits = false; //Flag to do Prefetch check only every 10 hits private void PrefetchSnippetsForNetworkHits(BT.TileHitCollection thc) { int lastDisplayed = 0; if (maxDisplayed != 0) { lastDisplayed = thc.LastDisplayed + 1; } //We have cached snippets for network hits upto maxDisplayed if (lastDisplayed < maxDisplayed) { return; } maxDisplayed = thc.LastDisplayed + 1; //Do Prefetch check once every ten hits tenHits = !tenHits; if (!tenHits) { return; } if (lastDisplayed < thc.NumResults) { int limit = 0; ArrayList networkHits = new ArrayList(); if ((thc.NumResults - lastDisplayed) > MAX_HITS_AHEAD) { limit = lastDisplayed + MAX_HITS_AHEAD; } else { limit = thc.NumResults; } ArrayList hits = _rp.hitsCopy; lock (hits.SyncRoot) { if (limit > hits.Count) { limit = hits.Count; } log.Debug("PrefetchSnippets: Scanning result set for Network Hits from {0} to {1}", lastDisplayed, limit); //Get all NetworkHits with snippets field not initialized: for (int si = lastDisplayed; si < limit; si++) { if ((hits[si] is NetworkHit) && (((NetworkHit)hits[si]).snippet == null)) { networkHits.Add((NetworkHit)hits[si]); } } } log.Debug("PrefetchSnippets: Found {0} NetworkHits without snippets", networkHits.Count); while (networkHits.Count > 0) { ArrayList nwHitsPerNode = new ArrayList(); string hostnamePort = GetHostnamePort((NetworkHit)networkHits[0]); //Gather NetworkHits from a specific target Networked Beagle foreach (NetworkHit nh in networkHits) { string hnp = GetHostnamePort(nh); if (hnp == null) { continue; } if (hnp.Equals(hostnamePort)) { if (nwHitsPerNode.Count < MAX_HIT_IDS_PER_REQ) { nwHitsPerNode.Add(nh); } else { break; } } } //Remove NetworkHits for this Networked Beagle int i = networkHits.Count; while (--i >= 0) { string hnp = GetHostnamePort((NetworkHit)networkHits[i]); if ((hnp == null) || hnp.Equals(hostnamePort)) { networkHits.RemoveAt(i); } } if (nwHitsPerNode.Count > 0) { string[] f3 = hostnamePort.Split(':'); if (f3.Length < 2) { log.Warn("PrefetchSnippets: Invalid format netBeagle URI in NetworkHit"); continue; } BeagleWebService wsp = new BeagleWebService(f3[0], f3[1]); string searchToken = GetSearchToken((NetworkHit)nwHitsPerNode[0]); if (searchToken.Equals("beagle")) //Check if it is Older version of Beagle networking { searchToken = null; } if (searchToken != null) { int[] hitHashCodes = new int [nwHitsPerNode.Count]; for (int j = 0; j < hitHashCodes.Length; j++) { hitHashCodes[j] = ((NetContext)((NetworkHit)nwHitsPerNode[j]).context).hashCode; } log.Debug("PrefetchSnippets: Invoking GetSnippets on {0} for {1} hits", wsp.Hostname, nwHitsPerNode.Count); GetSnippetsRequest sreq = new GetSnippetsRequest(); sreq.searchToken = searchToken; sreq.hitHashCodes = hitHashCodes; ReqContext2 rc = new ReqContext2(wsp, nwHitsPerNode, thc); wsp.BeginGetSnippets(sreq, PrefetchSnippetsResponseHandler, rc); } //Signal change in TileHitCollection due to addition of snippets: //_rp.rootTile.HitCollection.ClearSources(null); } } //end while } //end if }