/**
         * [[default-type-name]]
         * ==== Default type name
         * With Elasticsearch 6.x, you can only have a single type per index and in the long run types will be
         * phased out entirely.
         * The need to tag types is no longer necessary, so in many cases it makes sense to use a single fixed type,
         * like `doc`
         */
        [U] public void DefaultTypeName()
        {
            var settings = new ConnectionSettings().DefaultTypeName("doc");
            var resolver = new TypeNameResolver(settings);
            var type     = resolver.Resolve <Project>();

            type.Should().Be("doc");
        }
        [U] public void TypeNameFromDataContractAttribute()
        {
            var settings = new ConnectionSettings();
            var resolver = new TypeNameResolver(settings);
            var type     = resolver.Resolve <DataContractProject>();

            type.Should().Be("data_contract_project");
        }
        [U] public void TypeNameFromElasticsearchTypeAttribute()
        {
            var settings = new ConnectionSettings();
            var resolver = new TypeNameResolver(settings);
            var type     = resolver.Resolve <AttributedProject>();

            type.Should().Be("attributed_project");
        }
        /**
         * ==== TypeName default
         * Type names are resolved by lowercasing the type name
         */

        [U] public void DefaultTypeNameIsLowercase()
        {
            var settings = new ConnectionSettings();
            var resolver = new TypeNameResolver(settings);
            var index    = resolver.Resolve <Project>();

            index.Should().Be("project");
        }
        /**
         * With such a setting in place, all CLR types will resolve to `doc` as the type name to use in Elasticsearch.
         */

        /**
         * [[type-name-inferrer]]
         * ==== Override type name inferrer
         * You can provide a delegate to override the default type name inferrer for types
         */
        [U] public void OverridingDefaultTypeNameInferrer()
        {
            var settings = new ConnectionSettings()
                           .DefaultTypeNameInferrer(t => t.Name.ToLower() + "-suffix");
            var resolver = new TypeNameResolver(settings);
            var type     = resolver.Resolve <Project>();

            type.Should().Be("project-suffix");
        }
        /**
         * [[pluralize-type-names]]
         * ==== Pluralize type names
         * The default behaviour in older versions of NEST was to pluralize typenames
         *
         * You can still opt in to this old behaviour as followed:
         */
        [U] public void PluralizeTypeNames()
        {
            var settings = new ConnectionSettings()
                           .PluralizeTypeNames();
            var resolver = new TypeNameResolver(settings);
            var index    = resolver.Resolve <Project>();

            index.Should().Be("projects");
        }
        public static DocumentInfo <TEntity> Mapping <TEntity>(this IElasticClient client, Func <DocumentInfo <TEntity>, DocumentInfo <TEntity> > documentInfo) where TEntity : class
        {
            var doc = documentInfo(new DocumentInfo <TEntity>());

            if (string.IsNullOrEmpty(doc.Index))
            {
                doc.SetIndex(client.ConnectionSettings.DefaultIndex);
            }

            if (string.IsNullOrEmpty(doc.Type))
            {
                var resolver = new TypeNameResolver(client.ConnectionSettings);
                doc.SetType(resolver.Resolve <TEntity>());
            }

            MapTypeSearch.AddMap <TEntity>(doc);
            return(doc);
        }