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)); }
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); } }
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)); }
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>(); } }
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); }