Пример #1
0
        public void Publishing(PublishContentContext context, FieldIndexPart fieldIndexPart)
        {
            foreach (var part in fieldIndexPart.ContentItem.Parts)
            {
                foreach (var field in part.PartDefinition.Fields)
                {
                    // 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<T>(storageName)
                        var getter     = typeof(IFieldStorage).GetMethod("Get").MakeGenericMethod(storageType);
                        var fieldValue = getter.Invoke(fieldStorage, new[] { storageName });

                        _fieldIndexService.Set(fieldIndexPart,
                                               localPart.PartDefinition.Name,
                                               localField.Name,
                                               storageName, fieldValue, storageType);
                    });

                    foreach (var driver in drivers)
                    {
                        driver.Describe(membersContext);
                    }
                }
            }
        }
        public void BoundStorageIsNotNull()
        {
            var part    = CreateContentItemPart();
            var storage = _provider.BindStorage(part, part.PartDefinition.Fields.Single());

            Assert.That(storage, Is.Not.Null);
        }
        public override void Init()
        {
            base.Init();

            _fieldIndexService = _container.Resolve <IFieldIndexService>();
            _contentManager    = _container.Resolve <IContentManager>();
            _provider          = _container.Resolve <IFieldStorageProvider>();
            _events            = _container.Resolve <IEnumerable <IFieldStorageEvents> >();

            _part = CreateContentItemPart();
            var partFieldDefinition = _part.PartDefinition.Fields.Single();
            var storage             = _provider.BindStorage(_part, partFieldDefinition);

            _storage = new FieldStorageEventStorage(storage, partFieldDefinition, _part, _events);
        }
        public InfosetFieldIndexingHandler(
            IEnumerable<IContentFieldDriver> contentFieldDrivers,
            IFieldStorageProvider fieldStorageProvider) {
            
            _contentFieldDrivers = contentFieldDrivers;
            _fieldStorageProvider = fieldStorageProvider;

            OnIndexing<InfosetPart>(
                (context, cp) => {
                    var infosetPart = context.ContentItem.As<InfosetPart>();
                    if (infosetPart == null) {
                        return;
                    }


                    // part fields
                    foreach ( var part in infosetPart.ContentItem.Parts ) {
                        foreach ( var field in part.PartDefinition.Fields ) {
                            if (!field.Settings.GetModel<FieldIndexing>().Included) {
                                continue;
                            }

                            // 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<T>(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);
                            }
                        }
                    }
                });
        }
        public InfosetFieldIndexingHandler(
            IEnumerable <IContentFieldDriver> contentFieldDrivers,
            IFieldStorageProvider fieldStorageProvider)
        {
            _contentFieldDrivers  = contentFieldDrivers;
            _fieldStorageProvider = fieldStorageProvider;

            OnIndexing <InfosetPart>(
                (context, cp) => {
                var infosetPart = context.ContentItem.As <InfosetPart>();
                if (infosetPart == null)
                {
                    return;
                }


                // part fields
                foreach (var part in infosetPart.ContentItem.Parts)
                {
                    foreach (var field in part.PartDefinition.Fields)
                    {
                        if (!field.Settings.GetModel <FieldIndexing>().Included)
                        {
                            continue;
                        }

                        // 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<T>(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);
                        }
                    }
                }
            });
        }
        public InfosetFieldIndexingHandler(
            IEnumerable<IContentFieldDriver> contentFieldDrivers,
            IFieldStorageProvider fieldStorageProvider) {
            
            _contentFieldDrivers = contentFieldDrivers;
            _fieldStorageProvider = fieldStorageProvider;

            OnIndexing<InfosetPart>(
                (context, cp) => {
                    var infosetPart = context.ContentItem.As<InfosetPart>();
                    if (infosetPart == null) {
                        return;
                    }

                    // part fields
                    foreach ( var part in infosetPart.ContentItem.Parts ) {
                        foreach ( var field in part.PartDefinition.Fields ) {
                            if (!field.Settings.GetModel<FieldIndexing>().Included) {
                                continue;
                            }

                            // 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 fieldStorage = _fieldStorageProvider.BindStorage(localPart, localField);
                            var indexName = infosetPart.TypeDefinition.Name.ToLower() + "-" + field.Name.ToLower();

                            var membersContext = new DescribeMembersContext(fieldStorage, values => {

                                foreach (var value in values) {

                                    if (value == null) {
                                        continue;
                                    }

                                    var t = value.GetType();

                                    // the T is nullable, convert using underlying type
                                    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
                                        t = Nullable.GetUnderlyingType(t);
                                    }
                                    
                                    var typeCode = Type.GetTypeCode(t);

                                    switch (typeCode) {
                                        case TypeCode.Empty:
                                        case TypeCode.Object:
                                        case TypeCode.DBNull:
                                        case TypeCode.String:
                                        case TypeCode.Char:
                                            context.DocumentIndex.Add(indexName, Convert.ToString(value)).RemoveTags().Analyze();
                                            break;
                                        case TypeCode.Boolean:
                                            context.DocumentIndex.Add(indexName, Convert.ToBoolean(value));
                                            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(value));
                                            break;
                                        case TypeCode.Single:
                                        case TypeCode.Double:
                                        case TypeCode.Decimal:
                                            context.DocumentIndex.Add(indexName, Convert.ToDouble(value));
                                            break;
                                        case TypeCode.DateTime:
                                            context.DocumentIndex.Add(indexName, Convert.ToDateTime(value));
                                            break;
                                    }
                                }
                            });

                            foreach (var driver in drivers) {
                                driver.Describe(membersContext);
                            }
                        }
                    }
                });
        }
        public InfosetFieldIndexingHandler(
            IEnumerable <IContentFieldDriver> contentFieldDrivers,
            IFieldStorageProvider fieldStorageProvider)
        {
            _contentFieldDrivers  = contentFieldDrivers;
            _fieldStorageProvider = fieldStorageProvider;

            OnIndexing <InfosetPart>(
                (context, cp) => {
                var infosetPart = context.ContentItem.As <InfosetPart>();
                if (infosetPart == null)
                {
                    return;
                }

                // part fields
                foreach (var part in infosetPart.ContentItem.Parts)
                {
                    foreach (var field in part.PartDefinition.Fields)
                    {
                        if (!field.Settings.GetModel <FieldIndexing>().Included)
                        {
                            continue;
                        }

                        // 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 fieldStorage = _fieldStorageProvider.BindStorage(localPart, localField);
                        var indexName    = infosetPart.TypeDefinition.Name.ToLower() + "-" + field.Name.ToLower();

                        var membersContext = new DescribeMembersContext(fieldStorage, values => {
                            foreach (var value in values)
                            {
                                if (value == null)
                                {
                                    continue;
                                }

                                var t = value.GetType();

                                // the T is nullable, convert using underlying type
                                if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable <>))
                                {
                                    t = Nullable.GetUnderlyingType(t);
                                }

                                var typeCode = Type.GetTypeCode(t);

                                switch (typeCode)
                                {
                                case TypeCode.Empty:
                                case TypeCode.Object:
                                case TypeCode.DBNull:
                                case TypeCode.String:
                                case TypeCode.Char:
                                    context.DocumentIndex.Add(indexName, Convert.ToString(value)).RemoveTags().Analyze();
                                    break;

                                case TypeCode.Boolean:
                                    context.DocumentIndex.Add(indexName, Convert.ToBoolean(value));
                                    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(value));
                                    break;

                                case TypeCode.Single:
                                case TypeCode.Double:
                                case TypeCode.Decimal:
                                    context.DocumentIndex.Add(indexName, Convert.ToDouble(value));
                                    break;

                                case TypeCode.DateTime:
                                    context.DocumentIndex.Add(indexName, Convert.ToDateTime(value));
                                    break;
                                }
                            }
                        });

                        foreach (var driver in drivers)
                        {
                            driver.Describe(membersContext);
                        }
                    }
                }
            });
        }