private IEnumerable <PageData> FindPages(string searchQuery, int pagingNumber, int pagingSize)
        {
            GroupQuery groupQuery = new GroupQuery(LuceneOperator.AND);

            groupQuery.QueryExpressions.Add(new ContentQuery <PageData>());

            groupQuery.QueryExpressions.Add(new FieldQuery(searchQuery));

            VirtualPathQuery pathQuery = new VirtualPathQuery();

            pathQuery.AddContentNodes(ContentReference.StartPage);
            groupQuery.QueryExpressions.Add(pathQuery);

            // The access control list query will remove any pages the user doesn't have read access to
            //AccessControlListQuery aclQuery = new AccessControlListQuery();
            //aclQuery.AddAclForUser(PrincipalInfo.Current, HttpContext.Current);
            //groupQuery.QueryExpressions.Add(aclQuery);

            var           searchHandler = ServiceLocator.Current.GetInstance <SearchHandler>();
            SearchResults results       = searchHandler.GetSearchResults(groupQuery, pagingNumber, pagingSize);

            var contentSearchHandler = ServiceLocator.Current.GetInstance <ContentSearchHandler>();

            foreach (var hit in results.IndexResponseItems)
            {
                yield return(contentSearchHandler.GetContent <PageData>(hit));
            }
        }
        public static IQueryExpression FilterByAncestor(this IQueryExpression expression, ContentReference ancestor)
        {
            var virtualPathQuery = new VirtualPathQuery();

            virtualPathQuery.AddContentNodes(ancestor);
            return(expression.And(virtualPathQuery));
        }
Beispiel #3
0
        public ActionResult Index(SearchPage currentPage, string q)
        {
            var viewModel = new SearchPageViewModel(currentPage)
            {
                StartPage = Loader.Get <StartPage>(ContentReference.StartPage),
                MenuPages = FilterForVisitor
                            .Filter(Loader.GetChildren <SitePageData>(ContentReference.StartPage))
                            .Cast <SitePageData>()
                            .Where(p => p.VisibleInMenu),
                Section = currentPage.ContentLink.GetSection()
            };

            if (string.IsNullOrWhiteSpace(q))
            {
                return(View(viewModel));
            }

            // 1. only pages
            var onlyPages = new ContentQuery <SitePageData>();

            // 2. free-text query
            var freeText = new FieldQuery(q);

            // 3. only what current user can read
            var readAccess = new AccessControlListQuery();

            readAccess.AddAclForUser(PrincipalInfo.Current, HttpContext);

            // 4. only under start page (ignore trash bin)
            var underStart = new VirtualPathQuery();

            underStart.AddContentNodes(ContentReference.StartPage);

            // build query
            var query = new GroupQuery(LuceneOperator.AND);

            query.QueryExpressions.Add(onlyPages);
            query.QueryExpressions.Add(freeText);
            query.QueryExpressions.Add(readAccess);
            query.QueryExpressions.Add(underStart);

            // get result
            SearchResults results = _searchHandler.GetSearchResults(query, 1, 10);

            viewModel.SearchText    = q;
            viewModel.SearchResults = results.IndexResponseItems
                                      .Select(item => new Result
            {
                Title       = item.Title,
                Description = item.DisplayText?.TruncateAtWord(20),
                Url         = ConvertToUri(item).ToString()
            }).ToList();

            return(View(viewModel));
        }
        IQueryExpression GetStatusFilter()
        {
            var statusFilterExpression = new GroupQuery(LuceneOperator.AND);

            var underTheTrashQuery = new VirtualPathQuery();

            underTheTrashQuery.AddContentNodes(ContentReference.WasteBasket);

            statusFilterExpression.QueryExpressions.Add(new NotQueryExpression(underTheTrashQuery));
            statusFilterExpression.QueryExpressions.Add(new ItemStatusQuery(ItemStatus.Approved));

            return(statusFilterExpression);
        }
 public static void AddContentNodes(this VirtualPathQuery query, ContentReference contentLink,
                                    IContentLoader contentLoader)
 {
     if (ContentReference.IsNullOrEmpty(contentLink))
     {
         return;
     }
     Validator.ThrowIfNull("contentLoader", contentLoader);
     foreach (string current in LuceneContentSearchHandler.GetVirtualPathNodes(contentLink, contentLoader))
     {
         query.VirtualPathNodes.Add(current);
     }
 }
