From fab98c5adbba247154fddc7cfa0a13b8f0c4255c Mon Sep 17 00:00:00 2001 From: Benedek Farkas Date: Thu, 13 Sep 2018 22:41:10 +0200 Subject: [PATCH] Projections: Updating QueryVersionScopeOptions and ProjectionManager to support Draft-only Queries (#8111) --- .../Descriptors/Filter/FilterContext.cs | 2 +- .../SortCriterion/SortCriteriaContext.cs | 2 +- .../Drivers/QueryPartDriver.cs | 4 +++ .../Extensions/QueryPartRecordExtensions.cs | 9 +++++++ .../QueryVersionScopeOptionsExtensions.cs | 26 +++++++++++++++++++ .../BooleanFieldTypeEditor.cs | 2 +- .../DateTimeFieldTypeEditor.cs | 2 +- .../DecimalFieldTypeEditor.cs | 2 +- .../FieldTypeEditors/FloatFieldTypeEditor.cs | 2 +- .../IntegerFieldTypeEditor.cs | 2 +- .../FieldTypeEditors/StringFieldTypeEditor.cs | 2 +- .../Models/FieldIndexRecord.cs | 5 +--- .../Orchard.Projections/Models/QueryPart.cs | 4 +-- .../Models/QueryPartRecord.cs | 2 -- .../Orchard.Projections.csproj | 2 ++ .../QueryVersionScopeOptions.cs | 12 +++------ .../Services/ProjectionManager.cs | 20 +++++--------- 17 files changed, 63 insertions(+), 37 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Projections/Extensions/QueryPartRecordExtensions.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Projections/Extensions/QueryVersionScopeOptionsExtensions.cs diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Descriptors/Filter/FilterContext.cs b/src/Orchard.Web/Modules/Orchard.Projections/Descriptors/Filter/FilterContext.cs index 6e472c981..938dedf71 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Descriptors/Filter/FilterContext.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Descriptors/Filter/FilterContext.cs @@ -14,7 +14,7 @@ namespace Orchard.Projections.Descriptors.Filter { public QueryPartRecord QueryPartRecord { get; set; } public string GetFilterColumnName() { - return QueryPartRecord != null && QueryPartRecord.VersionScope == QueryVersionScopeOptions.Latest ? "LatestValue" : "Value"; + return QueryPartRecord.GetVersionedFieldIndexColumnName(); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Descriptors/SortCriterion/SortCriteriaContext.cs b/src/Orchard.Web/Modules/Orchard.Projections/Descriptors/SortCriterion/SortCriteriaContext.cs index 406a57899..b3ba95c1e 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Descriptors/SortCriterion/SortCriteriaContext.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Descriptors/SortCriterion/SortCriteriaContext.cs @@ -14,7 +14,7 @@ namespace Orchard.Projections.Descriptors.SortCriterion { public QueryPartRecord QueryPartRecord { get; set; } public string GetSortColumnName() { - return QueryPartRecord != null && QueryPartRecord.VersionScope == QueryVersionScopeOptions.Latest ? "LatestValue" : "Value"; + return QueryPartRecord.GetVersionedFieldIndexColumnName(); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Drivers/QueryPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Projections/Drivers/QueryPartDriver.cs index 64327db64..9d9a4f740 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Drivers/QueryPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Drivers/QueryPartDriver.cs @@ -44,6 +44,8 @@ namespace Orchard.Projections.Drivers { var element = context.Element(part.PartDefinition.Name); + element.SetAttributeValue("VersionScope", part.VersionScope); + element.Add( new XElement("FilterGroups", part.FilterGroups.Select(filterGroup => @@ -121,6 +123,8 @@ namespace Orchard.Projections.Drivers { return; } + context.ImportAttribute(part.PartDefinition.Name, "VersionScope", scope => part.VersionScope = (QueryVersionScopeOptions)Enum.Parse(typeof(QueryVersionScopeOptions), scope)); + var queryElement = context.Data.Element(part.PartDefinition.Name); part.Record.FilterGroups.Clear(); diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Extensions/QueryPartRecordExtensions.cs b/src/Orchard.Web/Modules/Orchard.Projections/Extensions/QueryPartRecordExtensions.cs new file mode 100644 index 000000000..2eecba42c --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Projections/Extensions/QueryPartRecordExtensions.cs @@ -0,0 +1,9 @@ +namespace Orchard.Projections.Models { + public static class QueryPartRecordExtensions { + public static string GetVersionedFieldIndexColumnName(this QueryPartRecord queryPartRecord) { + return queryPartRecord == null ? + QueryVersionScopeOptions.Published.ToVersionedFieldIndexColumnName() : + queryPartRecord.VersionScope.ToVersionedFieldIndexColumnName(); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Extensions/QueryVersionScopeOptionsExtensions.cs b/src/Orchard.Web/Modules/Orchard.Projections/Extensions/QueryVersionScopeOptionsExtensions.cs new file mode 100644 index 000000000..70dec2fc1 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Projections/Extensions/QueryVersionScopeOptionsExtensions.cs @@ -0,0 +1,26 @@ +using Orchard.ContentManagement; + +namespace Orchard.Projections { + public static class QueryVersionScopeOptionsExtensions { + public static VersionOptions ToVersionOptions(this QueryVersionScopeOptions scope) { + switch (scope) { + case QueryVersionScopeOptions.Latest: + return VersionOptions.Latest; + case QueryVersionScopeOptions.Draft: + return VersionOptions.Draft; + default: + return VersionOptions.Published; + } + } + + public static string ToVersionedFieldIndexColumnName(this QueryVersionScopeOptions scope) { + switch (scope) { + case QueryVersionScopeOptions.Latest: + case QueryVersionScopeOptions.Draft: + return "LatestValue"; + default: + return "Value"; + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/BooleanFieldTypeEditor.cs b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/BooleanFieldTypeEditor.cs index 7ad4b2eff..a905b7b3d 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/BooleanFieldTypeEditor.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/BooleanFieldTypeEditor.cs @@ -25,7 +25,7 @@ namespace Orchard.Projections.FieldTypeEditors { } public Action GetFilterPredicate(dynamic formState) { - return BooleanFilterForm.GetFilterPredicate(formState, formState.VersionScope == QueryVersionScopeOptions.Latest ? "LatestValue" : "Value"); + return BooleanFilterForm.GetFilterPredicate(formState, ((QueryVersionScopeOptions)formState.VersionScope).ToVersionedFieldIndexColumnName()); } public LocalizedString DisplayFilter(string fieldName, string storageName, dynamic formState) { diff --git a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/DateTimeFieldTypeEditor.cs b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/DateTimeFieldTypeEditor.cs index fbbb5d736..c8802ab18 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/DateTimeFieldTypeEditor.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/DateTimeFieldTypeEditor.cs @@ -29,7 +29,7 @@ namespace Orchard.Projections.FieldTypeEditors { } public Action GetFilterPredicate(dynamic formState) { - return DateTimeFilterForm.GetFilterPredicate(formState, formState.VersionScope == QueryVersionScopeOptions.Latest ? "LatestValue" : "Value", _clock.UtcNow, true); + return DateTimeFilterForm.GetFilterPredicate(formState, ((QueryVersionScopeOptions)formState.VersionScope).ToVersionedFieldIndexColumnName(), _clock.UtcNow, true); } public LocalizedString DisplayFilter(string fieldName, string storageName, dynamic formState) { diff --git a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/DecimalFieldTypeEditor.cs b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/DecimalFieldTypeEditor.cs index d4e9a3f79..5185b1223 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/DecimalFieldTypeEditor.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/DecimalFieldTypeEditor.cs @@ -27,7 +27,7 @@ namespace Orchard.Projections.FieldTypeEditors { } public Action GetFilterPredicate(dynamic formState) { - return NumericFilterForm.GetFilterPredicate(formState, formState.VersionScope == QueryVersionScopeOptions.Latest ? "LatestValue" : "Value"); + return NumericFilterForm.GetFilterPredicate(formState, ((QueryVersionScopeOptions)formState.VersionScope).ToVersionedFieldIndexColumnName()); } public LocalizedString DisplayFilter(string fieldName, string storageName, dynamic formState) { diff --git a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/FloatFieldTypeEditor.cs b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/FloatFieldTypeEditor.cs index 17b5d8883..2d8161b2c 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/FloatFieldTypeEditor.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/FloatFieldTypeEditor.cs @@ -28,7 +28,7 @@ namespace Orchard.Projections.FieldTypeEditors { } public Action GetFilterPredicate(dynamic formState) { - return NumericFilterForm.GetFilterPredicate(formState, formState.VersionScope == QueryVersionScopeOptions.Latest ? "LatestValue" : "Value"); + return NumericFilterForm.GetFilterPredicate(formState, ((QueryVersionScopeOptions)formState.VersionScope).ToVersionedFieldIndexColumnName()); } public LocalizedString DisplayFilter(string fieldName, string storageName, dynamic formState) { diff --git a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/IntegerFieldTypeEditor.cs b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/IntegerFieldTypeEditor.cs index 02137ea21..077ac3859 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/IntegerFieldTypeEditor.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/IntegerFieldTypeEditor.cs @@ -34,7 +34,7 @@ namespace Orchard.Projections.FieldTypeEditors { } public Action GetFilterPredicate(dynamic formState) { - return NumericFilterForm.GetFilterPredicate(formState, formState.VersionScope == QueryVersionScopeOptions.Latest ? "LatestValue" : "Value"); + return NumericFilterForm.GetFilterPredicate(formState, ((QueryVersionScopeOptions)formState.VersionScope).ToVersionedFieldIndexColumnName()); } public LocalizedString DisplayFilter(string fieldName, string storageName, dynamic formState) { diff --git a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/StringFieldTypeEditor.cs b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/StringFieldTypeEditor.cs index 647acf414..0b6a5677d 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/StringFieldTypeEditor.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/FieldTypeEditors/StringFieldTypeEditor.cs @@ -25,7 +25,7 @@ namespace Orchard.Projections.FieldTypeEditors { } public Action GetFilterPredicate(dynamic formState) { - return StringFilterForm.GetFilterPredicate(formState, formState.VersionScope == QueryVersionScopeOptions.Latest ? "LatestValue" : "Value"); + return StringFilterForm.GetFilterPredicate(formState, ((QueryVersionScopeOptions)formState.VersionScope).ToVersionedFieldIndexColumnName()); } public LocalizedString DisplayFilter(string fieldName, string storageName, dynamic formState) { diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Models/FieldIndexRecord.cs b/src/Orchard.Web/Modules/Orchard.Projections/Models/FieldIndexRecord.cs index c81fea701..33c9de34a 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Models/FieldIndexRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Models/FieldIndexRecord.cs @@ -1,6 +1,4 @@ -using System.ComponentModel.DataAnnotations; - -namespace Orchard.Projections.Models { +namespace Orchard.Projections.Models { public abstract class FieldIndexRecord { public virtual int Id { get; set; } public virtual string PropertyName { get; set; } @@ -25,5 +23,4 @@ namespace Orchard.Projections.Models { public virtual decimal? Value { get; set; } public virtual decimal? LatestValue { get; set; } } - } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Models/QueryPart.cs b/src/Orchard.Web/Modules/Orchard.Projections/Models/QueryPart.cs index b4873a642..d2100d7af 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Models/QueryPart.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Models/QueryPart.cs @@ -11,8 +11,8 @@ namespace Orchard.Projections.Models { } public QueryVersionScopeOptions VersionScope { - get { return this.Retrieve(x => x.VersionScope); } - set { this.Store(x => x.VersionScope, value); } + get { return Retrieve(x => x.VersionScope); } + set { Store(x => x.VersionScope, value); } } public IList SortCriteria { get { return Record.SortCriteria; } diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Models/QueryPartRecord.cs b/src/Orchard.Web/Modules/Orchard.Projections/Models/QueryPartRecord.cs index 9fd91f083..09f6ff214 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Models/QueryPartRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Models/QueryPartRecord.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Xml.Serialization; -using Orchard.ContentManagement; using Orchard.ContentManagement.Records; using Orchard.Data.Conventions; @@ -26,6 +25,5 @@ namespace Orchard.Projections.Models { [CascadeAllDeleteOrphan, Aggregate] [XmlArray("Layouts")] public virtual IList Layouts { get; set; } - } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Orchard.Projections.csproj b/src/Orchard.Web/Modules/Orchard.Projections/Orchard.Projections.csproj index 4a11e6807..1d9983858 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Orchard.Projections.csproj +++ b/src/Orchard.Web/Modules/Orchard.Projections/Orchard.Projections.csproj @@ -128,6 +128,8 @@ + + diff --git a/src/Orchard.Web/Modules/Orchard.Projections/QueryVersionScopeOptions.cs b/src/Orchard.Web/Modules/Orchard.Projections/QueryVersionScopeOptions.cs index 62a830624..ccd1f703e 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/QueryVersionScopeOptions.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/QueryVersionScopeOptions.cs @@ -1,11 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Orchard.Projections { - public enum QueryVersionScopeOptions { +namespace Orchard.Projections { + public enum QueryVersionScopeOptions { Published, - Latest + Latest, + Draft } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Services/ProjectionManager.cs b/src/Orchard.Web/Modules/Orchard.Projections/Services/ProjectionManager.cs index d3852fc75..6f03d1c94 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Services/ProjectionManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Services/ProjectionManager.cs @@ -4,11 +4,11 @@ using System.Linq; using Orchard.ContentManagement; using Orchard.Data; using Orchard.Forms.Services; -using Orchard.Projections.Descriptors; using Orchard.Localization; -using Orchard.Projections.Descriptors.Property; +using Orchard.Projections.Descriptors; using Orchard.Projections.Descriptors.Filter; using Orchard.Projections.Descriptors.Layout; +using Orchard.Projections.Descriptors.Property; using Orchard.Projections.Descriptors.SortCriterion; using Orchard.Projections.Models; using Orchard.Tokens; @@ -200,17 +200,11 @@ namespace Orchard.Projections.Services { tokens = new Dictionary(); } - // pre-executing all groups - var versionScope = queryRecord.VersionScope; - foreach (var group in queryRecord.FilterGroups) { + var version = queryRecord.VersionScope.ToVersionOptions(); - IHqlQuery contentQuery; - if (versionScope == QueryVersionScopeOptions.Latest) { - contentQuery = _contentManager.HqlQuery().ForVersion(VersionOptions.Latest); - } - else { - contentQuery = _contentManager.HqlQuery().ForVersion(VersionOptions.Published); - } + // pre-executing all groups + foreach (var group in queryRecord.FilterGroups) { + var contentQuery = _contentManager.HqlQuery().ForVersion(version); // iterate over each filter to apply the alterations to the query object foreach (var filter in group.Filters) { @@ -245,7 +239,7 @@ namespace Orchard.Projections.Services { var sortCriterionContext = new SortCriterionContext { Query = contentQuery, State = FormParametersHelper.ToDynamic(sortCriterion.State), - QueryPartRecord= queryRecord + QueryPartRecord = queryRecord }; string category = sortCriterion.Category;