Example #1
0
        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;
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
 private bool GetNeedLoadNextPage(BpmSearchResponse bpmSearchResponse, SearchRequestQuery searchRequestQuery, int totalFoundRecordCount, int recordCount)
 {
     return(GetNeedLoadRecords(recordCount, bpmSearchResponse) && HasAvailableElasticRecords(searchRequestQuery, totalFoundRecordCount));
 }
Example #6
0
        private bool GetNeedLoadRecords(int recordCount, BpmSearchResponse bpmSearchResponse)
        {
            int availableRecordCount = bpmSearchResponse == null ? 0 : bpmSearchResponse.Data.Count;

            return(availableRecordCount < recordCount);
        }