Beispiel #6
0
        public ActionResult Index(SearchPage currentPage, string q)
        {
            var viewmodel = new SearchPageViewModel(currentPage);

            if (!string.IsNullOrWhiteSpace(q))
            {
                // 1. only pages
                var onlyPages = new ContentQuery <PageData>();

                // 2. free-text query
                var freeText = new FieldQuery(q);

                // 3. only what the current user can read
                var readAccess = new AccessControlListQuery();
                readAccess.AddAclForUser(PrincipalInfo.Current, HttpContext);

                // 4. only under the Start page (to exclude Wastebasket, for example)
                var underStart = new VirtualPathQuery();
                underStart.AddContentNodes(ContentReference.StartPage);

                // build the query from the expressions
                var query = new GroupQuery(LuceneOperator.AND);
                query.QueryExpressions.Add(freeText);
                query.QueryExpressions.Add(onlyPages);
                query.QueryExpressions.Add(readAccess);
                query.QueryExpressions.Add(underStart);

                // get the first page of ten results
                SearchResults results = searchHandler.GetSearchResults(query, 1, 10);

                viewmodel.SearchText = q;

                viewmodel.SearchResults = results.IndexResponseItems
                                          .Select(x => new Result
                {
                    Title       = x.Title,
                    Description = x.DisplayText.TruncateAtWord(20),
                    Url         = GetExternalUrl(x).ToString()
                }).ToList();
            }

            //Not using the base controller CreateViewModel so we need to set the menu
            viewmodel.MenuPages = FilterForVisitor.Filter(
                loader.GetChildren <PageData>(ContentReference.StartPage))
                                  .Cast <PageData>().Where(page => page.VisibleInMenu);

            return(View(viewmodel));
        }
Beispiel #7
0
        private void MakeSearch(string q, ProductListPageViewModel viewmodel)
        {
            // 1. only productpages
            var onlyPages = new ContentQuery <ProductPage>();

            // 2. free-text query
            var freeText = new FieldQuery(q);

            // 3. only what the current user can read
            var readAccess = new AccessControlListQuery();

            readAccess.AddAclForUser(PrincipalInfo.Current, HttpContext);

            // 4. only productpages
            var inProductPages = new VirtualPathQuery();

            foreach (var page in viewmodel.MenuPages.Where(p => p.Name == "Shop"))
            {
                inProductPages.AddContentNodes(page.Page.ContentLink);
            }

            // build the query from the expressions
            var query = new GroupQuery(LuceneOperator.AND);

            query.QueryExpressions.Add(freeText);
            query.QueryExpressions.Add(onlyPages);
            query.QueryExpressions.Add(readAccess);
            query.QueryExpressions.Add(inProductPages);

            // get the first page of ten results
            SearchResults results = searchHandler.GetSearchResults(query, 1, 10);

            viewmodel.SearchText = q;

            if (results.TotalHits > 0)
            {
                viewmodel.ProductsToDisplay =
                    results.IndexResponseItems
                    .Where(p => p.Id.ToUpper().Contains(Thread.CurrentThread.CurrentUICulture.Name.ToUpper()))
                    .Select(p => loader.Get <ProductPage>(Guid.Parse(p.Id.Split('|').First())))
                    .ToList();
            }
            else
            {
                viewmodel.ProductsToDisplay = new List <ProductPage>();
            }
        }
