00001
00002
00003
00004 #ifndef IBIS_TAFEL_H
00005 #define IBIS_TAFEL_H
00006 #include "table.h"
00007 #include "bitvector.h"
00008
00011
00012 namespace ibis {
00013 class tafel;
00014 }
00015
00025 class ibis::tafel : public ibis::tablex {
00026 public:
00027 tafel() : mrows(0U) {}
00028 virtual ~tafel() {clear();}
00029
00030 virtual int addColumn(const char* cname, ibis::TYPE_T ctype,
00031 const char* cdesc, const char* idx);
00032 virtual int SQLCreateTable(const char *stmt, std::string&);
00033
00034 virtual int append(const char* cname, uint64_t begin, uint64_t end,
00035 void* values);
00036 virtual int appendRow(const ibis::table::row&);
00037 virtual int appendRow(const char*, const char*);
00038 virtual int appendRows(const std::vector<ibis::table::row>&);
00039 virtual int readCSV(const char* filename, int maxrows,
00040 const char* outputdir, const char* delimiters);
00041 virtual int readSQLDump(const char* filename, std::string& tname,
00042 int maxrows, const char* outputdir);
00043
00044 virtual int write(const char* dir, const char* tname=0,
00045 const char* tdesc=0, const char* idx=0,
00046 const char* nvpairs=0) const;
00047 virtual int writeMetaData(const char* dir, const char* tname=0,
00048 const char* tdesc=0, const char* idx=0,
00049 const char* nvpairs=0) const;
00050
00051 virtual void clearData();
00052 virtual int32_t reserveSpace(uint32_t);
00053 virtual uint32_t capacity() const;
00054
00055 virtual uint32_t mRows() const {return mrows;}
00056 virtual uint32_t mColumns() const {return cols.size();}
00057 virtual void describe(std::ostream&) const;
00058 virtual table* toTable(const char* nm=0, const char* de=0);
00059
00061 struct column {
00063 std::string name;
00065 std::string desc;
00067 std::string indexSpec;
00069 ibis::TYPE_T type;
00076 void* values;
00078 ibis::array_t<int64_t> starts;
00085 void* defval;
00087 ibis::bitvector mask;
00088
00089 column();
00090 ~column();
00091 };
00092 typedef std::map<const char*, column*, ibis::lessi> columnList;
00094 const columnList& getColumns() const {return cols;}
00095
00096 protected:
00098 columnList cols;
00100 std::vector<column*> colorder;
00102 ibis::bitvector::word_t mrows;
00103
00105 void clear();
00106
00108 void normalize();
00109
00110 template <typename T>
00111 void append(const T* in, ibis::bitvector::word_t be,
00112 ibis::bitvector::word_t en, array_t<T>& out,
00113 const T& fill, ibis::bitvector& mask) const;
00114 void appendString(const std::vector<std::string>* in,
00115 ibis::bitvector::word_t be,
00116 ibis::bitvector::word_t en,
00117 std::vector<std::string>& out,
00118 ibis::bitvector& mask) const;
00119 void appendRaw(const ibis::array_t<unsigned char>* in,
00120 ibis::bitvector::word_t be,
00121 ibis::bitvector::word_t en,
00122 std::vector<std::string>& out,
00123 ibis::bitvector& mask) const;
00124
00125 template <typename T>
00126 void locate(ibis::TYPE_T, std::vector<array_t<T>*>& buf,
00127 std::vector<ibis::bitvector*>& msk) const;
00128 void locateString(ibis::TYPE_T t,
00129 std::vector<std::vector<std::string>*>& buf,
00130 std::vector<ibis::bitvector*>& msk) const;
00131 template <typename T>
00132 void append(const std::vector<std::string>& nm, const std::vector<T>& va,
00133 std::vector<array_t<T>*>& buf,
00134 std::vector<ibis::bitvector*>& msk);
00135 void appendString(const std::vector<std::string>& nm,
00136 const std::vector<std::string>& va,
00137 std::vector<std::vector<std::string>*>& buf,
00138 std::vector<ibis::bitvector*>& msk);
00139 int parseLine(const char* str, const char* del, const char* id);
00140
00141 int32_t doReserve(uint32_t);
00142 int assignDefaultValue(ibis::tafel::column &col, const char *val) const;
00143 int readSQLStatement(std::istream &, ibis::fileManager::buffer<char>&,
00144 ibis::fileManager::buffer<char>&) const;
00145 uint32_t preferredSize() const;
00146
00147 private:
00148 tafel(const tafel&);
00149 tafel& operator=(const tafel&);
00150 };
00151 #endif // IBIS_TAFEL_H