Example #1
0
        private bool CanGenerateColumnar()
        {
            var typeOfTOuterKey = typeof(TOuterKey);
            var typeOfTInnerKey = typeof(TInnerKey);
            var typeOfTResult   = typeof(TResult);

            if (!typeOfTResult.CanRepresentAsColumnar())
            {
                return(false);
            }
            if (typeOfTOuterKey.GetPartitionType() != null)
            {
                return(false);
            }
            if (typeOfTInnerKey.GetPartitionType() != null)
            {
                return(false);
            }
            // For now, restrict the inner key to be anything other than an anonymous type since those can't be ungrouped without using reflection.
            if (typeOfTInnerKey.IsAnonymousType())
            {
                return(false);
            }

            var lookupKey = CacheKey.Create(ResultSelector.ExpressionToCSharp());

            var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => UngroupTemplate.Generate <TOuterKey, TInnerKey, TInnerResult, TResult>(ResultSelector));

            errorMessages = generatedPipeType.Item2;
            return(generatedPipeType.Item1 != null);
        }
Example #2
0
        private IStreamObserver <CompoundGroupKey <TOuterKey, TInnerKey>, TInnerResult> GetPipe(IStreamObserver <TOuterKey, TResult> observer)
        {
            var lookupKey = CacheKey.Create(ResultSelector.ExpressionToCSharp());

            var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => UngroupTemplate.Generate <TOuterKey, TInnerKey, TInnerResult, TResult>(ResultSelector));
            Func <PlanNode, IQueryObject, PlanNode> planNode = ((PlanNode p, IQueryObject o) => new UngroupPlanNode(
                                                                    p,
                                                                    o,
                                                                    typeof(CompoundGroupKey <TOuterKey, TInnerKey>),
                                                                    typeof(TOuterKey),
                                                                    typeof(TInnerResult),
                                                                    typeof(TResult),
                                                                    ResultSelector,
                                                                    true,
                                                                    generatedPipeType.Item2));

            var instance    = Activator.CreateInstance(generatedPipeType.Item1, this, observer, planNode);
            var returnValue = (IStreamObserver <CompoundGroupKey <TOuterKey, TInnerKey>, TInnerResult>)instance;

            return(returnValue);
        }