Example #1
0
        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());
        }
Example #2
0
        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));
        }
Example #3
0
        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)));
        }