Beispiel #1
0
        public static Nest.SearchDescriptor <T> Paging <T>(this Nest.SearchDescriptor <T> descriptor, PagedQuery <T> request) where T : class, IResponse
        {
            descriptor = descriptor.Skip(request.Skip ?? 0).Take(request.Take ?? Int32.MaxValue);
            if (request.Filter != null)
            {
                descriptor = descriptor.Filter(f => f.Grid(request.Filter));
            }
            if (request.Sort != null && request.Sort.Any())
            {
                descriptor = descriptor.Sort(request.Sort);
            }

            return(descriptor);
        }
Beispiel #2
0
 public static Nest.SearchDescriptor <T> Sort <T>(this Nest.SearchDescriptor <T> descriptor, IEnumerable <Sort> sorts) where T : class, IResponse
 {
     foreach (var sort in sorts)
     {
         if (sort.Dir == "desc")
         {
             descriptor = descriptor.SortDescending(sort.Field);
         }
         if (sort.Dir == "asc")
         {
             descriptor = descriptor.SortAscending(sort.Field);
         }
     }
     return(descriptor);
 }
Beispiel #3
0
        private ISearchResults Search <T>(ISearchCriteria criteria) where T : EntryContentBase
        {
            // set up filters

            // 1: phrase

            var filters = new List <Nest.QueryContainer>();

            if (criteria is CatalogEntrySearchCriteria)
            {
                var cesc = criteria as CatalogEntrySearchCriteria;

                if (!string.IsNullOrWhiteSpace(cesc.SearchPhrase))
                {
                    filters.Add(new Nest.QueryContainerDescriptor <T>().SimpleQueryString(
                                    sq => sq.Fields(f => f.Field("*.analyzed")).Query(cesc.SearchPhrase.Trim())));
                }
            }

            // 2: id ... NOTE: Vulcan supports 1 and only 1 filter field, code

            if (criteria.ActiveFilterFields != null && criteria.ActiveFilterFields.Count() == 1 && criteria.ActiveFilterFields[0].Equals("code", StringComparison.InvariantCultureIgnoreCase))
            {
                filters.Add(new Nest.QueryContainerDescriptor <T>().Term(
                                p => p.Field(f => f.Code).Value((criteria.ActiveFilterValues[0] as SimpleValue).value)));
            }

            // 3: inactive... TODO, not sure what this should check!

            /*
             * if(!criteria.IncludeInactive)
             * {
             *  filters.Add(new Nest.QueryContainerDescriptor<T>().Term(
             *      p => p.Field(f => f.)
             * }*/

            // get catalog filter, if needed

            var catalogReferences = new List <ContentReference>();

            if (criteria is CatalogEntrySearchCriteria)
            {
                var cesc = criteria as CatalogEntrySearchCriteria;

                if (cesc.CatalogNames != null)
                {
                    var catalogs = ContentLoader.Service.GetChildren <CatalogContent>(ReferenceConverter.Service.GetRootLink());

                    if (catalogs != null && catalogs.Any())
                    {
                        foreach (var catalogName in cesc.CatalogNames)
                        {
                            var catalog = catalogs.FirstOrDefault(c => c.Name.Equals(catalogName, StringComparison.InvariantCultureIgnoreCase));

                            if (catalog != null)
                            {
                                catalogReferences.Add(catalog.ContentLink);
                            }
                        }
                    }
                }
            }

            if (!catalogReferences.Any())
            {
                catalogReferences = null;
            }

            // do search

            var searchDescriptor = new Nest.SearchDescriptor <T>();

            searchDescriptor.Skip(criteria.StartingRecord);
            searchDescriptor.Take(criteria.RecordsToRetrieve);

            if (filters.Any())
            {
                searchDescriptor.Query(q => q.Bool(b => b.Must(filters.ToArray())));
            }

            var client = VulcanHandler.Service.GetClient(new CultureInfo(criteria.Locale));

            var results = client.SearchContent <T>(q => searchDescriptor, false, catalogReferences);

            //var id = ReferenceConverter.Service.GetObjectId();

            var searchDocuments = new SearchDocuments()
            {
                TotalCount = Convert.ToInt32(results.Total)
            };

            if (results.Hits != null && results.Hits.Any())
            {
                foreach (var hit in results.Hits)
                {
                    var doc = new SearchDocument();
                    doc.Add(new SearchField("_id", ReferenceConverter.Service.GetObjectId(hit.Source.ContentLink)));

                    searchDocuments.Add(doc);
                }
            }

            return(new SearchResults(searchDocuments, criteria));
        }