2014-06-08 09:51:06 -07:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using Umbraco.Core.Models;
|
|
|
|
|
|
using Umbraco.Web.Mvc;
|
|
|
|
|
|
using Umbraco.Web.WebApi.Filters;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Umbraco.Web.Editors
|
|
|
|
|
|
{
|
2014-06-08 22:39:01 +01:00
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
using System.Web.Services.Description;
|
|
|
|
|
|
|
2014-06-08 09:51:06 -07:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// The API controller used for building content queries within the template
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
[PluginController("UmbracoApi")]
|
|
|
|
|
|
[DisableBrowserCache]
|
|
|
|
|
|
public class TemplateQueryController : UmbracoAuthorizedJsonController
|
|
|
|
|
|
{
|
|
|
|
|
|
public TemplateQueryController()
|
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
|
|
public TemplateQueryController(UmbracoContext umbracoContext)
|
|
|
|
|
|
:base(umbracoContext)
|
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
|
|
private static readonly IEnumerable<OperathorTerm> _terms = new List<OperathorTerm>()
|
|
|
|
|
|
{
|
|
|
|
|
|
new OperathorTerm("is", Operathor.Equals, new [] {"string"}),
|
|
|
|
|
|
new OperathorTerm("is not", Operathor.NotEquals, new [] {"string"}),
|
|
|
|
|
|
new OperathorTerm("before", Operathor.LessThan, new [] {"datetime"}),
|
|
|
|
|
|
new OperathorTerm("before (including selected date)", Operathor.LessThanEqualTo, new [] {"datetime"}),
|
|
|
|
|
|
new OperathorTerm("after", Operathor.GreaterThan, new [] {"datetime"}),
|
|
|
|
|
|
new OperathorTerm("after (including selected date)", Operathor.GreaterThanEqualTo, new [] {"datetime"}),
|
|
|
|
|
|
new OperathorTerm("equals", Operathor.Equals, new [] {"int"}),
|
|
|
|
|
|
new OperathorTerm("does not equal", Operathor.NotEquals, new [] {"int"}),
|
|
|
|
|
|
new OperathorTerm("contains", Operathor.Contains, new [] {"string"}),
|
|
|
|
|
|
new OperathorTerm("does not contain", Operathor.NotContains, new [] {"string"}),
|
|
|
|
|
|
new OperathorTerm("greater than", Operathor.GreaterThan, new [] {"int"}),
|
|
|
|
|
|
new OperathorTerm("greater than or equal to", Operathor.GreaterThanEqualTo, new [] {"int"}),
|
|
|
|
|
|
new OperathorTerm("less than", Operathor.LessThan, new [] {"int"}),
|
|
|
|
|
|
new OperathorTerm("less than or equal to", Operathor.LessThanEqualTo, new [] {"int"})
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2014-06-08 10:20:34 -07:00
|
|
|
|
|
|
|
|
|
|
public IQueryResultModel GetTemplateQuery2()
|
|
|
|
|
|
{
|
|
|
|
|
|
return GetTemplateQuery(new QueryModel()
|
|
|
|
|
|
{
|
|
|
|
|
|
ContentTypeAlias = "umbTextPage",
|
2014-06-08 19:06:37 +01:00
|
|
|
|
Id = 1068,
|
|
|
|
|
|
Wheres = new List<IQueryCondition>()
|
2014-06-08 23:26:46 +01:00
|
|
|
|
{
|
|
|
|
|
|
new QueryCondition()
|
|
|
|
|
|
{
|
|
|
|
|
|
ConstraintValue = "Getting",
|
|
|
|
|
|
FieldName = "Name",
|
|
|
|
|
|
Term = _terms.FirstOrDefault(x => x.Name == "contains")
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2014-06-08 10:20:34 -07:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-06-08 09:51:06 -07:00
|
|
|
|
public IQueryResultModel GetTemplateQuery(IQueryModel model)
|
|
|
|
|
|
{
|
|
|
|
|
|
var umbraco = new UmbracoHelper(UmbracoContext);
|
|
|
|
|
|
|
|
|
|
|
|
var queryResult = new QueryResultModel();
|
|
|
|
|
|
|
|
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
|
|
sb.Append(queryResult.QueryExpression);
|
|
|
|
|
|
|
2014-06-08 22:39:01 +01:00
|
|
|
|
var timer = new Stopwatch();
|
|
|
|
|
|
|
|
|
|
|
|
timer.Start();
|
|
|
|
|
|
|
2014-06-08 09:51:06 -07:00
|
|
|
|
var currentPage = umbraco.TypedContentAtRoot().FirstOrDefault();
|
2014-06-08 22:39:01 +01:00
|
|
|
|
|
|
|
|
|
|
timer.Stop();
|
2014-06-08 09:51:06 -07:00
|
|
|
|
|
|
|
|
|
|
// adjust the "FROM"
|
2014-06-08 19:06:37 +01:00
|
|
|
|
if (model != null && model.Id > 0)
|
2014-06-08 09:51:06 -07:00
|
|
|
|
{
|
|
|
|
|
|
var fromTypeAlias = umbraco.TypedContent(model.Id).DocumentTypeAlias;
|
|
|
|
|
|
|
2014-06-08 22:39:01 +01:00
|
|
|
|
timer.Start();
|
|
|
|
|
|
|
2014-06-09 08:41:29 +01:00
|
|
|
|
currentPage = currentPage.DescendantsOrSelf(fromTypeAlias).FirstOrDefault();
|
2014-06-08 22:39:01 +01:00
|
|
|
|
|
|
|
|
|
|
timer.Stop();
|
2014-06-09 08:41:29 +01:00
|
|
|
|
|
|
|
|
|
|
sb.AppendFormat(".DescendantsOrSelf(\"{0}\").First()", fromTypeAlias);
|
2014-06-08 09:51:06 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TYPE to return if filtered by type
|
|
|
|
|
|
IEnumerable<IPublishedContent> contents;
|
2014-06-08 19:06:37 +01:00
|
|
|
|
if (model != null && string.IsNullOrEmpty(model.ContentTypeAlias) == false)
|
2014-06-08 09:51:06 -07:00
|
|
|
|
{
|
2014-06-08 22:39:01 +01:00
|
|
|
|
timer.Start();
|
|
|
|
|
|
|
2014-06-08 09:51:06 -07:00
|
|
|
|
contents = currentPage.Descendants(model.ContentTypeAlias);
|
|
|
|
|
|
|
2014-06-08 22:39:01 +01:00
|
|
|
|
timer.Stop();
|
2014-06-09 07:08:06 +01:00
|
|
|
|
sb.AppendFormat(".Descendants(\"{0}\")", model.ContentTypeAlias);
|
2014-06-08 09:51:06 -07:00
|
|
|
|
}
|
2014-06-08 22:39:01 +01:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
timer.Start();
|
|
|
|
|
|
contents = currentPage.Descendants();
|
|
|
|
|
|
timer.Stop();
|
2014-06-09 07:08:06 +01:00
|
|
|
|
sb.Append(".Descendants()");
|
2014-06-08 22:39:01 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var clause = string.Empty;
|
2014-06-08 09:51:06 -07:00
|
|
|
|
|
|
|
|
|
|
// WHERE
|
|
|
|
|
|
foreach (var condition in model.Wheres)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(string.IsNullOrEmpty( condition.ConstraintValue)) continue;
|
2014-06-08 22:39:01 +01:00
|
|
|
|
|
|
|
|
|
|
var operation = string.Empty;
|
2014-06-08 09:51:06 -07:00
|
|
|
|
|
2014-06-08 22:39:01 +01:00
|
|
|
|
|
2014-06-08 09:51:06 -07:00
|
|
|
|
switch (condition.Term.Operathor)
|
|
|
|
|
|
{
|
2014-06-08 19:06:37 +01:00
|
|
|
|
case Operathor.Equals:
|
|
|
|
|
|
operation = condition.MakeBinaryOperation(" == ");
|
2014-06-08 09:51:06 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case Operathor.NotEquals:
|
|
|
|
|
|
operation = condition.MakeBinaryOperation(" != ");
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case Operathor.GreaterThan:
|
|
|
|
|
|
operation = condition.MakeBinaryOperation(" > ");
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case Operathor.GreaterThanEqualTo:
|
|
|
|
|
|
operation = condition.MakeBinaryOperation(" >= ");
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case Operathor.LessThan:
|
|
|
|
|
|
operation = condition.MakeBinaryOperation(" < ");
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case Operathor.LessThanEqualTo:
|
|
|
|
|
|
operation = condition.MakeBinaryOperation(" <= ");
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case Operathor.Contains:
|
|
|
|
|
|
// .Where()
|
|
|
|
|
|
operation = string.Format("{0}.Contains(\"{1}\")", condition.FieldName, condition.ConstraintValue);
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case Operathor.NotContains:
|
|
|
|
|
|
operation = string.Format("!{0}.Contains(\"{1}\")", condition.FieldName, condition.ConstraintValue);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-06-08 22:39:01 +01:00
|
|
|
|
clause = string.IsNullOrEmpty(clause) ? operation : string.Concat(new[] { clause, " && ", operation });
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(string.IsNullOrEmpty(clause) == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
timer.Start();
|
|
|
|
|
|
|
|
|
|
|
|
contents = contents.Where(clause);
|
|
|
|
|
|
|
|
|
|
|
|
timer.Stop();
|
|
|
|
|
|
|
|
|
|
|
|
sb.AppendFormat(".Where(\"{0}\")", clause);
|
2014-06-08 09:51:06 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
queryResult.QueryExpression = sb.ToString();
|
2014-06-08 22:39:01 +01:00
|
|
|
|
queryResult.ExecutionTime = timer.ElapsedMilliseconds;
|
|
|
|
|
|
queryResult.ResultCount = contents.Count();
|
|
|
|
|
|
queryResult.SampleResults = contents.Take(20).Select(x => new TemplateQueryResult()
|
|
|
|
|
|
{
|
|
|
|
|
|
Icon = "icon-file",
|
|
|
|
|
|
Name = x.Name
|
|
|
|
|
|
});
|
2014-06-08 09:51:06 -07:00
|
|
|
|
|
|
|
|
|
|
return queryResult;
|
|
|
|
|
|
}
|
2014-06-08 19:06:37 +01:00
|
|
|
|
|
2014-06-08 09:51:06 -07:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Returns a collection of constraint conditions that can be used in the query
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public IEnumerable<OperathorTerm> GetFilterConditions()
|
|
|
|
|
|
{
|
|
|
|
|
|
return _terms;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|