public static string GetRoutingUrl(RoutingDefinition routingDefinition) { var parameters = new ParameterCollection(); if (routingDefinition != null && routingDefinition.ParentId != null) { parameters.Add("parent", routingDefinition.ParentId.ToString()); } if (routingDefinition != null && routingDefinition.RoutingId != null) { parameters.Add("routing", routingDefinition.RoutingId.ToString()); } return parameters.ToString(); }
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(); } }
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 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 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()); }
public EntityContextInfo() { RoutingDefinition = new RoutingDefinition(); }
public void CreateNewIndexAndMappingForNestedChildInTwoStepsWithRouting() { const string index = "newindextestmappingtwostep"; IElasticsearchMappingResolver elasticsearchMappingResolver; var mappingTestsParent = SetupIndexMappingTests(index, out elasticsearchMappingResolver); var routing = new RoutingDefinition {RoutingId = "coolrouting"}; var config = new ElasticsearchSerializerConfiguration(elasticsearchMappingResolver,true,false,true); using (var context = new ElasticsearchContext(ConnectionString, config)) { context.AllowDeleteForIndex = true; context.TraceProvider = new ConsoleTraceProvider(); context.IndexCreate(index); Thread.Sleep(1500); Assert.IsTrue(context.IndexExists<MappingTestsParent>()); context.IndexCreateTypeMapping<MappingTestsParent>(new MappingDefinition { Index = index, RoutingDefinition = routing }); Thread.Sleep(1500); context.AddUpdateDocument(mappingTestsParent, mappingTestsParent.MappingTestsParentId, routing); context.SaveChanges(); Thread.Sleep(1500); var doc = context.GetDocument<MappingTestsParent>(mappingTestsParent.MappingTestsParentId, routing); Thread.Sleep(1500); Assert.IsNotNull(doc); context.DeleteIndexType<MappingTestsParent>(); Thread.Sleep(1500); Assert.IsFalse(context.IndexTypeExists<MappingTestsParent>()); if (context.IndexExists<MappingTestsParent>()) { context.DeleteIndex<MappingTestsParent>(); } } }