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