/ToMigrate/Raven.Tests.TimeSeries/TimeSeriesTests.cs

https://github.com/fitzchak/ravendb · C# · 491 lines · 448 code · 43 blank · 0 comment · 55 complexity · 9295de558a49f1b4f6b1963e43a7759a MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using Raven.Abstractions.TimeSeries;
  6. using Raven.Database.TimeSeries;
  7. using Voron;
  8. using Xunit;
  9. namespace Raven.Tests.TimeSeries
  10. {
  11. public class TimeSeriesTests : TimeSeriesTest
  12. {
  13. [Fact]
  14. public void CanQueryData()
  15. {
  16. using (var tss = GetStorage())
  17. {
  18. WriteTestData(tss);
  19. var start = new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero);
  20. using (var r = tss.CreateReader())
  21. {
  22. var time = r.GetPoints("Simple", "Time", start.AddYears(-1), start.AddYears(1)).ToArray();
  23. var money = r.GetPoints("Simple", "Money", DateTimeOffset.MinValue, DateTimeOffset.MaxValue).ToArray();
  24. Assert.Equal(3, time.Length);
  25. Assert.Equal(new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero), time[0].At);
  26. Assert.Equal(new DateTimeOffset(2015, 4, 1, 1, 0, 0, TimeSpan.Zero), time[1].At);
  27. Assert.Equal(new DateTimeOffset(2015, 4, 1, 2, 0, 0, TimeSpan.Zero), time[2].At);
  28. Assert.Equal(10, time[0].Values[0]);
  29. Assert.Equal(19, time[1].Values[0]);
  30. Assert.Equal(50, time[2].Values[0]);
  31. #if DEBUG
  32. Assert.Equal("Time", time[0].DebugKey);
  33. Assert.Equal("Time", time[1].DebugKey);
  34. Assert.Equal("Time", time[2].DebugKey);
  35. #endif
  36. Assert.Equal(3, money.Length);
  37. #if DEBUG
  38. Assert.Equal("Money", money[0].DebugKey);
  39. Assert.Equal("Money", money[1].DebugKey);
  40. Assert.Equal("Money", money[2].DebugKey);
  41. #endif
  42. }
  43. }
  44. }
  45. [Fact]
  46. public void CanQueryDataOnSeries()
  47. {
  48. using (var tss = GetStorage())
  49. {
  50. WriteTestData(tss);
  51. using (var r = tss.CreateReader())
  52. {
  53. var money = r.GetPoints("Simple", "Money", DateTimeOffset.MinValue, DateTimeOffset.MaxValue).ToArray();
  54. Assert.Equal(3, money.Length);
  55. #if DEBUG
  56. Assert.Equal("Money", money[0].DebugKey);
  57. Assert.Equal("Money", money[1].DebugKey);
  58. Assert.Equal("Money", money[2].DebugKey);
  59. #endif
  60. }
  61. }
  62. }
  63. [Fact]
  64. public void CanQueryDataInSpecificDurationSum()
  65. {
  66. using (var tss = GetStorage())
  67. {
  68. WriteTestData(tss);
  69. var start = new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero);
  70. using (var r = tss.CreateReader())
  71. {
  72. var time = r.GetAggregatedPoints("Simple", "Time", AggregationDuration.Hours(6), start.AddDays(-1), start.AddDays(2)).ToArray();
  73. var money = r.GetAggregatedPoints("Simple", "Money", AggregationDuration.Hours(2), start.AddDays(-2), start.AddDays(1)).ToArray();
  74. Assert.Equal(12, time.Length);
  75. Assert.Equal(new DateTimeOffset(2015, 3, 31, 0, 0, 0, TimeSpan.Zero), time[0].StartAt);
  76. Assert.Equal(new DateTimeOffset(2015, 3, 31, 6, 0, 0, TimeSpan.Zero), time[1].StartAt);
  77. Assert.Equal(new DateTimeOffset(2015, 3, 31, 12, 0, 0, TimeSpan.Zero), time[2].StartAt);
  78. Assert.Equal(new DateTimeOffset(2015, 3, 31, 18, 0, 0, TimeSpan.Zero), time[3].StartAt);
  79. Assert.Equal(new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero), time[4].StartAt);
  80. Assert.Equal(new DateTimeOffset(2015, 4, 1, 6, 0, 0, TimeSpan.Zero), time[5].StartAt);
  81. Assert.Equal(new DateTimeOffset(2015, 4, 1, 12, 0, 0, TimeSpan.Zero), time[6].StartAt);
  82. Assert.Equal(new DateTimeOffset(2015, 4, 1, 18, 0, 0, TimeSpan.Zero), time[7].StartAt);
  83. Assert.Equal(new DateTimeOffset(2015, 4, 2, 0, 0, 0, TimeSpan.Zero), time[8].StartAt);
  84. Assert.Equal(new DateTimeOffset(2015, 4, 2, 6, 0, 0, TimeSpan.Zero), time[9].StartAt);
  85. Assert.Equal(new DateTimeOffset(2015, 4, 2, 12, 0, 0, TimeSpan.Zero), time[10].StartAt);
  86. Assert.Equal(new DateTimeOffset(2015, 4, 2, 18, 0, 0, TimeSpan.Zero), time[11].StartAt);
  87. Assert.Equal(79, time[4].Values[0].Sum);
  88. #if DEBUG
  89. Assert.Equal("Time", time[4].DebugKey);
  90. #endif
  91. Assert.Equal(AggregationDuration.Hours(6), time[4].Duration);
  92. Assert.Equal(36, money.Length);
  93. for (int i = 0; i < 36; i++)
  94. {
  95. #if DEBUG
  96. Assert.Equal("Money", money[i].DebugKey);
  97. #endif
  98. Assert.Equal(AggregationDuration.Hours(2), money[0].Duration);
  99. if (i == 24 || i == 25)
  100. continue;
  101. Assert.Equal(0, money[i].Values[0].Sum);
  102. Assert.Equal(0, money[i].Values[0].Volume);
  103. Assert.Equal(0, money[i].Values[0].High);
  104. }
  105. Assert.Equal(600, money[24].Values[0].Sum);
  106. Assert.Equal(2, money[24].Values[0].Volume);
  107. Assert.Equal(130, money[25].Values[0].Sum);
  108. Assert.Equal(1, money[25].Values[0].Volume);
  109. }
  110. }
  111. }
  112. [Fact]
  113. public void CanQueryDataInSpecificDurationAverage()
  114. {
  115. using (var tss = GetStorage())
  116. {
  117. WriteTestData(tss);
  118. var start = new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero);
  119. using (var r = tss.CreateReader())
  120. {
  121. var time = r.GetAggregatedPoints("Simple", "Time", AggregationDuration.Hours(3), start.AddMonths(-1), start.AddDays(1)).ToArray();
  122. var money = r.GetAggregatedPoints("Simple", "Money", AggregationDuration.Hours(2), start.AddDays(-1), start.AddMonths(1)).ToArray();
  123. Assert.Equal(24 / 3 * 32, time.Length);
  124. for (int i = 0; i < 256; i++)
  125. {
  126. #if DEBUG
  127. Assert.Equal("Time", time[i].DebugKey);
  128. #endif
  129. Assert.Equal(AggregationDuration.Hours(3), time[i].Duration);
  130. if (i == 248 || i == 249)
  131. continue;
  132. Assert.Equal(0, time[i].Values[0].Volume);
  133. }
  134. Assert.Equal("26.3333333333333", (time[248].Values[0].Sum / time[248].Values[0].Volume).ToString(CultureInfo.InvariantCulture));
  135. Assert.Equal(3, time[248].Values[0].Volume);
  136. Assert.Equal(10, time[248].Values[0].Open);
  137. Assert.Equal(50, time[248].Values[0].Close);
  138. Assert.Equal(50, time[248].Values[0].High);
  139. Assert.Equal(10, time[248].Values[0].Low);
  140. Assert.Equal(24 / 2 * 31, money.Length);
  141. for (int i = 0; i < 372; i++)
  142. {
  143. if (i == 12 || i == 13)
  144. continue;
  145. Assert.Equal(0, money[i].Values[0].Volume);
  146. }
  147. #if DEBUG
  148. Assert.Equal("Money", money[12].DebugKey);
  149. #endif
  150. Assert.Equal(300, money[12].Values[0].Sum / money[12].Values[0].Volume);
  151. Assert.Equal(130, money[13].Values[0].Sum / money[13].Values[0].Volume);
  152. Assert.Equal(AggregationDuration.Hours(2), money[12].Duration);
  153. Assert.Equal(AggregationDuration.Hours(2), money[13].Duration);
  154. Assert.Equal(2, money[12].Values[0].Volume);
  155. Assert.Equal(1, money[13].Values[0].Volume);
  156. Assert.Equal(54, money[12].Values[0].Open);
  157. Assert.Equal(130, money[13].Values[0].Open);
  158. Assert.Equal(546, money[12].Values[0].Close);
  159. Assert.Equal(130, money[13].Values[0].Close);
  160. Assert.Equal(54, money[12].Values[0].Low);
  161. Assert.Equal(130, money[13].Values[0].Low);
  162. Assert.Equal(546, money[12].Values[0].High);
  163. Assert.Equal(130, money[13].Values[0].High);
  164. }
  165. }
  166. }
  167. [Fact]
  168. public void CanQueryDataInSpecificDurationAverageUpdateRollup()
  169. {
  170. using (var tss = GetStorage())
  171. {
  172. WriteTestData(tss);
  173. var start = new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero);
  174. using (var r = tss.CreateReader())
  175. {
  176. var time = r.GetAggregatedPoints("Simple", "Time", AggregationDuration.Hours(3), start.AddMonths(-1), start.AddDays(1)).ToArray();
  177. var money = r.GetAggregatedPoints("Simple", "Money", AggregationDuration.Hours(2), start.AddDays(-1), start.AddMonths(1)).ToArray();
  178. Assert.Equal(24/3*32, time.Length);
  179. for (int i = 0; i < 256; i++)
  180. {
  181. if (i == 248)
  182. continue;
  183. Assert.Equal(0, time[i].Values[0].Volume);
  184. }
  185. Assert.Equal("26.3333333333333", (time[248].Values[0].Sum / time[248].Values[0].Volume).ToString(CultureInfo.InvariantCulture));
  186. #if DEBUG
  187. Assert.Equal("Time", time[248].DebugKey);
  188. #endif
  189. Assert.Equal(AggregationDuration.Hours(3), time[248].Duration);
  190. Assert.Equal(3, time[248].Values[0].Volume);
  191. Assert.Equal(10, time[248].Values[0].Open);
  192. Assert.Equal(50, time[248].Values[0].Close);
  193. Assert.Equal(50, time[248].Values[0].High);
  194. Assert.Equal(10, time[248].Values[0].Low);
  195. Assert.Equal(24/2*31, money.Length);
  196. for (int i = 0; i < 372; i++)
  197. {
  198. if (i == 12 || i == 13)
  199. continue;
  200. Assert.Equal(0, money[i].Values[0].Volume);
  201. }
  202. #if DEBUG
  203. Assert.Equal("Money", money[12].DebugKey);
  204. #endif
  205. Assert.Equal(300, money[12].Values[0].Sum / money[12].Values[0].Volume);
  206. Assert.Equal(130, money[13].Values[0].Sum / money[13].Values[0].Volume);
  207. Assert.Equal(AggregationDuration.Hours(2), money[12].Duration);
  208. Assert.Equal(AggregationDuration.Hours(2), money[13].Duration);
  209. Assert.Equal(2, money[12].Values[0].Volume);
  210. Assert.Equal(1, money[13].Values[0].Volume);
  211. Assert.Equal(54, money[12].Values[0].Open);
  212. Assert.Equal(130, money[13].Values[0].Open);
  213. Assert.Equal(546, money[12].Values[0].Close);
  214. Assert.Equal(130, money[13].Values[0].Close);
  215. Assert.Equal(54, money[12].Values[0].Low);
  216. Assert.Equal(130, money[13].Values[0].Low);
  217. Assert.Equal(546, money[12].Values[0].High);
  218. Assert.Equal(130, money[13].Values[0].High);
  219. }
  220. var start2 = start.AddMonths(-1).AddDays(5);
  221. using (var writer = tss.CreateWriter())
  222. {
  223. int value = 6;
  224. for (int i = 0; i < 4; i++)
  225. {
  226. writer.Append("Simple", "Time", start2.AddHours(2 + i), value++);
  227. writer.Append("Simple", "Is", start2.AddHours(3 + i), value++);
  228. writer.Append("Simple", "Money", start2.AddHours(3 + i), value++);
  229. }
  230. writer.Commit();
  231. }
  232. using (var r = tss.CreateReader())
  233. {
  234. var time = r.GetAggregatedPoints("Simple", "Time", AggregationDuration.Hours(3), start.AddMonths(-1), start.AddDays(1)).ToArray();
  235. var money = r.GetAggregatedPoints("Simple", "Money", AggregationDuration.Hours(2), start.AddMonths(-2).AddDays(-1), start.AddMonths(2)).ToArray();
  236. Assert.Equal(24/3*32, time.Length);
  237. for (int i = 0; i < 256; i++)
  238. {
  239. #if DEBUG
  240. Assert.Equal("Time", time[i].DebugKey);
  241. #endif
  242. Assert.Equal(AggregationDuration.Hours(3), time[i].Duration);
  243. if (i == 40 ||i == 41 || i == 248)
  244. continue;
  245. Assert.Equal(0, time[i].Values[0].Volume);
  246. }
  247. Assert.Equal(1, time[40].Values[0].Volume);
  248. Assert.Equal(6, time[40].Values[0].Sum);
  249. Assert.Equal(6, time[40].Values[0].Open);
  250. Assert.Equal(6, time[40].Values[0].Close);
  251. Assert.Equal(6, time[40].Values[0].High);
  252. Assert.Equal(6, time[40].Values[0].Low);
  253. Assert.Equal(3, time[41].Values[0].Volume);
  254. Assert.Equal(36, time[41].Values[0].Sum);
  255. Assert.Equal(9, time[41].Values[0].Open);
  256. Assert.Equal(15, time[41].Values[0].Close);
  257. Assert.Equal(15, time[41].Values[0].High);
  258. Assert.Equal(9, time[41].Values[0].Low);
  259. Assert.Equal("26.3333333333333", (time[248].Values[0].Sum / time[248].Values[0].Volume).ToString(CultureInfo.InvariantCulture));
  260. Assert.Equal(3, time[248].Values[0].Volume);
  261. Assert.Equal(79, time[248].Values[0].Sum);
  262. Assert.Equal(10, time[248].Values[0].Open);
  263. Assert.Equal(50, time[248].Values[0].Close);
  264. Assert.Equal(50, time[248].Values[0].High);
  265. Assert.Equal(10, time[248].Values[0].Low);
  266. Assert.Equal((60 + 1 + 60) * 24 / 2, money.Length);
  267. for (int i = 0; i < 1452; i++)
  268. {
  269. #if DEBUG
  270. Assert.Equal("Money", money[i].DebugKey);
  271. #endif
  272. Assert.Equal(AggregationDuration.Hours(2), money[i].Duration);
  273. if (i == 409 || i == 410 || i == 411 || i == 720 || i == 721)
  274. continue;
  275. Assert.Equal(0, money[i].Values[0].Volume);
  276. }
  277. Assert.Equal(1, money[409].Values[0].Volume);
  278. Assert.Equal(2, money[410].Values[0].Volume);
  279. Assert.Equal(1, money[411].Values[0].Volume);
  280. Assert.Equal(8, money[409].Values[0].Sum);
  281. Assert.Equal(8, money[409].Values[0].Open);
  282. Assert.Equal(8, money[409].Values[0].Close);
  283. Assert.Equal(8, money[409].Values[0].Low);
  284. Assert.Equal(8, money[409].Values[0].High);
  285. Assert.Equal(25, money[410].Values[0].Sum);
  286. Assert.Equal(11, money[410].Values[0].Open);
  287. Assert.Equal(14, money[410].Values[0].Close);
  288. Assert.Equal(11, money[410].Values[0].Low);
  289. Assert.Equal(14, money[410].Values[0].High);
  290. Assert.Equal(17, money[411].Values[0].Sum);
  291. Assert.Equal(17, money[411].Values[0].Open);
  292. Assert.Equal(17, money[411].Values[0].Close);
  293. Assert.Equal(17, money[411].Values[0].Low);
  294. Assert.Equal(17, money[411].Values[0].High);
  295. Assert.Equal(300, money[720].Values[0].Sum / money[720].Values[0].Volume);
  296. Assert.Equal(130, money[721].Values[0].Sum / money[721].Values[0].Volume);
  297. Assert.Equal(2, money[720].Values[0].Volume);
  298. Assert.Equal(1, money[721].Values[0].Volume);
  299. Assert.Equal(54, money[720].Values[0].Open);
  300. Assert.Equal(130, money[721].Values[0].Open);
  301. Assert.Equal(546, money[720].Values[0].Close);
  302. Assert.Equal(130, money[721].Values[0].Close);
  303. Assert.Equal(54, money[720].Values[0].Low);
  304. Assert.Equal(130, money[721].Values[0].Low);
  305. Assert.Equal(546, money[720].Values[0].High);
  306. Assert.Equal(130, money[721].Values[0].High);
  307. }
  308. }
  309. }
  310. [Fact]
  311. public void CanQueryDataInSpecificDuration_LowerDurationThanActualOnDisk()
  312. {
  313. using (var tss = GetStorage())
  314. {
  315. WriteTestData(tss);
  316. var start = new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero);
  317. using (var r = tss.CreateReader())
  318. {
  319. var time = r.GetAggregatedPoints("Simple", "Time", AggregationDuration.Seconds(3), start.AddHours(-1), start.AddHours(4)).ToArray();
  320. var money = r.GetAggregatedPoints("Simple", "Money", AggregationDuration.Minutes(3), start.AddHours(-1), start.AddHours(4)).ToArray();
  321. Assert.Equal(5 * 60 * 60 / 3, time.Length);
  322. for (int i = 0; i < 6000; i++)
  323. {
  324. if (i == 1200 || i == 2400 || i == 3600)
  325. continue;
  326. Assert.Equal(AggregationDuration.Seconds(3), time[i].Duration);
  327. #if DEBUG
  328. Assert.Equal("Time", time[i].DebugKey);
  329. #endif
  330. Assert.Equal(0, time[i].Values[0].Volume);
  331. Assert.Equal(0, time[i].Values[0].Open);
  332. Assert.Equal(0, time[i].Values[0].Close);
  333. Assert.Equal(0, time[i].Values[0].Low);
  334. Assert.Equal(0, time[i].Values[0].High);
  335. Assert.Equal(0, time[i].Values[0].Sum);
  336. Assert.Equal(0, time[i].Values[0].Volume);
  337. }
  338. #if DEBUG
  339. Assert.Equal("Time", time[1200].DebugKey);
  340. #endif
  341. Assert.Equal(AggregationDuration.Seconds(3), time[1200].Duration);
  342. Assert.Equal(AggregationDuration.Seconds(3), time[2400].Duration);
  343. Assert.Equal(AggregationDuration.Seconds(3), time[3600].Duration);
  344. Assert.Equal(1, time[1200].Values[0].Volume);
  345. Assert.Equal(1, time[2400].Values[0].Volume);
  346. Assert.Equal(1, time[3600].Values[0].Volume);
  347. Assert.Equal(10, time[1200].Values[0].Open);
  348. Assert.Equal(19, time[2400].Values[0].Open);
  349. Assert.Equal(50, time[3600].Values[0].Open);
  350. Assert.Equal(10, time[1200].Values[0].Close);
  351. Assert.Equal(19, time[2400].Values[0].Close);
  352. Assert.Equal(50, time[3600].Values[0].Close);
  353. Assert.Equal(10, time[1200].Values[0].Low);
  354. Assert.Equal(19, time[2400].Values[0].Low);
  355. Assert.Equal(50, time[3600].Values[0].Low);
  356. Assert.Equal(10, time[1200].Values[0].High);
  357. Assert.Equal(19, time[2400].Values[0].High);
  358. Assert.Equal(50, time[3600].Values[0].High);
  359. Assert.Equal(10, time[1200].Values[0].Sum);
  360. Assert.Equal(19, time[2400].Values[0].Sum);
  361. Assert.Equal(50, time[3600].Values[0].Sum);
  362. Assert.Equal(1, time[1200].Values[0].Volume);
  363. Assert.Equal(1, time[2400].Values[0].Volume);
  364. Assert.Equal(1, time[3600].Values[0].Volume);
  365. Assert.Equal(5 * 60 / 3, money.Length);
  366. for (int i = 0; i < 100; i++)
  367. {
  368. #if DEBUG
  369. Assert.Equal("Money", money[i].DebugKey);
  370. #endif
  371. Assert.Equal(AggregationDuration.Minutes(3), money[i].Duration);
  372. if (i == 20 || i == 40 || i == 60)
  373. continue;
  374. Assert.Equal(0, money[i].Values[0].Volume);
  375. Assert.Equal(0, money[i].Values[0].Open);
  376. Assert.Equal(0, money[i].Values[0].Close);
  377. Assert.Equal(0, money[i].Values[0].Low);
  378. Assert.Equal(0, money[i].Values[0].High);
  379. Assert.Equal(0, money[i].Values[0].Sum);
  380. Assert.Equal(0, money[i].Values[0].Volume);
  381. }
  382. Assert.Equal(1, money[20].Values[0].Volume);
  383. Assert.Equal(1, money[40].Values[0].Volume);
  384. Assert.Equal(1, money[60].Values[0].Volume);
  385. Assert.Equal(54, money[20].Values[0].Open);
  386. Assert.Equal(546, money[40].Values[0].Open);
  387. Assert.Equal(130, money[60].Values[0].Open);
  388. Assert.Equal(54, money[20].Values[0].Close);
  389. Assert.Equal(546, money[40].Values[0].Close);
  390. Assert.Equal(130, money[60].Values[0].Close);
  391. Assert.Equal(54, money[20].Values[0].Low);
  392. Assert.Equal(546, money[40].Values[0].Low);
  393. Assert.Equal(130, money[60].Values[0].Low);
  394. Assert.Equal(54, money[20].Values[0].High);
  395. Assert.Equal(546, money[40].Values[0].High);
  396. Assert.Equal(130, money[60].Values[0].High);
  397. Assert.Equal(54, money[20].Values[0].Sum);
  398. Assert.Equal(546, money[40].Values[0].Sum);
  399. Assert.Equal(130, money[60].Values[0].Sum);
  400. Assert.Equal(1, money[20].Values[0].Volume);
  401. Assert.Equal(1, money[40].Values[0].Volume);
  402. Assert.Equal(1, money[60].Values[0].Volume);
  403. }
  404. }
  405. }
  406. [Fact]
  407. public void MissingDataInSeries()
  408. {
  409. using (var tss = GetStorage())
  410. {
  411. WriteTestData(tss);
  412. var start = new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero);
  413. using (var r = tss.CreateReader())
  414. {
  415. var time = r.GetPoints("Simple", "Time", start.AddSeconds(1), start.AddMinutes(30)).ToArray();
  416. var money = r.GetPoints("Simple", "Money", start.AddSeconds(1), start.AddMinutes(30)).ToArray();
  417. var Is = r.GetPoints("Simple", "Is", start.AddSeconds(1), start.AddMinutes(30)).ToArray();
  418. Assert.Equal(0, time.Length);
  419. Assert.Equal(0, money.Length);
  420. Assert.Equal(0, Is.Length);
  421. }
  422. }
  423. }
  424. private static void WriteTestData(TimeSeriesStorage tss)
  425. {
  426. var start = new DateTimeOffset(2015, 4, 1, 0, 0, 0, TimeSpan.Zero);
  427. var data = new[]
  428. {
  429. new {Key = "Time", At = start, Value = 10},
  430. new {Key = "Money", At = start, Value = 54},
  431. new {Key = "Is", At = start, Value = 1029},
  432. new {Key = "Money", At = start.AddHours(1), Value = 546},
  433. new {Key = "Is", At = start.AddHours(1), Value = 70},
  434. new {Key = "Time", At = start.AddHours(1), Value = 19},
  435. new {Key = "Is", At = start.AddHours(2), Value = 64},
  436. new {Key = "Money", At = start.AddHours(2), Value = 130},
  437. new {Key = "Time", At = start.AddHours(2), Value = 50},
  438. };
  439. var writer = tss.CreateWriter();
  440. foreach (var item in data)
  441. {
  442. writer.Append("Simple", item.Key, item.At, item.Value);
  443. }
  444. writer.Commit();
  445. writer.Dispose();
  446. }
  447. }
  448. }