/// <summary>
		/// Here you can do any type of entity mapping
		/// </summary>
		public override void MapEntityValues(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, bool beginMappingTree = false, bool createPropertyMappings = false)
		{
			var propertyInfo = entityInfo.Document.GetType().GetProperties();
			foreach (var prop in propertyInfo)
			{
				MapValue(prop.Name, prop.GetValue(entityInfo.Document), elasticsearchCrudJsonWriter.JsonWriter);
			}
		}
コード例 #2
0
 /// <summary>
 /// Only required if you have some special mapping or want to remove some properties or use attributes..
 /// </summary>
 /// <param name="entity"></param>
 public override void MapEntityValues(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, bool beginMappingTree = false, bool createPropertyMappings = false)
 {
     Skill skillEntity = entityInfo.Document as Skill;
     MapValue("id", skillEntity.Id, elasticsearchCrudJsonWriter.JsonWriter);
     MapValue("name", skillEntity.Name, elasticsearchCrudJsonWriter.JsonWriter);
     MapValue("description", skillEntity.Description, elasticsearchCrudJsonWriter.JsonWriter);
     MapValue("created", skillEntity.Created.UtcDateTime, elasticsearchCrudJsonWriter.JsonWriter);
     MapValue("updated", skillEntity.Updated.UtcDateTime, elasticsearchCrudJsonWriter.JsonWriter);
 }
コード例 #3
0
        private void AddUpdateEntity(EntityContextInfo entityInfo)
        {
            var elasticSearchMapping = _elasticsearchSerializerConfiguration.ElasticsearchMappingResolver.GetElasticSearchMapping(entityInfo.EntityType);
            elasticSearchMapping.TraceProvider = _traceProvider;
            elasticSearchMapping.SaveChildObjectsAsWellAsParent = _elasticsearchSerializerConfiguration.SaveChildObjectsAsWellAsParent;
            elasticSearchMapping.ProcessChildDocumentsAsSeparateChildIndex = _elasticsearchSerializerConfiguration.ProcessChildDocumentsAsSeparateChildIndex;

            CreateBulkContentForParentDocument(entityInfo, elasticSearchMapping);

            if (_elasticsearchSerializerConfiguration.ProcessChildDocumentsAsSeparateChildIndex)
            {
                if (elasticSearchMapping.ChildIndexEntities.Count > 0)
                {
                    // Only save the top level items now
                    elasticSearchMapping.SaveChildObjectsAsWellAsParent = false;
                    foreach (var item in elasticSearchMapping.ChildIndexEntities)
                    {
                        CreateBulkContentForChildDocument(entityInfo, elasticSearchMapping, item);
                    }
                }
            }
            elasticSearchMapping.ChildIndexEntities.Clear();
        }
コード例 #4
0
        private void MapIEnumerableEntitiesForMapping(ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter,
            EntityContextInfo parentEntityInfo, PropertyInfo prop, bool createPropertyMappings)
        {
            object item;
            if (prop.PropertyType.GenericTypeArguments.Length == 0)
            {
                item = Activator.CreateInstance(prop.PropertyType.GetElementType());
            }
            else
            {
                item = Activator.CreateInstance(prop.PropertyType.GenericTypeArguments[0]);
            }

            var typeofArrayItem = item.GetType();
            if (typeofArrayItem.IsClass && typeofArrayItem.FullName != "System.String" &&
                typeofArrayItem.FullName != "System.Decimal")
            {
                // collection of Objects
                elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

                if (Attribute.IsDefined(prop, typeof(ElasticsearchNestedAttribute)))
                {
                    elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName("type");
                    elasticsearchCrudJsonWriter.JsonWriter.WriteValue("nested");

                    object[] attrs = prop.GetCustomAttributes(typeof(ElasticsearchNestedAttribute), true);

                    if ((attrs[0] as ElasticsearchNestedAttribute) != null)
                    {
                        (attrs[0] as ElasticsearchNestedAttribute).WriteJson(elasticsearchCrudJsonWriter);
                    }
                }

                // "properties": {
                elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName("properties");
                elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

                // Do class mapping for nested type
                var routingDefinition = new RoutingDefinition
                {
                    ParentId = parentEntityInfo.Id,
                    RoutingId = parentEntityInfo.RoutingDefinition.RoutingId
                };
                var child = new EntityContextInfo
                {
                    Document = item,
                    RoutingDefinition = routingDefinition,
                    EntityType = item.GetType(),
                    DeleteDocument = parentEntityInfo.DeleteDocument
                };
                MapEntityValues(child, elasticsearchCrudJsonWriter, false, createPropertyMappings);
                elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
                elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            }
            else
            {
                // {"type": "ienumerable"}
                // collection of simple types
                elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
                elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName("type");
                elasticsearchCrudJsonWriter.JsonWriter.WriteValue(GetElasticsearchType(item.GetType()));
                elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            }
        }
