Esempio 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 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);
        }
Esempio n. 2
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);
            }

            // 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);
        }
Esempio n. 3
0
        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);
        }