예제 #1
0
		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());
        }
예제 #6
0
		public EntityContextInfo()
		{
			RoutingDefinition = new RoutingDefinition();
		}
예제 #7
0
        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>();
                }
            }
        }