コード例 #5
0
        private void ProcessArrayOrCollection(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, PropertyInfo prop, bool createPropertyMappings)
        {
            TraceProvider.Trace(TraceEventType.Verbose, "ElasticsearchMapping: IsPropertyACollection: {0}", prop.Name.ToLower());

            if (createPropertyMappings && prop.GetValue(entityInfo.Document) == null)
            {
                if (prop.PropertyType.IsArray)
                {
                    prop.SetValue(entityInfo.Document, Array.CreateInstance(prop.PropertyType.GetElementType(), 0));
                }
                else
                {
                    prop.SetValue(entityInfo.Document, Activator.CreateInstance(prop.PropertyType));
                }
            }

            if (prop.GetValue(entityInfo.Document) != null && SaveChildObjectsAsWellAsParent)
            {
                if (ProcessChildDocumentsAsSeparateChildIndex)
                {
                    ProcessArrayOrCollectionAsChildDocument(entityInfo, elasticsearchCrudJsonWriter, prop, createPropertyMappings);
                }
                else
                {
                    ProcessArrayOrCollectionAsNestedObject(entityInfo, elasticsearchCrudJsonWriter, prop, createPropertyMappings);
                }
            }
        }
コード例 #6
0
        private void MapIEnumerableEntities(ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, IEnumerable ienumerable, EntityContextInfo parentEntityInfo, bool createPropertyMappings)
        {
            string json = null;
            bool isSimpleArrayOrCollection = true;
            bool doProccessingIfTheIEnumerableHasAtLeastOneItem = false;
            if (ienumerable != null)
            {
                var sbCollection = new StringBuilder();
                sbCollection.Append("[");
                foreach (var item in ienumerable)
                {
                    doProccessingIfTheIEnumerableHasAtLeastOneItem = true;

                    var childElasticsearchCrudJsonWriter = new ElasticsearchCrudJsonWriter(sbCollection);
                    elasticsearchCrudJsonWriter.ElasticsearchCrudJsonWriterChildItem = childElasticsearchCrudJsonWriter;

                    var typeofArrayItem = item.GetType();
                    if (typeofArrayItem.IsClass && typeofArrayItem.FullName != "System.String" &&
                        typeofArrayItem.FullName != "System.Decimal")
                    {
                        isSimpleArrayOrCollection = false;
                        // collection of Objects
                        childElasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
                        // Do class mapping for nested type
                        var routingDefinition = new RoutingDefinition { ParentId = parentEntityInfo.Id, RoutingId = parentEntityInfo.RoutingDefinition.RoutingId };
                        var child = new EntityContextInfo { Document = item, RoutingDefinition = routingDefinition, EntityType = item.GetType(), DeleteDocument = parentEntityInfo.DeleteDocument };
                        MapEntityValues(child, childElasticsearchCrudJsonWriter, false, createPropertyMappings);
                        childElasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();

                        // Add as separate document later
                    }
                    else
                    {
                        // collection of simple types, serialize all items in one go and break from the loop
                        json = JsonConvert.SerializeObject(ienumerable);

                        break;
                    }
                    sbCollection.Append(",");
                }

                if (isSimpleArrayOrCollection && doProccessingIfTheIEnumerableHasAtLeastOneItem)
                {
                    elasticsearchCrudJsonWriter.JsonWriter.WriteRawValue(json);
                }
                else
                {
                    if (doProccessingIfTheIEnumerableHasAtLeastOneItem)

                    {
                        sbCollection.Remove(sbCollection.Length - 1, 1);
                    }

                    sbCollection.Append("]");
                    elasticsearchCrudJsonWriter.JsonWriter.WriteRawValue(sbCollection.ToString());
                }
            }
            else
            {
                elasticsearchCrudJsonWriter.JsonWriter.WriteRawValue("");
            }
        }
