📄 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_NAMESPACE
00017
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_int4 used;
00073 db_int8 blockId;
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_4a20">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_4a20">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_4a31">setSelectionLimit</a>(1);
00163 <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)) {
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_4a31">setSelectionLimit</a>(1);
00181 <span class="keywordflow">if</span> (blocks.<a class="code" href="classdbAnyCursor.html#dbCursor_3_01dbTimeSeriesBlock_3_01T_01_4_01_4a20">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_4a20">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_4a20">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 + -