diff --git a/src/Orchard.Web/Modules/Orchard.Indexing/Handlers/InfosetFieldIndexingHandler.cs b/src/Orchard.Web/Modules/Orchard.Indexing/Handlers/InfosetFieldIndexingHandler.cs index feeed3de8..f767c4685 100644 --- a/src/Orchard.Web/Modules/Orchard.Indexing/Handlers/InfosetFieldIndexingHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Indexing/Handlers/InfosetFieldIndexingHandler.cs @@ -4,11 +4,23 @@ using Orchard.ContentManagement; using Orchard.ContentManagement.FieldStorage.InfosetStorage; using Orchard.ContentManagement.Handlers; using Orchard.Indexing.Settings; +using System.Collections.Generic; +using Orchard.ContentManagement.Drivers; +using Orchard.ContentManagement.MetaData.Models; +using Orchard.ContentManagement.FieldStorage; namespace Orchard.Indexing.Handlers { public class InfosetFieldIndexingHandler : ContentHandler { - public InfosetFieldIndexingHandler() { + private readonly IEnumerable _contentFieldDrivers; + private readonly IFieldStorageProvider _fieldStorageProvider; + + public InfosetFieldIndexingHandler( + IEnumerable contentFieldDrivers, + IFieldStorageProvider fieldStorageProvider) { + + _contentFieldDrivers = contentFieldDrivers; + _fieldStorageProvider = fieldStorageProvider; OnIndexing( (context, cp) => { @@ -17,6 +29,7 @@ namespace Orchard.Indexing.Handlers { return; } + // part fields foreach ( var part in infosetPart.ContentItem.Parts ) { foreach ( var field in part.PartDefinition.Fields ) { @@ -24,9 +37,59 @@ namespace Orchard.Indexing.Handlers { continue; } - var fieldName = field.Name; - var value = part.Fields.Where(f => f.Name == fieldName).First().Storage.Get(null); - context.DocumentIndex.Add(String.Format("{0}-{1}", infosetPart.TypeDefinition.Name.ToLower(), fieldName.ToLower()), value).RemoveTags().Analyze(); + // get all drivers for the current field type + // the driver will describe what values of the field should be indexed + var drivers = _contentFieldDrivers.Where(x => x.GetFieldInfo().Any(fi => fi.FieldTypeName == field.FieldDefinition.Name)).ToList(); + + ContentPart localPart = part; + ContentPartFieldDefinition localField = field; + var membersContext = new DescribeMembersContext( + (storageName, storageType, displayName, description) => + { + var fieldStorage = _fieldStorageProvider.BindStorage(localPart, localField); + + // fieldStorage.Get(storageName) + var getter = typeof(IFieldStorage).GetMethod("Get").MakeGenericMethod(storageType); + var fieldValue = getter.Invoke(fieldStorage, new[] { storageName }); + var indexName = String.Format("{0}-{1}", infosetPart.TypeDefinition.Name.ToLower(), field.Name.ToLower()); + + TypeCode typeCode = Type.GetTypeCode(storageType); + switch (typeCode) + { + case TypeCode.Empty: + case TypeCode.Object: + case TypeCode.DBNull: + case TypeCode.String: + case TypeCode.Char: + context.DocumentIndex.Add(indexName, fieldValue.ToString()).RemoveTags().Analyze(); + break; + case TypeCode.Boolean: + context.DocumentIndex.Add(indexName, Convert.ToBoolean(fieldValue)); + break; + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + context.DocumentIndex.Add(indexName, Convert.ToInt32(fieldValue)); + break; + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + context.DocumentIndex.Add(indexName, Convert.ToDouble(fieldValue)); + break; + case TypeCode.DateTime: + context.DocumentIndex.Add(indexName, Convert.ToDateTime(fieldValue)); + break; + } + + }); + + foreach (var driver in drivers) { + driver.Describe(membersContext); + } } } });