コード例 #7
0
        private void MapIEnumerableEntitiesForChildIndexes(ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, IEnumerable ienumerable, EntityContextInfo parentEntityInfo,PropertyInfo prop, bool createPropertyMappings)
        {
            if (createPropertyMappings)
            {
                object item;
                if (prop.PropertyType.GenericTypeArguments.Length == 0)
                {
                    item = Activator.CreateInstance(prop.PropertyType.GetElementType());
                }
                else
                {
                    item = Activator.CreateInstance(prop.PropertyType.GenericTypeArguments[0]);
                }

                CreateChildEntityForDocumentIndex(parentEntityInfo, elasticsearchCrudJsonWriter, item, true);
            }
            else
            {
                if (ienumerable != null)
                {
                    foreach (var item in ienumerable)
                    {
                        CreateChildEntityForDocumentIndex(parentEntityInfo, elasticsearchCrudJsonWriter, item, false);
                    }
                }
            }
        }
コード例 #8
0
 private void BeginNewEntityToDocumentMapping(EntityContextInfo entityInfo, bool beginMappingTree)
 {
     if (beginMappingTree)
     {
         SerializedTypes = new HashSet<string>();
         TraceProvider.Trace(TraceEventType.Verbose, "ElasticsearchMapping: Serialize BEGIN for Type: {0}", entityInfo.Document.GetType());
     }
 }
コード例 #9
0
        private void CreateChildEntityForDocumentIndex(EntityContextInfo parentEntityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, object entity, bool createPropertyMappings)
        {
            var propertyInfo = entity.GetType().GetProperties();
            foreach (var property in propertyInfo)
            {
                if (Attribute.IsDefined(property, typeof(KeyAttribute)) || Attribute.IsDefined(property, typeof(ElasticsearchIdAttribute)))
                {
                    var obj = property.GetValue(entity);

                    if (obj == null && createPropertyMappings)
                    {
                        obj = "0";
                    }

                    RoutingDefinition routingDefinition;
                    if (parentEntityInfo.RoutingDefinition.RoutingId != null)
                    {
                        // child of a child or lower...
                        routingDefinition = new RoutingDefinition { ParentId = parentEntityInfo.Id, RoutingId = parentEntityInfo.RoutingDefinition.RoutingId };
                    }
                    else
                    {
                        // This is a direct child
                        routingDefinition = new RoutingDefinition { ParentId = parentEntityInfo.Id, RoutingId = parentEntityInfo.Id };
                    }

                    var child = new EntityContextInfo
                    {
                        Document = entity,
                        RoutingDefinition = routingDefinition,
                        EntityType = GetEntityDocumentType(entity.GetType()),
                        ParentEntityType = GetEntityDocumentType(parentEntityInfo.EntityType),
                        DeleteDocument = parentEntityInfo.DeleteDocument,
                        Id = obj.ToString()
                    };
                    ChildIndexEntities.Add(child);
                    MapEntityValues(child, elasticsearchCrudJsonWriter, false, createPropertyMappings);

                    return;
                }
            }

            throw new ElasticsearchCrudException("No Key found for child object: " + parentEntityInfo.Document.GetType());
        }
コード例 #10
0
 private void ProcessSingleObjectAsChildDocument(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, PropertyInfo prop, bool createPropertyMappings)
 {
     var entity = prop.GetValue(entityInfo.Document);
     CreateChildEntityForDocumentIndex(entityInfo, elasticsearchCrudJsonWriter, entity, createPropertyMappings);
 }
