00001
00002
00003
00004
00005 #ifndef IBIS_INDEX_H
00006 #define IBIS_INDEX_H
00024 #if defined(_WIN32) && defined(_MSC_VER)
00025 #pragma warning(disable:4786) // some identifier longer than 256 characters
00026 #endif
00027 #include "qExpr.h"
00028 #include "bitvector.h"
00029
00030 #include <string>
00031 #include <limits>
00032
00033 namespace ibis {
00034 class bin;
00035 class range;
00036 class mesa;
00037 class ambit;
00038 class pale;
00039 class pack;
00040 class zone;
00041 class relic;
00042 class slice;
00043 class fade;
00044 class sbiad;
00045 class sapid;
00046
00047 class egale;
00048
00049 class moins;
00050 class entre;
00051
00052 class bak;
00053
00054
00055 class bak2;
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 class keywords;
00066 class mesh;
00067 class band;
00068 class direkte;
00069 class bylt;
00070 class zona;
00071 class fuzz;
00072 class fuge;
00073 }
00074
00080 class ibis::index {
00081 public:
00085 enum INDEX_TYPE {
00086 BINNING=0,
00087 RANGE,
00088 MESA,
00089 AMBIT,
00090 PALE,
00091 PACK,
00092 ZONE,
00093 RELIC,
00094 ROSTER,
00095 SLICE,
00096 FADE,
00097 SBIAD,
00098 SAPID,
00099 EGALE,
00100 MOINS,
00101 ENTRE,
00102 BAK,
00103 BAK2,
00104
00105
00106 KEYWORDS,
00107 MESH,
00108 BAND,
00109 DIREKTE,
00110 GENERIC,
00111 BYLT,
00112 FUZZ,
00113 ZONA,
00114 FUGE,
00115 EXTERN
00116 };
00117
00172 static index* create(const column* c, const char* name=0,
00173 const char* spec=0);
00177 static bool isIndex(const char* f, INDEX_TYPE t);
00179 virtual ~index () {clear();};
00180
00182 virtual INDEX_TYPE type() const = 0;
00185 virtual const char* name() const = 0;
00186
00189 virtual long evaluate(const ibis::qContinuousRange& expr,
00190 ibis::bitvector& hits) const = 0;
00193 virtual long evaluate(const ibis::qDiscreteRange&,
00194 ibis::bitvector&) const {return -1;}
00195
00206 virtual void estimate(const ibis::qContinuousRange& expr,
00207 ibis::bitvector& lower,
00208 ibis::bitvector& upper) const {
00209 lower.set(0, nrows); upper.set(1, nrows);}
00211 virtual uint32_t estimate(const ibis::qContinuousRange& expr) const {
00212 return nrows;}
00220 virtual float undecidable(const ibis::qContinuousRange& expr,
00221 ibis::bitvector& iffy) const {return 0.5;}
00222
00225 virtual void estimate(const ibis::qDiscreteRange& expr,
00226 ibis::bitvector& lower,
00227 ibis::bitvector& upper) const;
00228 virtual uint32_t estimate(const ibis::qDiscreteRange& expr) const;
00229 virtual float undecidable(const ibis::qDiscreteRange& expr,
00230 ibis::bitvector& iffy) const;
00231
00233 virtual void estimate(const ibis::index& idx2,
00234 const ibis::rangeJoin& expr,
00235 ibis::bitvector64& lower,
00236 ibis::bitvector64& upper) const;
00239 virtual void estimate(const ibis::index& idx2,
00240 const ibis::rangeJoin& expr,
00241 const ibis::bitvector& mask,
00242 ibis::bitvector64& lower,
00243 ibis::bitvector64& upper) const;
00244 virtual void estimate(const ibis::index& idx2,
00245 const ibis::rangeJoin& expr,
00246 const ibis::bitvector& mask,
00247 const ibis::qRange* const range1,
00248 const ibis::qRange* const range2,
00249 ibis::bitvector64& lower,
00250 ibis::bitvector64& upper) const;
00252 virtual int64_t estimate(const ibis::index& idx2,
00253 const ibis::rangeJoin& expr) const;
00256 virtual int64_t estimate(const ibis::index& idx2,
00257 const ibis::rangeJoin& expr,
00258 const ibis::bitvector& mask) const;
00259 virtual int64_t estimate(const ibis::index& idx2,
00260 const ibis::rangeJoin& expr,
00261 const ibis::bitvector& mask,
00262 const ibis::qRange* const range1,
00263 const ibis::qRange* const range2) const;
00264
00266 virtual void estimate(const ibis::rangeJoin& expr,
00267 const ibis::bitvector& mask,
00268 const ibis::qRange* const range1,
00269 const ibis::qRange* const range2,
00270 ibis::bitvector64& lower,
00271 ibis::bitvector64& upper) const;
00272 virtual int64_t estimate(const ibis::rangeJoin& expr,
00273 const ibis::bitvector& mask,
00274 const ibis::qRange* const range1,
00275 const ibis::qRange* const range2) const;
00276
00278 virtual double estimateCost(const ibis::qContinuousRange& expr) const {
00279 return (offsets.empty() ? nrows : offsets.back());}
00280 virtual double estimateCost(const ibis::qDiscreteRange& expr) const {
00281 return (offsets.empty() ? nrows : offsets.back());}
00282
00285 virtual void print(std::ostream& out) const = 0;
00289 virtual int write(const char* name) const = 0;
00293 virtual int read(const char* name) = 0;
00296 virtual int read(ibis::fileManager::storage* st) = 0;
00297
00299 virtual long append(const char* dt, const char* df, uint32_t nnew) {
00300 return -1;}
00301
00303 virtual void speedTest(std::ostream& out) const {};
00305 virtual uint32_t numBitvectors() const {return bits.size();}
00307 virtual const ibis::bitvector* getBitvector(uint32_t i) const {
00308 if (i < bits.size()) {
00309 if (bits[i] == 0)
00310 activate(i);
00311 return bits[i];
00312 }
00313 else {
00314 return 0;
00315 }
00316 }
00317
00320 virtual void binBoundaries(std::vector<double>&) const {return;}
00321 virtual void binWeights(std::vector<uint32_t>&) const {return;}
00322
00324 virtual long getCumulativeDistribution
00325 (std::vector<double>& bds, std::vector<uint32_t>& cts) const;
00327 virtual long getDistribution
00328 (std::vector<double>& bbs, std::vector<uint32_t>& cts) const;
00330 virtual double getMin() const {
00331 return std::numeric_limits<double>::quiet_NaN();}
00333 virtual double getMax() const {
00334 return std::numeric_limits<double>::quiet_NaN();}
00338 virtual double getSum() const {
00339 return std::numeric_limits<double>::quiet_NaN();}
00340 virtual uint32_t getNRows() const {return nrows;}
00341
00347 virtual int expandRange(ibis::qContinuousRange& rng) const {return 0;}
00348 virtual int contractRange(ibis::qContinuousRange& rng) const {return 0;}
00349
00350 typedef std::map< double, ibis::bitvector* > VMap;
00351 typedef std::map< double, uint32_t > histogram;
00352 template <typename E>
00353 static void mapValues(const array_t<E>& val, VMap& bmap);
00354 template <typename E>
00355 static void mapValues(const array_t<E>& val, histogram& hist,
00356 uint32_t count=0);
00357 template <typename E>
00358 static void mapValues(const array_t<E>& val, array_t<E>& bounds,
00359 std::vector<uint32_t>& cnts);
00360 template <typename E1, typename E2>
00361 static void mapValues(const array_t<E1>& val1, const array_t<E2>& val2,
00362 array_t<E1>& bnd1, array_t<E2>& bnd2,
00363 std::vector<uint32_t>& cnts);
00366 static void divideCounts(array_t<uint32_t>& bounds,
00367 const array_t<uint32_t>& cnt);
00368
00369 protected:
00370
00372 const ibis::column* col;
00375 mutable ibis::fileManager::storage* str;
00377 mutable const char* fname;
00379 mutable array_t<int32_t> offsets;
00381 mutable std::vector<ibis::bitvector*> bits;
00383 uint32_t nrows;
00384
00388 index(const ibis::column* c=0, ibis::fileManager::storage* s=0)
00389 : col(c), str(s), fname(0), offsets(), nrows(0) {}
00390
00392 void dataFileName(const char* f, std::string& name) const;
00394 void indexFileName(const char* f, std::string& name) const;
00395 static void indexFileName(std::string& name, const ibis::column* col1,
00396 const ibis::column* col2, const char* f=0);
00397
00399 virtual void activate() const;
00401 virtual void activate(uint32_t i) const;
00404 virtual void activate(uint32_t i, uint32_t j) const;
00406 virtual void clear();
00407
00409
00410
00413 void mapValues(const char* f, VMap& bmap) const;
00415 void mapValues(const char* f, histogram& hist, uint32_t count=0) const;
00416 void computeMinMax(const char* f, double& min, double& max) const;
00418 void optionalUnpack(std::vector<ibis::bitvector*>& bits,
00419 const char* opt);
00422 void addBits(uint32_t ib, uint32_t ie, ibis::bitvector& res) const;
00425 void addBits(uint32_t ib, uint32_t ie, ibis::bitvector& res,
00426 const ibis::bitvector& tot) const;
00429 void sumBits(uint32_t ib, uint32_t ie, ibis::bitvector& res) const;
00432 void sumBits(uint32_t ib, uint32_t ie, ibis::bitvector& res,
00433 uint32_t ib0, uint32_t ie0) const;
00434
00435
00436 static void addBins(const std::vector<ibis::bitvector*>& bits,
00437 uint32_t ib, uint32_t ie, ibis::bitvector& res);
00438 static void sumBins(const std::vector<ibis::bitvector*>& bits,
00439 uint32_t ib, uint32_t ie, ibis::bitvector& res);
00440 static void sumBins(const std::vector<ibis::bitvector*>& bits,
00441 const ibis::bitvector& tot, uint32_t ib, uint32_t ie,
00442 ibis::bitvector& res);
00443
00444 static void setBases(array_t<uint32_t>& bases, uint32_t card,
00445 uint32_t nbase = 2);
00446
00447 class barrel;
00448
00449 private:
00450 index(const index&);
00451 const index& operator=(const index&);
00452 };
00453
00454
00457 class ibis::index::barrel : public ibis::compRange::barrel {
00458 public:
00459 barrel(const ibis::compRange::term* t) : ibis::compRange::barrel(t) {}
00460
00461 void setValue(uint32_t i, double v) {varvalues[i] = v;}
00462 };
00463 #endif // IBIS_INDEX_H