📄 timeseries_8h-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>timeseries.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.2.18 --><center><a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> </center><hr><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 "fastdb.h"</span>00015 00016 BEGIN_FASTDB_NAMESPACE00017 00018 <span class="preprocessor">#define INFINITE_TIME 0x7fffffff</span>00019 <span class="preprocessor"></span>00069 <span class="keyword">template</span><<span class="keyword">class</span> T><a name="l00070"></a><a class="code" href="classdbTimeSeriesBlock.html">00070</a> <span class="keyword">class </span><a class="code" href="classdbTimeSeriesBlock.html">dbTimeSeriesBlock</a> { 00071 <span class="keyword">public</span>:00072 db_int8 blockId;00073 db_int4 used;00074 <a class="code" href="classdbArray.html">dbArray<T></a> elements;00075 00076 TYPE_DESCRIPTOR((KEY(blockId, INDEXED), FIELD(used), FIELD(elements)));00077 };00078 00079 00085 <span class="keyword">template</span><<span class="keyword">class</span> T><a name="l00086"></a><a class="code" href="classdbTimeSeriesProcessor.html">00086</a> <span class="keyword">class </span><a class="code" href="classdbTimeSeriesProcessor.html">dbTimeSeriesProcessor</a> { 00087 <span class="keyword">struct </span>Interval { 00088 db_int8 from;00089 db_int8 till;00090 };00091 00092 <span class="keyword">public</span>:<a name="l00097"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora0">00097</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>&) {}00098 <a name="l00104"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora1">00104</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) 00105 { 00106 Interval interval;00107 interval.from = generateBlockId(oid, data.time() - maxBlockTimeInterval);00108 interval.till = generateBlockId(oid, data.time());00109 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00110 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a22">select</a>(selectBlock, dbCursorForUpdate, &interval);00111 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora6">last</a>()) { 00112 insertInBlock(oid, blocks, data);00113 } <span class="keywordflow">else</span> { 00114 addNewBlock(oid, data);00115 }00116 }00117 <a name="l00124"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora2">00124</a> <span class="keywordtype">void</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora2">select</a>(oid_t oid, time_t from, time_t till) 00125 { 00126 Interval interval;00127 interval.from = generateBlockId(oid, from - maxBlockTimeInterval);00128 interval.till = generateBlockId(oid, till);00129 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00130 <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)) { 00131 <span class="keywordflow">do</span> { 00132 <span class="keywordtype">int</span> n = blocks->used;00133 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00134 <span class="keywordtype">int</span> l = 0, r = n;00135 <span class="keywordflow">while</span> (l < r) {00136 <span class="keywordtype">int</span> i = (l+r) >> 1;00137 <span class="keywordflow">if</span> (from > e[i].time()) { 00138 l = i+1;00139 } <span class="keywordflow">else</span> { 00140 r = i;00141 }00142 }00143 assert(l == r && (l == n || e[l].time() >= from)); 00144 <span class="keywordflow">while</span> (l < n && e[l].time() <= till) {00145 <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora0">process</a>(e[l++]);00146 }00147 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());00148 }00149 }00150 <a name="l00156"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora3">00156</a> time_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora3">getFirstTime</a>(oid_t oid) 00157 {00158 Interval interval;00159 interval.from = generateBlockId(oid, 0);00160 interval.till = generateBlockId(oid, INFINITE_TIME);00161 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00162 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a33">setSelectionLimit</a>(1);00163 <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)) { 00164 <span class="keywordflow">return</span> blocks->elements[0].time();00165 }00166 <span class="keywordflow">return</span> (time_t)-1;00167 }00168 <a name="l00174"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora4">00174</a> time_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora4">getLastTime</a>(oid_t oid) 00175 {00176 Interval interval;00177 interval.from = generateBlockId(oid, 0);00178 interval.till = generateBlockId(oid, INFINITE_TIME);00179 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00180 blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a33">setSelectionLimit</a>(1);00181 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a22">select</a>(selectBlockReverse, dbCursorViewOnly, &interval)) { 00182 <span class="keywordflow">return</span> blocks->elements[blocks->used-1].time();00183 }00184 <span class="keywordflow">return</span> (time_t)-1;00185 }00186 <a name="l00192"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora5">00192</a> size_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora5">getNumberOfElements</a>(oid_t oid) 00193 {00194 Interval interval;00195 interval.from = generateBlockId(oid, 0);00196 interval.till = generateBlockId(oid, INFINITE_TIME);00197 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00198 <span class="keywordtype">int</span> n = 0;00199 <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)) {00200 <span class="keywordflow">do</span> { 00201 n += blocks->used;00202 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());00203 }00204 <span class="keywordflow">return</span> n;00205 }00206 <a name="l00216"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora6">00216</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) 00217 { 00218 Interval interval;00219 interval.from = generateBlockId(oid, from == 0 ? 0 : from - maxBlockTimeInterval);00220 interval.till = generateBlockId(oid, till);00221 <a class="code" href="classdbCursor.html">dbCursor< dbTimeSeriesBlock<T></a> > blocks;00222 size_t nSelected = 0;00223 <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)) { 00224 <span class="keywordflow">do</span> { 00225 <span class="keywordtype">int</span> n = blocks->used;00226 T <span class="keyword">const</span>* e = blocks->elements.<a class="code" href="classdbCursor.html#dbCursora2">get</a>();00227 <span class="keywordtype">int</span> l = 0, r = n;00228 <span class="keywordflow">while</span> (l < r) {00229 <span class="keywordtype">int</span> i = (l+r) >> 1;00230 <span class="keywordflow">if</span> (from > e[i].time()) { 00231 l = i+1;00232 } <span class="keywordflow">else</span> { 00233 r = i;00234 }00235 }00236 assert(l == r && (l == n || e[l].time() >= from)); 00237 <span class="keywordflow">while</span> (l < n && e[l].time() <= till) {00238 <span class="keywordflow">if</span> (nSelected < bufSize) { 00239 buf[nSelected] = e[l];00240 }00241 l += 1;00242 nSelected += 1;00243 }00244 } <span class="keywordflow">while</span> (blocks.<a class="code" href="classdbCursor.html#dbCursora3">next</a>());00245 }00246 <span class="keywordflow">return</span> nSelected;00247 } 00248 <a name="l00256"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora7">00256</a> <span class="keywordtype">bool</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora7">getElement</a>(oid_t oid, T& elem, time_t t) 00257 { 00258 <span class="keywordflow">return</span> <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora6">getInterval</a>(oid, t, t, &elem, 1) == 1;00259 } 00260 <a name="l00270"></a><a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora8">00270</a> size_t <a class="code" href="classdbTimeSeriesProcessor.html#dbTimeSeriesProcessora8">getFirstInterval</a>(oid_t oid, time_t till, T* buf, size_t bufSize) 00271 {00272 <span class="keywordflow">if</span> (bufSize == 0) { 00273 <span class="keywordflow">return</span> 0;00274 }00275 Interval interval;00276 interval.from = generateBlockId(oid, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -