private void SetResponseNextFrom(BpmSearchResponse bpmSearchResponse, ESSearchResponse esSearchResponse, SearchRequestQuery searchRequestQuery) { var lastNeededHitId = bpmSearchResponse.Data.Last().Id; var lastIndexFromElasticResponce = esSearchResponse.SearchResult.Hits.ToList() .FindIndex(x => string.Equals(x.Id, lastNeededHitId, StringComparison.InvariantCultureIgnoreCase)); bpmSearchResponse.NextFrom = searchRequestQuery.From + lastIndexFromElasticResponce + 1; }
public string Search(string queryString, string sectionEntityName, int recordCount, string type = "", int from = 0) { int pageNum = 0; int totalFoundRecordCount = -1; SearchRequestQuery searchRequestQuery = null; BpmSearchResponse bpmSearchResponse = null; while (GetNeedLoadNextPage(bpmSearchResponse, searchRequestQuery, totalFoundRecordCount, recordCount)) { searchRequestQuery = SearchHelper.GetSearchScoreRequestQuery(queryString, sectionEntityName, recordCount, pageNum, from); var request = PrepareRequest(searchRequestQuery, type); IRestResponse response = ExecutePostRequest(request); if (response.ResponseStatus != RestSharp.ResponseStatus.Completed) { var errorMessage = GetErrorResponse(response); return(JsonSerializer.Serialize(errorMessage)); } var esSearchResponse = JsonConvert.DeserializeObject <ESSearchResponse>(response.Content); if (esSearchResponse.SearchResult == null) { _metricReporter.Report(new ErrorMetric { SearchErrorCode = GlobalSearchErrorCode.ElasticError }); return(JsonSerializer.Serialize(GetErrorResponse(response, new ErrorInfo { Message = "Search result is empty", ErrorCode = "EmptyResult" }))); } _metricReporter.Report(new SearchMetric { Duration = esSearchResponse.Took }); var processedEsResponse = SearchHelper.ProccessESSearchResponse(esSearchResponse); totalFoundRecordCount = processedEsResponse.Total; if (bpmSearchResponse == null) { bpmSearchResponse = processedEsResponse; } else { bpmSearchResponse.Data.AddRange(processedEsResponse.Data); } if (bpmSearchResponse.Data.Count >= recordCount) { bpmSearchResponse.Data = bpmSearchResponse.Data.Take(recordCount).ToList(); SetResponseNextFrom(bpmSearchResponse, esSearchResponse, searchRequestQuery); } pageNum++; } return(JsonSerializer.Serialize(bpmSearchResponse)); }
private BaseResponse GetErrorResponse(IRestResponse response, ErrorInfo errorInfo = null) { var info = errorInfo ?? new ErrorInfo { Message = response.ErrorMessage, ErrorCode = response.ResponseStatus.ToString() }; BpmSearchResponse searchResponse = new BpmSearchResponse { Success = false, ErrorInfo = info }; var responseJson = JsonConvert.SerializeObject(response); _log.Error(string.Format(@"ResponseStatus: {0} ErrorMessage: {1} Content: {2}, Response: {3}" , info.ErrorCode, info.Message, response.Content, responseJson)); return(searchResponse); }
/// <summary> /// Proccess elastic search response. /// </summary> /// <param name="esResponse"><see cref="ESSearchResponse"/> instance.</param> /// <returns><see cref="BpmSearchResponse"/> instance.</returns> public BpmSearchResponse ProccessESSearchResponse(ESSearchResponse esResponse) { var availableRecordIdentifiers = GetAvailableRecordIdentifiers(esResponse); BpmSearchResponse searchResponse = new BpmSearchResponse(); searchResponse.Took = esResponse.Took; searchResponse.Total = esResponse.SearchResult.Total; searchResponse.Data = new List <BpmSearchResponseEntity>(); searchResponse.Success = true; foreach (ESHit esHit in esResponse.SearchResult.Hits .Where(x => availableRecordIdentifiers.Contains(x.Id.ToLower())).ToList()) { if (_userConnection.EntitySchemaManager.FindInstanceByName(esHit.Type) != null) { var responseEntity = FillBpmResponseEntity(esHit); if (responseEntity.ColumnValues.Any()) { searchResponse.Data.Add(responseEntity); } } } return(searchResponse); }
private bool GetNeedLoadNextPage(BpmSearchResponse bpmSearchResponse, SearchRequestQuery searchRequestQuery, int totalFoundRecordCount, int recordCount) { return(GetNeedLoadRecords(recordCount, bpmSearchResponse) && HasAvailableElasticRecords(searchRequestQuery, totalFoundRecordCount)); }
private bool GetNeedLoadRecords(int recordCount, BpmSearchResponse bpmSearchResponse) { int availableRecordCount = bpmSearchResponse == null ? 0 : bpmSearchResponse.Data.Count; return(availableRecordCount < recordCount); }