コード例 #11
0
		public void CreatePropertyMappingForTopDocument(EntityContextInfo entityInfo, MappingDefinition mappingDefinition)
		{
			var elasticSearchMapping = _elasticsearchSerializerConfiguration.ElasticsearchMappingResolver.GetElasticSearchMapping(entityInfo.EntityType);
			elasticSearchMapping.TraceProvider = _traceProvider;
			elasticSearchMapping.SaveChildObjectsAsWellAsParent = _elasticsearchSerializerConfiguration.SaveChildObjectsAsWellAsParent;
			elasticSearchMapping.ProcessChildDocumentsAsSeparateChildIndex = _elasticsearchSerializerConfiguration.ProcessChildDocumentsAsSeparateChildIndex;

			CreatePropertyMappingForEntityForParentDocument(entityInfo, elasticSearchMapping, mappingDefinition);

			if (_elasticsearchSerializerConfiguration.ProcessChildDocumentsAsSeparateChildIndex)
			{
				if (elasticSearchMapping.ChildIndexEntities.Count > 0)
				{
					// Only save the top level items now
					elasticSearchMapping.SaveChildObjectsAsWellAsParent = false;
					foreach (var item in elasticSearchMapping.ChildIndexEntities)
					{
						CreatePropertyMappingForChildDocument(entityInfo, elasticSearchMapping, item, mappingDefinition);
					}
				}
			}

			elasticSearchMapping.ChildIndexEntities.Clear();
		}
コード例 #12
0
		/// <summary>
		/// Create a new index for the parent document
		/// </summary>
		/// <param name="entityInfo"></param>
		/// <param name="elasticsearchMapping"></param>
		/// <param name="mappingDefinition">mapping definitions for the index type</param>
		private void CreatePropertyMappingForEntityForParentDocument(EntityContextInfo entityInfo, ElasticsearchMapping elasticsearchMapping, MappingDefinition mappingDefinition)
		{
			var itemType = elasticsearchMapping.GetDocumentType(entityInfo.EntityType);
			if (_processedItems.Contains("_mapping" +itemType))
			{
				return;
			}
			_processedItems.Add("_mapping" +itemType);

			var elasticsearchCrudJsonWriter = new ElasticsearchCrudJsonWriter();
			elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
			elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName(itemType);
			elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

			mappingDefinition.Source.WriteJson(elasticsearchCrudJsonWriter);
			mappingDefinition.All.WriteJson(elasticsearchCrudJsonWriter);
			mappingDefinition.Analyzer.WriteJson(elasticsearchCrudJsonWriter);

			if (entityInfo.RoutingDefinition.RoutingId != null && _elasticsearchSerializerConfiguration.UserDefinedRouting)
			{
				CreateForceRoutingMappingForDocument(elasticsearchCrudJsonWriter);
			}

			if (entityInfo.RoutingDefinition.ParentId != null)
			{
				CreateParentMappingForDocument(
				elasticsearchCrudJsonWriter,
				elasticsearchMapping.GetDocumentType(entityInfo.ParentEntityType));
			}

			ProccessPropertyMappingsWithoutTypeName(elasticsearchCrudJsonWriter, entityInfo, elasticsearchMapping);

			elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
			elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();

			CreateMappingCommandForTypeWithExistingIndex(elasticsearchCrudJsonWriter.GetJsonString(), mappingDefinition.Index, itemType);
		
		}
コード例 #13
0
        private void ProcessArrayOrCollectionAsNestedObject(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, PropertyInfo prop, bool createPropertyMappings)
        {
            elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName(prop.Name.ToLower());
            TraceProvider.Trace(TraceEventType.Verbose, "ElasticsearchMapping: BEGIN ARRAY or COLLECTION: {0} {1}", prop.Name.ToLower(), elasticsearchCrudJsonWriter.JsonWriter.Path);
            var typeOfEntity = prop.GetValue(entityInfo.Document).GetType().GetGenericArguments();
            if (typeOfEntity.Length > 0)
            {
                var child = GetDocumentType(typeOfEntity[0]);
                var parent = GetDocumentType(entityInfo.EntityType);

                if (!SerializedTypes.Contains(child + parent))
                {
                    SerializedTypes.Add(parent + child);
                    TraceProvider.Trace(TraceEventType.Verbose,
                        "ElasticsearchMapping: SerializedTypes type ok, BEGIN ARRAY or COLLECTION: {0}", typeOfEntity[0]);
                    TraceProvider.Trace(TraceEventType.Verbose, "ElasticsearchMapping: SerializedTypes new Type added: {0}",
                        GetDocumentType(typeOfEntity[0]));
                    MapCollectionOrArray(prop, entityInfo, elasticsearchCrudJsonWriter, createPropertyMappings);
                }
                else
                {
                    elasticsearchCrudJsonWriter.JsonWriter.WriteRawValue("null");
                }
            }
            else
            {
                TraceProvider.Trace(TraceEventType.Verbose, "ElasticsearchMapping: BEGIN ARRAY or COLLECTION NOT A GENERIC: {0}",
                    prop.Name.ToLower());
                // Not a generic
                MapCollectionOrArray(prop, entityInfo, elasticsearchCrudJsonWriter, createPropertyMappings);
            }
        }
