public override IEnumerable <TElement> FindElements <TElement>(ElasticSearchQuery compositeQuery) { var searchResults = Execute(compositeQuery, typeof(TElement)); var list = (from m in compositeQuery.Methods where m.MethodType == QueryMethodType.Select select(SelectMethod) m).ToList <SelectMethod>(); var selectMethod = (list.Count() == 1) ? list[0] : null; var results2 = new ElasticSearchResults <TElement>(_context, searchResults, selectMethod, compositeQuery.VirtualFieldProcessors); return(results2.GetSearchResults()); }
public override TResult Execute <TResult>(ElasticSearchQuery query) { if (typeof(TResult).IsGenericType && (typeof(TResult).GetGenericTypeDefinition() == typeof(SearchResults <>))) { var resultType = typeof(TResult).GetGenericArguments()[0]; var results = Execute(query, resultType); var searchResultsType = typeof(ElasticSearchResults <>).MakeGenericType(new[] { resultType }); var applyScalarMethods = GetType().GetMethod("ApplyScalarMethods", BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(new[] { typeof(TResult), resultType }); var method = GetSelectMethod(query); var searchResultsInstance = Activator.CreateInstance(searchResultsType, new object[] { _context, results, method, query.VirtualFieldProcessors }); return((TResult)applyScalarMethods.Invoke(this, new[] { query, searchResultsInstance })); } var searchResults = Execute(query, typeof(TResult)); var selectMethod = GetSelectMethod(query); var processedResults = new ElasticSearchResults <TResult>(_context, searchResults, selectMethod, query.VirtualFieldProcessors); return(ApplyScalarMethods <TResult, TResult>(query, processedResults)); }
private TResult ApplyScalarMethods <TResult, TDocument>(ElasticSearchQuery query, ElasticSearchResults <TDocument> processedResults) { object scalarResult; var method = query.Methods.First(); switch (method.MethodType) { case QueryMethodType.All: scalarResult = true; break; case QueryMethodType.Any: scalarResult = processedResults.Any(); break; case QueryMethodType.Count: scalarResult = processedResults.Count(); break; case QueryMethodType.ElementAt: if (!((ElementAtMethod)method).AllowDefaultValue) { scalarResult = processedResults.ElementAt(((ElementAtMethod)method).Index); } else { scalarResult = processedResults.ElementAtOrDefault(((ElementAtMethod)method).Index); } break; case QueryMethodType.First: if (!((FirstMethod)method).AllowDefaultValue) { scalarResult = processedResults.First(); } else { scalarResult = processedResults.FirstOrDefault(); } break; case QueryMethodType.Last: if (!((LastMethod)method).AllowDefaultValue) { scalarResult = processedResults.Last(); } else { scalarResult = processedResults.LastOrDefault(); } break; case QueryMethodType.Single: if (!((SingleMethod)method).AllowDefaultValue) { scalarResult = processedResults.Single(); } else { scalarResult = processedResults.SingleOrDefault(); } break; case QueryMethodType.GetResults: { var searchHits = processedResults.GetSearchHits(); var results2 = FormatFacetResults(processedResults.GetFacets(), query.FacetQueries); scalarResult = Activator.CreateInstance(typeof(TResult), new object[] { searchHits, processedResults.NumberFound, results2 }); break; } case QueryMethodType.GetFacets: scalarResult = FormatFacetResults(processedResults.GetFacets(), query.FacetQueries); break; default: throw new InvalidOperationException("Invalid query method"); } return((TResult)System.Convert.ChangeType(scalarResult, typeof(TResult))); }