public void TestQTable() { var columns = new[] { "pos", "dates" }; var data = new object[] { new[] { "d1", "d2", "d3" }, new[] { 1001, 1002, 1003 } }; var t = new QTable(columns, data); Assert.AreEqual(t, new QTable(columns, data)); Assert.IsTrue(t.HasColumn("pos")); Assert.IsFalse(t.HasColumn("unknown")); Assert.AreEqual(1, t.GetColumnIndex("dates")); Assert.Throws <NullReferenceException>(() => t.GetColumnIndex("unknown")); int i = 0; var e = t.GetEnumerator(); while (e.MoveNext()) { var r = e.Current; Assert.AreEqual(t[i].ToArray(), r.ToArray()); i++; } Assert.AreEqual(i, t.RowsCount); }
//-------------------------------------------------------------------// /// <summary> /// This function applies data received from Q process to in-memory cache. /// All operations are structured in a way that only data that has been subscribed is kept, /// i.e.: data from columns that were not requested is simply discarded. /// </summary> /// <param name="alias">alias of the connection producing the data</param> /// <param name="table">name of the table</param> /// <param name="data">table data</param> private static void UpdateCache(string alias, string table, QTable data) { var symIdx = data.GetColumnIndex(_symColName); var cols = data.Columns; foreach (QTable.Row row in data) { var ra = row.ToArray(); var symName = ra[symIdx].ToString(); var symId = GetSymbolId(alias, table, symName); if (WildCardMapping.ContainsKey(alias) /*&& symId != null*/) { for (var i = 0; i < cols.Length; i++) { Cache.UpdateData(alias, table, symName, cols[i], Conversions.Convert2Excel(ra[i])); AllSymbols[alias][table].Add(symName); if (symId == null) { continue; } if (!WildCardMapping[alias].ContainsColumn(table, symId, cols[i])) { continue; } foreach (var ti in WildCardMapping[alias].GetTopics(table, symId, cols[i])) { DataOut.AddOrUpdate(ti, "", (k, v) => ""); var val = string.IsNullOrEmpty(ti.History) ? Conversions.Convert2Excel(ra[i]) : Cache.GetData(alias, table, symName, cols[i], ti.History); ti.Topic.UpdateValue(val ?? ExcelEmpty.Value); } } } if (!Mapping.ContainsKey(alias) || !Mapping[alias].ContainsSymbol(table, symName)) { continue; } for (var i = 0; i < cols.Length; i++) { if (!Mapping[alias].ContainsColumn(table, symName, cols[i])) { continue; } Cache.UpdateData(alias, table, symName, cols[i], Conversions.Convert2Excel(ra[i])); foreach (var ti in Mapping[alias].GetTopics(table, symName, cols[i])) { DataOut.AddOrUpdate(ti, "", (k, v) => ""); var val = string.IsNullOrEmpty(ti.History) ? Conversions.Convert2Excel(ra[i]) : Cache.GetData(alias, table, symName, cols[i], ti.History); ti.Topic.UpdateValue(val ?? ExcelEmpty.Value); } } } }
public void TestQTable() { var columns = new[] { "pos", "dates" }; var data = new object[] { new[] { "d1", "d2", "d3" }, new[] { 1001, 1002, 1003 } }; var t = new QTable(columns, data); Assert.AreEqual(t, new QTable(columns, data)); Assert.IsTrue(t.HasColumn("pos")); Assert.IsFalse(t.HasColumn("unknown")); Assert.AreEqual(1, t.GetColumnIndex("dates")); Assert.Throws<NullReferenceException>(() => t.GetColumnIndex("unknown")); int i = 0; var e = t.GetEnumerator(); while (e.MoveNext()) { var r = e.Current; Assert.AreEqual(t[i].ToArray(), r.ToArray()); i++; } Assert.AreEqual(i, t.RowsCount); }