📄 timeseries_8h-source.html
字号:
00277 interval.till = generateBlockId(oid, till);
00278 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;
00279 size_t nSelected = 0;
00280 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a20">select</a>(selectBlock, dbCursorViewOnly, &interval)) {
00281 <span class="keywordflow">do</span> {
00282 <span class="keywordtype">int</span> n = blocks->used;
00283 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();
00284 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n && e[i].time() <= till; i++) {
00285 buf[nSelected++] = e[i];
00286 <span class="keywordflow">if</span> (nSelected == bufSize) {
00287 <span class="keywordflow">return</span> nSelected;
00288 }
00289 }
00290 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());
00291 }
00292 <span class="keywordflow">return</span> nSelected;
00293 }
00294
00295
<a name="l00305"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora9">00305</a> size_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora9">getLastInterval</a>(oid_t oid, time_t from, T* buf, size_t bufSize)
00306 {
00307 <span class="keywordflow">if</span> (bufSize == 0) {
00308 <span class="keywordflow">return</span> 0;
00309 }
00310 Interval interval;
00311 interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);
00312 interval.till = generateBlockId(oid, INFINITE_TIME);
00313 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;
00314
00315 size_t nSelected = 0;
00316 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a20">select</a>(selectBlock, dbCursorViewOnly, &interval);
00317 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora6">last</a>()) {
00318 <span class="keywordflow">do</span> {
00319 <span class="keywordtype">int</span> n = blocks->used;
00320 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();
00321 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = n; --i >= 0 && e[i].time() >= from;) {
00322 buf[nSelected++] = e[i];
00323 <span class="keywordflow">if</span> (nSelected == bufSize) {
00324 <span class="keywordflow">return</span> nSelected;
00325 }
00326 }
00327 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora4">prev</a>());
00328 }
00329 <span class="keywordflow">return</span> nSelected;
00330 }
00331
00332
00333
<a name="l00340"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora10">00340</a> <span class="keywordtype">bool</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora10">hasElement</a>(oid_t oid, time_t t)
00341 {
00342 T dummy;
00343 <span class="keywordflow">return</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora7">getElement</a>(oid, dummy, t);
00344 }
00345
<a name="l00357"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora11">00357</a> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora11">dbTimeSeriesProcessor</a>(<a class="code" href="classdbDatabase.html">dbDatabase</a>& database, <span class="keywordtype">int</span> minElementsInBlock=100, <span class="keywordtype">int</span> maxElementsInBlock=100, time_t maxBlockTimeInterval=0) :
00358 db(database)
00359 {
00360 assert(minElementsInBlock > 0 && maxElementsInBlock >= minElementsInBlock);
00361 <span class="keywordflow">if</span> (maxBlockTimeInterval == 0) {
00362 maxBlockTimeInterval = 2*(maxElementsInBlock*24*60*60); <span class="comment">// doubled interval in seconds, one element per day</span>
00363 }
00364 this->maxElementsInBlock = maxElementsInBlock;
00365 this->minElementsInBlock = minElementsInBlock;
00366 this->maxBlockTimeInterval = maxBlockTimeInterval;
00367
00368 <span class="comment">// correct instance of interval will be specified in select</span>
00369 Interval* dummy = NULL;
00370 selectBlock = <span class="stringliteral">"blockId between"</span>,dummy->from,<span class="stringliteral">"and"</span>,dummy->till;
00371 selectBlockReverse = <span class="stringliteral">"blockId between"</span>,dummy->from,<span class="stringliteral">"and"</span>,dummy->till,<span class="stringliteral">"order by blockId desc"</span>;
00372 }
00373
<a name="l00381"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora12">00381</a> <span class="keywordtype">int</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora12">remove</a>(oid_t oid, time_t from, time_t till)
00382 {
00383 Interval interval;
00384 interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);
00385 interval.till = generateBlockId(oid, till);
00386 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;
00387 size_t nRemoved = 0;
00388 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a20">select</a>(selectBlock, dbCursorForUpdate, &interval)) {
00389 <span class="keywordflow">do</span> {
00390 <span class="keywordtype">int</span> n = blocks->used;
00391 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();
00392 <span class="keywordtype">int</span> l = 0, r = n;
00393 <span class="keywordflow">while</span> (l < r) {
00394 <span class="keywordtype">int</span> i = (l+r) >> 1;
00395 <span class="keywordflow">if</span> (from > e[i].time()) {
00396 l = i+1;
00397 } <span class="keywordflow">else</span> {
00398 r = i;
00399 }
00400 }
00401 assert(l == r && (l == n || e[l].time() >= from));
00402 <span class="keywordflow">while</span> (r < n && e[r].time() <= till) {
00403 r += 1;
00404 nRemoved += 1;
00405 }
00406 <span class="keywordflow">if</span> (l == 0 && r == n) {
00407 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a14">remove</a>();
00408 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (l < n && l != r) {
00409 <span class="keywordflow">if</span> (l == 0) {
00410 blocks->blockId = generateBlockId(oid, e[r].time());
00411 }
00412 T* ue = blocks->elements.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a28">update</a>();
00413 <span class="keywordflow">while</span> (r < n) {
00414 ue[l++] = ue[r++];
00415 }
00416 blocks->used = l;
00417 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a28">update</a>();
00418 }
00419 } <span class="keywordflow">while</span> (blocks.nextAvailable());
00420 }
00421 <span class="keywordflow">return</span> nRemoved;
00422 }
00423
00424 <span class="keyword">virtual</span>~<a class="code" href="classdbTimeSeriesProcessor.html">dbTimeSeriesProcessor</a>() {}
00425
<a name="l00431"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora14">00431</a> <span class="keywordtype">int</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora14">_openIteratorCursor</a>(<a class="code" href="classdbCursor.html">dbCursor</a>< <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock<T></a> >& cursor, oid_t oid, time_t from, time_t till)
00432 {
00433 Interval interval;
00434 interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);
00435 interval.till = generateBlockId(oid, till);
00436 <span class="keywordflow">return</span> cursor.select(selectBlock, dbCursorViewOnly, &interval);
00437 }
00438
00439 <span class="keyword">private</span>:
00440 db_int8 generateBlockId(oid_t oid, time_t date)
00441 {
00442 <span class="keywordflow">return</span> cons_int8(oid, date);
00443 }
00444
00445
00446 <span class="keywordtype">void</span> addNewBlock(oid_t oid, T <span class="keyword">const</span>& data)
00447 {
00448 <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock<T></a> block;
00449 block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlockm1">blockId</a> = generateBlockId(oid, data.time());
00450 block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlockm2">elements</a>.resize(minElementsInBlock);
00451 block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlockm0">used</a> = 1;
00452 block.<a class="code" href="classdbTimeSeriesBlock.html#dbTimeSeriesBlockm2">elements</a>.putat(0, data);
00453 insert(block);
00454 }
00455
00456 <span class="keywordtype">void</span> insertInBlock(oid_t oid, <a class="code" href="classdbCursor.html">dbCursor</a>< <a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock<T></a> >& blocks, T <span class="keyword">const</span>& data)
00457 {
00458 time_t t = data.time();
00459 <span class="keywordtype">int</span> i, n = blocks->used;
00460
00461 T <span class="keyword">const</span>* e = blocks->elements.get();
00462 <span class="keywordtype">int</span> l = 0, r = n;
00463 <span class="keywordflow">while</span> (l < r) {
00464 i = (l+r) >> 1;
00465 <span class="keywordflow">if</span> (t > e[i].time()) {
00466 l = i+1;
00467 } <span class="keywordflow">else</span> {
00468 r = i;
00469 }
00470 }
00471 assert(l == r && (l == n || e[l].time() >= t));
00472 <span class="keywordflow">if</span> (r == 0) {
00473 <span class="keywordflow">if</span> (e[n-1].time() - t > maxBlockTimeInterval || n == maxElementsInBlock) {
00474 addNewBlock(oid, data);
00475 <span class="keywordflow">return</span>;
00476 }
00477 blocks->blockId = generateBlockId(oid, t);
00478 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (r == n) {
00479 <span class="keywordflow">if</span> (t - e[0].time() > maxBlockTimeInterval || n == maxElementsInBlock) {
00480 addNewBlock(oid, data);
00481 <span class="keywordflow">return</span>;
00482 }
00483 }
00484 <span class="keywordflow">if</span> ((size_t)n == blocks->elements.length()) {
00485 <span class="keywordflow">if</span> (n == maxElementsInBlock) {
00486 T* u = blocks->elements.update();
00487 addNewBlock(oid, u[n-1]);
00488 <span class="keywordflow">for</span> (i = n; --i > r; ) {
00489 u[i] = u[i-1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -