private Type determineBaseType(CompiledSourceType sourceType)
        {
            switch (sourceType)
            {
            case CompiledSourceType.Cloneable:
                return(typeof(ClonedCompiledQuery <,>).MakeGenericType(_plan.OutputType, _plan.QueryType));

            case CompiledSourceType.Complex:
                return(typeof(ComplexCompiledQuery <,>).MakeGenericType(_plan.OutputType, _plan.QueryType));

            case CompiledSourceType.Stateless:
                return(typeof(StatelessCompiledQuery <,>).MakeGenericType(_plan.OutputType, _plan.QueryType));
            }

            throw new ArgumentOutOfRangeException();
        }
        private GeneratedType buildHandlerType(GeneratedAssembly assembly,
                                               CompiledSourceType handlerType, HardCodedParameters hardcoded)
        {
            var queryTypeName = _plan.QueryType.Name + "CompiledQuery";
            var baseType      = determineBaseType(handlerType);
            var type          = assembly.AddType(queryTypeName, baseType);


            configureCommandMethod(type, hardcoded);

            if (handlerType == CompiledSourceType.Complex)
            {
                buildHandlerMethod(type);
            }

            return(type);
        }
Exemplo n.º 3
0
        private GeneratedType buildSourceType(GeneratedAssembly assembly, CompiledSourceType handlerType,
                                              GeneratedType compiledHandlerType)
        {
            var sourceBaseType = typeof(CompiledQuerySource <,>).MakeGenericType(_plan.OutputType, _plan.QueryType);
            var sourceName     = _plan.QueryType.Name + "CompiledQuerySource";
            var sourceType     = assembly.AddType(sourceName, sourceBaseType);

            var hardcoded = new InjectedField(typeof(HardCodedParameters), "hardcoded");

            sourceType.AllInjectedFields.Add(hardcoded);

            var buildHandler = sourceType.MethodFor("BuildHandler");

            switch (handlerType)
            {
            case CompiledSourceType.Cloneable:
                var innerField = new InjectedField(typeof(IMaybeStatefulHandler));
                sourceType.AllInjectedFields.Add(innerField);

                var statistics = _plan.StatisticsMember == null ? "null" : $"query.{_plan.StatisticsMember.Name}";
                buildHandler.Frames.Code(
                    $"return new Marten.Generated.{compiledHandlerType.TypeName}({innerField.Usage}, query, {statistics}, _hardcoded);");
                break;

            case CompiledSourceType.Stateless:
                var inner = new InjectedField(typeof(IQueryHandler <>).MakeGenericType(_plan.OutputType));
                sourceType.AllInjectedFields.Add(inner);

                buildHandler.Frames.Code(
                    $"return new Marten.Generated.{compiledHandlerType.TypeName}({inner.Usage}, query, _hardcoded);");
                break;

            case CompiledSourceType.Complex:
                var innerField2 = new InjectedField(typeof(IMaybeStatefulHandler));
                sourceType.AllInjectedFields.Add(innerField2);

                buildHandler.Frames.Code(
                    $"return new Marten.Generated.{compiledHandlerType.TypeName}({innerField2.Usage}, query, _hardcoded);");
                break;
            }

            return(sourceType);
        }