bord110517.h
Go to the documentation of this file.
00001 // File: $Id$
00002 // Author: John Wu <John.Wu at acm.org>
00003 //      Lawrence Berkeley National Laboratory
00004 // Copyright 2007-2011 the Regents of the University of California
00005 #ifndef IBIS_BORD_H
00006 #define IBIS_BORD_H
00007 #include "table.h"      // ibis::table
00008 #include "util.h"       // ibis::partList
00009 #include "part.h"       // ibis::part
00010 
00014 namespace ibis {
00015     class bord;
00016 } // namespace ibis
00017 
00028 class FASTBIT_CXX_DLLSPEC ibis::bord : public ibis::table {
00029 public:
00030     bord(const char *tn, const char *td, uint64_t nr,
00031          ibis::table::bufferList &buf,
00032          const ibis::table::typeList &ct,
00033          const ibis::table::stringList &cn,
00034          const ibis::table::stringList *cdesc=0);
00035     virtual ~bord() {clear();}
00036 
00037     virtual uint64_t nRows() const {return mypart.nRows();}
00038     virtual uint32_t nColumns() const {return mypart.nColumns();}
00039 
00040     virtual ibis::table::stringList columnNames() const;
00041     virtual ibis::table::typeList columnTypes() const;
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 getColumnAsBytes(const char*, char*) const;
00052     virtual int64_t getColumnAsUBytes(const char*, unsigned char*) const;
00053     virtual int64_t getColumnAsShorts(const char*, int16_t*) const;
00054     virtual int64_t getColumnAsUShorts(const char*, uint16_t*) const;
00055     virtual int64_t getColumnAsInts(const char*, int32_t*) const;
00056     virtual int64_t getColumnAsUInts(const char*, uint32_t*) const;
00057     virtual int64_t getColumnAsLongs(const char*, int64_t*) const;
00058     virtual int64_t getColumnAsULongs(const char*, uint64_t*) const;
00059     virtual int64_t getColumnAsFloats(const char*, float*) const;
00060     virtual int64_t getColumnAsDoubles(const char*, double*) const;
00061     virtual int64_t getColumnAsDoubles(const char*,
00062                                        std::vector<double>&) const;
00063     virtual int64_t getColumnAsStrings(const char*,
00064                                        std::vector<std::string>&) const;
00065 
00066     virtual long getHistogram(const char*, const char*,
00067                               double, double, double,
00068                               std::vector<uint32_t>&) const;
00069     virtual long getHistogram2D(const char*, const char*,
00070                                 double, double, double,
00071                                 const char*,
00072                                 double, double, double,
00073                                 std::vector<uint32_t>&) const;
00074     virtual long getHistogram3D(const char*, const char*,
00075                                 double, double, double,
00076                                 const char*,
00077                                 double, double, double,
00078                                 const char*,
00079                                 double, double, double,
00080                                 std::vector<uint32_t>&) const;
00081 
00082     virtual void estimate(const char* cond,
00083                           uint64_t& nmin, uint64_t& nmax) const;
00084     virtual void estimate(const ibis::qExpr* cond,
00085                           uint64_t& nmin, uint64_t& nmax) const;
00086     using table::select;
00087     virtual table* select(const char* sel, const char* cond) const;
00088     virtual table* groupby(const ibis::table::stringList&) const;
00089     virtual table* groupby(const char* str) const;
00090     virtual void orderby(const ibis::table::stringList&);
00091     virtual void orderby(const char* str) {
00092         ibis::table::orderby(str);
00093     }
00094     virtual void reverseRows();
00095 
00096     virtual int buildIndex(const char*, const char*) {return -1;}
00097     virtual int buildIndexes(const char*) {return -1;}
00098     virtual const char* indexSpec(const char*) const {return 0;}
00099     virtual void indexSpec(const char*, const char*) {return;}
00100     virtual int getPartitions(std::vector<const ibis::part*> &) const;
00101 
00102     // Cursor class for row-wise data accesses.
00103     class cursor;
00105     virtual ibis::table::cursor* createCursor() const;
00106 
00107     int restoreCategoriesAsStrings(const ibis::part&, const char*);
00108     ibis::table* groupby(const ibis::selectClause&) const;
00109     ibis::table* evaluateTerms(const ibis::selectClause&,
00110                                const char*) const;
00111 
00112     class column;
00113     class text;
00115     class part : public ibis::part {
00116     public:
00117         part(const char *tn, const char *td, uint64_t nr,
00118              const ibis::table::stringList &cn,
00119              const ibis::table::typeList   &ct,
00120              ibis::table::bufferList       &buf,
00121              const ibis::table::stringList *cdesc=0);
00122 
00123         ibis::table* groupby(const ibis::selectClause&) const;
00124         ibis::table* evaluateTerms(const ibis::selectClause&,
00125                                    const char*) const;
00126         virtual long reorder(const ibis::table::stringList&);
00127         virtual long reorder() {return ibis::part::reorder();}
00128 
00129         int dump(std::ostream&, uint32_t, const char*) const;
00130         int dump(std::ostream&, uint32_t, uint32_t, const char*) const;
00131         int backup(const char*, const char*, const char*) const;
00132 
00133         void describe(std::ostream&) const;
00134         void dumpNames(std::ostream&, const char*) const;
00135         void reverseRows();
00136         int limit(uint32_t);
00137 
00138         template <typename T>
00139         long sortValues(array_t<T>& vals,
00140                         const array_t<uint32_t>& indin,
00141                         array_t<uint32_t>& indout,
00142                         array_t<uint32_t>& starts) const;
00143         template <typename T>
00144         long reorderValues(array_t<T>& vals,
00145                            const array_t<uint32_t>& ind) const;
00146         long sortStrings(std::vector<std::string>& vals,
00147                          const array_t<uint32_t>& idxin,
00148                          array_t<uint32_t>& idxout,
00149                          array_t<uint32_t>& starts) const;
00150         long reorderStrings(std::vector<std::string>& vals,
00151                             const array_t<uint32_t>& ind) const;
00152 
00153         int restoreCategoriesAsStrings(const ibis::part&, const char*);
00154 
00155     private:
00156         part();
00157         part(const part&);
00158         part& operator=(const part&);
00159     }; // ibis::bord::part
00160 
00161     static void copyValue(ibis::TYPE_T type,
00162                           void* outbuf, size_t outpos,
00163                           const void* inbuf, size_t inpos);
00164 
00165 protected:
00166     part mypart; 
00167 
00169     void clear();
00171     int64_t computeHits(const char* cond) const;
00172 
00173 private:
00174     // disallow copying.
00175     bord(const bord&);
00176     bord& operator=(const bord&);
00177 
00178     friend class cursor;
00179 }; // ibis::bord
00180 
00190 class ibis::bord::column : public ibis::column {
00191 public:
00192     column(const ibis::bord::part* tbl, ibis::TYPE_T t,
00193            const char* name, void *buf,
00194            const char* desc="", double low=DBL_MAX, double high=-DBL_MAX);
00195     column(const ibis::bord::part*, const ibis::column&, void *buf);
00196     column(const column& rhs);
00197     virtual ~column();
00198 
00199     virtual ibis::fileManager::storage* getRawData() const;
00200 
00201     using ibis::column::evaluateRange;
00202     virtual long evaluateRange(const ibis::qContinuousRange& cmp,
00203                                const ibis::bitvector& mask,
00204                                ibis::bitvector& res) const;
00205     virtual long evaluateRange(const ibis::qDiscreteRange& cmp,
00206                                const ibis::bitvector& mask,
00207                                ibis::bitvector& res) const;
00208     virtual long stringSearch(const char*, ibis::bitvector&) const;
00209     virtual long stringSearch(const std::vector<std::string>&,
00210                               ibis::bitvector&) const;
00211     virtual long stringSearch(const char*) const;
00212     virtual long stringSearch(const std::vector<std::string>&) const;
00213     virtual long keywordSearch(const char*, ibis::bitvector&) const;
00214     virtual long keywordSearch(const char*) const;
00215     virtual long patternSearch(const char*) const;
00216     virtual long patternSearch(const char*, ibis::bitvector &) const;
00217 
00218     virtual array_t<signed char>*   selectBytes(const ibis::bitvector&) const;
00219     virtual array_t<unsigned char>* selectUBytes(const ibis::bitvector&) const;
00220     virtual array_t<int16_t>*       selectShorts(const ibis::bitvector&) const;
00221     virtual array_t<uint16_t>*      selectUShorts(const ibis::bitvector&) const;
00222     virtual array_t<int32_t>*       selectInts(const ibis::bitvector&) const;
00223     virtual array_t<uint32_t>*      selectUInts(const ibis::bitvector&) const;
00224     virtual array_t<int64_t>*       selectLongs(const ibis::bitvector&) const;
00225     virtual array_t<uint64_t>*      selectULongs(const ibis::bitvector&) const;
00226     virtual array_t<float>*         selectFloats(const ibis::bitvector&) const;
00227     virtual array_t<double>*        selectDoubles(const ibis::bitvector&) const;
00228     virtual std::vector<std::string>*
00229         selectStrings(const bitvector& mask) const;
00230 
00231     virtual void computeMinMax() {
00232         computeMinMax(thePart->currentDataDir(), lower, upper);}
00233     virtual void computeMinMax(const char *dir) {
00234         computeMinMax(dir, lower, upper);}
00235     virtual void computeMinMax(const char *, double &min, double &max) const;
00236     virtual void getString(uint32_t i, std::string &val) const;
00237     virtual int  getValuesArray(void* vals) const;
00238 
00239     void reverseRows();
00240     int  limit(uint32_t nr);
00241 
00242     void* getArray() const {return buffer;}
00243     int dump(std::ostream& out, uint32_t i) const;
00244 
00245     int restoreCategoriesAsStrings(const ibis::part&);
00246 
00247 protected:
00250     void *buffer;
00251 
00252     column& operator=(const column&); // no assignment
00253 }; // ibis::bord::column
00254 
00255 class FASTBIT_CXX_DLLSPEC ibis::bord::cursor : public ibis::table::cursor {
00256 public:
00257     cursor(const ibis::bord& t);
00258     virtual ~cursor() {};
00259 
00260     virtual uint64_t nRows() const {return tab.nRows();}
00261     virtual uint32_t nColumns() const {return tab.nColumns();}
00262     virtual ibis::table::stringList columnNames() const {
00263         return tab.columnNames();}
00264     virtual ibis::table::typeList columnTypes() const {
00265         return tab.columnTypes();}
00266     virtual int fetch();
00267     virtual int fetch(uint64_t);
00268     virtual int fetch(ibis::table::row&);
00269     virtual int fetch(uint64_t, ibis::table::row&);
00270     virtual uint64_t getCurrentRowNumber() const {return curRow;}
00271     virtual int dump(std::ostream& out, const char* del) const;
00272 
00273     virtual int getColumnAsByte(const char*, char&) const;
00274     virtual int getColumnAsUByte(const char*, unsigned char&) const;
00275     virtual int getColumnAsShort(const char*, int16_t&) const;
00276     virtual int getColumnAsUShort(const char*, uint16_t&) const;
00277     virtual int getColumnAsInt(const char*, int32_t&) const;
00278     virtual int getColumnAsUInt(const char*, uint32_t&) const;
00279     virtual int getColumnAsLong(const char*, int64_t&) const;
00280     virtual int getColumnAsULong(const char*, uint64_t&) const;
00281     virtual int getColumnAsFloat(const char*, float&) const;
00282     virtual int getColumnAsDouble(const char*, double&) const;
00283     virtual int getColumnAsString(const char*, std::string&) const;
00284 
00285     virtual int getColumnAsByte(uint32_t, char&) const;
00286     virtual int getColumnAsUByte(uint32_t, unsigned char&) const;
00287     virtual int getColumnAsShort(uint32_t, int16_t&) const;
00288     virtual int getColumnAsUShort(uint32_t, uint16_t&) const;
00289     virtual int getColumnAsInt(uint32_t, int32_t&) const;
00290     virtual int getColumnAsUInt(uint32_t, uint32_t&) const;
00291     virtual int getColumnAsLong(uint32_t, int64_t&) const;
00292     virtual int getColumnAsULong(uint32_t, uint64_t&) const;
00293     virtual int getColumnAsFloat(uint32_t, float&) const;
00294     virtual int getColumnAsDouble(uint32_t, double&) const;
00295     virtual int getColumnAsString(uint32_t, std::string&) const;
00296 
00297 protected:
00298     struct bufferElement {
00299         const char* cname;
00300         ibis::TYPE_T ctype;
00301         void* cval;
00302 
00303         bufferElement() : cname(0), ctype(ibis::UNKNOWN_TYPE), cval(0) {}
00304     }; // bufferElement
00305     typedef std::map<const char*, uint32_t, ibis::lessi> bufferMap;
00306     std::vector<bufferElement> buffer;
00307     bufferMap bufmap;
00308     const ibis::bord& tab;
00309     int64_t curRow; // the current row number
00310 
00311     void fillRow(ibis::table::row& res) const;
00312     int dumpIJ(std::ostream&, uint32_t, uint32_t) const;
00313 
00314 private:
00315     cursor();
00316     cursor(const cursor&);
00317     cursor& operator=(const cursor&);
00318 }; // ibis::bord::cursor
00319 
00323 inline void ibis::bord::copyValue(ibis::TYPE_T type,
00324                                   void* outbuf, size_t outpos,
00325                                   const void* inbuf, size_t inpos) {
00326     switch (type) {
00327     default:
00328         break;
00329     case ibis::BYTE: {
00330         (*static_cast<array_t<signed char>*>(outbuf))[outpos]
00331             = (*static_cast<const array_t<signed char>*>(inbuf))[inpos];
00332         break;}
00333     case ibis::UBYTE: {
00334         (*static_cast<array_t<unsigned char>*>(outbuf))[outpos]
00335             = (*static_cast<const array_t<unsigned char>*>(inbuf))[inpos];
00336         break;}
00337     case ibis::SHORT: {
00338         (*static_cast<array_t<int16_t>*>(outbuf))[outpos]
00339             = (*static_cast<const array_t<int16_t>*>(inbuf))[inpos];
00340         break;}
00341     case ibis::USHORT: {
00342         (*static_cast<array_t<uint16_t>*>(outbuf))[outpos]
00343             = (*static_cast<const array_t<uint16_t>*>(inbuf))[inpos];
00344         LOGGER(ibis::gVerbose > 5)
00345             << "DEBUG -- copied inbuf[" << inpos << "] (="
00346             << (*static_cast<const array_t<uint16_t>*>(inbuf))[inpos]
00347             << ") to outbuf[" << outpos << "] (="
00348             << (*static_cast<array_t<uint16_t>*>(outbuf))[outpos] << ')';
00349         break;}
00350     case ibis::INT: {
00351         (*static_cast<array_t<int32_t>*>(outbuf))[outpos]
00352             = (*static_cast<const array_t<int32_t>*>(inbuf))[inpos];
00353         break;}
00354     case ibis::UINT: {
00355         (*static_cast<array_t<uint32_t>*>(outbuf))[outpos]
00356             = (*static_cast<const array_t<uint32_t>*>(inbuf))[inpos];
00357         break;}
00358     case ibis::LONG: {
00359         (*static_cast<array_t<int64_t>*>(outbuf))[outpos]
00360             = (*static_cast<const array_t<int64_t>*>(inbuf))[inpos];
00361         break;}
00362     case ibis::ULONG: {
00363         (*static_cast<array_t<uint64_t>*>(outbuf))[outpos]
00364             = (*static_cast<const array_t<uint64_t>*>(inbuf))[inpos];
00365         break;}
00366     case ibis::FLOAT: {
00367         (*static_cast<array_t<float>*>(outbuf))[outpos]
00368             = (*static_cast<const array_t<float>*>(inbuf))[inpos];
00369         break;}
00370     case ibis::DOUBLE: {
00371         (*static_cast<array_t<double>*>(outbuf))[outpos]
00372             = (*static_cast<const array_t<double>*>(inbuf))[inpos];
00373         break;}
00374     case ibis::TEXT:
00375     case ibis::CATEGORY: {
00376         (*static_cast<std::vector<std::string>*>(outbuf))[outpos]
00377         = (*static_cast<const std::vector<std::string>*>(inbuf))[inpos];
00378         break;}
00379     }
00380 } //ibis::bord::copyValue
00381 
00382 inline void ibis::bord::describe(std::ostream &out) const {
00383     mypart.describe(out);
00384 } // ibis::bord::describe
00385 
00386 inline void ibis::bord::dumpNames(std::ostream &out, const char* del) const {
00387     mypart.dumpNames(out, del);
00388 } // ibis::bord::dumpNames
00389 
00390 inline int ibis::bord::dump(std::ostream &out, const char* del) const {
00391     return mypart.dump(out, mypart.nRows(), del);
00392 } // ibis::bord::dump
00393 
00394 inline int ibis::bord::dump(std::ostream &out, uint64_t nr,
00395                             const char* del) const {
00396     if (nr == static_cast<uint32_t>(nr))
00397         return mypart.dump(out, static_cast<uint32_t>(nr), del);
00398     else
00399         return -5;
00400 } // ibis::bord::dump
00401 
00402 inline int ibis::bord::dump(std::ostream &out, uint64_t off, uint64_t nr,
00403                             const char* del) const {
00404     if (off == static_cast<uint32_t>(off) &&
00405         nr == static_cast<uint32_t>(nr))
00406         return mypart.dump(out, static_cast<uint32_t>(off),
00407                            static_cast<uint32_t>(nr), del);
00408     else
00409         return -5;
00410 } // ibis::bord::dump
00411 
00412 inline int ibis::bord::backup(const char* dir, const char* tname,
00413                               const char* tdesc) const {
00414     return mypart.backup(dir, tname, tdesc);
00415 } // ibis::bord::backup
00416 
00417 inline ibis::table* ibis::bord::groupby(const ibis::selectClause &sc) const {
00418     return mypart.groupby(sc);
00419 } // ibis::bord::groupby
00420 
00421 inline void ibis::bord::orderby(const ibis::table::stringList& keys) {
00422     mypart.reorder(keys);
00423 } // ibis::bord::orderby
00424 
00425 inline void ibis::bord::reverseRows() {
00426     mypart.reverseRows();
00427 } // ibis::bord::reverseRows
00428 
00429 inline ibis::table::cursor* ibis::bord::createCursor() const {
00430     return new ibis::bord::cursor(*this);
00431 } // ibis::bord::createCursor
00432 
00435 inline ibis::table*
00436 ibis::bord::evaluateTerms(const ibis::selectClause& sel,
00437                           const char* desc) const {
00438     return mypart.evaluateTerms(sel, desc);
00439 } // ibis::bord::evaluateTerms
00440 
00442 inline int 
00443 ibis::bord::restoreCategoriesAsStrings(const ibis::part& prt, const char* nm) {
00444     return mypart.restoreCategoriesAsStrings(prt, nm);
00445 } // ibis::bord::restoreCategoriesAsStrings
00446 
00448 inline int
00449 ibis::bord::part::restoreCategoriesAsStrings(const ibis::part& prt,
00450                                              const char* nm) {
00451     if (nm == 0 || *nm == 0)
00452         return -1;
00453     ibis::bord::column *col = static_cast<ibis::bord::column*>(getColumn(nm));
00454     if (col != 0)
00455         return col->restoreCategoriesAsStrings(prt);
00456     else
00457         return -2;
00458 } // ibis::bord::part::restoreCategoriesAsStrings
00459 
00460 inline int ibis::bord::column::dump(std::ostream& out, uint32_t i) const {
00461     int ierr = -1;
00462     if (buffer == 0) {
00463         out << "(no data in memory)";
00464         return ierr;
00465     }
00466 
00467     switch (m_type) {
00468     case ibis::BYTE: {
00469         const array_t<signed char>* vals =
00470             static_cast<const array_t<signed char>*>(buffer);
00471         out << (int)((*vals)[i]);
00472         ierr = 0;
00473         break;}
00474     case ibis::UBYTE: {
00475         const array_t<unsigned char>* vals =
00476             static_cast<const array_t<unsigned char>*>(buffer);
00477         out << (unsigned)((*vals)[i]);
00478         ierr = 0;
00479         break;}
00480     case ibis::SHORT: {
00481         const array_t<int16_t>* vals =
00482             static_cast<const array_t<int16_t>*>(buffer);
00483         out << (*vals)[i];
00484         ierr = 0;
00485         break;}
00486     case ibis::USHORT: {
00487         const array_t<uint16_t>* vals =
00488             static_cast<const array_t<uint16_t>*>(buffer);
00489         out << (*vals)[i];
00490         ierr = 0;
00491         break;}
00492     case ibis::INT: {
00493         const array_t<int32_t>* vals =
00494             static_cast<const array_t<int32_t>*>(buffer);
00495         out << (*vals)[i];
00496         ierr = 0;
00497         break;}
00498     case ibis::UINT: {
00499         const array_t<uint32_t>* vals =
00500             static_cast<const array_t<uint32_t>*>(buffer);
00501         out << (*vals)[i];
00502         ierr = 0;
00503         break;}
00504     case ibis::LONG: {
00505         const array_t<int64_t>* vals =
00506             static_cast<const array_t<int64_t>*>(buffer);
00507         out << (*vals)[i];
00508         ierr = 0;
00509         break;}
00510     case ibis::ULONG: {
00511         const array_t<uint64_t>* vals =
00512             static_cast<const array_t<uint64_t>*>(buffer);
00513         out << (*vals)[i];
00514         ierr = 0;
00515         break;}
00516     case ibis::FLOAT: {
00517         const array_t<float>* vals =
00518             static_cast<const array_t<float>*>(buffer);
00519         out << std::setprecision(7) << (*vals)[i];
00520         ierr = 0;
00521         break;}
00522     case ibis::DOUBLE: {
00523         const array_t<double>* vals =
00524             static_cast<const array_t<double>*>(buffer);
00525         out << std::setprecision(15) << (*vals)[i];
00526         ierr = 0;
00527         break;}
00528     case ibis::TEXT:
00529     case ibis::CATEGORY: {
00530         std::string tmp;
00531         getString(i, tmp);
00532         out << '"' << tmp << '"';
00533         ierr = 0;
00534         break;}
00535     default: {
00536         ierr = -2;
00537         break;}
00538     }
00539     return ierr;
00540 } // ibis::bord::column::dump
00541 
00542 inline int ibis::bord::cursor::fetch() {
00543     ++ curRow;
00544     return (0 - (curRow >= (int64_t) tab.nRows()));
00545 } // ibis::bord::cursor::fetch
00546 
00547 inline int ibis::bord::cursor::fetch(uint64_t irow) {
00548     if (irow < tab.nRows()) {
00549         curRow = static_cast<int64_t>(irow);
00550         return 0;
00551     }
00552     else {
00553         return -1;
00554     }
00555 } // ibis::bord::cursor::fetch
00556 
00557 inline int ibis::bord::cursor::fetch(ibis::table::row& res) {
00558     ++ curRow;
00559     if ((uint64_t) curRow < tab.nRows()) {
00560         fillRow(res);
00561         return 0;
00562     }
00563     else {
00564         return -1;
00565     }
00566 } // ibis::bord::cursor::fetch
00567 
00568 inline int ibis::bord::cursor::fetch(uint64_t irow, ibis::table::row& res) {
00569     if (irow < tab.nRows()) {
00570         curRow = static_cast<int64_t>(irow);
00571         fillRow(res);
00572         return 0;
00573     }
00574     else {
00575         return -1;
00576     }
00577 } // ibis::bord::cursor::fetch
00578 
00579 inline int
00580 ibis::bord::cursor::dumpIJ(std::ostream& out, uint32_t i,
00581                            uint32_t j) const {
00582     if (buffer[j].cval == 0) return -1;
00583 
00584     switch (buffer[j].ctype) {
00585     case ibis::BYTE: {
00586         const array_t<const signed char>* vals =
00587             static_cast<const array_t<const signed char>*>(buffer[j].cval);
00588         out << (int) ((*vals)[i]);
00589         break;}
00590     case ibis::UBYTE: {
00591         const array_t<const unsigned char>* vals =
00592             static_cast<const array_t<const unsigned char>*>(buffer[j].cval);
00593         out << (unsigned int) ((*vals)[i]);
00594         break;}
00595     case ibis::SHORT: {
00596         const array_t<const int16_t>* vals =
00597             static_cast<const array_t<const int16_t>*>(buffer[j].cval);
00598         out << (*vals)[i];
00599         break;}
00600     case ibis::USHORT: {
00601         const array_t<const uint16_t>* vals =
00602             static_cast<const array_t<const uint16_t>*>(buffer[j].cval);
00603         out << (*vals)[i];
00604         break;}
00605     case ibis::INT: {
00606         const array_t<const int32_t>* vals =
00607             static_cast<const array_t<const int32_t>*>(buffer[j].cval);
00608         out << (*vals)[i];
00609         break;}
00610     case ibis::UINT: {
00611         const array_t<const uint32_t>* vals =
00612             static_cast<const array_t<const uint32_t>*>(buffer[j].cval);
00613         out << (*vals)[i];
00614         break;}
00615     case ibis::LONG: {
00616         const array_t<const int64_t>* vals =
00617             static_cast<const array_t<const int64_t>*>(buffer[j].cval);
00618         out << (*vals)[i];
00619         break;}
00620     case ibis::ULONG: {
00621         const array_t<const uint64_t>* vals =
00622             static_cast<const array_t<const uint64_t>*>(buffer[j].cval);
00623         out << (*vals)[i];
00624         break;}
00625     case ibis::FLOAT: {
00626         const array_t<const float>* vals =
00627             static_cast<const array_t<const float>*>(buffer[j].cval);
00628         out << (*vals)[i];
00629         break;}
00630     case ibis::DOUBLE: {
00631         const array_t<const double>* vals =
00632             static_cast<const array_t<const double>*>(buffer[j].cval);
00633         out << (*vals)[i];
00634         break;}
00635     case ibis::TEXT:
00636     case ibis::CATEGORY: {
00637         const std::vector<std::string>* vals =
00638             static_cast<const std::vector<std::string>*>(buffer[j].cval);
00639         out << '"' << (*vals)[i] << '"';
00640         break;}
00641     default: {
00642         return -2;}
00643     }
00644     return 0;
00645 } // ibis::bord::cursor::dumpIJ
00646 
00647 inline int
00648 ibis::bord::cursor::getColumnAsByte(const char* cn, char& val) const {
00649     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00650         return -1;
00651     bufferMap::const_iterator it = bufmap.find(cn);
00652     if (it != bufmap.end())
00653         return getColumnAsByte((*it).second, val);
00654     else
00655         return -2;
00656 } // ibis::bord::cursor::getColumnAsByte
00657 
00658 inline int
00659 ibis::bord::cursor::getColumnAsUByte(const char* cn,
00660                                      unsigned char& val) const {
00661     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00662         return -1;
00663     bufferMap::const_iterator it = bufmap.find(cn);
00664     if (it != bufmap.end())
00665         return getColumnAsUByte((*it).second, val);
00666     else
00667         return -2;
00668 } // ibis::bord::cursor::getColumnAsUByte
00669 
00670 inline int
00671 ibis::bord::cursor::getColumnAsShort(const char* cn, int16_t& val) const {
00672     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00673         return -1;
00674     bufferMap::const_iterator it = bufmap.find(cn);
00675     if (it != bufmap.end())
00676         return getColumnAsShort((*it).second, val);
00677     else
00678         return -2;
00679 } // ibis::bord::cursor::getColumnAsShort
00680 
00681 inline int
00682 ibis::bord::cursor::getColumnAsUShort(const char* cn, uint16_t& val) const {
00683     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00684         return -1;
00685     bufferMap::const_iterator it = bufmap.find(cn);
00686     if (it != bufmap.end())
00687         return getColumnAsUShort((*it).second, val);
00688     else
00689         return -2;
00690 } // ibis::bord::cursor::getColumnAsUShort
00691 
00692 inline int
00693 ibis::bord::cursor::getColumnAsInt(const char* cn, int32_t& val) const {
00694     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00695         return -1;
00696     bufferMap::const_iterator it = bufmap.find(cn);
00697     if (it != bufmap.end())
00698         return getColumnAsInt((*it).second, val);
00699     else
00700         return -2;
00701 } // ibis::bord::cursor::getColumnAsInt
00702 
00703 inline int
00704 ibis::bord::cursor::getColumnAsUInt(const char* cn, uint32_t& val) const {
00705     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00706         return -1;
00707     bufferMap::const_iterator it = bufmap.find(cn);
00708     if (it != bufmap.end())
00709         return getColumnAsUInt((*it).second, val);
00710     else
00711         return -2;
00712 } // ibis::bord::cursor::getColumnAsUInt
00713 
00714 inline int
00715 ibis::bord::cursor::getColumnAsLong(const char* cn, int64_t& val) const {
00716     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00717         return -1;
00718     bufferMap::const_iterator it = bufmap.find(cn);
00719     if (it != bufmap.end())
00720         return getColumnAsLong((*it).second, val);
00721     else
00722         return -2;
00723 } // ibis::bord::cursor::getColumnAsLong
00724 
00725 inline int
00726 ibis::bord::cursor::getColumnAsULong(const char* cn, uint64_t& val) const {
00727     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00728         return -1;
00729     bufferMap::const_iterator it = bufmap.find(cn);
00730     if (it != bufmap.end())
00731         return getColumnAsULong((*it).second, val);
00732     else
00733         return -2;
00734 } // ibis::bord::cursor::getColumnAsULong
00735 
00736 inline int
00737 ibis::bord::cursor::getColumnAsFloat(const char* cn, float& val) const {
00738     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00739         return -1;
00740     bufferMap::const_iterator it = bufmap.find(cn);
00741     if (it != bufmap.end())
00742         return getColumnAsFloat((*it).second, val);
00743     else
00744         return -2;
00745 } // ibis::bord::cursor::getColumnAsFloat
00746 
00747 inline int
00748 ibis::bord::cursor::getColumnAsDouble(const char* cn, double& val) const {
00749     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00750         return -1;
00751     bufferMap::const_iterator it = bufmap.find(cn);
00752     if (it != bufmap.end())
00753         return getColumnAsDouble((*it).second, val);
00754     else
00755         return -2;
00756 } // ibis::bord::cursor::getColumnAsDouble
00757 
00758 inline int
00759 ibis::bord::cursor::getColumnAsString(const char* cn,
00760                                       std::string& val) const {
00761     if (curRow < 0 || curRow >= (int64_t) tab.nRows() || cn == 0 || *cn == 0)
00762         return -1;
00763     bufferMap::const_iterator it = bufmap.find(cn);
00764     if (it != bufmap.end())
00765         return getColumnAsString((*it).second, val);
00766     else
00767         return -2;
00768 } // ibis::bord::cursor::getColumnAsString
00769 #endif // IBIS_BORD_H

Make It A Bit Faster
Contact us
Disclaimers
FastBit source code
FastBit mailing list archive