public override void Process(BuildQueryArgs args)
 {
     if (args.TabItem?.ApplyLatestVersion ?? false)
     {
         args.Query = args.Query.Cast <NimbleSearchResultItem>().Filter(x => x.IsLatestVersion);
     }
 }
 public override void Process(BuildQueryArgs args)
 {
     if (args.TabItem?.ApplyCurrentLanguage ?? false)
     {
         var lang = Sitecore.Context.Language?.Name;
         if (!string.IsNullOrWhiteSpace(lang))
         {
             args.Query = args.Query.Cast <NimbleSearchResultItem>().Filter(x => x.Language == lang);
         }
     }
 }
Beispiel #3
0
        public override void Process(BuildQueryArgs args)
        {
            if (string.IsNullOrWhiteSpace(args.SearchParameters.Keyword))
            {
                return;
            }

            // TODO: Get keyword fields from tab
            // default _content

            args.Query = args.Query.Where(i => i.Content.Contains(args.SearchParameters.Keyword));
        }
        public override void Process(BuildQueryArgs args)
        {
            var rules = args.TabItem?.QueryFilter;

            if (string.IsNullOrWhiteSpace(rules))
            {
                return;
            }

            var queryFilterPredicate = this.GetPredicatesFromRules(args.SearchContext, rules, args.TabItem?.Database);

            if (queryFilterPredicate != null)
            {
                args.Query = args.Query.Filter(queryFilterPredicate);
            }
        }
Beispiel #5
0
        public override void Process(BuildQueryArgs args)
        {
            // If tab defines start locations...
            var locations = args.TabItem?.StartLocations;

            if (locations == null || !locations.Any())
            {
                return;
            }

            // Apply Start Locations
            var rootPredicates = PredicateBuilder.False <SearchResultItem>();

            foreach (var rootId in locations)
            {
                rootPredicates = rootPredicates.Or(item => item.Paths.Contains(rootId));
            }

            args.Query = args.Query.Filter(rootPredicates);
        }
Beispiel #6
0
        public override void Process(BuildQueryArgs args)
        {
            // If tab defines templates...
            var templates = args.TabItem?.TemplateIDs;

            if (templates == null || templates.Length <= 0)
            {
                return;
            }

            // Apply template filter
            var templatePredicates = PredicateBuilder.False <NimbleSearchResultItem>();

            foreach (var templateId in templates)
            {
                var templateGuid = IdHelper.NormalizeGuid(templateId);
                templatePredicates = templatePredicates.Or(x => x.AllTemplates.Contains(templateGuid));
            }

            args.Query = args.Query.Cast <NimbleSearchResultItem>().Filter(templatePredicates);
        }
Beispiel #7
0
        public override void Process(BuildQueryArgs args)
        {
            var viewOptions = args.TabItem.ViewOptions;
            var defaultView = args.TabItem.DefaultViewOption?.ID.Guid
                              ?? viewOptions?.FirstOrDefault()?.ID.Guid
                              ?? Guid.Empty;

            // Validate view parameter
            if (args.SearchParameters.View == Guid.Empty ||
                !(viewOptions?.Any(x => x.ID.Guid == args.SearchParameters.View) ?? false)
                )
            {
                args.SearchParameters.View = defaultView;
            }

            // Validate PageSize
            var validPageSizes  = GetPageSizes(args.SearchParameters.View, args.TabItem.Database) ?? new int[] { };
            var defaultPageSize = validPageSizes.Length > 0 ? validPageSizes.First() : 10;

            if (!validPageSizes.Contains(args.SearchParameters.PageSize))
            {
                args.SearchParameters.PageSize = defaultPageSize;
            }

            // Validate page
            if (args.SearchParameters.Page <= 0)
            {
                args.SearchParameters.Page = 1;
            }

            // Apply paging
            var page     = args.SearchParameters.Page;
            var pageSize = args.SearchParameters.PageSize;

            if (pageSize > 0)
            {
                args.Query = args.Query.Page(page - 1, pageSize); // input is zero base, so -1
            }
        }