Beispiel #8
0
        private IQueryExpression CreateQuery(string searchText, IEnumerable <ContentReference> searchRoots, HttpContextBase context, string languageBranch)
        {
            //Main query which groups other queries. Each query added
            //must match in order for a page or file to be returned.
            var query = new GroupQuery(LuceneOperator.AND);

            //Add free text query to the main query
            query.QueryExpressions.Add(new FieldQuery(searchText));

            //Search for pages using the provided language
            var pageTypeQuery = new GroupQuery(LuceneOperator.AND);

            pageTypeQuery.QueryExpressions.Add(new ContentQuery <PageData>());
            pageTypeQuery.QueryExpressions.Add(new FieldQuery(languageBranch, Field.Culture));

            //Search for media without languages
            var contentTypeQuery = new GroupQuery(LuceneOperator.OR);

            contentTypeQuery.QueryExpressions.Add(new ContentQuery <MediaData>());
            contentTypeQuery.QueryExpressions.Add(pageTypeQuery);

            query.QueryExpressions.Add(contentTypeQuery);

            //Create and add query which groups type conditions using OR
            var typeQueries = new GroupQuery(LuceneOperator.OR);

            query.QueryExpressions.Add(typeQueries);

            foreach (var root in searchRoots)
            {
                var contentRootQuery = new VirtualPathQuery();
                contentRootQuery.AddContentNodes(root);
                typeQueries.QueryExpressions.Add(contentRootQuery);
            }

            var accessRightsQuery = new AccessControlListQuery();

            accessRightsQuery.AddAclForUser(PrincipalInfo.Current, context);
            query.QueryExpressions.Add(accessRightsQuery);

            return(query);
        }
        private IQueryExpression CreateQuery(string searchText, IEnumerable<ContentReference> searchRoots, HttpContextBase context, string languageBranch)
        {
            //Main query which groups other queries. Each query added
            //must match in order for a page or file to be returned.
            var query = new GroupQuery(LuceneOperator.AND);

            //Add free text query to the main query
            query.QueryExpressions.Add(new FieldQuery(searchText));

            //Search for pages using the provided language
            var pageTypeQuery = new GroupQuery(LuceneOperator.AND);
            pageTypeQuery.QueryExpressions.Add(new ContentQuery<PageData>());
            pageTypeQuery.QueryExpressions.Add(new FieldQuery(languageBranch, Field.Culture));

            //Search for media without languages
            var contentTypeQuery = new GroupQuery(LuceneOperator.OR);
            contentTypeQuery.QueryExpressions.Add(new ContentQuery<MediaData>());
            contentTypeQuery.QueryExpressions.Add(pageTypeQuery);

            query.QueryExpressions.Add(contentTypeQuery);

            //Create and add query which groups type conditions using OR
            var typeQueries = new GroupQuery(LuceneOperator.OR);
            query.QueryExpressions.Add(typeQueries);

            foreach (var root in searchRoots)
            {
                var contentRootQuery = new VirtualPathQuery();
                contentRootQuery.AddContentNodes(root, _contentLoader);
                typeQueries.QueryExpressions.Add(contentRootQuery);
            }

            var accessRightsQuery = new AccessControlListQuery();
            accessRightsQuery.AddAclForUser(PrincipalInfo.Current, context);
            query.QueryExpressions.Add(accessRightsQuery);

            return query;
        }
        public virtual SearchResults GetSearchResults <T>(string searchQuery, ContentReference root, int page, int pageSize, Collection <SortField> sortFields, bool filterOnAccess) where T : IContent
        {
            if (!this.ServiceActive)
            {
                return(null);
            }
            var groupQuery = new GroupQuery(LuceneOperator.AND);

            groupQuery.QueryExpressions.Add(new ContentQuery <T>());
            groupQuery.QueryExpressions.Add(new FieldQuery(ContentLanguage.PreferredCulture.Name, Field.Culture));
            groupQuery.QueryExpressions.Add(new FieldQuery(searchQuery));
            if (!ContentReference.IsNullOrEmpty(root))
            {
                var virtualPathQuery = new VirtualPathQuery();
                virtualPathQuery.AddContentNodes(root, this.contentRepository);
                groupQuery.QueryExpressions.Add(virtualPathQuery);
            }
            if (filterOnAccess)
            {
                var accessControlListQuery = new AccessControlListQuery();
                accessControlListQuery.AddAclForUser(PrincipalInfo.Current, HttpContext.Current);
                groupQuery.QueryExpressions.Add(accessControlListQuery);
            }

            #region Customized
            Collection <string> sortFieldCollection = null;
            if (sortFields != null && sortFields.Count > 0)
            {
                sortFieldCollection = new Collection <string>();
                foreach (var sortField in sortFields)
                {
                    sortFieldCollection.Add(string.Format("{0},{1},{2}", sortField.Field, sortField.Type, sortField.Reverse));
                }
            }
            #endregion
            return(this.searchHandler.GetSearchResults(groupQuery, this.NamedIndexingService, this.namedIndexes, page, pageSize, sortFieldCollection));
        }
        private IQueryExpression CreateQuery(string searchText, IEnumerable <ContentReference> searchRoots, HttpContextBase context, string languageBranch)
        {
            var query = new GroupQuery(LuceneOperator.AND);

            query.QueryExpressions.Add(new FieldQuery(searchText));

            var pageTypeQuery = new GroupQuery(LuceneOperator.AND);

            pageTypeQuery.QueryExpressions.Add(new ContentQuery <PageData>());
            pageTypeQuery.QueryExpressions.Add(new FieldQuery(languageBranch, Field.Culture));

            var contentTypeQuery = new GroupQuery(LuceneOperator.OR);

            contentTypeQuery.QueryExpressions.Add(new ContentQuery <MediaData>());
            contentTypeQuery.QueryExpressions.Add(pageTypeQuery);

            query.QueryExpressions.Add(contentTypeQuery);

            var typeQueries = new GroupQuery(LuceneOperator.OR);

            query.QueryExpressions.Add(typeQueries);

            foreach (var root in searchRoots)
            {
                var contentRootQuery = new VirtualPathQuery();
                contentRootQuery.AddContentNodes(root);
                typeQueries.QueryExpressions.Add(contentRootQuery);
            }

            var accessRightsQuery = new AccessControlListQuery();

            accessRightsQuery.AddAclForUser(PrincipalInfo.Current, context);
            query.QueryExpressions.Add(accessRightsQuery);

            return(query);
        }