Пример #1
0
        // Calculate an offset from the row and mode, returning the ordinal of some other row
        // This is required to be within the same group (no key break)
        public int Offset(DataRow row, int index, OffsetModes mode)
        {
            if (index < 0)
            {
                return(-1);
            }
            var key   = BuildKey(row, row.Order);
            var xofk  = _slist.IndexOfKey(key);
            var xofkx = (mode == OffsetModes.Lead) ? xofk + index
        : (mode == OffsetModes.Lag) ? xofk - index
        : (mode == OffsetModes.Absolute) ? _firstkeyx + index
        : index;

            if (!(xofkx >= _firstkeyx && xofkx < _slist.Count))
            {
                return(-1);
            }
            // Are these keys in the same group?
            if (IsKeyBreak(_slist.Keys[xofk], _slist.Keys[xofkx]))
            {
                return(-1);
            }
            //if (_groupseg >= 0) {
            //  var v1 = _slist.Keys[xofk][_groupseg] as TypedValue;
            //  var v2 = _slist.Keys[xofkx][_groupseg] as TypedValue;
            //  if (!v1.Equals(v2)) return -1;  // BUG: must compare all prior segs
            //}
            return(_slist.Values[xofkx]);
        }
Пример #2
0
        // Return value of attribute with tuple indexing
        // FIX: needs to get from this row to some other row via parent table to use as lookup
        public TypedValue ValueOffset(ExpressionEval expr, int index, OffsetModes mode)
        {
            var parent = Parent as DataTableLocal;

            Logger.Assert(parent != null);
            var ord   = OrderedIndex.Offset(this, index, mode);
            var value = (ord == -1) ? expr.ReturnType.DefaultValue()
        : expr.EvalOpen(parent.GetRow(ord));

            return(value);
        }