// 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]); }
// 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); }