Esempio n. 1
0
        public void CopyTo(PivotData toPivotData, Func <object[], IAggregator, object[]> mapKey, Func <IAggregator, IAggregator> mapAggr)
        {
            // remove all totals
            toPivotData.totalValues.Clear();

            IAggregator aggr;

            foreach (var entry in values)
            {
                var toKey = mapKey(entry.Key, entry.Value);
                if (toKey != null)
                {
                    if (!toPivotData.values.TryGetValue(toKey, out aggr))
                    {
                        aggr = toPivotData.aggregatorFactory.Create();
                        toPivotData.values[toKey] = aggr;
                    }
                    aggr.Merge(mapAggr(entry.Value));
                }
            }
            if (!toPivotData.lazyTotals)
            {
                toPivotData.BatchCalcTotals();
            }
        }
        PivotData GetGrandTotalPvtData(IPivotData basePvtData)
        {
            // this is grand-total
            var grandTotalPvtData = new PivotData(emptyStringArray, PvtData.AggregatorFactory);
            var grandTotalAggr    = grandTotalPvtData[emptyObjectArray];

            foreach (var entry in basePvtData)
            {
                grandTotalAggr.Merge(entry.Value);
            }
            return(grandTotalPvtData);
        }
            IPivotData GetBasePivotData(BitArrayMask findMask)
            {
                PivotData minPvtData = null;

                foreach (var cacheEntry in Cache)
                {
                    if (cacheEntry.Key.Match(findMask))
                    {
                        if (minPvtData == null || cacheEntry.Value.Count < minPvtData.Count)
                        {
                            minPvtData = cacheEntry.Value;
                        }
                    }
                }
                return(minPvtData ?? PvtDataWrapper.PvtData);
            }
            IPivotData GetBasePivotData(ulong findDimMask)
            {
                PivotData minPvtData = null;

                foreach (var cacheEntry in Cache)
                {
                    if ((cacheEntry.Key.mask & findDimMask) == findDimMask)
                    {
                        if (minPvtData == null || cacheEntry.Value.Count < minPvtData.Count)
                        {
                            minPvtData = cacheEntry.Value;
                        }
                    }
                }
                return(minPvtData ?? PvtDataWrapper.PvtData);
            }
Esempio n. 5
0
        public PivotData Slice(string[] dimensions, bool lazyTotals, Func <object[], IAggregator, bool> predicate)
        {
            var toPivotData = new PivotData(dimensions, AggregatorFactory, lazyTotals);
            int copyDimLen  = toPivotData.Dimensions.Length;
            var dimIndexes  = new int[copyDimLen];

            for (int i = 0; i < toPivotData.Dimensions.Length; i++)
            {
                var dimToCopyIdx = Array.IndexOf(Dimensions, toPivotData.Dimensions[i]);
                if (dimToCopyIdx < 0)
                {
                    throw new ArgumentException(String.Format("Dimension {0} does not exist", toPivotData.Dimensions[i]));
                }
                dimIndexes[i] = dimToCopyIdx;
            }

            int d;

            CopyTo(toPivotData,
                   (key, aggr) => {
                if (!predicate(key, aggr))
                {
                    return(null);
                }
                var valKeyDims = new object[copyDimLen];
                for (d = 0; d < copyDimLen; d++)
                {
                    valKeyDims[d] = key[dimIndexes[d]];
                }
                return(valKeyDims);
            },
                   (aggr) => {
                return(aggr);
            }
                   );
            return(toPivotData);
        }
Esempio n. 6
0
 public AllValuesCollection(PivotData pvtData)
 {
     PvtData = pvtData;
 }
Esempio n. 7
0
        /// <summary>
        /// Execute the query and return operation result as new <see cref="PivotData"/> instance.
        /// </summary>
        /// <param name="lazyTotals"></param>
        /// <returns>data cube that represents query results.</returns>
        public PivotData Execute(bool lazyTotals)
        {
            // compose aggregator handler
            var aggrFactory = PvtData.AggregatorFactory;
            Func <KeyValuePair <object[], IAggregator>, IAggregator> aggrHandler = (dp) => {
                // default handler that returns umodified measure
                return(dp.Value);
            };

            if (AggrSelectors.Count == 1)
            {
                aggrFactory = AggrSelectors[0].GetFactory(aggrFactory);
                aggrHandler = AggrSelectors[0].GetAggregator;
            }
            else if (AggrSelectors.Count > 1)
            {
                aggrFactory = new CompositeAggregatorFactory(
                    AggrSelectors.Select(s => s.GetFactory(aggrFactory)).ToArray()
                    );
                var resAggrHandlers = AggrSelectors.Select(s => s.GetAggregator).ToArray();
                var resAggrCnt      = AggrSelectors.Count;
                int i;
                aggrHandler = (dp) => {
                    var resAggregators = new IAggregator[resAggrCnt];
                    for (i = 0; i < resAggrCnt; i++)
                    {
                        resAggregators[i] = resAggrHandlers[i](dp);
                    }
                    return(new CompositeAggregator(resAggregators));
                };
            }

            // compose filter handler
            Func <KeyValuePair <object[], IAggregator>, bool> filterHandler = (entry) => { return(true); };

            if (FilterHandlers.Count > 0)
            {
                int i;
                var resFilterCnt      = FilterHandlers.Count;
                var resFilterHandlers = FilterHandlers.ToArray();
                filterHandler = (entry) => {
                    for (i = 0; i < resFilterCnt; i++)
                    {
                        if (!resFilterHandlers[i](entry))
                        {
                            return(false);
                        }
                    }
                    return(true);
                };
            }

            // compose default value key handler
            Func <KeyValuePair <object[], IAggregator>, object[]> valKeyHandler = (dp) => {
                // default handler for unmodified dimensions
                return(dp.Key);
            };
            var selectDims = PvtData.Dimensions;

            if (DimSelectors.Count > 0)
            {
                int copyDimLen        = DimSelectors.Count;
                var resDimKeyHandlers = DimSelectors.Select(s => s.GetDimensionKey).ToArray();
                int d;
                valKeyHandler = (dp) => {
                    var valKeyDims = new object[copyDimLen];
                    for (d = 0; d < copyDimLen; d++)
                    {
                        valKeyDims[d] = resDimKeyHandlers[d](dp.Key);
                    }
                    return(valKeyDims);
                };
                selectDims = DimSelectors.Select(ds => ds.Dimension).ToArray();
            }

            var toPivotData = new PivotData(selectDims, aggrFactory, lazyTotals);

            toPivotData.Merge(new FilterPivotData(selectDims, aggrFactory, PvtData,
                                                  filterHandler, valKeyHandler, aggrHandler
                                                  ));
            return(toPivotData);
        }