コード例 #14
0
        private void DeleteEntity(EntityContextInfo entityInfo)
        {
            var elasticSearchMapping = _elasticsearchSerializerConfiguration.ElasticsearchMappingResolver.GetElasticSearchMapping(entityInfo.EntityType);
            elasticSearchMapping.TraceProvider = _traceProvider;
            elasticSearchMapping.SaveChildObjectsAsWellAsParent = _elasticsearchSerializerConfiguration.SaveChildObjectsAsWellAsParent;
            elasticSearchMapping.ProcessChildDocumentsAsSeparateChildIndex = _elasticsearchSerializerConfiguration.ProcessChildDocumentsAsSeparateChildIndex;
            elasticSearchMapping.MapToLowerCase = _elasticsearchSerializerConfiguration.MapToLowerCase;
            _elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

            _elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName("delete");

            // Write the batch "index" operation header
            _elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
            WriteValue("_index", elasticSearchMapping.GetIndexForType(entityInfo.EntityType));
            WriteValue("_type", elasticSearchMapping.GetDocumentType(entityInfo.EntityType));
            WriteValue("_id", entityInfo.Id);
            if (entityInfo.RoutingDefinition.ParentId != null && _elasticsearchSerializerConfiguration.ProcessChildDocumentsAsSeparateChildIndex)
            {
                // It's a document which belongs to a parent
                WriteValue("_parent", entityInfo.RoutingDefinition.ParentId);
            }
            if (entityInfo.RoutingDefinition.RoutingId != null && _elasticsearchSerializerConfiguration.ProcessChildDocumentsAsSeparateChildIndex &&
                _elasticsearchSerializerConfiguration.UserDefinedRouting)
            {
                // It's a document which has a specific route
                WriteValue("_routing", entityInfo.RoutingDefinition.RoutingId);
            }
            _elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WriteRaw("\n");
        }
コード例 #15
0
        private void CreateBulkContentForParentDocument(EntityContextInfo entityInfo, ElasticsearchMapping elasticsearchMapping)
        {
            _elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName("index");
            // Write the batch "index" operation header
            _elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
            WriteValue("_index", elasticsearchMapping.GetIndexForType(entityInfo.EntityType));
            WriteValue("_type", elasticsearchMapping.GetDocumentType(entityInfo.EntityType));
            WriteValue("_id", entityInfo.Id);
            if (entityInfo.RoutingDefinition.ParentId != null && _elasticsearchSerializerConfiguration.ProcessChildDocumentsAsSeparateChildIndex)
            {
                // It's a document which belongs to a parent
                WriteValue("_parent", entityInfo.RoutingDefinition.ParentId);
            }
            if (entityInfo.RoutingDefinition.RoutingId != null &&
                _elasticsearchSerializerConfiguration.UserDefinedRouting)
            {
                // It's a document which has a specific route
                WriteValue("_routing", entityInfo.RoutingDefinition.RoutingId);
            }
            _elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WriteRaw("\n"); //ES requires this \n separator
            _elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

            elasticsearchMapping.MapEntityValues(entityInfo, _elasticsearchCrudJsonWriter, true);

            _elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WriteRaw("\n");
        }
