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); }
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); }