00001
00002
00003
00004 #ifndef IBIS_TAB_H
00005 #define IBIS_TAB_H
00006
00020 #include "table.h"
00021 #include "array_t.h"
00022 #include <iostream>
00023
00024 namespace ibis {
00025 class tabula;
00026 class tabele;
00027 }
00028
00032 class ibis::tabula : public ibis::table {
00033 public:
00034 tabula(const char* na, const char* de, uint64_t nr) :
00035 table(na, de), nrows(nr) {};
00036 explicit tabula(uint32_t nr=0) : nrows(nr) {};
00037 virtual ~tabula() {};
00038 virtual uint64_t nRows() const {return nrows;}
00039 virtual uint32_t nColumns() const {return 0;}
00040
00041 virtual stringList columnNames() const;
00042 virtual typeList columnTypes() const;
00043
00044 virtual void describe(std::ostream&) const;
00045 virtual void dumpNames(std::ostream&, const char*) const {}
00046 virtual int dump(std::ostream&, const char*) const {return 0;}
00047 virtual int dump(std::ostream&, uint64_t, const char*) const {return 0;}
00048 virtual int dump(std::ostream&, uint64_t, uint64_t, const char*) const {
00049 return 0;}
00051 virtual int backup(const char*, const char* =0,
00052 const char* =0) const {return 0;}
00053
00054 virtual int64_t
00055 getColumnAsBytes(const char*, char*, uint64_t =0,
00056 uint64_t =0) const {return -1;}
00057 virtual int64_t
00058 getColumnAsUBytes(const char*, unsigned char*, uint64_t =0,
00059 uint64_t =0) const {return -1;}
00060 virtual int64_t
00061 getColumnAsShorts(const char*, int16_t*, uint64_t =0,
00062 uint64_t =0) const {return -1;}
00063 virtual int64_t
00064 getColumnAsUShorts(const char*, uint16_t*, uint64_t =0,
00065 uint64_t =0) const {return -1;}
00066 virtual int64_t
00067 getColumnAsInts(const char*, int32_t*, uint64_t =0,
00068 uint64_t =0) const {return -1;}
00069 virtual int64_t
00070 getColumnAsUInts(const char*, uint32_t*, uint64_t =0,
00071 uint64_t =0) const {return -1;}
00072 virtual int64_t
00073 getColumnAsLongs(const char*, int64_t*, uint64_t =0,
00074 uint64_t =0) const {return -1;}
00075 virtual int64_t
00076 getColumnAsULongs(const char*, uint64_t*, uint64_t =0,
00077 uint64_t =0) const {return -1;}
00078 virtual int64_t
00079 getColumnAsFloats(const char*, float*, uint64_t =0,
00080 uint64_t =0) const {return -1;}
00081 virtual int64_t
00082 getColumnAsDoubles(const char*, double*, uint64_t =0,
00083 uint64_t =0) const {return -1;}
00084 virtual int64_t
00085 getColumnAsDoubles(const char*, std::vector<double>&, uint64_t =0,
00086 uint64_t =0) const {return -1;}
00087 virtual int64_t
00088 getColumnAsStrings(const char*, std::vector<std::string>&, uint64_t =0,
00089 uint64_t =0) const {return -1;}
00090 virtual double getColumnMin(const char*) const {
00091 return (isfinite(FASTBIT_DOUBLE_NULL) ?
00092 DBL_MAX : FASTBIT_DOUBLE_NULL);}
00093 virtual double getColumnMax(const char*) const {
00094 return (isfinite(FASTBIT_DOUBLE_NULL) ?
00095 -DBL_MAX : FASTBIT_DOUBLE_NULL);}
00096
00097 virtual long getHistogram(const char*, const char*,
00098 double, double, double,
00099 std::vector<uint32_t>&) const {return -1;}
00100 virtual long getHistogram2D(const char*, const char*,
00101 double, double, double,
00102 const char*,
00103 double, double, double,
00104 std::vector<uint32_t>&) const {return -1;}
00105 virtual long getHistogram3D(const char*, const char*,
00106 double, double, double,
00107 const char*,
00108 double, double, double,
00109 const char*,
00110 double, double, double,
00111 std::vector<uint32_t>&) const {return -1;}
00112
00113 virtual void estimate(const char* cond,
00114 uint64_t& nmin, uint64_t& nmax) const;
00115 virtual void estimate(const ibis::qExpr* cond,
00116 uint64_t& nmin, uint64_t& nmax) const;
00117 using ibis::table::select;
00118 virtual table* select(const char*, const char*) const {return 0;}
00119
00120 virtual table* groupby(const stringList&) const {return 0;}
00121 virtual table* groupby(const char*) const {return 0;}
00122 virtual void orderby(const stringList&, const std::vector<bool>&) {};
00123 virtual void orderby(const stringList&) {};
00124 virtual void orderby(const char*) {};
00125 virtual void reverseRows() {};
00126
00127 virtual int buildIndex(const char*, const char*) {return -1;}
00128 virtual int buildIndexes(const char*) {return -1;}
00129 virtual const char* indexSpec(const char*) const {return 0;}
00130 virtual void indexSpec(const char*, const char*) {return;}
00131
00132
00133 class cursor;
00135 virtual ibis::table::cursor* createCursor() const;
00136
00137 private:
00139 uint64_t nrows;
00140
00141 tabula(const tabula&);
00142 tabula& operator=(const tabula&);
00143 };
00144
00150 class ibis::tabele : public ibis::table {
00151 public:
00154 tabele(const char* na, const char* de, uint64_t nr, const char* nm=0) :
00155 table(na, de), nrows(nr), col(nm && *nm ? nm : "nrows") {};
00159 explicit tabele(uint64_t nr=0, const char* nm=0) :
00160 nrows(nr), col(nm && *nm ? nm : "nrows") {};
00161 virtual ~tabele() {};
00162 virtual uint64_t nRows() const {return 1U;}
00163 virtual uint32_t nColumns() const {return 1U;}
00164
00165 virtual stringList columnNames() const;
00166 virtual typeList columnTypes() const;
00167
00168 virtual void describe(std::ostream&) const;
00169 virtual void dumpNames(std::ostream&, const char*) const;
00170 virtual int dump(std::ostream&, const char*) const;
00171 virtual int dump(std::ostream& out, uint64_t nr, const char* sep) const {
00172 if (nr > 0) return dump(out, sep); else return 0;}
00173 virtual int dump(std::ostream& out, uint64_t off, uint64_t nr,
00174 const char* sep) const {
00175 if (off==0 && nr > 0) return dump(out, sep); else return 0;}
00177 virtual int backup(const char*, const char* =0,
00178 const char* =0) const {return 0;}
00179
00180 virtual int64_t getColumnAsBytes(const char*, char*, uint64_t =0,
00181 uint64_t =0) const {return -1;}
00182 virtual int64_t getColumnAsUBytes(const char*,
00183 unsigned char*, uint64_t =0,
00184 uint64_t =0) const {return -1;}
00185 virtual int64_t getColumnAsShorts(const char*,
00186 int16_t*, uint64_t =0,
00187 uint64_t =0) const {return -1;}
00188 virtual int64_t getColumnAsUShorts(const char*,
00189 uint16_t*, uint64_t =0,
00190 uint64_t =0) const {return -1;}
00191 virtual int64_t getColumnAsInts(const char*, int32_t*, uint64_t =0,
00192 uint64_t =0) const {return -1;}
00193 virtual int64_t getColumnAsUInts(const char* cn, uint32_t* vals,
00194 uint64_t begin =0, uint64_t =0) const {
00195 if (stricmp(col.c_str(), cn) == 0) {
00196 if (begin == 0) {
00197 *vals = static_cast<uint32_t>(nrows);
00198 return 1;
00199 }
00200 else {
00201 return 0;
00202 }
00203 }
00204 else {
00205 return -1;
00206 }
00207 }
00208 virtual int64_t getColumnAsLongs(const char* cn, int64_t* vals,
00209 uint64_t begin =0, uint64_t =0) const {
00210 if (stricmp(col.c_str(), cn) == 0) {
00211 if (begin == 0) {
00212 *vals = nrows;
00213 return 1;
00214 }
00215 else {
00216 return 0;
00217 }
00218 }
00219 else {
00220 return -1;
00221 }
00222 }
00223 virtual int64_t getColumnAsULongs(const char* cn, uint64_t* vals,
00224 uint64_t begin =0, uint64_t =0) const {
00225 if (stricmp(col.c_str(), cn) == 0) {
00226 if (begin == 0) {
00227 *vals = nrows;
00228 return 1;
00229 }
00230 else {
00231 return 0;
00232 }
00233 }
00234 else {
00235 return -1;
00236 }
00237 }
00238 virtual int64_t getColumnAsFloats(const char*, float*, uint64_t =0,
00239 uint64_t =0) const {return -1;}
00240 virtual int64_t getColumnAsDoubles(const char*, double*, uint64_t =0,
00241 uint64_t =0) const {return -1;}
00242 virtual int64_t
00243 getColumnAsDoubles(const char*, std::vector<double>&, uint64_t =0,
00244 uint64_t =0) const {return -1;}
00245 virtual int64_t
00246 getColumnAsStrings(const char*, std::vector<std::string>&, uint64_t =0,
00247 uint64_t =0) const {return -1;}
00248 virtual double getColumnMin(const char* cn) const {
00249 if (stricmp(cn, col.c_str()) == 0)
00250 return nrows;
00251 else
00252 return (isfinite(FASTBIT_DOUBLE_NULL) ?
00253 DBL_MAX : FASTBIT_DOUBLE_NULL);
00254 }
00255 virtual double getColumnMax(const char* cn) const {
00256 if (stricmp(cn, col.c_str()) == 0)
00257 return nrows;
00258 else
00259 return (isfinite(FASTBIT_DOUBLE_NULL) ?
00260 -DBL_MAX : FASTBIT_DOUBLE_NULL);
00261 }
00262
00263 virtual long getHistogram(const char*, const char*,
00264 double, double, double,
00265 std::vector<uint32_t>&) const {return -1;}
00266 virtual long getHistogram2D(const char*, const char*,
00267 double, double, double,
00268 const char*,
00269 double, double, double,
00270 std::vector<uint32_t>&) const {return -1;}
00271 virtual long getHistogram3D(const char*, const char*,
00272 double, double, double,
00273 const char*,
00274 double, double, double,
00275 const char*,
00276 double, double, double,
00277 std::vector<uint32_t>&) const {return -1;}
00278
00279 virtual void estimate(const char* cond,
00280 uint64_t& nmin, uint64_t& nmax) const;
00281 virtual void estimate(const ibis::qExpr* cond,
00282 uint64_t& nmin, uint64_t& nmax) const;
00283 using ibis::table::select;
00284 virtual table* select(const char*, const char*) const {return 0;}
00285
00286 virtual table* groupby(const stringList&) const {return 0;}
00287 virtual table* groupby(const char*) const {return 0;}
00288 virtual void orderby(const stringList&, const std::vector<bool>&) {};
00289 virtual void orderby(const stringList&) {};
00290 virtual void orderby(const char*) {};
00291 virtual void reverseRows() {};
00292
00293 virtual int buildIndex(const char*, const char*) {return -1;}
00294 virtual int buildIndexes(const char*) {return -1;}
00295 virtual const char* indexSpec(const char*) const {return 0;}
00296 virtual void indexSpec(const char*, const char*) {return;}
00297
00298
00299 class cursor;
00301 virtual ibis::table::cursor* createCursor() const;
00302
00303 const char* colName() const {return col.c_str();}
00304
00305 private:
00306
00307 uint64_t nrows;
00308
00309 std::string col;
00310
00311 tabele(const tabele&);
00312 tabele& operator=(const tabele&);
00313
00314 friend class cursor;
00315 };
00316
00317
00318 inline ibis::table::stringList ibis::tabula::columnNames() const {
00319 ibis::table::stringList tmp;
00320 return tmp;
00321 }
00322
00323 inline ibis::table::typeList ibis::tabula::columnTypes() const {
00324 ibis::table::typeList tmp;
00325 return tmp;
00326 }
00327
00328 inline void ibis::tabula::describe(std::ostream& out) const {
00329 out << "Table " << name_ << " (" << desc_ << ") contains "
00330 << nrows << " row" << (nrows > 1 ? "s" : "")
00331 << " but no columns" << std::endl;
00332 }
00333
00334 inline void
00335 ibis::tabula::estimate(const char*, uint64_t& nmin, uint64_t& nmax) const {
00336 nmin = 0;
00337 nmax = nrows;
00338 }
00339
00340 inline void
00341 ibis::tabula::estimate(const ibis::qExpr*,
00342 uint64_t& nmin, uint64_t& nmax) const {
00343 nmin = 0;
00344 nmax = nrows;
00345 }
00346
00347 class ibis::tabula::cursor : public ibis::table::cursor {
00348 public:
00349 cursor(const ibis::tabula& t) : tab(t) {}
00350 virtual ~cursor() {};
00351
00352 virtual uint64_t nRows() const {return tab.nRows();}
00353 virtual uint32_t nColumns() const {return tab.nColumns();}
00354 virtual ibis::table::stringList columnNames() const {
00355 return tab.columnNames();}
00356 virtual ibis::table::typeList columnTypes() const {
00357 return tab.columnTypes();}
00358 virtual int fetch() {return -1;}
00359 virtual int fetch(uint64_t) {return -1;}
00360 virtual int fetch(ibis::table::row&) {return -1;}
00361 virtual int fetch(uint64_t, ibis::table::row&) {return -1;}
00362 virtual uint64_t getCurrentRowNumber() const {return tab.nRows();}
00363 virtual int dump(std::ostream&, const char* del) const {return 0;}
00364
00365 virtual int getColumnAsByte(const char*, char&) const {return -1;}
00366 virtual int getColumnAsUByte(const char*, unsigned char&) const
00367 {return -1;}
00368 virtual int getColumnAsShort(const char*, int16_t&) const {return -1;}
00369 virtual int getColumnAsUShort(const char*, uint16_t&) const {return -1;}
00370 virtual int getColumnAsInt(const char*, int32_t&) const {return -1;}
00371 virtual int getColumnAsUInt(const char*, uint32_t&) const {return -1;}
00372 virtual int getColumnAsLong(const char*, int64_t&) const {return -1;}
00373 virtual int getColumnAsULong(const char*, uint64_t&) const {return -1;}
00374 virtual int getColumnAsFloat(const char*, float&) const {return -1;}
00375 virtual int getColumnAsDouble(const char*, double&) const {return -1;}
00376 virtual int getColumnAsString(const char*, std::string&) const {return -1;}
00377
00378 virtual int getColumnAsByte(uint32_t, char&) const {return -1;}
00379 virtual int getColumnAsUByte(uint32_t, unsigned char&) const {return -1;}
00380 virtual int getColumnAsShort(uint32_t, int16_t&) const {return -1;}
00381 virtual int getColumnAsUShort(uint32_t, uint16_t&) const {return -1;}
00382 virtual int getColumnAsInt(uint32_t, int32_t&) const {return -1;}
00383 virtual int getColumnAsUInt(uint32_t, uint32_t&) const {return -1;}
00384 virtual int getColumnAsLong(uint32_t, int64_t&) const {return -1;}
00385 virtual int getColumnAsULong(uint32_t, uint64_t&) const {return -1;}
00386 virtual int getColumnAsFloat(uint32_t, float&) const {return -1;}
00387 virtual int getColumnAsDouble(uint32_t, double&) const {return -1;}
00388 virtual int getColumnAsString(uint32_t, std::string&) const {return -1;}
00389
00390 private:
00391 const ibis::tabula& tab;
00392
00393 cursor();
00394 cursor(const cursor&);
00395 cursor& operator=(const cursor&);
00396 };
00397
00398 inline ibis::table::cursor* ibis::tabula::createCursor() const {
00399 return new ibis::tabula::cursor(*this);
00400 }
00401
00402 inline ibis::table::stringList ibis::tabele::columnNames() const {
00403 ibis::table::stringList tmp(1);
00404 tmp[0] = col.c_str();
00405 return tmp;
00406 }
00407
00408 inline ibis::table::typeList ibis::tabele::columnTypes() const {
00409 ibis::table::typeList tmp(1);
00410 tmp[0] = ibis::ULONG;
00411 return tmp;
00412 }
00413
00414 inline void ibis::tabele::describe(std::ostream& out) const {
00415 out << "Table " << name_ << " (" << desc_
00416 << ") contains 1 column and 1 row\n"
00417 << col << "\t" << ibis::TYPESTRING[(int)ibis::ULONG] << "\n"
00418 << std::endl;
00419 }
00420
00421 inline void ibis::tabele::dumpNames(std::ostream& out, const char*) const {
00422 out << col << std::endl;
00423 }
00424
00425 inline int ibis::tabele::dump(std::ostream& out, const char *) const {
00426 out << nrows << std::endl;
00427 return 0;
00428 }
00429
00430 inline void
00431 ibis::tabele::estimate(const char*, uint64_t& nmin, uint64_t& nmax) const {
00432 nmin = 0;
00433 nmax = 1;
00434 }
00435
00436 inline void
00437 ibis::tabele::estimate(const ibis::qExpr*,
00438 uint64_t& nmin, uint64_t& nmax) const {
00439 nmin = 0;
00440 nmax = 1;
00441 }
00442
00443 class ibis::tabele::cursor : public ibis::table::cursor {
00444 public:
00445 cursor(const ibis::tabele& t) : tab(t), current(-1) {}
00446 virtual ~cursor() {};
00447
00448 virtual uint64_t nRows() const {return tab.nRows();}
00449 virtual uint32_t nColumns() const {return tab.nColumns();}
00450 virtual ibis::table::stringList columnNames() const {
00451 return tab.columnNames();}
00452 virtual ibis::table::typeList columnTypes() const {
00453 return tab.columnTypes();}
00454 virtual int fetch() {
00455 ++ current;
00456 return (static_cast<uint64_t>(current) < tab.nRows() ? 0 : -1);}
00457 virtual int fetch(uint64_t irow) {
00458 if (irow < tab.nRows()) {
00459 current = irow;
00460 return 0;
00461 }
00462 else {
00463 return -1;
00464 }}
00465 virtual int fetch(ibis::table::row& res) {
00466 ++ current;
00467 res.clear();
00468 if (current == 0) {
00469 res.ulongsnames.push_back(tab.col);
00470 res.ulongsvalues.push_back(tab.nrows);
00471 return 0;
00472 }
00473 else {
00474 return -1;
00475 }
00476 }
00477 virtual int fetch(uint64_t irow, ibis::table::row& res) {
00478 res.clear();
00479 if (irow < 1U) {
00480 current = 0U;
00481 res.ulongsnames.push_back(tab.col);
00482 res.ulongsvalues.push_back(tab.nrows);
00483 return 0;
00484 }
00485 else {
00486 return -1;
00487 }
00488 }
00489 virtual uint64_t getCurrentRowNumber() const {return current;}
00490 virtual int dump(std::ostream& out, const char* del) const {
00491 if (current == 0) {
00492 out << tab.nrows << "\n";
00493 return 0;
00494 }
00495 else {
00496 return -1;
00497 }
00498 }
00499
00500 virtual int getColumnAsByte(const char*, char&) const {return -1;}
00501 virtual int getColumnAsUByte(const char*, unsigned char&) const {
00502 return -1;}
00503 virtual int getColumnAsShort(const char*, int16_t&) const {return -1;}
00504 virtual int getColumnAsUShort(const char*, uint16_t&) const {return -1;}
00505 virtual int getColumnAsInt(const char*, int32_t&) const {return -1;}
00506 virtual int getColumnAsUInt(const char* cn, uint32_t&) const {
00507 return -1;}
00508 virtual int getColumnAsLong(const char* cn, int64_t& val) const {
00509 if (current == 0 && stricmp(tab.colName(), cn) == 0) {
00510 val = tab.nrows;
00511 return 1;}
00512 else {
00513 return -1;
00514 }
00515 }
00516 virtual int getColumnAsULong(const char* cn, uint64_t& val) const {
00517 if (current == 0 && stricmp(tab.colName(), cn) == 0) {
00518 val = tab.nrows;
00519 return 1;}
00520 else {
00521 return -1;
00522 }
00523 }
00524 virtual int getColumnAsFloat(const char*, float&) const {return -1;}
00525 virtual int getColumnAsDouble(const char*, double&) const {return -1;}
00526 virtual int getColumnAsString(const char*, std::string&) const {return -1;}
00527
00528 virtual int getColumnAsByte(uint32_t, char&) const {return -1;}
00529 virtual int getColumnAsUByte(uint32_t, unsigned char&) const {return -1;}
00530 virtual int getColumnAsShort(uint32_t, int16_t&) const {return -1;}
00531 virtual int getColumnAsUShort(uint32_t, uint16_t&) const {return -1;}
00532 virtual int getColumnAsInt(uint32_t, int32_t&) const {return -1;}
00533 virtual int getColumnAsUInt(uint32_t cn, uint32_t&) const {
00534 return -1;}
00535 virtual int getColumnAsLong(uint32_t cn, int64_t& val) const {
00536 if (current == 0 && cn == 0) {
00537 val = tab.nrows;
00538 return 1;}
00539 else {
00540 return -1;
00541 }}
00542 virtual int getColumnAsULong(uint32_t cn, uint64_t& val) const {
00543 if (current == 0 && cn == 0) {
00544 val = tab.nrows;
00545 return 1;}
00546 else {
00547 return -1;
00548 }}
00549 virtual int getColumnAsFloat(uint32_t, float&) const {return -1;}
00550 virtual int getColumnAsDouble(uint32_t, double&) const {return -1;}
00551 virtual int getColumnAsString(uint32_t, std::string&) const {return -1;}
00552
00553 private:
00554 const ibis::tabele& tab;
00555 int64_t current;
00556
00557 cursor();
00558 cursor(const cursor&);
00559 cursor& operator=(const cursor&);
00560 };
00561
00562 inline ibis::table::cursor* ibis::tabele::createCursor() const {
00563 return new ibis::tabele::cursor(*this);
00564 }
00565 #endif // IBIS_TAB_H