示例#1
0
        public PersonAccountViewModel(IReactiveTable personAccounts, int rowIndex)
        {
            _rowIndex       = rowIndex;
            _personAccounts = personAccounts;

            _personAccounts.ChangeNotifier.RegisterPropertyNotifiedConsumer(this, rowIndex);
        }
        public AccountViewModel(IReactiveTable accounts, int rowIndex)
        {
            _accounts = accounts;
            _rowIndex = rowIndex;

            _accounts.ChangeNotifier.RegisterPropertyNotifiedConsumer(this, _rowIndex);
        }
示例#3
0
 public void CloneColumns(IReactiveTable reactiveTable)
 {
     foreach (var column in reactiveTable.Columns)
     {
         AddColumn(column.Clone());
     }
 }
示例#4
0
        private bool PropagateColumnUpdates(TableUpdate update,
                                            int columnRowIndex,
                                            IReactiveTable table,
                                            Dictionary <int, HashSet <int> > columnRowsToJoinRows,
                                            JoinSide side)
        {
            HashSet <int>   joinRows;
            IReactiveColumn updateColumn;

            if (table.GetColumnByName(update.Column.ColumnId, out updateColumn) &&
                columnRowsToJoinRows.TryGetValue(columnRowIndex, out joinRows))
            {
                foreach (var joinRow in joinRows)
                {
                    var row = _rows[joinRow];
                    if (row.HasValue && row.Value.RowId.HasValue && !IsRowUnlinked(row.Value, side))
                    {
                        var colUpdate = new TableUpdate(TableUpdateAction.Update, joinRow, update.Column);
                        if (_updateObservers != null)
                        {
                            _updateObservers.OnNext(colUpdate);
                        }
                        return(true);
                    }
                }
            }
            return(false);
        }
            public BalanceGroup(IReactiveTable groups, int rowIndex)
            {
                _groups   = groups;
                _rowIndex = rowIndex;

                groups.ChangeNotifier.RegisterPropertyNotifiedConsumer(this, _rowIndex);
            }
示例#6
0
 private void AddBaseTableColumns(IReactiveTable table)
 {
     foreach (var column in table.Columns)
     {
         _columns.AddColumn(column);
     }
 }
示例#7
0
//        private readonly IDisposable _columnSubscription;

        public TableSynchroniser(IReactiveTable sourceTable, IWritableReactiveTable targetTable, IThreadMarshaller threadMarshaller)
        {
            _sourceTable      = sourceTable;
            _targetTable      = targetTable;
            _threadMarshaller = threadMarshaller;

            _subscription = _sourceTable.Subscribe(this);
        }
示例#8
0
 public static void SetupFeedTable(IReactiveTable feeds)
 {
     feeds.AddColumn(new ReactiveColumn <string>(BrokerColumns.CcyPairColumn));
     feeds.AddColumn(new ReactiveColumn <double>(BrokerColumns.BidColumn));
     feeds.AddColumn(new ReactiveColumn <double>(BrokerColumns.AskColumn));
     feeds.AddColumn(new ReactiveColumn <string>(BrokerColumns.MaturityColumn));
     feeds.AddColumn(new ReactiveColumn <string>(BrokerColumns.BrokerNameColumn));
 }
示例#9
0
        /// <summary>
        /// Filter the source table using the given predicate.
        /// </summary>
        /// <param name="sourceTable"></param>
        /// <param name="predicate"></param>
        public FilteredTable(IReactiveTable sourceTable, IReactivePredicate predicate)
        {
            _sourceTable = sourceTable;
            _predicate   = predicate;

            _token = _sourceTable.ReplayAndSubscribe(OnNext);

            _changeNotifier = new Lazy <PropertyChangedNotifier>(() => new PropertyChangedNotifier(this));
        }
示例#10
0
 public Sorter(IReactiveTable sourceTable, string sortColumnId, IComparer <T> comparer)
 {
     _sourceTable    = sourceTable;
     _comparer       = comparer;
     _sortColumnId   = sortColumnId;
     _keyComparer    = new KeyComparer <T>(_comparer);
     _keysToRows     = new List <KeyValuePair <T, int> >(sourceTable.RowCount);
     _rowIdsToValues = new Dictionary <int, T>(sourceTable.RowCount);
 }
示例#11
0
        public static IDisposable ReplayAndSubscribe(this IReactiveTable table, Action <TableUpdate> onNext)
        {
            var rowObserver  = new Subject <TableUpdate>();
            var subscription = rowObserver.Subscribe(onNext);

            table.ReplayRows(rowObserver);
            table.Subscribe(rowObserver);
            return(subscription);
        }
示例#12
0
        public BatchedTableSynchroniser(ReactiveTable sourceTable, IWritableReactiveTable targetTable,
                                        IThreadMarshaller threadMarshaller, TimeSpan delay)
        {
            _sourceTable      = sourceTable;
            _targetTable      = targetTable;
            _threadMarshaller = threadMarshaller;
            _timer            = new Timer(SynchroniseChanges, null, delay, delay);

            _subscription = _sourceTable.Subscribe(this);
        }
示例#13
0
 public static void SetAndTestValueNotPresent <T>(IWritableReactiveTable setTable,
                                                  IReactiveTable getTable,
                                                  int setRowId,
                                                  int getRowId,
                                                  T value,
                                                  string columnId)
 {
     setTable.SetValue(columnId, setRowId, value);
     Assert.AreEqual(default(T), getTable.GetValue <T>(columnId, getRowId));
 }
示例#14
0
        /// <summary>
        /// Create a new table joining two existing tables
        /// </summary>
        /// <param name="leftTable"></param>
        /// <param name="rightTable"></param>
        /// <param name="joiner"></param>
        public JoinedTable(IReactiveTable leftTable, IReactiveTable rightTable, IReactiveTableJoiner joiner)
        {
            _leftTable  = leftTable;
            _rightTable = rightTable;
            _joiner     = joiner;

            _joiner.SetObserver(_calculatedColumnSubject);
            _changeNotifier = new Lazy <PropertyChangedNotifier>(() => new PropertyChangedNotifier(this));
            AddBaseTableColumns(leftTable);
            AddBaseTableColumns(rightTable);
            // TODO: need to process all existing values in the tables
        }
示例#15
0
        public AccountsViewModel(IReactiveTable accounts)
        {
            _accounts = accounts;

            Accounts      = new ObservableCollection <AccountViewModel>();
            _subscription = _accounts.ReplayAndSubscribe(
                update => { if (update.IsRowUpdate())
                            {
                                Accounts.Add(new AccountViewModel(_accounts, update.RowIndex));
                            }
                });
        }
        public PersonAccountsViewModel(IReactiveTable personAccounts, IWritableReactiveTable accounts)
        {
            _personAccounts = personAccounts;

            PersonAccounts = new IndexedObservableCollection <PersonAccountViewModel, int>(h => h.RowIndex);
            _subscription  = _personAccounts.ReplayAndSubscribe(OnNext);

            Change = new DelegateCommand(
                () => accounts.SetValue(AccountColumns.AccountBalance, CurrentRowIndex, (decimal)DateTime.Now.Millisecond));

            _personAccounts.ChangeNotifier.RegisterPropertyNotifiedConsumer(this, CurrentRowIndex);
        }
示例#17
0
        private void SetupFeedServer(IReactiveTable feedsAndClients, ReactiveBatchedPassThroughTable feedsTable, IReactiveTableProcessor <IReactiveTable> tableEncoder)
        {
//            feedsAndClients.Subscribe(update => Console.WriteLine(update.ToString()));

            var server = new ReactiveTableTcpServer <IReactiveTable>(() => tableEncoder,
                                                                     new IPEndPoint(IPAddress.Loopback, (int)ServerPorts.BrokerFeed),
                                                                     _finished,
                                                                     s => FilterFeedsForClientTable(s, feedsAndClients),
                                                                     () => UpdateClients(feedsTable));

            // Start the server in a new thread
            Task.Run(() => server.Start(GetEncoderState()));
        }
        public RowUpdateAggregator(IReactiveTable leftTable, IReactiveTable rightTable, IObserver <TableUpdate> observer)
        {
            _leftTable  = leftTable;
            _rightTable = rightTable;
            _observer   = observer;

            var leftTableRowUpdateObserver = new TableRowUpdateObserver(this, _leftTable);

            _leftToken = _leftTable.Where(TableUpdate.IsRowUpdate).Subscribe(leftTableRowUpdateObserver);
            var rightTableRowUpdateObserver = new TableRowUpdateObserver(this, _rightTable);

            _rightToken = _rightTable.Where(TableUpdate.IsRowUpdate).Subscribe(rightTableRowUpdateObserver);
        }