コード例 #16
0
        private void CreateBulkContentForChildDocument(EntityContextInfo entityInfo, ElasticsearchMapping elasticsearchMapping,
            EntityContextInfo item)
        {
            var childMapping =
                _elasticsearchSerializerConfiguration.ElasticsearchMappingResolver.GetElasticSearchMapping(item.EntityType);

            _elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName("index");
            // Write the batch "index" operation header
            _elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

            // Always write to the same index
            WriteValue("_index", childMapping.GetIndexForType(entityInfo.EntityType));
            WriteValue("_type", childMapping.GetDocumentType(item.EntityType));
            WriteValue("_id", item.Id);
            WriteValue("_parent", item.RoutingDefinition.ParentId);
            if (item.RoutingDefinition.RoutingId != null && _elasticsearchSerializerConfiguration.UserDefinedRouting)
            {
                // It's a document which has a specific route
                WriteValue("_routing", item.RoutingDefinition.RoutingId);
            }
            _elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WriteRaw("\n"); //ES requires this \n separator
            _elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

            childMapping.MapEntityValues(item, _elasticsearchCrudJsonWriter, true);

            _elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            _elasticsearchCrudJsonWriter.JsonWriter.WriteRaw("\n");
        }
コード例 #17
0
		private void ProccessPropertyMappingsWithoutTypeName(ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, EntityContextInfo entityInfo, ElasticsearchMapping elasticsearchMapping)
		{
			//"properties": {
			elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName("properties");
			elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
			elasticsearchMapping.MapEntityValues(entityInfo, elasticsearchCrudJsonWriter, true, CreatePropertyMappings);
			elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
		}
コード例 #18
0
		/// <summary>
		/// Create a new mapping for the child type in the parent document index
		/// </summary>
		/// <param name="entityInfo"></param>
		/// <param name="elasticsearchMapping"></param>
		/// <param name="item"></param>
		/// <param name="mappingDefinition">definition for the type mappings</param>
		private void CreatePropertyMappingForChildDocument(EntityContextInfo entityInfo, ElasticsearchMapping elasticsearchMapping, EntityContextInfo item, MappingDefinition mappingDefinition)
		{
			var childMapping =
				_elasticsearchSerializerConfiguration.ElasticsearchMappingResolver.GetElasticSearchMapping(item.EntityType);

			var parentMapping =
				_elasticsearchSerializerConfiguration.ElasticsearchMappingResolver.GetElasticSearchMapping(item.ParentEntityType);

			var childType = childMapping.GetDocumentType(item.EntityType);
			var parentType = parentMapping.GetDocumentType(item.ParentEntityType);

			var processedId = childType + "_" + parentType;
			if (_processedItems.Contains(childType))
			{
				var test = CommandTypes.Find(t => t.StartsWith(childType));
				if (test != processedId)
				{
					throw new ElasticsearchCrudException("InitMappings: Not supported, child documents can only have one parent");
				}
				return;
			}
			_processedItems.Add(childType);
			CommandTypes.Add(processedId);

			var elasticsearchCrudJsonWriter = new ElasticsearchCrudJsonWriter();
			elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

			elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName(childType);
			elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

			mappingDefinition.Source.WriteJson(elasticsearchCrudJsonWriter);
			mappingDefinition.All.WriteJson(elasticsearchCrudJsonWriter);
			mappingDefinition.Analyzer.WriteJson(elasticsearchCrudJsonWriter);

			CreateParentMappingForDocument(
				elasticsearchCrudJsonWriter,
				elasticsearchMapping.GetDocumentType(item.ParentEntityType));

			if (item.RoutingDefinition.RoutingId != null && _elasticsearchSerializerConfiguration.UserDefinedRouting)
			{
				CreateForceRoutingMappingForDocument(elasticsearchCrudJsonWriter);
			}

			ProccessPropertyMappingsWithoutTypeName(elasticsearchCrudJsonWriter, item, childMapping);
			elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
			elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
			CreateMappingCommandForTypeWithExistingIndex(elasticsearchCrudJsonWriter.GetJsonString(), elasticsearchMapping.GetIndexForType(entityInfo.EntityType), childMapping.GetDocumentType(item.EntityType));
		}
