Skip to content

Commit

Permalink
Adding support for multiple wheres, take and skip
Browse files Browse the repository at this point in the history
  • Loading branch information
base33 committed Nov 30, 2015
1 parent ab84e9a commit 7b08c17
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 8 deletions.
Binary file modified Umbraco.Examine.Linq.Sandbox/App_Data/Umbraco.sdf
Binary file not shown.
4 changes: 3 additions & 1 deletion Umbraco.Examine.Linq.Sandbox/Views/Home.cshtml
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
@using System.Linq;
@using Umbraco.Examine.Linq.Extensions;
@using Umbraco.Examine.Linq.Sandbox.Models;

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage

@{
Layout = "Master.cshtml";
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
var results = new Umbraco.Examine.Linq.Index<Umbraco.Examine.Linq.Sandbox.Models.BlogPost>().ToList();
var results = new Umbraco.Examine.Linq.Index<BlogPost>().Where(c => c.Name.Contains("different", 0.6) || c.Name.Contains("only").Boost(8))
.Where(c => c.CreatedDate < DateTime.Now && c.CreatedDate > DateTime.Now.AddMonths(-6)).ToList();
//var results = mm.Where(c => c.Name == "u*").ToList();
//var date = DateTime.Parse("2015-05-31T02:00:12.0000000");
Expand Down
11 changes: 10 additions & 1 deletion Umbraco.Examine.Linq/Executor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,16 @@ public IEnumerable<T> ExecuteCollection<T>(QueryModel queryModel)
{
var visitor = new QueryModelVisitor();
visitor.VisitQueryModel(queryModel);
var searchResults = Searcher.Search(visitor.query.ToString());
var searchResults = Searcher.Search(string.Join(" AND ", visitor.queries));

if (visitor.skip != -1)
searchResults = searchResults.Skip(visitor.skip);

if (visitor.take != -1)
{
searchResults = searchResults.Take(visitor.take);
}

return new SearchResultMapper<T>().Map(searchResults);
}

Expand Down
39 changes: 33 additions & 6 deletions Umbraco.Examine.Linq/QueryModelVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,25 @@
using System.Text;
using System.Threading.Tasks;
using Umbraco.Examine.Linq.Attributes;
using Remotion.Linq.Clauses;
using Remotion.Linq.Clauses.ResultOperators;
using System.Linq.Expressions;

namespace Umbraco.Examine.Linq
{
public class QueryModelVisitor : QueryModelVisitorBase
{
public StringBuilder query = new StringBuilder();
public List<StringBuilder> queries = new List<StringBuilder>();
public int take = -1;
public int skip = -1;

public override void VisitWhereClause(Remotion.Linq.Clauses.WhereClause whereClause, QueryModel queryModel, int index)
{
if (query.Length > 0)
query.Append(" AND ");
bool alreadyHasQuery = false;

var query = new StringBuilder();
queries.Add(query);

ExpressionTreeVisitor visitor = new ExpressionTreeVisitor(query);
visitor.VisitExpression(whereClause.Predicate);

Expand All @@ -24,14 +32,33 @@ public override void VisitWhereClause(Remotion.Linq.Clauses.WhereClause whereCla

public override void VisitMainFromClause(Remotion.Linq.Clauses.MainFromClause fromClause, QueryModel queryModel)
{
query.Clear();
queries = new List<StringBuilder>();

NodeTypeAliasAttribute attribute = (NodeTypeAliasAttribute)fromClause.ItemType.GetCustomAttributes(typeof(NodeTypeAliasAttribute), false).FirstOrDefault();

if (attribute != null)
query.AppendFormat("nodeTypeAlias:{0}", attribute.Name);

{
queries.Add(new StringBuilder(string.Format("nodeTypeAlias:{0}", attribute.Name)));
}

base.VisitMainFromClause(fromClause, queryModel);
}

public override void VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, int index)
{
base.VisitResultOperator(resultOperator, queryModel, index);
}

public override void VisitQueryModel(QueryModel queryModel)
{
foreach (var resultOperator in queryModel.ResultOperators)
{
if (resultOperator is TakeResultOperator)
take = (int)((ConstantExpression)((TakeResultOperator)resultOperator).Count).Value;
else if (resultOperator is SkipResultOperator)
skip = (int)((ConstantExpression)((SkipResultOperator)resultOperator).Count).Value;
}
base.VisitQueryModel(queryModel);
}
}
}

0 comments on commit 7b08c17

Please sign in to comment.