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 lookupKey = CacheKey.Create(KeySelector.ToString()); var comparer = (Properties.KeyEqualityComparer as CompoundGroupKeyEqualityComparer <TOuterKey, TInnerKey>).innerComparer.GetGetHashCodeExpr(); var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => GroupTemplate.Generate <TOuterKey, TSource, TInnerKey>(comparer, KeySelector, true)); errorMessages = generatedPipeType.Item2; return(generatedPipeType.Item1 != null); }
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); } // 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(KeySelector.ToString()); var comparer = Properties.KeyEqualityComparer.GetGetHashCodeExpr(); var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => GroupTemplate.Generate <TOuterKey, TSource, TInnerKey>(comparer, KeySelector, false)); errorMessages = generatedPipeType.Item2; return(generatedPipeType.Item1 != null); }
private IStreamObserver <TOuterKey, TSource> GetPipe(IStreamObserver <CompoundGroupKey <TOuterKey, TInnerKey>, TSource> observer) { var lookupKey = CacheKey.Create(KeySelector.ToString()); var comparer = (Properties.KeyEqualityComparer as CompoundGroupKeyEqualityComparer <TOuterKey, TInnerKey>).innerComparer.GetGetHashCodeExpr(); var generatedPipeType = cachedPipes.GetOrAdd(lookupKey, key => GroupTemplate.Generate <TOuterKey, TSource, TInnerKey>(comparer, KeySelector, true)); Func <PlanNode, IQueryObject, PlanNode> planNode = ((PlanNode p, IQueryObject o) => new GroupPlanNode( p, o, typeof(TOuterKey), typeof(CompoundGroupKey <TOuterKey, TInnerKey>), typeof(TSource), KeySelector, int.MinValue, 1, false, true, generatedPipeType.Item2)); var instance = Activator.CreateInstance(generatedPipeType.Item1, this, observer, comparer, KeySelector, planNode); var returnValue = (IStreamObserver <TOuterKey, TSource>)instance; return(returnValue); }