Beispiel #8
0
        public override void Process(BuildQueryArgs args)
        {
            var boosts = args.TabItem?.Boosts;

            if (boosts == null || boosts.Length <= 0)
            {
                return;
            }

            var boostArgs = new ApplyBoostArgs
            {
                SearchParameters = args.SearchParameters,
                Query            = args.Query
            };

            foreach (var boost in boosts)
            {
                boostArgs.BoostItem = boost;
                CorePipeline.Run(Abstractions.Constants.Pipeline.ApplyBoost, boostArgs);
            }
            args.Query = boostArgs.Query;
        }
Beispiel #9
0
        public override void Process(BuildQueryArgs args)
        {
            // Validate Sort option
            Item sortItem    = null;
            var  sortOptions = args.TabItem.SortOptions ?? new Sitecore.Data.Items.Item[] { };

            var defaultSortOption = args.TabItem.DefaultSortOption ?? sortOptions?.FirstOrDefault();

            if (!sortOptions.Any(x => x.ID.Guid == args.SearchParameters.Sort))
            {
                args.SearchParameters.Sort = defaultSortOption?.ID.Guid ?? Guid.Empty;
                sortItem = defaultSortOption;
            }
            else
            {
                sortItem = sortOptions.First(x => x.ID.Guid == args.SearchParameters.Sort);
            }

            if (sortItem == null || sortItem.ID.Guid == Constants.RelevanceOption)
            {
                args.SearchParameters.Sort = Constants.RelevanceOption;
                return;
            }

            var sortField = sortItem[SortOption.FieldName.IndexProperty];

            if (string.IsNullOrWhiteSpace(sortField))
            {
                return;
            }

            var isDesc = sortItem[SortOption.FieldName.IsDescending] == "1";


            args.Query = isDesc ?
                         args.Query.OrderByDescending(x => x[sortField]) :
                         args.Query.OrderBy(x => x[sortField]);
        }
 public override void Process(BuildQueryArgs args)
 {
     args.Query = args.Query.Cast <NimbleSearchResultItem>().Filter(x => !x.ExcludeFromSearchResults);
 }
Beispiel #11
0
        public SearchResponse PerformSearch(TabItem tab, SearchParameters parameters)
        {
            Assert.ArgumentNotNull(tab, nameof(tab));
            Assert.ArgumentNotNull(parameters, nameof(parameters));

            // Init Query
            var initArgs = new InitQueryArgs
            {
                TabItem          = tab,
                SearchParameters = parameters
            };

            CorePipeline.Run(Pipeline.InitQuery, initArgs);
            Assert.ArgumentNotNullOrEmpty(initArgs.IndexName, nameof(initArgs.IndexName));

            var searchIndex = ContentSearchManager.GetIndex(initArgs.IndexName);

            using (var context = searchIndex.CreateSearchContext(initArgs.SearchSecurityOption))
            {
                var query = context.GetQueryable <SearchResultItem>();

                var watch = System.Diagnostics.Stopwatch.StartNew();

                // Build Query
                var queryArgs = new BuildQueryArgs
                {
                    TabItem          = tab,
                    SearchParameters = parameters,
                    Query            = query,
                    SearchContext    = context
                };
                CorePipeline.Run(Pipeline.BuildQuery, queryArgs);
                query = queryArgs.Query;

                // Apply Selected Facets
                var selectedFacets = GetSelectedFacets(parameters.SelectedFacets, tab.Facets);
                var finalQuery     = ApplySelectedFacets(query, selectedFacets, parameters);

                // Add common (unselected) facet-ons to lessen additional queries
                var unselectedFacets = GetUnselectedFacets(parameters.SelectedFacets, tab.Facets);
                finalQuery = ApplyFacetOn(finalQuery, unselectedFacets, parameters);

                // Execute
                var results = finalQuery.Cast <NimbleSearchResultItem>().GetResults();

                // Correct facet counts (for selected facets only)
                var facets = CorrectFacetCounts(query, selectedFacets, parameters, results.Facets?.Categories);


                watch.Stop();



                // Map Results
                var resultArgs = new MapResultArgs
                {
                    TabItem            = tab,
                    SearchParameters   = parameters,
                    TotalSearchResults = results.TotalSearchResults,
                    Hits          = results.Hits,
                    FacetResults  = facets,
                    QueryDuration = watch.ElapsedMilliseconds
                };
                CorePipeline.Run(Pipeline.MapResult, resultArgs);

                return(resultArgs.Response);
            }
        }