📄 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_4a22">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_4a22">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_4a22">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_4a16">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_4a30">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_4a30">update</a>();00418 }00419 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora12">nextAvailable</a>());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#dbTimeSeriesBlockm0">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#dbTimeSeriesBlockm1">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 + -