/// <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); } }
/// <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); }
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(); }
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(); } }
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); } } }
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(""); } }
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); } } } }
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()); } }
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()); }
private void ProcessSingleObjectAsChildDocument(EntityContextInfo entityInfo, ElasticsearchCrudJsonWriter elasticsearchCrudJsonWriter, PropertyInfo prop, bool createPropertyMappings) { var entity = prop.GetValue(entityInfo.Document); CreateChildEntityForDocumentIndex(entityInfo, elasticsearchCrudJsonWriter, entity, createPropertyMappings); }
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(); }
/// <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); }
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); } }
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"); }
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"); }
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"); }
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(); }
/// <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)); }
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); } } } }
/// <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; } }
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(); } }
// 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); } } } }