📄 timeseries_8h-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>FastDB: timeseries.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.5 --><div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a></div><h1>timeseries.h</h1><div class="fragment"><pre>00001 <span class="comment">//-< TIMESERIES.H >--------------------------------------------------*--------*</span>00002 <span class="comment">// FastDB Version 1.0 (c) 1999 GARRET * ? *</span>00003 <span class="comment">// (Post Relational Database Management System) * /\| *</span>00004 <span class="comment">// * / \ *</span>00005 <span class="comment">// Created: 22-Nov-2002 K.A. Knizhnik * / [] \ *</span>00006 <span class="comment">// Last update: 22-Nov-2002 K.A. Knizhnik * GARRET *</span>00007 <span class="comment">//-------------------------------------------------------------------*--------*</span>00008 <span class="comment">// Container for time serires data</span>00009 <span class="comment">//-------------------------------------------------------------------*--------*</span>00010 00011 <span class="preprocessor">#ifndef __TIMESERIES_H__</span>00012 <span class="preprocessor"></span><span class="preprocessor">#define __TIMESERIES_H__</span>00013 <span class="preprocessor"></span>00014 <span class="preprocessor">#include <time.h></span>00015 <span class="preprocessor">#include "fastdb.h"</span>00016 00017 <span class="preprocessor">#define INFINITE_TIME 0x7fffffff</span>00018 <span class="preprocessor"></span>00068 <span class="keyword">template</span><<span class="keyword">class</span> T><a name="l00069"></a><a class="code" href="classdbTimeSeriesBlock.html">00069</a> <span class="keyword">class </span><a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock</a> { 00070 <span class="keyword">public</span>:00071 db_int8 blockId;00072 db_int4 used;00073 <a class="code" href="classdbArray.html">dbArray<T></a> elements;00074 00075 TYPE_DESCRIPTOR((KEY(blockId, INDEXED), FIELD(used), FIELD(elements)));00076 };00077 00078 00084 <span class="keyword">template</span><<span class="keyword">class</span> T><a name="l00085"></a><a class="code" href="classdbTimeSeriesProcessor.html">00085</a> <span class="keyword">class </span><a class="code" href="classdbTimeSeriesProcessor.html">dbTimeSeriesProcessor</a> { 00086 <span class="keyword">struct </span>Interval { 00087 db_int8 from;00088 db_int8 till;00089 };00090 00091 <span class="keyword">public</span>:<a name="l00096"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora0">00096</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora0">process</a>(T <span class="keyword">const</span>&) {}00097 <a name="l00103"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora1">00103</a> <span class="keywordtype">void</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora1">add</a>(oid_t oid, T <span class="keyword">const</span>& data) 00104 { 00105 Interval interval;00106 interval.from = generateBlockId(oid, data.time() - maxBlockTimeInterval);00107 interval.till = generateBlockId(oid, data.time());00108 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00109 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorForUpdate, &interval);00110 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora6">last</a>()) { 00111 insertInBlock(oid, blocks, data);00112 } <span class="keywordflow">else</span> { 00113 addNewBlock(oid, data);00114 }00115 }00116 <a name="l00123"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora2">00123</a> <span class="keywordtype">void</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora2">select</a>(oid_t oid, time_t from, time_t till) 00124 { 00125 Interval interval;00126 interval.from = generateBlockId(oid, from - maxBlockTimeInterval);00127 interval.till = generateBlockId(oid, till);00128 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00129 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorViewOnly, &interval)) { 00130 <span class="keywordflow">do</span> { 00131 <span class="keywordtype">int</span> n = blocks->used;00132 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00133 <span class="keywordtype">int</span> l = 0, r = n;00134 <span class="keywordflow">while</span> (l < r) {00135 <span class="keywordtype">int</span> i = (l+r) >> 1;00136 <span class="keywordflow">if</span> (from > e[i].time()) { 00137 l = i+1;00138 } <span class="keywordflow">else</span> { 00139 r = i;00140 }00141 }00142 assert(l == r && (l == n || e[l].time() >= from)); 00143 <span class="keywordflow">while</span> (l < n && e[l].time() <= till) {00144 <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora0">process</a>(e[l++]);00145 }00146 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());00147 }00148 }00149 <a name="l00155"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora3">00155</a> time_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora3">getFirstTime</a>(oid_t oid) 00156 {00157 Interval interval;00158 interval.from = generateBlockId(oid, 0);00159 interval.till = generateBlockId(oid, INFINITE_TIME);00160 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00161 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a32">setSelectionLimit</a>(1);00162 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorViewOnly, &interval)) { 00163 <span class="keywordflow">return</span> blocks->elements[0].time();00164 }00165 <span class="keywordflow">return</span> (time_t)-1;00166 }00167 <a name="l00173"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora4">00173</a> time_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora4">getLastTime</a>(oid_t oid) 00174 {00175 Interval interval;00176 interval.from = generateBlockId(oid, 0);00177 interval.till = generateBlockId(oid, INFINITE_TIME);00178 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00179 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a32">setSelectionLimit</a>(1);00180 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlockReverse, dbCursorViewOnly, &interval)) { 00181 <span class="keywordflow">return</span> blocks->elements[blocks->used-1].time();00182 }00183 <span class="keywordflow">return</span> (time_t)-1;00184 }00185 <a name="l00191"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora5">00191</a> size_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora5">getNumberOfElements</a>(oid_t oid) 00192 {00193 Interval interval;00194 interval.from = generateBlockId(oid, 0);00195 interval.till = generateBlockId(oid, INFINITE_TIME);00196 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00197 <span class="keywordtype">int</span> n = 0;00198 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorViewOnly, &interval)) {00199 <span class="keywordflow">do</span> { 00200 n += blocks->used;00201 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());00202 }00203 <span class="keywordflow">return</span> n;00204 }00205 <a name="l00215"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora6">00215</a> size_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora6">getInterval</a>(oid_t oid, time_t from, time_t till, T* buf, size_t bufSize) 00216 { 00217 Interval interval;00218 interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);00219 interval.till = generateBlockId(oid, till);00220 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00221 size_t nSelected = 0;00222 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01Sequencer_01_4a21">select</a>(selectBlock, dbCursorViewOnly, &interval)) { 00223 <span class="keywordflow">do</span> { 00224 <span class="keywordtype">int</span> n = blocks->used;00225 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00226 <span class="keywordtype">int</span> l = 0, r = n;00227 <span class="keywordflow">while</span> (l < r) {00228 <span class="keywordtype">int</span> i = (l+r) >> 1;00229 <span class="keywordflow">if</span> (from > e[i].time()) { 00230 l = i+1;00231 } <span class="keywordflow">else</span> { 00232 r = i;00233 }00234 }00235 assert(l == r && (l == n || e[l].time() >= from)); 00236 <span class="keywordflow">while</span> (l < n && e[l].time() <= till) {00237 <span class="keywordflow">if</span> (nSelected < bufSize) { 00238 buf[nSelected] = e[l];00239 }00240 l += 1;00241 nSelected += 1;00242 }00243 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());00244 }00245 <span class="keywordflow">return</span> nSelected;00246 } 00247 <a name="l00255"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora7">00255</a> <span class="keywordtype">bool</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora7">getElement</a>(oid_t oid, T& elem, time_t t) 00256 { 00257 <span class="keywordflow">return</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora6">getInterval</a>(oid, t, t, &elem, 1) == 1;00258 } 00259 <a name="l00269"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora8">00269</a> size_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora8">getFirstInterval</a>(oid_t oid, time_t till, T* buf, size_t bufSize) 00270 {00271 <span class="keywordflow">if</span> (bufSize == 0) { 00272 <span class="keywordflow">return</span> 0;00273 }00274 Interval interval;00275 interval.from = generateBlockId(oid, 0);00276 interval.till = generateBlockId(oid, till);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -