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
00022 class ibis::tafel : public ibis::tablex {
00023 public:
00024 tafel() : mrows(0U) {}
00025 virtual ~tafel() {clear();}
00026
00027 virtual int addColumn(const char* cname, ibis::TYPE_T ctype,
00028 const char* cdesc, const char* idx);
00029 virtual int SQLCreateTable(const char *stmt, std::string&);
00030
00031 virtual int append(const char* cname, uint64_t begin, uint64_t end,
00032 void* values);
00033 virtual int appendRow(const ibis::table::row&);
00034 virtual int appendRow(const char*, const char*);
00035 virtual int appendRows(const std::vector<ibis::table::row>&);
00036 virtual int readCSV(const char* filename, int maxrows,
00037 const char* outputdir, const char* delimiters);
00038 virtual int readSQLDump(const char* filename, std::string& tname,
00039 int maxrows, const char* outputdir);
00040
00041 virtual int write(const char* dir, const char* tname,
00042 const char* tdesc, const char* idx) const;
00043 virtual int writeMetaData(const char* dir, const char* tname,
00044 const char* tdesc, const char* idx) const;
00045
00046 virtual void clearData();
00047 virtual int32_t reserveSpace(uint32_t);
00048 virtual uint32_t capacity() const;
00049
00050 virtual uint32_t mRows() const {return mrows;}
00051 virtual uint32_t mColumns() const {return cols.size();}
00052 virtual void describe(std::ostream&) const;
00053
00055 struct column {
00057 std::string name;
00059 std::string desc;
00061 std::string indexSpec;
00063 ibis::TYPE_T type;
00070 void* values;
00072 ibis::array_t<int64_t> starts;
00079 void* defval;
00081 ibis::bitvector mask;
00082
00083 column();
00084 ~column();
00085 };
00086 typedef std::map<const char*, column*, ibis::lessi> columnList;
00088 const columnList& getColumns() const {return cols;}
00089
00090 protected:
00092 columnList cols;
00094 std::vector<column*> colorder;
00096 ibis::bitvector::word_t mrows;
00097
00099 void clear();
00100
00102 void normalize();
00103
00104 template <typename T>
00105 void append(const T* in, ibis::bitvector::word_t be,
00106 ibis::bitvector::word_t en, array_t<T>& out,
00107 const T& fill, ibis::bitvector& mask) const;
00108 void appendString(const std::vector<std::string>* in,
00109 ibis::bitvector::word_t be,
00110 ibis::bitvector::word_t en,
00111 std::vector<std::string>& out,
00112 ibis::bitvector& mask) const;
00113 void appendRaw(const ibis::array_t<unsigned char>* in,
00114 ibis::bitvector::word_t be,
00115 ibis::bitvector::word_t en,
00116 std::vector<std::string>& out,
00117 ibis::bitvector& mask) const;
00118
00119 template <typename T>
00120 void locate(ibis::TYPE_T, std::vector<array_t<T>*>& buf,
00121 std::vector<ibis::bitvector*>& msk) const;
00122 void locateString(ibis::TYPE_T t,
00123 std::vector<std::vector<std::string>*>& buf,
00124 std::vector<ibis::bitvector*>& msk) const;
00125 template <typename T>
00126 void append(const std::vector<std::string>& nm, const std::vector<T>& va,
00127 std::vector<array_t<T>*>& buf,
00128 std::vector<ibis::bitvector*>& msk);
00129 void appendString(const std::vector<std::string>& nm,
00130 const std::vector<std::string>& va,
00131 std::vector<std::vector<std::string>*>& buf,
00132 std::vector<ibis::bitvector*>& msk);
00133 int parseLine(const char* str, const char* del, const char* id);
00134
00135 template <typename T>
00136 int writeColumn(int fdes, ibis::bitvector::word_t nold,
00137 ibis::bitvector::word_t nnew,
00138 const array_t<T>& vals, const T& fill,
00139 ibis::bitvector& totmask,
00140 const ibis::bitvector& newmask) const;
00141 int writeString(int fdes, ibis::bitvector::word_t nold,
00142 ibis::bitvector::word_t nnew,
00143 const std::vector<std::string>& vals,
00144 ibis::bitvector& totmask,
00145 const ibis::bitvector& newmask) const;
00146 int writeRaw(int bdes, int sdes, ibis::bitvector::word_t nold,
00147 ibis::bitvector::word_t nnew,
00148 const ibis::array_t<unsigned char>& bytes,
00149 const ibis::array_t<int64_t>& starts,
00150 ibis::bitvector& totmask,
00151 const ibis::bitvector& newmask) const;
00152
00153 int32_t doReserve(uint32_t);
00154 int assignDefaultValue(ibis::tafel::column &col, const char *val) const;
00155 int readSQLStatement(std::istream &, ibis::fileManager::buffer<char>&,
00156 ibis::fileManager::buffer<char>&) const;
00157 uint32_t preferredSize() const;
00158
00159 private:
00160 tafel(const tafel&);
00161 tafel& operator=(const tafel&);
00162 };
00163 #endif // IBIS_TAFEL_H