예제 #1
0
        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));
        }
예제 #2
0
        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);
        }