コード例 #19
0
        private void ProcessSingleObject(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, PropertyInfo prop, bool createPropertyMappings)
        {
            TraceProvider.Trace(TraceEventType.Verbose, "ElasticsearchMapping: Property is an Object: {0}", prop.ToString());
            // This is a single object and not a reference to it's parent

            if (createPropertyMappings && prop.GetValue(entityInfo.Document) == null)
            {
                prop.SetValue(entityInfo.Document,Activator.CreateInstance(prop.PropertyType));
            }
            if (prop.GetValue(entityInfo.Document) != null  && SaveChildObjectsAsWellAsParent)
            {
                var child = GetDocumentType(prop.GetValue(entityInfo.Document).GetType());
                var parent = GetDocumentType(entityInfo.EntityType);
                if (!SerializedTypes.Contains(child + parent))
                {
                    SerializedTypes.Add(parent + child);
                    if (ProcessChildDocumentsAsSeparateChildIndex)
                    {
                        ProcessSingleObjectAsChildDocument(entityInfo, elasticsearchCrudJsonWriter, prop, createPropertyMappings);
                    }
                    else
                    {
                        ProcessSingleObjectAsNestedObject(entityInfo, elasticsearchCrudJsonWriter, prop, createPropertyMappings);
                    }
                }
            }
        }
