Merge DraftFieldIndexService.cs into FieldIndexService.cs, fixes #7925 (#8205)

Lombiq Technologies: ORCH-199
This commit is contained in:
Gábor Domonkos
2019-05-21 20:05:19 +02:00
committed by Benedek Farkas
parent b07a9ee5bb
commit ce63f47dc4
8 changed files with 193 additions and 176 deletions

View File

@@ -17,13 +17,11 @@ namespace Orchard.Projections.Handlers {
private readonly IFieldIndexService _fieldIndexService;
private readonly IFieldStorageProvider _fieldStorageProvider;
private readonly IEnumerable<IContentFieldDriver> _contentFieldDrivers;
private readonly IDraftFieldIndexService _draftFieldIndexService;
public FieldIndexPartHandler(
IContentDefinitionManager contentDefinitionManager,
IRepository<FieldIndexPartRecord> repository,
IFieldIndexService fieldIndexService,
IDraftFieldIndexService draftFieldIndexService,
IFieldStorageProvider fieldStorageProvider,
IEnumerable<IContentFieldDriver> contentFieldDrivers) {
Filters.Add(StorageFilter.For(repository));
@@ -31,7 +29,6 @@ namespace Orchard.Projections.Handlers {
_fieldIndexService = fieldIndexService;
_fieldStorageProvider = fieldStorageProvider;
_contentFieldDrivers = contentFieldDrivers;
_draftFieldIndexService = draftFieldIndexService;
OnUpdated<FieldIndexPart>(Updated);
OnPublishing<FieldIndexPart>(Publishing);
}
@@ -49,22 +46,25 @@ namespace Orchard.Projections.Handlers {
}
private void Updated(UpdateContentContext context, FieldIndexPart fieldIndexPart) {
if (context.UpdatingItemVersionRecord.Latest) { // updates projection draft indexes only if it is the latest version
DescribeValuesToindex(fieldIndexPart, (indexServiceContext) => {
_draftFieldIndexService.Set(fieldIndexPart,
indexServiceContext.LocalPart.PartDefinition.Name,
indexServiceContext.LocalField.Name,
indexServiceContext.StorageName, indexServiceContext.FieldValue, indexServiceContext.StorageType);
DescribeValuesToIndex(fieldIndexPart, (indexServiceContext) => {
_fieldIndexService.Set(
fieldIndexPart,
indexServiceContext.LocalPart.PartDefinition.Name,
indexServiceContext.LocalField.Name,
indexServiceContext.StorageName, indexServiceContext.FieldValue, indexServiceContext.StorageType,
FieldIndexRecordVersionOptions.LatestValue);
});
}
}
public void Publishing(PublishContentContext context, FieldIndexPart fieldIndexPart) {
DescribeValuesToindex(fieldIndexPart, (indexServiceContext) => {
_fieldIndexService.Set(fieldIndexPart,
indexServiceContext.LocalPart.PartDefinition.Name,
indexServiceContext.LocalField.Name,
indexServiceContext.StorageName, indexServiceContext.FieldValue, indexServiceContext.StorageType);
DescribeValuesToIndex(fieldIndexPart, (indexServiceContext) => {
_fieldIndexService.Set(
fieldIndexPart,
indexServiceContext.LocalPart.PartDefinition.Name,
indexServiceContext.LocalField.Name,
indexServiceContext.StorageName, indexServiceContext.FieldValue, indexServiceContext.StorageType);
});
}
@@ -73,7 +73,7 @@ namespace Orchard.Projections.Handlers {
/// </summary>
/// <param name="fieldIndexPart"></param>
/// <param name="indexService"></param>
private void DescribeValuesToindex(FieldIndexPart fieldIndexPart, Action<IndexServiceContext> indexService) {
private void DescribeValuesToIndex(FieldIndexPart fieldIndexPart, Action<IndexServiceContext> indexService) {
foreach (var part in fieldIndexPart.ContentItem.Parts) {
foreach (var field in part.PartDefinition.Fields) {
@@ -95,7 +95,8 @@ namespace Orchard.Projections.Handlers {
LocalField = localField,
StorageName = storageName,
FieldValue = fieldValue,
StorageType = storageType });
StorageType = storageType
});
});
foreach (var driver in drivers) {

View File

@@ -189,8 +189,6 @@
<Compile Include="Providers\Properties\CustomValueProperties.cs" />
<Compile Include="Navigation\NavigationQueryProvider.cs" />
<Compile Include="Models\QueryVersionScopeOptions.cs" />
<Compile Include="Services\DraftFieldIndexService.cs" />
<Compile Include="Services\IDraftFieldIndexService.cs" />
<Compile Include="Shapes.cs" />
<Compile Include="Descriptors\Layout\LayoutComponentResult.cs" />
<Compile Include="Descriptors\Layout\LayoutContext.cs" />

View File

@@ -1,125 +0,0 @@
using System;
using System.Linq;
using Orchard.Projections.Models;
namespace Orchard.Projections.Services {
public class DraftFieldIndexService : IDraftFieldIndexService {
public void Set(FieldIndexPart part, string partName, string fieldName, string valueName, object value, Type valueType) {
var propertyName = String.Join(".", partName, fieldName, valueName ?? "");
var typeCode = Type.GetTypeCode(valueType);
if(valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Nullable<>)) {
typeCode = Type.GetTypeCode(Nullable.GetUnderlyingType(valueType));
}
switch (typeCode) {
case TypeCode.Char:
case TypeCode.String:
var stringRecord = part.Record.StringFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
if (stringRecord == null) {
stringRecord = new StringFieldIndexRecord { PropertyName = propertyName };
part.Record.StringFieldIndexRecords.Add(stringRecord);
}
// take the first 4000 chars as it is the limit for the field
stringRecord.LatestValue = value == null ? null : value.ToString().Substring(0, Math.Min(value.ToString().Length, 4000));
break;
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
var integerRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
if (integerRecord == null) {
integerRecord = new IntegerFieldIndexRecord { PropertyName = propertyName };
part.Record.IntegerFieldIndexRecords.Add(integerRecord);
}
integerRecord.LatestValue = value == null ? default(long?) : Convert.ToInt64(value);
break;
case TypeCode.DateTime:
var dateTimeRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
if (dateTimeRecord == null) {
dateTimeRecord = new IntegerFieldIndexRecord { PropertyName = propertyName };
part.Record.IntegerFieldIndexRecords.Add(dateTimeRecord);
}
dateTimeRecord.LatestValue = value == null ? default(long?) : ((DateTime)value).Ticks;
break;
case TypeCode.Boolean:
var booleanRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
if (booleanRecord == null) {
booleanRecord = new IntegerFieldIndexRecord { PropertyName = propertyName };
part.Record.IntegerFieldIndexRecords.Add(booleanRecord);
}
booleanRecord.LatestValue = value == null ? default(long?) : Convert.ToInt64((bool)value);
break;
case TypeCode.Decimal:
var decimalRecord = part.Record.DecimalFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
if (decimalRecord == null) {
decimalRecord = new DecimalFieldIndexRecord { PropertyName = propertyName };
part.Record.DecimalFieldIndexRecords.Add(decimalRecord);
}
decimalRecord.LatestValue = value == null ? default(decimal?) : Convert.ToDecimal((decimal)value);
break;
case TypeCode.Single:
case TypeCode.Double:
var doubleRecord = part.Record.DoubleFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
if (doubleRecord == null) {
doubleRecord = new DoubleFieldIndexRecord { PropertyName = propertyName };
part.Record.DoubleFieldIndexRecords.Add(doubleRecord);
}
doubleRecord.LatestValue = value == null ? default(double?) : Convert.ToDouble(value);
break;
}
}
public T Get<T>(FieldIndexPart part, string partName, string fieldName, string valueName) {
var propertyName = String.Join(".", partName, fieldName, valueName ?? "");
var typeCode = Type.GetTypeCode(typeof(T));
switch (typeCode) {
case TypeCode.Char:
case TypeCode.String:
var stringRecord = part.Record.StringFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return stringRecord != null ? (T)Convert.ChangeType(stringRecord.LatestValue, typeof(T)) : default(T);
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
var integerRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return integerRecord != null ? (T)Convert.ChangeType(integerRecord.LatestValue, typeof(T)) : default(T);
case TypeCode.Decimal:
var decimalRecord = part.Record.DecimalFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return decimalRecord != null ? (T)Convert.ChangeType(decimalRecord.LatestValue, typeof(T)) : default(T);
case TypeCode.Single:
case TypeCode.Double:
var doubleRecord = part.Record.DoubleFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return doubleRecord != null ? (T)Convert.ChangeType(doubleRecord.LatestValue, typeof(T)) : default(T);
case TypeCode.DateTime:
var dateTimeRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return dateTimeRecord != null ? (T)Convert.ChangeType(new DateTime(Convert.ToInt64(dateTimeRecord.LatestValue)), typeof(T)) : default(T);
case TypeCode.Boolean:
var booleanRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return booleanRecord != null ? (T)Convert.ChangeType(booleanRecord.LatestValue, typeof(T)) : default(T);
default:
return default(T);
}
}
}
}

View File

@@ -5,12 +5,16 @@ using Orchard.Projections.Models;
namespace Orchard.Projections.Services {
public class FieldIndexService : IFieldIndexService {
public void Set(FieldIndexPart part, string partName, string fieldName, string valueName, object value, Type valueType) {
var propertyName = String.Join(".", partName, fieldName, valueName ?? "");
public void Set(FieldIndexPart part, string partName, string fieldName, string valueName, object value, Type valueType) =>
Set(part, partName, fieldName, valueName, value, valueType, FieldIndexRecordVersionOptions.Value);
public void Set(FieldIndexPart part, string partName, string fieldName, string valueName, object value, Type valueType,
FieldIndexRecordVersionOptions fieldIndexRecordVersionOption) {
var propertyName = string.Join(".", partName, fieldName, valueName ?? "");
var typeCode = Type.GetTypeCode(valueType);
if(valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Nullable<>)) {
if (valueType.IsGenericType && valueType.GetGenericTypeDefinition() == typeof(Nullable<>)) {
typeCode = Type.GetTypeCode(Nullable.GetUnderlyingType(valueType));
}
@@ -23,10 +27,19 @@ namespace Orchard.Projections.Services {
part.Record.StringFieldIndexRecords.Add(stringRecord);
}
// take the first 4000 chars as it is the limit for the field
stringRecord.Value = value == null ? null : value.ToString().Substring(0, Math.Min(value.ToString().Length, 4000));
// Take the first 4000 chars as it is the limit for the field.
var stringRecordValue = value?.ToString().Substring(0, Math.Min(value.ToString().Length, 4000));
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
stringRecord.Value = stringRecordValue;
break;
case FieldIndexRecordVersionOptions.LatestValue:
stringRecord.LatestValue = stringRecordValue;
break;
}
break;
case TypeCode.Byte:
case TypeCode.SByte:
@@ -42,7 +55,18 @@ namespace Orchard.Projections.Services {
part.Record.IntegerFieldIndexRecords.Add(integerRecord);
}
integerRecord.Value = value == null ? default(long?) : Convert.ToInt64(value);
var integerRecordValue = value == null ? default(long?) : Convert.ToInt64(value);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
integerRecord.Value = integerRecordValue;
break;
case FieldIndexRecordVersionOptions.LatestValue:
integerRecord.LatestValue = integerRecordValue;
break;
}
break;
case TypeCode.DateTime:
var dateTimeRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
@@ -51,7 +75,18 @@ namespace Orchard.Projections.Services {
part.Record.IntegerFieldIndexRecords.Add(dateTimeRecord);
}
dateTimeRecord.Value = value == null ? default(long?) : ((DateTime)value).Ticks;
var dateTimeRecordValue = value == null ? default(long?) : ((DateTime)value).Ticks;
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
dateTimeRecord.Value = dateTimeRecordValue;
break;
case FieldIndexRecordVersionOptions.LatestValue:
dateTimeRecord.LatestValue = dateTimeRecordValue;
break;
}
break;
case TypeCode.Boolean:
var booleanRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
@@ -60,7 +95,18 @@ namespace Orchard.Projections.Services {
part.Record.IntegerFieldIndexRecords.Add(booleanRecord);
}
booleanRecord.Value = value == null ? default(long?) : Convert.ToInt64((bool)value);
var booleanRecordValue = value == null ? default(long?) : Convert.ToInt64((bool)value);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
booleanRecord.Value = booleanRecordValue;
break;
case FieldIndexRecordVersionOptions.LatestValue:
booleanRecord.LatestValue = booleanRecordValue;
break;
}
break;
case TypeCode.Decimal:
var decimalRecord = part.Record.DecimalFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
@@ -69,7 +115,18 @@ namespace Orchard.Projections.Services {
part.Record.DecimalFieldIndexRecords.Add(decimalRecord);
}
decimalRecord.Value = value == null ? default(decimal?) : Convert.ToDecimal((decimal)value);
var decimalRecordValue = value == null ? default(decimal?) : Convert.ToDecimal((decimal)value);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
decimalRecord.Value = decimalRecordValue;
break;
case FieldIndexRecordVersionOptions.LatestValue:
decimalRecord.LatestValue = decimalRecordValue;
break;
}
break;
case TypeCode.Single:
case TypeCode.Double:
@@ -79,13 +136,27 @@ namespace Orchard.Projections.Services {
part.Record.DoubleFieldIndexRecords.Add(doubleRecord);
}
doubleRecord.Value = value == null ? default(double?) : Convert.ToDouble(value);
var doubleRecordValue = value == null ? default(double?) : Convert.ToDouble(value);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
doubleRecord.Value = doubleRecordValue;
break;
case FieldIndexRecordVersionOptions.LatestValue:
doubleRecord.LatestValue = doubleRecordValue;
break;
}
break;
}
}
public T Get<T>(FieldIndexPart part, string partName, string fieldName, string valueName) {
var propertyName = String.Join(".", partName, fieldName, valueName ?? "");
public T Get<T>(FieldIndexPart part, string partName, string fieldName, string valueName) =>
Get<T>(part, partName, fieldName, valueName, FieldIndexRecordVersionOptions.Value);
public T Get<T>(FieldIndexPart part, string partName, string fieldName, string valueName, FieldIndexRecordVersionOptions fieldIndexRecordVersionOption) {
var propertyName = string.Join(".", partName, fieldName, valueName ?? "");
var typeCode = Type.GetTypeCode(typeof(T));
@@ -93,7 +164,20 @@ namespace Orchard.Projections.Services {
case TypeCode.Char:
case TypeCode.String:
var stringRecord = part.Record.StringFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return stringRecord != null ? (T)Convert.ChangeType(stringRecord.Value, typeof(T)) : default(T);
var stringRecordValue = default(T);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
stringRecordValue = (T)Convert.ChangeType(stringRecord.Value, typeof(T));
break;
case FieldIndexRecordVersionOptions.LatestValue:
stringRecordValue = (T)Convert.ChangeType(stringRecord.LatestValue, typeof(T));
break;
}
return stringRecord != null ? stringRecordValue : default;
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.Int16:
@@ -103,22 +187,87 @@ namespace Orchard.Projections.Services {
case TypeCode.UInt32:
case TypeCode.UInt64:
var integerRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return integerRecord != null ? (T)Convert.ChangeType(integerRecord.Value, typeof(T)) : default(T);
var integerRecordValue = default(T);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
integerRecordValue = (T)Convert.ChangeType(integerRecord.Value, typeof(T));
break;
case FieldIndexRecordVersionOptions.LatestValue:
integerRecordValue = (T)Convert.ChangeType(integerRecord.LatestValue, typeof(T));
break;
}
return integerRecord != null ? integerRecordValue : default;
case TypeCode.Decimal:
var decimalRecord = part.Record.DecimalFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return decimalRecord != null ? (T)Convert.ChangeType(decimalRecord.Value, typeof(T)) : default(T);
var decimalRecordValue = default(T);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
decimalRecordValue = (T)Convert.ChangeType(decimalRecord.Value, typeof(T));
break;
case FieldIndexRecordVersionOptions.LatestValue:
decimalRecordValue = (T)Convert.ChangeType(decimalRecord.LatestValue, typeof(T));
break;
}
return decimalRecord != null ? decimalRecordValue : default;
case TypeCode.Single:
case TypeCode.Double:
var doubleRecord = part.Record.DoubleFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return doubleRecord != null ? (T)Convert.ChangeType(doubleRecord.Value, typeof(T)) : default(T);
var doubleRecordValue = default(T);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
doubleRecordValue = (T)Convert.ChangeType(doubleRecord.Value, typeof(T));
break;
case FieldIndexRecordVersionOptions.LatestValue:
doubleRecordValue = (T)Convert.ChangeType(doubleRecord.LatestValue, typeof(T));
break;
}
return doubleRecord != null ? doubleRecordValue : default;
case TypeCode.DateTime:
var dateTimeRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return dateTimeRecord != null ? (T)Convert.ChangeType(new DateTime(Convert.ToInt64(dateTimeRecord.Value)), typeof(T)) : default(T);
var dateTimeRecordValue = default(T);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
dateTimeRecordValue = (T)Convert.ChangeType(new DateTime(Convert.ToInt64(dateTimeRecord.Value)), typeof(T));
break;
case FieldIndexRecordVersionOptions.LatestValue:
dateTimeRecordValue = (T)Convert.ChangeType(new DateTime(Convert.ToInt64(dateTimeRecord.LatestValue)), typeof(T));
break;
}
return dateTimeRecord != null ? dateTimeRecordValue : default;
case TypeCode.Boolean:
var booleanRecord = part.Record.IntegerFieldIndexRecords.FirstOrDefault(r => r.PropertyName == propertyName);
return booleanRecord != null ? (T)Convert.ChangeType(booleanRecord.Value, typeof(T)) : default(T);
var booleanRecordValue = default(T);
switch (fieldIndexRecordVersionOption) {
case FieldIndexRecordVersionOptions.Value:
booleanRecordValue = (T)Convert.ChangeType(booleanRecord.Value, typeof(T));
break;
case FieldIndexRecordVersionOptions.LatestValue:
booleanRecordValue = (T)Convert.ChangeType(booleanRecord.LatestValue, typeof(T));
break;
}
return booleanRecord != null ? booleanRecordValue : default;
default:
return default(T);
return default;
}
}
}