示例#19
0
        /// <summary>
        /// Create a new sorted table
        /// </summary>
        /// <param name="sourceTable"></param>
        public SortedTable(IReactiveTable sourceTable)
        {
            _sourceTable = sourceTable;
            _sorter      = new DefaultSorter(sourceTable);

            _subject = new Subject <TableUpdate>();
            _rowPosUpdatedSubject = new Subject <bool>();
            RowPositionsUpdated   = _rowPosUpdatedSubject;

            _token = _sourceTable.ReplayAndSubscribe(OnNext);

            _changeNotifier = new Lazy <PropertyChangedNotifier>(() => new PropertyChangedNotifier(this));
        }
        private IReactiveTable SetupAccountPeopleTable(IReactiveTable accounts, IReactiveTable people)
        {
            var joinedTable = people.Join(accounts, new Join <int>(
                                              people, PersonColumns.IdColumn,
                                              accounts, AccountColumns.PersonId));

            joinedTable.AddColumn(new ReactiveCalculatedColumn2 <string, string, decimal>(
                                      PersonAccountColumns.AccountDetails,
                                      (IReactiveColumn <string>)people.GetColumnByName(PersonColumns.NameColumn),
                                      (IReactiveColumn <decimal>)accounts.GetColumnByName(AccountColumns.AccountBalance),
                                      (name, balance) => $"{name} has {balance} in their account."));

            return(joinedTable);
        }
示例#21
0
        public FullJoinedTablesTest()
        {
            _table = new ReactiveTable();
            _table.AddColumn(new ReactiveColumn <int>("IdCol"));
            _table.AddColumn(new ReactiveColumn <string>("TextCol"));
            _table.AddColumn(new ReactiveColumn <decimal>("ValueCol"));

            _table2 = new ReactiveTable();
            _table2.AddColumn(new ReactiveColumn <int>("IdCol2"));
            _table2.AddColumn(new ReactiveColumn <string>("TextCol2"));
            _table2.AddColumn(new ReactiveColumn <decimal>("ValueCol2"));

            _joinedTable = _table.Join(_table2, new Join <int>(_table, "IdCol", _table2, "IdCol2"));
        }
        private void OnCompleted(IReactiveTable table)
        {
            if (table == _leftTable)
            {
                _leftCompleted = true;
            }
            if (table == _rightTable)
            {
                _rightCompleted = true;
            }

            if (_leftCompleted && _rightCompleted)
            {
                _observer.OnCompleted();
            }
        }
        protected void SetTable(IReactiveTable table)
        {
            _table         = table;
            _writableTable = _table as IWritableReactiveTable;
            _token         = table.ReplayAndSubscribe(OnNext);
            var sortedTable = table as ISortedTable;

            if (sortedTable != null)
            {
                RowPositionsUpdated = sortedTable.RowPositionsUpdated;
            }

            // TODO: This should look up a dictionary of column id's to friendly column names
            ColumnNames = table.Columns.Select(c => c.ColumnId.Substring(c.ColumnId.LastIndexOf('.') + 1)).ToList();

            _columnIds = table.Columns.Select(c => c.ColumnId).ToList();
        }
 private void OnNext(IReactiveTable table, TableUpdate update)
 {
     if (table == _leftTable)
     {
         _leftUpdateCount++;
         if (_leftUpdateCount > _rightUpdateCount)
         {
             _observer.OnNext(update);
         }
     }
     if (table == _rightTable)
     {
         _rightUpdateCount++;
         if (_rightUpdateCount > _leftUpdateCount)
         {
             _observer.OnNext(update);
         }
     }
 }
        public AccountBalanceDataService(Dispatcher dispatcher, int maxEntries = int.MaxValue)
        {
            _maxEntries = maxEntries;
            People      = new ReactiveTable <PersonViewModel>();
            var basePersonColumns = new List <IReactiveColumn>
            {
                new ReactiveColumn <int>(PersonColumns.IdColumn),
                new ReactiveColumn <string>(PersonColumns.NameColumn)
            };

            var peopleWire = SetupPersonTable((IWritableReactiveTable)People, basePersonColumns, dispatcher);

            var baseAccountColumns = new List <IReactiveColumn>
            {
                new ReactiveColumn <int>(AccountColumns.IdColumn),
                new ReactiveColumn <int>(AccountColumns.PersonId),
                new ReactiveColumn <decimal>(AccountColumns.AccountBalance)
            };

            Accounts = new ReactiveTable();
            var accountsWire = SetupAccountTable((IWritableReactiveTable)Accounts, baseAccountColumns, dispatcher);

            AccountPeople = SetupAccountPeopleTable(Accounts, People);

            AddTestPeople(peopleWire);
            AddTestAccounts(accountsWire);

            var personDataThread = new Thread(StreamPersonData);

            personDataThread.IsBackground = true;
            personDataThread.Start(new StreamingState {
                Table = peopleWire, Running = _running, MaxEntries = _maxEntries
            });

            var accountDataThread = new Thread(StreamAccountData);

            accountDataThread.IsBackground = true;
            accountDataThread.Start(new StreamingState {
                Table = accountsWire, Running = _running, MaxEntries = _maxEntries
            });

            Thread.Sleep(GuiDisplayDelay);
        }
