Ejemplo n.º 1
0
        private bool CanGenerateColumnar()
        {
            var typeOfTOuterKey = typeof(TOuterKey);
            var typeOfTSource   = typeof(TSource);
            var typeOfTInnerKey = typeof(TInnerKey);

            if (!typeOfTSource.CanRepresentAsColumnar())
            {
                return(false);
            }
            if (typeOfTOuterKey.GetPartitionType() != null)
            {
                return(false);
            }
            if (typeOfTInnerKey.GetPartitionType() != null)
            {
                return(false);
            }

            var    keyEqComparer = Properties.KeyEqualityComparer;
            string inlinedHashCodeComputation;

            if (keyEqComparer is CompoundGroupKeyEqualityComparer <TOuterKey, TInnerKey> comparer)
            {
                var y = comparer.innerComparer.GetGetHashCodeExpr();
                inlinedHashCodeComputation = y.Inline("key");
            }
            else
            {
                inlinedHashCodeComputation = keyEqComparer.GetGetHashCodeExpr().Inline("key");
            }

            var lookupKey         = CacheKey.Create(inlinedHashCodeComputation, powerOf2);
            var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => ShuffleTemplate.Generate <TOuterKey, TSource, TInnerKey>(null, inlinedHashCodeComputation, false, this.powerOf2));

            errorMessages = generatedPipeType.Item2;
            return(generatedPipeType.Item1 != null);
        }
Ejemplo n.º 2
0
        private IStreamObserverAndSameKeyGroupedStreamObservable <TOuterKey, TSource, TOuterKey> GetPipe(IStreamObserver <TOuterKey, TSource> observer, int totalBranchesL2, int shuffleId)
        {
            var    keyEqComparer = Properties.KeyEqualityComparer;
            string inlinedHashCodeComputation;

            if (keyEqComparer is CompoundGroupKeyEqualityComparer <TOuterKey, TInnerKey> comparer)
            {
                var y = comparer.innerComparer.GetGetHashCodeExpr();
                inlinedHashCodeComputation = y.Inline("key");
            }
            else
            {
                inlinedHashCodeComputation = keyEqComparer.GetGetHashCodeExpr().Inline("key");
            }

            var lookupKey         = CacheKey.Create(inlinedHashCodeComputation, powerOf2);
            var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => ShuffleTemplate.Generate <TOuterKey, TSource, TInnerKey>(null, inlinedHashCodeComputation, false, this.powerOf2));

            Func <PlanNode, IQueryObject, PlanNode> planNode = ((PlanNode p, IQueryObject o) => new GroupPlanNode(
                                                                    p,
                                                                    o,
                                                                    typeof(TOuterKey),
                                                                    typeof(CompoundGroupKey <TOuterKey, TInnerKey>),
                                                                    typeof(TSource),
                                                                    null,
                                                                    this.shuffleId,
                                                                    this.totalBranchesL2,
                                                                    true,
                                                                    true,
                                                                    generatedPipeType.Item2));

            var instance    = Activator.CreateInstance(generatedPipeType.Item1, this, observer, totalBranchesL2, shuffleId, planNode);
            var returnValue = (IStreamObserverAndSameKeyGroupedStreamObservable <TOuterKey, TSource, TOuterKey>)instance;

            return(returnValue);
        }