コード例 #20
0
        /// <summary>
        /// Ovveride this if your default mapping needs to be changed.
        /// default type is lowercase for properties, indes pluralized and type to lower
        /// </summary>
        /// <param name="entityInfo">Information about the entity</param>
        /// <param name="elasticsearchCrudJsonWriter">Serializer with added tracing</param>
        /// <param name="beginMappingTree">begin new mapping tree</param>
        /// <param name="createPropertyMappings">This tells the serializer to create a Json property mapping from the entity and not the document itself</param>
        public virtual void MapEntityValues(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, bool beginMappingTree = false, bool createPropertyMappings = false)
        {
            try
            {
                BeginNewEntityToDocumentMapping(entityInfo, beginMappingTree);

                TraceProvider.Trace(TraceEventType.Verbose, "ElasticsearchMapping: SerializedTypes new Type added: {0}", GetDocumentType(entityInfo.Document.GetType()));
                var propertyInfo = entityInfo.Document.GetType().GetProperties();
                foreach (var prop in propertyInfo)
                {
                    if (!Attribute.IsDefined(prop, typeof (JsonIgnoreAttribute)))
                    {
                        if (Attribute.IsDefined(prop, typeof (ElasticsearchGeoTypeAttribute)))
                        {
                            var obj = prop.Name.ToLower();
                            // process GeoTypes
                            if (createPropertyMappings)
                            {
                                object[] attrs = prop.GetCustomAttributes(typeof (ElasticsearchCoreTypes), true);

                                if ((attrs[0] as ElasticsearchCoreTypes) != null)
                                {
                                    elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName(obj);
                                    elasticsearchCrudJsonWriter.JsonWriter.WriteRawValue((attrs[0] as ElasticsearchCoreTypes).JsonString());
                                }
                            }
                            else
                            {
                                var data = prop.GetValue(entityInfo.Document) as IGeoType;
                                elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName(obj);
                                data.WriteJson(elasticsearchCrudJsonWriter);
                                // Write data
                            }
                        }
                        else if (IsPropertyACollection(prop))
                        {
                            ProcessArrayOrCollection(entityInfo, elasticsearchCrudJsonWriter, prop, createPropertyMappings);
                        }
                        else
                        {
                            if (prop.PropertyType.IsClass && prop.PropertyType.FullName != "System.String" && prop.PropertyType.FullName != "System.Decimal")
                            {
                                ProcessSingleObject(entityInfo, elasticsearchCrudJsonWriter, prop, createPropertyMappings);
                            }
                            else
                            {
                                if (!ProcessChildDocumentsAsSeparateChildIndex || ProcessChildDocumentsAsSeparateChildIndex && beginMappingTree)
                                {
                                    TraceProvider.Trace(TraceEventType.Verbose, "ElasticsearchMapping: Property is a simple Type: {0}, {1}", prop.Name.ToLower(), prop.PropertyType.FullName);

                                    if (createPropertyMappings)
                                    {
                                        var obj = prop.Name.ToLower();
                                        if (Attribute.IsDefined(prop, typeof (ElasticsearchCoreTypes)))
                                        {
                                            object[] attrs = prop.GetCustomAttributes(typeof (ElasticsearchCoreTypes), true);

                                            if ((attrs[0] as ElasticsearchCoreTypes) != null)
                                            {
                                                elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName(obj);
                                                elasticsearchCrudJsonWriter.JsonWriter.WriteRawValue((attrs[0] as ElasticsearchCoreTypes).JsonString());
                                            }

                                        }
                                        else
                                        {
                                            // no elasticsearch property defined
                                            elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName(obj);
                                            if (prop.PropertyType.FullName == "System.DateTime" || prop.PropertyType.FullName == "System.DateTimeOffset")
                                            {
                                                elasticsearchCrudJsonWriter.JsonWriter.WriteRawValue("{ \"type\" : \"date\", \"format\": \"dateOptionalTime\"}");
                                            }
                                            else
                                            {
                                                elasticsearchCrudJsonWriter.JsonWriter.WriteRawValue("{ \"type\" : \"" + GetElasticsearchType(prop.PropertyType) + "\" }");
                                            }

                                        }
                                    }
                                    else
                                    {
                                        MapValue(prop.Name.ToLower(), prop.GetValue(entityInfo.Document), elasticsearchCrudJsonWriter.JsonWriter);
                                    }

                                }
                            }
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                TraceProvider.Trace(TraceEventType.Critical, ex, "ElasticsearchMapping: Property is a simple Type: {0}", elasticsearchCrudJsonWriter.GetJsonString());
                throw;
            }
        }
コード例 #21
0
        private void ProcessSingleObjectAsNestedObject(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, PropertyInfo prop, bool createPropertyMappings)
        {
            elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName(prop.Name.ToLower());
            elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();

            if (createPropertyMappings)
            {
                // "properties": {
                elasticsearchCrudJsonWriter.JsonWriter.WritePropertyName("properties");
                elasticsearchCrudJsonWriter.JsonWriter.WriteStartObject();
            }
            // Do class mapping for nested type
            var entity = prop.GetValue(entityInfo.Document);
            var routingDefinition = new RoutingDefinition {ParentId = entityInfo.Id};
            var child = new EntityContextInfo { Document = entity, RoutingDefinition = routingDefinition, EntityType = entity.GetType(), DeleteDocument = entityInfo.DeleteDocument };

            MapEntityValues(child, elasticsearchCrudJsonWriter, false, createPropertyMappings);
            elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();

            if (createPropertyMappings)
            {

                elasticsearchCrudJsonWriter.JsonWriter.WriteEndObject();
            }
        }
コード例 #22
0
        // Nested
        // "tags" : ["elasticsearch", "wow"], (string array or int array)
        // Nested
        //"lists" : [
        //    {
        //        "name" : "prog_list",
        //        "description" : "programming list"
        //    },
        protected virtual void MapCollectionOrArray(PropertyInfo prop, EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, bool createPropertyMappings)
        {
            Type type = prop.PropertyType;

            if (type.HasElementType)
            {
                // It is a collection
                var ienumerable = (Array)prop.GetValue(entityInfo.Document);
                if (ProcessChildDocumentsAsSeparateChildIndex)
                {
                    MapIEnumerableEntitiesForChildIndexes(elasticsearchCrudJsonWriter, ienumerable, entityInfo, prop, createPropertyMappings);
                }
                else
                {
                    if (createPropertyMappings)
                    {
                        MapIEnumerableEntitiesForMapping(elasticsearchCrudJsonWriter, entityInfo, prop,true);
                    }
                    else
                    {
                        MapIEnumerableEntities(elasticsearchCrudJsonWriter, ienumerable, entityInfo, false);
                    }

                }

            }
            else if (prop.PropertyType.IsGenericType)
            {
                // It is a collection
                var ienumerable = (IEnumerable)prop.GetValue(entityInfo.Document);

                if (ProcessChildDocumentsAsSeparateChildIndex)
                {
                    MapIEnumerableEntitiesForChildIndexes(elasticsearchCrudJsonWriter, ienumerable, entityInfo, prop, createPropertyMappings);
                }
                else
                {
                    if (createPropertyMappings)
                    {
                        MapIEnumerableEntitiesForMapping(elasticsearchCrudJsonWriter, entityInfo, prop, true);
                    }
                    else
                    {
                        MapIEnumerableEntities(elasticsearchCrudJsonWriter, ienumerable, entityInfo, false);
                    }
                }
            }
        }