示例#26
0
        private void SetupFeedSubscription(IReactiveTable currenciesTable, IReactiveTableProcessor <IReactiveTable> encoder)
        {
            var endPoint           = new IPEndPoint(IPAddress.Loopback, (int)ServerPorts.BrokerFeedClients);
            var selectedCurrencies = new FilteredTable(
                currenciesTable,
                new DelegatePredicate1 <bool>(BrokerTableDefinition.BrokerClientColumns.ClientSide.Selected, selected => selected));

            var client = new ReactiveTableTcpClient <IReactiveTable>(encoder,
                                                                     selectedCurrencies,
                                                                     GetEncoderState(),
                                                                     endPoint);

            _ccyPairSubscriptionClient = client;
            try
            {
                client.Start();
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
        }
示例#27
0
        /// <summary>
        /// Create a new join.
        /// </summary>
        /// <param name="leftTable"></param>
        /// <param name="leftIdColumn">The column from the left table to join on</param>
        /// <param name="rightTable"></param>
        /// <param name="rightIdColumn">The column from the right table to join on</param>
        /// <param name="joinType">The type of the join</param>
        public Join(IReactiveTable leftTable, string leftIdColumn, IReactiveTable rightTable, string rightIdColumn,
                    JoinType joinType = JoinType.FullOuter)
        {
            _leftTable  = leftTable;
            _rightTable = rightTable;
            _joinType   = joinType;

            _leftColumn  = leftTable.GetColumnByName(leftIdColumn);
            _rightColumn = rightTable.GetColumnByName(rightIdColumn);

            _leftColToken  = leftTable.ReplayAndSubscribe(OnNextLeft);
            _rightColToken = rightTable.ReplayAndSubscribe(OnNextRight);

            _replaying = false;

            _leftRowDeleteHandler = new JoinRowDeleteHandler <TKey>(
                _rows, _rowsByKey, _leftColumnRowsToJoinRows, _rightColumnRowsToJoinRows, JoinSide.Left, _joinType, _rowManager);
            _rightRowDeleteHandler = new JoinRowDeleteHandler <TKey>(
                _rows, _rowsByKey, _rightColumnRowsToJoinRows, _leftColumnRowsToJoinRows, JoinSide.Right, _joinType, _rowManager);

            _leftRowToken  = leftTable.RowUpdates().Subscribe(_leftRowDeleteHandler);
            _rightRowToken = rightTable.RowUpdates().Subscribe(_rightRowDeleteHandler);
        }
 public IReactiveTable Join(IReactiveTable otherTable, IReactiveTableJoiner joiner)
 {
     throw new NotImplementedException();
 }
示例#29
0
 public static void SetupClientFeedTable(IReactiveTable clients)
 {
     clients.AddColumn(new ReactiveColumn <string>(BrokerClientColumns.ClientIpColumn));
     clients.AddColumn(new ReactiveColumn <string>(BrokerClientColumns.ClientCcyPairColumn));
 }
示例#30
0
 public virtual IReactiveTable Join(IReactiveTable otherTable, IReactiveTableJoiner joiner)
 {
     return(new JoinedTable(this, otherTable, joiner));
 }