00001
00002
00003
00004
00005 #ifndef IBIS_MENSA_H
00006 #define IBIS_MENSA_H
00007 #include "table.h"
00008 #include "array_t.h"
00009
00017 namespace ibis {
00018 class mensa;
00019 class liga;
00020 }
00021
00029 class ibis::mensa : public ibis::table {
00030 public:
00031 mensa() : nrows(0) {};
00032 explicit mensa(const char* dir);
00033 mensa(const char* dir1, const char* dir2);
00034 virtual ~mensa() {clear();}
00035
00036 virtual uint64_t nRows() const {return nrows;}
00037 virtual uint32_t nColumns() const;
00038
00039 virtual typeList columnTypes() const;
00040 virtual stringList columnNames() const;
00041 virtual int addPartition(const char* dir);
00042
00043 virtual void describe(std::ostream&) const;
00044 virtual void dumpNames(std::ostream&, const char*) const;
00045 virtual int dump(std::ostream&, const char*) const;
00046 virtual int dump(std::ostream&, uint64_t, const char*) const;
00047 virtual int dump(std::ostream&, uint64_t, uint64_t, const char*) const;
00048 virtual int backup(const char* dir, const char* tname=0,
00049 const char* tdesc=0) const;
00050
00051 virtual int64_t
00052 getColumnAsBytes(const char*, char*, uint64_t =0, uint64_t =0) const;
00053 virtual int64_t
00054 getColumnAsUBytes(const char*, unsigned char*, uint64_t =0, uint64_t =0) const;
00055 virtual int64_t
00056 getColumnAsShorts(const char*, int16_t*, uint64_t =0, uint64_t =0) const;
00057 virtual int64_t
00058 getColumnAsUShorts(const char*, uint16_t*, uint64_t =0, uint64_t =0) const;
00059 virtual int64_t
00060 getColumnAsInts(const char*, int32_t*, uint64_t =0, uint64_t =0) const;
00061 virtual int64_t
00062 getColumnAsUInts(const char*, uint32_t*, uint64_t =0, uint64_t =0) const;
00063 virtual int64_t
00064 getColumnAsLongs(const char*, int64_t*, uint64_t =0, uint64_t =0) const;
00065 virtual int64_t
00066 getColumnAsULongs(const char*, uint64_t*, uint64_t =0, uint64_t =0) const;
00067 virtual int64_t
00068 getColumnAsFloats(const char*, float*, uint64_t =0, uint64_t =0) const;
00069 virtual int64_t
00070 getColumnAsDoubles(const char*, double*, uint64_t =0, uint64_t =0) const;
00071 virtual int64_t
00072 getColumnAsDoubles(const char*, std::vector<double>&,
00073 uint64_t =0, uint64_t =0) const;
00074 virtual int64_t
00075 getColumnAsStrings(const char*, std::vector<std::string>&,
00076 uint64_t =0, uint64_t =0) const;
00077 virtual double getColumnMin(const char*) const;
00078 virtual double getColumnMax(const char*) const;
00079
00080 virtual long getHistogram(const char*, const char*,
00081 double, double, double,
00082 std::vector<uint32_t>&) const;
00083 virtual long getHistogram2D(const char*, const char*,
00084 double, double, double,
00085 const char*,
00086 double, double, double,
00087 std::vector<uint32_t>&) const;
00088 virtual long getHistogram3D(const char*, const char*,
00089 double, double, double,
00090 const char*,
00091 double, double, double,
00092 const char*,
00093 double, double, double,
00094 std::vector<uint32_t>&) const;
00095
00096 virtual void estimate(const char* cond,
00097 uint64_t& nmin, uint64_t& nmax) const;
00098 virtual void estimate(const ibis::qExpr* cond,
00099 uint64_t& nmin, uint64_t& nmax) const;
00100 using table::select;
00101 virtual table* select(const char* sel, const char* cond) const;
00102 virtual table* select2(const char* sel, const char* cond,
00103 const char* pts) const;
00104
00105 virtual void orderby(const stringList&, const std::vector<bool>&);
00106 virtual void orderby(const stringList&);
00107 virtual void orderby(const char *str) {ibis::table::orderby(str);}
00110 virtual void reverseRows() {};
00113 virtual table* groupby(const stringList&) const {return 0;}
00116 virtual table* groupby(const char *) const {return 0;}
00117
00118 virtual int buildIndex(const char*, const char*);
00119 virtual int buildIndexes(const char*);
00120 virtual const char* indexSpec(const char*) const;
00121 virtual void indexSpec(const char*, const char*);
00122 virtual int getPartitions(std::vector<const ibis::part*> &) const;
00123
00124
00125 class cursor;
00127 virtual ibis::table::cursor* createCursor() const;
00128
00129 protected:
00131 ibis::partList parts;
00133 ibis::table::namesTypes naty;
00134 uint64_t nrows;
00135
00137 void clear();
00139 int64_t computeHits(const char* cond) const {
00140 return ibis::table::computeHits
00141 (reinterpret_cast<const std::vector<const ibis::part*>&>(parts),
00142 cond);}
00143
00144 private:
00145
00146 mensa(const mensa&);
00147 mensa& operator=(const mensa&);
00148
00149 friend class cursor;
00150 };
00151
00152 class ibis::mensa::cursor : public ibis::table::cursor {
00153 public:
00154 cursor(const ibis::mensa& t);
00155 virtual ~cursor() {clearBuffers();};
00156
00157 virtual uint64_t nRows() const {return tab.nRows();}
00158 virtual uint32_t nColumns() const {return tab.nColumns();}
00159 virtual ibis::table::stringList columnNames() const {
00160 return tab.columnNames();}
00161 virtual ibis::table::typeList columnTypes() const {
00162 return tab.columnTypes();}
00163 virtual int fetch();
00164 virtual int fetch(uint64_t);
00165 virtual int fetch(ibis::table::row&);
00166 virtual int fetch(uint64_t, ibis::table::row&);
00167 virtual uint64_t getCurrentRowNumber() const {return curRow;}
00168 virtual int dump(std::ostream& out, const char* del) const;
00169
00170 int dumpBlock(std::ostream& out, const char* del);
00171 int dumpSome(std::ostream& out, uint64_t nr, const char* del);
00172
00173 virtual int getColumnAsByte(const char*, char&) const;
00174 virtual int getColumnAsUByte(const char*, unsigned char&) const;
00175 virtual int getColumnAsShort(const char*, int16_t&) const;
00176 virtual int getColumnAsUShort(const char*, uint16_t&) const;
00177 virtual int getColumnAsInt(const char*, int32_t&) const;
00178 virtual int getColumnAsUInt(const char*, uint32_t&) const;
00179 virtual int getColumnAsLong(const char*, int64_t&) const;
00180 virtual int getColumnAsULong(const char*, uint64_t&) const;
00181 virtual int getColumnAsFloat(const char*, float&) const;
00182 virtual int getColumnAsDouble(const char*, double&) const;
00183 virtual int getColumnAsString(const char*, std::string&) const;
00184
00185 virtual int getColumnAsByte(uint32_t, char&) const;
00186 virtual int getColumnAsUByte(uint32_t, unsigned char&) const;
00187 virtual int getColumnAsShort(uint32_t, int16_t&) const;
00188 virtual int getColumnAsUShort(uint32_t, uint16_t&) const;
00189 virtual int getColumnAsInt(uint32_t, int32_t&) const;
00190 virtual int getColumnAsUInt(uint32_t, uint32_t&) const;
00191 virtual int getColumnAsLong(uint32_t, int64_t&) const;
00192 virtual int getColumnAsULong(uint32_t, uint64_t&) const;
00193 virtual int getColumnAsFloat(uint32_t, float&) const;
00194 virtual int getColumnAsDouble(uint32_t, double&) const;
00195 virtual int getColumnAsString(uint32_t, std::string&) const;
00196
00197 protected:
00203 struct bufferElement {
00204 const char* cname;
00205 ibis::TYPE_T ctype;
00206 mutable void* cval;
00207
00208 bufferElement() : cname(0), ctype(ibis::UNKNOWN_TYPE), cval(0) {}
00209 ~bufferElement();
00210 };
00211 typedef std::map<const char*, uint32_t, ibis::lessi> bufferMap;
00212 std::vector<bufferElement> buffer;
00213 bufferMap bufmap;
00214 const ibis::mensa& tab;
00215 unsigned curPart;
00216 unsigned preferred_block_size;
00217 uint64_t pBegin;
00218 uint64_t bBegin;
00219 uint64_t bEnd;
00220 int64_t curRow;
00221
00222 void clearBuffers();
00223 int fillBuffers() const;
00224 int fillBuffer(uint32_t) const;
00225 void fillRow(ibis::table::row& res) const;
00226 int dumpIJ(std::ostream&, uint32_t, uint32_t) const;
00227
00228 private:
00229 cursor();
00230 cursor(const cursor&);
00231 cursor& operator=(const cursor&);
00232 };
00233
00242 class ibis::liga : public ibis::mensa {
00243 public:
00244 liga(ibis::part&);
00245 liga(const ibis::partList&);
00246 ~liga();
00247
00250 virtual int addPartition(const char*) {return -1;}
00251
00252 private:
00253 liga();
00254 liga(const liga&);
00255 liga& operator=(const liga&);
00256 };
00257
00258 inline int
00259 ibis::mensa::cursor::getColumnAsByte(const char* cn, char& val) const {
00260 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00261 return -1;
00262 bufferMap::const_iterator it = bufmap.find(cn);
00263 if (it != bufmap.end())
00264 return getColumnAsByte((*it).second, val);
00265 else
00266 return -2;
00267 }
00268
00269 inline int
00270 ibis::mensa::cursor::getColumnAsUByte(const char* cn,
00271 unsigned char& val) const {
00272 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00273 return -1;
00274 bufferMap::const_iterator it = bufmap.find(cn);
00275 if (it != bufmap.end())
00276 return getColumnAsUByte((*it).second, val);
00277 else
00278 return -2;
00279 }
00280
00281 inline int
00282 ibis::mensa::cursor::getColumnAsShort(const char* cn, int16_t& val) const {
00283 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00284 return -1;
00285 bufferMap::const_iterator it = bufmap.find(cn);
00286 if (it != bufmap.end())
00287 return getColumnAsShort((*it).second, val);
00288 else
00289 return -2;
00290 }
00291
00292 inline int
00293 ibis::mensa::cursor::getColumnAsUShort(const char* cn, uint16_t& val) const {
00294 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00295 return -1;
00296 bufferMap::const_iterator it = bufmap.find(cn);
00297 if (it != bufmap.end())
00298 return getColumnAsUShort((*it).second, val);
00299 else
00300 return -2;
00301 }
00302
00303 inline int
00304 ibis::mensa::cursor::getColumnAsInt(const char* cn, int32_t& val) const {
00305 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00306 return -1;
00307 bufferMap::const_iterator it = bufmap.find(cn);
00308 if (it != bufmap.end())
00309 return getColumnAsInt((*it).second, val);
00310 else
00311 return -2;
00312 }
00313
00314 inline int
00315 ibis::mensa::cursor::getColumnAsUInt(const char* cn, uint32_t& val) const {
00316 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00317 return -1;
00318 bufferMap::const_iterator it = bufmap.find(cn);
00319 if (it != bufmap.end())
00320 return getColumnAsUInt((*it).second, val);
00321 else
00322 return -2;
00323 }
00324
00325 inline int
00326 ibis::mensa::cursor::getColumnAsLong(const char* cn, int64_t& val) const {
00327 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00328 return -1;
00329 bufferMap::const_iterator it = bufmap.find(cn);
00330 if (it != bufmap.end())
00331 return getColumnAsLong((*it).second, val);
00332 else
00333 return -2;
00334 }
00335
00336 inline int
00337 ibis::mensa::cursor::getColumnAsULong(const char* cn, uint64_t& val) const {
00338 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00339 return -1;
00340 bufferMap::const_iterator it = bufmap.find(cn);
00341 if (it != bufmap.end())
00342 return getColumnAsULong((*it).second, val);
00343 else
00344 return -2;
00345 }
00346
00347 inline int
00348 ibis::mensa::cursor::getColumnAsFloat(const char* cn, float& val) const {
00349 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00350 return -1;
00351 bufferMap::const_iterator it = bufmap.find(cn);
00352 if (it != bufmap.end())
00353 return getColumnAsFloat((*it).second, val);
00354 else
00355 return -2;
00356 }
00357
00358 inline int
00359 ibis::mensa::cursor::getColumnAsDouble(const char* cn, double& val) const {
00360 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00361 return -1;
00362 bufferMap::const_iterator it = bufmap.find(cn);
00363 if (it != bufmap.end())
00364 return getColumnAsDouble((*it).second, val);
00365 else
00366 return -2;
00367 }
00368
00369 inline int
00370 ibis::mensa::cursor::getColumnAsString(const char* cn,
00371 std::string& val) const {
00372 if (curRow < 0 || curPart >= tab.parts.size() || cn == 0 || *cn == 0)
00373 return -1;
00374 bufferMap::const_iterator it = bufmap.find(cn);
00375 if (it != bufmap.end())
00376 return getColumnAsString((*it).second, val);
00377 else
00378 return -2;
00379 }
00380
00381 inline int
00382 ibis::mensa::dump(std::ostream& out, uint64_t nr, const char* del) const {
00383 if (parts.empty() || nr == 0) return 0;
00384 ibis::mensa::cursor cur(*this);
00385 int ierr = cur.dumpSome(out, nr, del);
00386 return ierr;
00387 }
00388
00389 inline int
00390 ibis::mensa::dump(std::ostream& out, uint64_t off, uint64_t nr,
00391 const char* del) const {
00392 if (parts.empty() || nr == 0 || off > nrows) return 0;
00393 ibis::mensa::cursor cur(*this);
00394 int ierr = cur.fetch(off);
00395 if (ierr < 0) return ierr;
00396
00397 ierr = cur.dumpSome(out, nr, del);
00398 return ierr;
00399 }
00400 #endif // IBIS_MENSA_H