Exemplo n.º 1
0
        private UnaryPipe <TKey, TPayload, TPayload> GetPipe(IStreamObserver <TKey, TPayload> observer)
        {
            var lookupKey = CacheKey.Create(this.Properties.KeyEqualityComparer.GetEqualsExpr().ExpressionToCSharp(), this.Properties.PayloadEqualityComparer.GetEqualsExpr().ExpressionToCSharp());

            var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => EndEdgeFreeOutputTemplate.Generate(this));
            Func <PlanNode, IQueryObject, PlanNode> planNode = ((PlanNode p, IQueryObject o) => new EndEdgeFreeOutputPlanNode(p, o, typeof(TKey), typeof(TPayload), true, generatedPipeType.Item2));

            var instance    = Activator.CreateInstance(generatedPipeType.Item1, this, observer, planNode);
            var returnValue = (UnaryPipe <TKey, TPayload, TPayload>)instance;

            return(returnValue);
        }
Exemplo n.º 2
0
        protected override bool CanGenerateColumnar()
        {
            var typeOfTKey     = typeof(TKey);
            var typeOfTPayload = typeof(TPayload);

            if (typeOfTKey.GetPartitionType() != null)
            {
                return(false);
            }
            if (!typeOfTPayload.CanRepresentAsColumnar())
            {
                return(false);
            }

            var lookupKey = CacheKey.Create(this.Properties.KeyEqualityComparer.GetEqualsExpr().ExpressionToCSharp(), this.Properties.PayloadEqualityComparer.GetEqualsExpr().ExpressionToCSharp());

            var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => EndEdgeFreeOutputTemplate.Generate(this));

            this.errorMessages = generatedPipeType.Item2;
            return(generatedPipeType.Item1 != null);
        }
        /// <summary>
        /// Generate a batch class definition to be used as a EndEdgeFreeOutputStreamable pipe.
        /// Compile the definition, dynamically load the assembly containing it, and return the Type representing the
        /// union pipe class.
        /// </summary>
        /// <typeparam name="TKey">The key type for both sides.</typeparam>
        /// <typeparam name="TPayload">The payload type.</typeparam>
        /// <returns>
        /// A type that is defined to be a subtype of UnaryPipe&lt;<typeparamref name="TKey"/>,<typeparamref name="TPayload"/>, <typeparamref name="TPayload"/>&gt;.
        /// </returns>
        internal static Tuple <Type, string> Generate <TKey, TPayload>(
            EndEdgeFreeOutputStreamable <TKey, TPayload> stream)
        {
            Contract.Requires(stream != null);
            Contract.Ensures(Contract.Result <Tuple <Type, string> >() == null || typeof(UnaryPipe <TKey, TPayload, TPayload>).GetTypeInfo().IsAssignableFrom(Contract.Result <Tuple <Type, string> >().Item1));

            var template = new EndEdgeFreeOutputTemplate(
                $"GeneratedEndEdgeFreeOutput_{EndEdgeFreeOutputTemplateSequenceNumber++}",
                typeof(TKey), typeof(TPayload));

            template.ActiveEventType = typeof(TPayload).GetTypeInfo().IsValueType ? template.TPayload : "Active_Event";

            #region Key Equals
            var keyComparer = stream.Properties.KeyEqualityComparer.GetEqualsExpr();
            template.keyEquals =
                (left, right) =>
                keyComparer.Inline(left, right);
            #endregion

            #region Key Hash Function
            var keyHashFunction = stream.Properties.KeyEqualityComparer.GetGetHashCodeExpr();
            template.keyHashFunction = (e => keyHashFunction.Inline(e));
            #endregion

            #region Payload Equals
            var payloadComparer = stream.Properties.PayloadEqualityComparer.GetEqualsExpr();
            template.payloadEquals = (left, right) => payloadComparer.Inline(left, right);
            #endregion

            #region Payload Hash Function
            var payloadHashFunction = stream.Properties.PayloadEqualityComparer.GetGetHashCodeExpr();
            template.payloadHashFunction = (aa) => payloadHashFunction.Inline(aa);
            #endregion

            return(template.Generate <TKey, TPayload>(typeof(IStreamable <,>), typeof(FastDictionaryGenerator2)));
        }