74 lines
2.8 KiB
C#
74 lines
2.8 KiB
C#
using BCG;
|
|
|
|
using MongoDB.Driver.Core.WireProtocol.Messages;
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
// the first arg is all the rows, the second arg is the index of the row that needs mapping, and
|
|
// the func returns the mapped row (ie mapped version of the index row)
|
|
using GlobalMap = System.Func<System.Collections.Generic.List<BCG.IBlueRow>, uint, BCG.IBlueRow>;
|
|
|
|
namespace bts {
|
|
// In GlobalMap, each row is mapped with the full view of all rows, ie the map functions for a row
|
|
// can use the state fo all rows.
|
|
public class GlobalMapStream : ViewStream {
|
|
private ViewStream _base_stream;
|
|
private readonly string _sort_col_name, _group_by_col;
|
|
private GlobalMap _map_func;
|
|
public GlobalMapStream(ViewStream base_stream, string sort_col_name, string group_by_col, GlobalMap map_func) {
|
|
_base_stream = base_stream;
|
|
_sort_col_name = sort_col_name;
|
|
_group_by_col = group_by_col;
|
|
_map_func = map_func;
|
|
}
|
|
|
|
public GlobalMapStream(ViewStream base_stream, string sort_col_name, GlobalMap map_func) :
|
|
this(base_stream, sort_col_name, null, map_func) {
|
|
}
|
|
|
|
protected override void myOnFirstSubscriber() {
|
|
_base_stream.onChange += _handle_stream_update;
|
|
}
|
|
|
|
protected override void myOnLastSubscriber() {
|
|
_base_stream.onChange -= _handle_stream_update;
|
|
}
|
|
|
|
void _handle_stream_update(object dp_obj) {
|
|
DataPacket dp = dp_obj as DataPacket;
|
|
IDictionary<int, List<IBlueRow>> groups = !String.IsNullOrEmpty(_group_by_col) ?
|
|
BlueDataUtility.group_together(dp.newRows, new string[] { _group_by_col })
|
|
:
|
|
new Dictionary<int, List<IBlueRow>>() { { 0, dp.newRows.to_list() } };
|
|
BlueTable out_table = null;
|
|
foreach (var kv in groups) {
|
|
List<IBlueRow> group_rows = kv.Value;
|
|
group_rows.Sort((r1, r2) => BlueDataUtility.compare_rows(r2, r1, _sort_col_name));
|
|
uint i = 0;
|
|
foreach (IBlueRow r in group_rows) {
|
|
IBlueRow nr = _map_func(group_rows, i++);
|
|
out_table = out_table ?? new BlueTable(nr.schema);
|
|
out_table.addRow(nr);
|
|
}
|
|
}
|
|
|
|
|
|
// List<IBlueRow> rows = dp.newRows.to_ienum().ToList();
|
|
// rows.Sort((r1, r2) => BlueDataUtility.compare_rows(r1, r2, _sort_col_name));
|
|
// uint i = 0;
|
|
|
|
// BlueTable out_table = null;
|
|
// foreach (IBlueRow r in rows) {
|
|
// IBlueRow nr = _map_func(rows, i++);
|
|
// out_table = out_table ?? new BlueTable(nr.schema);
|
|
// out_table.addRow(nr);
|
|
// }
|
|
DataPacket dp_out = BlueDataUtility.build_dp_inc(out_table, myLastValue as DataPacket);
|
|
myFireEvent(dp_out);
|
|
}
|
|
}
|
|
|
|
|
|
} |