View File

@@ -1,9 +0,0 @@
using System;
using Orchard.Projections.Models;
namespace Orchard.Projections.Services {
public interface IDraftFieldIndexService : IDependency {
void Set(FieldIndexPart part, string partName, string fieldName, string valueName, object value, Type valueType);
T Get<T>(FieldIndexPart part, string partName, string fieldName, string valueName);
}
}

View File

@@ -3,7 +3,14 @@ using Orchard.Projections.Models;
namespace Orchard.Projections.Services {
public interface IFieldIndexService : IDependency {
void Set(FieldIndexPart part, string partName, string fieldName, string valueName, object value, Type valueType);
T Get<T>(FieldIndexPart part, string partName, string fieldName, string valueName);
T Get<T>(FieldIndexPart part, string partName, string fieldName, string valueName, FieldIndexRecordVersionOptions fieldIndexRecordVersionOption);
void Set(FieldIndexPart part, string partName, string fieldName, string valueName, object value, Type valueType);
void Set(FieldIndexPart part, string partName, string fieldName, string valueName, object value, Type valueType, FieldIndexRecordVersionOptions fieldIndexRecordVersionOption);
}
public enum FieldIndexRecordVersionOptions {
Value,
LatestValue
}
}

View File

@@ -33,9 +33,7 @@ namespace Orchard.Projections.Tests.Services {
builder.RegisterType<FieldIndexPartHandler>().As<IContentHandler>();
builder.RegisterType<OrchardServices>().As<IOrchardServices>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<DraftFieldIndexService>().As<IDraftFieldIndexService>();
builder.RegisterType<FieldIndexService>().As<IFieldIndexService>();
builder.RegisterType<DraftFieldIndexService>().As<IDraftFieldIndexService>();
builder.RegisterType<ThingHandler>().As<IContentHandler>();
builder.RegisterType<FieldIndexPartHandler>().As<IContentHandler>();
builder.RegisterType<InfosetStorageProvider>().As<IFieldStorageProvider>();

View File

@@ -41,9 +41,7 @@ namespace Orchard.Projections.Tests.Services {
builder.RegisterType<FieldIndexPartHandler>().As<IContentHandler>();
builder.RegisterType<OrchardServices>().As<IOrchardServices>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<DraftFieldIndexService>().As<IDraftFieldIndexService>();
builder.RegisterType<FieldIndexService>().As<IFieldIndexService>();
builder.RegisterType<DraftFieldIndexService>().As<IDraftFieldIndexService>();
builder.RegisterType<ThingHandler>().As<IContentHandler>();
builder.RegisterType<FieldIndexPartHandler>().As<IContentHandler>();