internal static Tuple <Type, string> Generate <TKey, TPayload>(RowToColumnStreamable <TKey, TPayload> stream) { Contract.Requires(stream != null); Contract.Ensures(Contract.Result <Tuple <Type, string> >() != null); Contract.Ensures(typeof(UnaryPipe <TKey, TPayload, TPayload>).GetTypeInfo().IsAssignableFrom(Contract.Result <Tuple <Type, string> >().Item1)); var keyType = typeof(TKey); var payloadType = typeof(TPayload); var generatedClassName = string.Format(CultureInfo.InvariantCulture, "RowToColumnUnaryPipeGeneratedFrom_{0}_{1}_{2}", keyType.GetValidIdentifier(), payloadType.GetValidIdentifier(), RowToColumnSequenceNumber++); var template = new RowToColumnTemplate(generatedClassName, keyType, payloadType); var expandedCode = template.TransformText(); var assemblyReferences = Transformer.AssemblyReferencesNeededFor(keyType, payloadType); assemblyReferences.Add(typeof(IStreamable <,>).GetTypeInfo().Assembly); assemblyReferences.Add(Transformer.GeneratedStreamMessageAssembly <TKey, TPayload>()); assemblyReferences.Add(Transformer.GeneratedMemoryPoolAssembly <TKey, TPayload>()); generatedClassName = generatedClassName.AddNumberOfNecessaryGenericArguments(keyType, payloadType); var a = Transformer.CompileSourceCode(expandedCode, assemblyReferences, out string errorMessages); var t = a.GetType(generatedClassName); return(Tuple.Create(t.InstantiateAsNecessary(typeof(TKey), typeof(TPayload)), errorMessages)); }
private UnaryPipe <TKey, TPayload, TPayload> GetPipe(IStreamObserver <TKey, TPayload> observer) { var lookupKey = CacheKey.Create(); var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => RowToColumnTemplate.Generate(this)); Func <PlanNode, IQueryObject, PlanNode> planNode = ((PlanNode p, IQueryObject o) => new RowToColumnPlanNode(p, o, typeof(TKey), typeof(TPayload))); var instance = Activator.CreateInstance(generatedPipeType.Item1, this, observer, planNode); var returnValue = (UnaryPipe <TKey, TPayload, TPayload>)instance; return(returnValue); }