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); }
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); }