Ejemplo n.º 1
0
            public Cursor(IChannelProvider provider, IRowCursor input, SchemaImpl schema, Func <int, bool> predicate)
                : base(provider, input)
            {
                _schema        = schema;
                _active        = Utils.BuildArray(_schema.ColumnCount, predicate);
                _cachedGetters = new Delegate[_schema.ColumnCount];
                _colSizes      = new int[_schema.ColumnCount];

                int sizeColumnsLim = _schema.Mode == UngroupMode.First ? 1 : _schema.PivotColumnCount;

                _fixedSize = 0;
                var needed = new List <Func <int> >();

                for (int i = 0; i < sizeColumnsLim; i++)
                {
                    var info = _schema.GetPivotColumnInfo(i);
                    if (info.Size > 0)
                    {
                        if (_fixedSize == 0)
                        {
                            _fixedSize = info.Size;
                        }
                        else if (_schema.Mode == UngroupMode.Inner && _fixedSize > info.Size)
                        {
                            _fixedSize = info.Size;
                        }
                        else if (_schema.Mode == UngroupMode.Outer && _fixedSize < info.Size)
                        {
                            _fixedSize = info.Size;
                        }
                    }
                    else
                    {
                        // This will also create and cache a getter for the pivot column.
                        // That's why MakeSizeGetter is an instance method.
                        var rawItemType             = info.ItemType.RawType;
                        Func <int, Func <int> > del = MakeSizeGetter <int>;
                        var mi         = del.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(rawItemType);
                        var sizeGetter = (Func <int>)mi.Invoke(this, new object[] { info.Index });
                        needed.Add(sizeGetter);
                    }
                }

                _sizeGetters = needed.ToArray();
                Ch.Assert(_fixedSize > 0 || _sizeGetters.Length > 0);
            }