00001
00002
00003
00004
00005 #ifndef IBIS_BUNDLE_H
00006 #define IBIS_BUNDLE_H
00018 #include "query.h" // ibis::query, ibis::selectClause
00019 #include "colValues.h"
00020
00021 namespace ibis {
00022
00023
00024 class bundle0;
00025 class bundle1;
00026
00027
00028 class bundles;
00029
00030 }
00031
00067 class FASTBIT_CXX_DLLSPEC ibis::bundle {
00068 public:
00069 static bundle* create(const ibis::query& q);
00070 static bundle* create(const ibis::query& q, const ibis::bitvector& hits);
00071 static bundle* create(const ibis::part&, const ibis::selectClause& sel,
00072 const std::vector<void*>& vals);
00073
00075 static const ibis::RIDSet* readRIDs(const char* dir, const uint32_t i);
00076
00078 virtual uint32_t size() const {
00079 return (starts != 0 ? (starts->size()>0 ? starts->size()-1 : 0) : 0);}
00081 virtual uint32_t width() const {return 0;}
00083 virtual void print(std::ostream& out) const = 0;
00085 virtual void printAll(std::ostream& out) const = 0;
00092 virtual int32_t getInt(uint32_t, uint32_t) const;
00093 virtual uint32_t getUInt(uint32_t, uint32_t) const;
00094 virtual int64_t getLong(uint32_t, uint32_t) const;
00095 virtual uint64_t getULong(uint32_t, uint32_t) const;
00096 virtual float getFloat(uint32_t, uint32_t) const;
00097 virtual double getDouble(uint32_t, uint32_t) const;
00101 virtual std::string getString(uint32_t, uint32_t) const;
00103
00106 virtual ibis::TYPE_T columnType(uint32_t j) const {
00107 return ibis::UNKNOWN_TYPE;}
00110 virtual void* columnArray(uint32_t j) const {return 0;}
00111
00113 virtual void reorder(const char *names, int direction) = 0;
00115 virtual long truncate(uint32_t keep) = 0;
00117 virtual long truncate(const char *names, int direction, uint32_t keep) = 0;
00118
00119 virtual ~bundle() {delete rids; delete starts;}
00121 virtual void write(const ibis::query& q) const = 0;
00122
00123
00124 void sortRIDs(uint32_t i, uint32_t j);
00125 void swapRIDs(uint32_t i, uint32_t j) {
00126 if (rids) {
00127 ibis::rid_t tmp = (*rids)[i];
00128 (*rids)[i] = (*rids)[j];
00129 (*rids)[j] = tmp;
00130 }
00131 };
00133 uint32_t numRowsInBundle(uint32_t ind) const {
00134 if (starts != 0 && ind+1 < starts->size()) {
00135 return (*starts)[ind+1]-(*starts)[ind];
00136 }
00137 else {
00138 return 0U;
00139 }
00140 }
00143 uint32_t rowCounts(array_t<uint32_t>& cnt) const;
00144
00146 const ibis::RIDSet* getRIDs(uint32_t ind) const {
00147 if (rids != 0 && starts != 0 && ind+1 < starts->size()) {
00148 return new ibis::RIDSet(*rids, (*starts)[ind],
00149 (*starts)[ind+1]-(*starts)[ind]);
00150 }
00151 else {
00152 return static_cast<ibis::RIDSet*>(0);
00153 }
00154 };
00156 const ibis::RIDSet* getRIDs() const {return rids;}
00157
00158 protected:
00159 const ibis::selectClause& comps;
00160 array_t<uint32_t>* starts;
00161 ibis::RIDSet* rids;
00162 const char* id;
00163 mutable bool infile;
00164
00165
00166 bundle(const ibis::selectClause& c)
00167 : comps(c), starts(0), rids(0), id(""), infile(false) {};
00168
00169
00170 explicit bundle(const ibis::query& q)
00171 : comps(q.components()), starts(0),
00172 rids(q.getRIDs(*(q.getHitVector()))), id(q.id()),
00173 infile(false) {
00174 if (rids != 0 && static_cast<long>(rids->size()) != q.getNumHits()) {
00175 delete rids;
00176 rids = 0;
00177 }
00178 };
00179 bundle(const ibis::query& q, const ibis::bitvector& hits)
00180 : comps(q.components()), starts(0), rids(q.getRIDs(hits)),
00181 id(q.id()), infile(false) {};
00182
00183 private:
00184 bundle();
00185 bundle(const bundle&);
00186 bundle& operator=(const bundle&);
00187 };
00188
00190 class FASTBIT_CXX_DLLSPEC ibis::bundle0 : public ibis::bundle {
00191 public:
00192 explicit bundle0(const ibis::query& q) : bundle(q) {q.writeRIDs(rids);};
00193 bundle0(const ibis::query& q, const ibis::bitvector& hits)
00194 : bundle(q, hits) {
00195 if (rids != 0 && static_cast<long>(rids->size()) != q.getNumHits()) {
00196 delete rids;
00197 rids = 0;
00198 }
00199 };
00200
00201 virtual uint32_t size() const {return (rids ? rids->size() : 0);}
00202
00203 virtual void print(std::ostream& out) const {
00204 out << "bundle " << id << " is empty" << std::endl;
00205 }
00206
00207 virtual void printAll(std::ostream& out) const;
00208
00209
00210 virtual void reorder(const char *names, int direction) {};
00211
00212 virtual long truncate(uint32_t keep) {return 1;}
00213 virtual long truncate(const char *names, int direction, uint32_t keep)
00214 {return 1;}
00215
00216 virtual void write(const ibis::query& q) const {
00217 if (rids != 0 && infile == false) {
00218 q.writeRIDs(rids);
00219 infile = true;
00220 }
00221 }
00222 };
00223
00225 class FASTBIT_CXX_DLLSPEC ibis::bundle1 : public ibis::bundle {
00226 public:
00227 explicit bundle1(const ibis::query& q);
00228 bundle1(const ibis::query& q, const ibis::bitvector& hits);
00229 bundle1(const ibis::part& tbl, const ibis::selectClause& sel,
00230 const std::vector<void*>& vals);
00231 virtual ~bundle1() {delete col;}
00232 virtual void write(const ibis::query&) const;
00233
00234 virtual uint32_t size() const {return (col ? col->size() : 0);}
00235 virtual uint32_t width() const {return 1;}
00236
00237 virtual void print(std::ostream& out) const;
00238
00239 virtual void printAll(std::ostream& out) const;
00240 virtual int32_t getInt(uint32_t, uint32_t) const;
00241 virtual uint32_t getUInt(uint32_t, uint32_t) const;
00242 virtual int64_t getLong(uint32_t, uint32_t) const;
00243 virtual uint64_t getULong(uint32_t, uint32_t) const;
00244 virtual float getFloat(uint32_t, uint32_t) const;
00245 virtual double getDouble(uint32_t, uint32_t) const;
00246 virtual std::string getString(uint32_t, uint32_t) const;
00247
00248 virtual ibis::TYPE_T columnType(uint32_t j) const {
00249 return (j == 0 ? col->getType() : ibis::UNKNOWN_TYPE);}
00250 virtual void* columnArray(uint32_t j) const {
00251 return (j == 0 ? col->getArray() : 0);}
00252
00258 virtual void reorder(const char *, int direction) {
00259 if (direction < 0) {
00260 reverse();
00261 infile = false;
00262 }
00263 }
00264 virtual long truncate(uint32_t keep);
00265 virtual long truncate(const char *names, int direction, uint32_t keep) {
00266 if (direction < 0) {
00267 reverse();
00268 infile = false;
00269 }
00270 return truncate(keep);
00271 }
00272
00273 private:
00274 ibis::colValues* col;
00275
00277 void sort();
00279 void reverse();
00280
00281 bundle1();
00282 bundle1(const bundle1&);
00283 bundle1& operator=(const bundle1&);
00284 };
00285
00287 class FASTBIT_CXX_DLLSPEC ibis::bundles : public ibis::bundle {
00288 public:
00289 explicit bundles(const ibis::query& q);
00290 bundles(const ibis::query& q, const ibis::bitvector& hits);
00291 bundles(const ibis::part& tbl, const ibis::selectClause& sel,
00292 const std::vector<void*>& vals);
00293 virtual ~bundles() {clear();}
00294 virtual void write(const ibis::query&) const;
00295
00296 virtual uint32_t size() const {
00297 return (cols.empty() ? 0 : cols.back()->size());}
00298 virtual uint32_t width() const {return cols.size();}
00299
00300 virtual void print(std::ostream& out) const;
00301
00302 virtual void printAll(std::ostream& out) const;
00303 virtual int32_t getInt(uint32_t, uint32_t) const;
00304 virtual uint32_t getUInt(uint32_t, uint32_t) const;
00305 virtual int64_t getLong(uint32_t, uint32_t) const;
00306 virtual uint64_t getULong(uint32_t, uint32_t) const;
00307 virtual float getFloat(uint32_t, uint32_t) const;
00308 virtual double getDouble(uint32_t, uint32_t) const;
00309 virtual std::string getString(uint32_t, uint32_t) const;
00310
00311 virtual ibis::TYPE_T columnType(uint32_t j) const {
00312 return (j < cols.size() ? cols[j]->getType() : ibis::UNKNOWN_TYPE);}
00313 virtual void* columnArray(uint32_t j) const {
00314 return (j < cols.size() ? cols[j]->getArray() : 0);}
00315
00316 virtual void reorder(const char *names, int direction);
00317 virtual long truncate(uint32_t keep);
00318 virtual long truncate(const char *names, int direction, uint32_t keep);
00319
00320 private:
00321 colList cols;
00322
00323 void sort();
00324 void clear();
00325 void reverse();
00326
00327 bundles();
00328 bundles(const bundles&);
00329 bundles& operator=(const bundles&);
00330 };
00331
00343 class FASTBIT_CXX_DLLSPEC ibis::query::result {
00344 public:
00345 result(ibis::query& q);
00346 ~result();
00347
00349 bool next();
00352 void reset();
00353
00357 int32_t getInt(const char *cname) const;
00359 uint32_t getUInt(const char *cname) const;
00361 int64_t getLong(const char *cname) const;
00363 uint64_t getULong(const char *cname) const;
00366 float getFloat(const char *cname) const;
00369 double getDouble(const char *cname) const;
00370 std::string getString(const char *cname) const;
00371
00376 int32_t getInt(uint32_t selind) const {
00377 return bdl_->getInt(bid_-1, selind);
00378 }
00381 uint32_t getUInt(uint32_t selind) const {
00382 return bdl_->getUInt(bid_-1, selind);
00383 }
00385 int64_t getLong(uint32_t selind) const {
00386 return bdl_->getLong(bid_-1, selind);
00387 }
00390 uint64_t getULong(uint32_t selind) const {
00391 return bdl_->getULong(bid_-1, selind);
00392 }
00395 float getFloat(uint32_t selind) const {
00396 return bdl_->getFloat(bid_-1, selind);
00397 }
00400 double getDouble(uint32_t selind) const {
00401 return bdl_->getDouble(bid_-1, selind);
00402 }
00405 std::string getString(uint32_t selind) const {
00406 return bdl_->getString(bid_-1, selind);
00407 }
00408 inline uint32_t colPosition(const char *cname) const
00409 {return sel.find(cname);}
00410
00411 private:
00412 ibis::query &que_;
00413 ibis::bundle *bdl_;
00414 const ibis::selectClause& sel;
00415 uint32_t bid_;
00416 uint32_t lib_;
00417
00418 result();
00419 result(const result&);
00420 result& operator=(const result&);
00421 };
00422 #endif // IBIS_BUNDLE_H