public override void Map(ByteSlice row, MapOutput output) { if (null == TableName) { InitFields(); } // Operate on values! ByteSlice key; bool keep = null == filter || filter.TestRow(row); if (DeleteFromFilter) { keep = !keep; } if (keep) { if (KeyOn != null) { orderbuf.Clear(); for (int iob = 0; iob < KeyOn.Count; iob++) { GetKeyPart gkp = KeyOn[iob]; gkp(row, orderbuf); } #if DEBUG string KeyOnStringValue = "<not evaluated yet>"; if (0 != ((orderbuf.Count - 1) % 2)) { KeyOnStringValue = "<not a string>"; } else { //KeyOnStringValue = System.Text.Encoding.Unicode.GetString(ByteSlice.Prepare(orderbuf, 1, orderbuf.Count - 1).ToBytes()); { System.Text.Encoding ue = new System.Text.UnicodeEncoding(false, false, true); // throwOnInvalidBytes=true try { KeyOnStringValue = ue.GetString(ByteSlice.Prepare(orderbuf, 1, orderbuf.Count - 1).ToBytes()); } catch { KeyOnStringValue = "<not a string>"; } } } #endif while (orderbuf.Count < DSpace_KeyLength) { orderbuf.Add(0); } key = ByteSlice.Prepare(orderbuf); } else // Use default key. { orderbuf.Clear(); Entry.ToBytesAppend(defkey, orderbuf); key = ByteSlice.Prepare(orderbuf); defkey = unchecked (defkey + DSpace_ProcessCount); } if (null != Updates) { updatebuf.Clear(); row.AppendTo(updatebuf); for (int ui = 0; ui < Updates.Count; ui++) { UpdateField uf = Updates[ui]; DbColumn ci = cols[uf.FieldIndex]; for (int i = 0; i < ci.Type.Size; i++) { updatebuf[ci.RowOffset + i] = uf.NewValue[i]; } } row = ByteSlice.Prepare(updatebuf); } } else { if (null == Updates) { if (null != ftools) { ftools.ResetBuffers(); } return; } if (KeyOn != null) { key = row; #if DEBUG throw new Exception("DEBUG: (!keep) && (KeyOn != null)"); #endif } else { // Use default key. orderbuf.Clear(); Entry.ToBytesAppend(defkey, orderbuf); key = ByteSlice.Prepare(orderbuf); defkey = unchecked (defkey + DSpace_ProcessCount); } } // If WhatFunctions, might need all input fields, so keep them here and filter out unwanted stuff in reduce. if (null != Whats && !WhatFunctions) { newfieldsbuf.Clear(); for (int iww = 0; iww < Whats.Count; iww++) { int wi = Whats[iww]; if (-1 == wi) { DbTypeID ltype; if (null == ftools) { ftools = new DbFunctionTools(); } List <byte> lbuf = ftools.AllocBuffer(); ByteSlice cval = Types.LiteralToValueBuffer(awhat[iww], out ltype, lbuf); int Size = cval.Length; #if DEBUG if (Size != OutputColumnSizes[iww]) { throw new Exception("DEBUG: " + awhat[iww] + ": (Size{" + Size + "} != OutputColumnSizes[iww]{" + OutputColumnSizes[iww] + "})"); } #endif cval.AppendTo(newfieldsbuf); } else { DbColumn ci = cols[wi]; int StartOffset = ci.RowOffset; int Size = ci.Type.Size; #if DEBUG if (Size != OutputColumnSizes[iww]) { throw new Exception("DEBUG: (Size != OutputColumnSizes[iww])"); } #endif ByteSlice cval = ByteSlice.Prepare(row, StartOffset, Size); cval.AppendTo(newfieldsbuf); } } row = ByteSlice.Prepare(newfieldsbuf); } output.Add(key, row); if (null != ftools) { ftools.ResetBuffers(); } }