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
00081 class ibis::index {
00082 public:
00086 enum INDEX_TYPE {
00087 BINNING=0,
00088 RANGE,
00089 MESA,
00090 AMBIT,
00091 PALE,
00092 PACK,
00093 ZONE,
00094 RELIC,
00095 ROSTER,
00096 SLICE,
00097 FADE,
00098 SBIAD,
00099 SAPID,
00100 EGALE,
00101 MOINS,
00102 ENTRE,
00103 BAK,
00104 BAK2,
00105
00106
00107 KEYWORDS,
00108 MESH,
00109 BAND,
00110 DIREKTE,
00111 GENERIC,
00112 BYLT,
00113 FUZZ,
00114 ZONA,
00115 FUGE,
00116 EXTERN
00117 };
00118
00120 static index* create(const column* c, const char* name=0,
00121 const char* spec=0, int inEntirety=0);
00125 static bool isIndex(const char* f, INDEX_TYPE t);
00127 virtual ~index () {clear();};
00128
00130 virtual INDEX_TYPE type() const = 0;
00133 virtual const char* name() const = 0;
00134
00137 virtual long evaluate(const ibis::qContinuousRange& expr,
00138 ibis::bitvector& hits) const = 0;
00141 virtual long evaluate(const ibis::qDiscreteRange&,
00142 ibis::bitvector&) const {return -1;}
00143
00154 virtual void estimate(const ibis::qContinuousRange& expr,
00155 ibis::bitvector& lower,
00156 ibis::bitvector& upper) const {
00157 lower.set(0, nrows); upper.set(1, nrows);}
00159 virtual uint32_t estimate(const ibis::qContinuousRange& expr) const {
00160 return nrows;}
00168 virtual float undecidable(const ibis::qContinuousRange& expr,
00169 ibis::bitvector& iffy) const {return 0.5;}
00170
00173 virtual void estimate(const ibis::qDiscreteRange& expr,
00174 ibis::bitvector& lower,
00175 ibis::bitvector& upper) const;
00176 virtual uint32_t estimate(const ibis::qDiscreteRange& expr) const;
00177 virtual float undecidable(const ibis::qDiscreteRange& expr,
00178 ibis::bitvector& iffy) const;
00179
00181 virtual void estimate(const ibis::index& idx2,
00182 const ibis::rangeJoin& expr,
00183 ibis::bitvector64& lower,
00184 ibis::bitvector64& upper) const;
00187 virtual void estimate(const ibis::index& idx2,
00188 const ibis::rangeJoin& expr,
00189 const ibis::bitvector& mask,
00190 ibis::bitvector64& lower,
00191 ibis::bitvector64& upper) const;
00192 virtual void estimate(const ibis::index& idx2,
00193 const ibis::rangeJoin& expr,
00194 const ibis::bitvector& mask,
00195 const ibis::qRange* const range1,
00196 const ibis::qRange* const range2,
00197 ibis::bitvector64& lower,
00198 ibis::bitvector64& upper) const;
00200 virtual int64_t estimate(const ibis::index& idx2,
00201 const ibis::rangeJoin& expr) const;
00204 virtual int64_t estimate(const ibis::index& idx2,
00205 const ibis::rangeJoin& expr,
00206 const ibis::bitvector& mask) const;
00207 virtual int64_t estimate(const ibis::index& idx2,
00208 const ibis::rangeJoin& expr,
00209 const ibis::bitvector& mask,
00210 const ibis::qRange* const range1,
00211 const ibis::qRange* const range2) const;
00212
00214 virtual void estimate(const ibis::rangeJoin& expr,
00215 const ibis::bitvector& mask,
00216 const ibis::qRange* const range1,
00217 const ibis::qRange* const range2,
00218 ibis::bitvector64& lower,
00219 ibis::bitvector64& upper) const;
00220 virtual int64_t estimate(const ibis::rangeJoin& expr,
00221 const ibis::bitvector& mask,
00222 const ibis::qRange* const range1,
00223 const ibis::qRange* const range2) const;
00224
00226 virtual double estimateCost(const ibis::qContinuousRange& expr) const {
00227 return (offset32.empty() ? (nrows<<3) : offset32.back());}
00228 virtual double estimateCost(const ibis::qDiscreteRange& expr) const {
00229 return (offset32.empty() ? (nrows<<3) : offset32.back());}
00230
00233 virtual void print(std::ostream& out) const = 0;
00237 virtual int write(const char* name) const = 0;
00241 virtual int read(const char* name) = 0;
00244 virtual int read(ibis::fileManager::storage* st) = 0;
00245
00247 virtual long append(const char* dt, const char* df, uint32_t nnew) {
00248 return -1;}
00249
00251 virtual void speedTest(std::ostream& out) const {};
00253 virtual uint32_t numBitvectors() const {return bits.size();}
00255 virtual const ibis::bitvector* getBitvector(uint32_t i) const {
00256 if (i < bits.size()) {
00257 if (bits[i] == 0)
00258 activate(i);
00259 return bits[i];
00260 }
00261 else {
00262 return 0;
00263 }
00264 }
00265
00268 virtual void binBoundaries(std::vector<double>&) const {return;}
00269 virtual void binWeights(std::vector<uint32_t>&) const {return;}
00270
00272 virtual long getCumulativeDistribution
00273 (std::vector<double>& bds, std::vector<uint32_t>& cts) const;
00275 virtual long getDistribution
00276 (std::vector<double>& bbs, std::vector<uint32_t>& cts) const;
00278 virtual double getMin() const {
00279 return std::numeric_limits<double>::quiet_NaN();}
00281 virtual double getMax() const {
00282 return std::numeric_limits<double>::quiet_NaN();}
00286 virtual double getSum() const {
00287 return std::numeric_limits<double>::quiet_NaN();}
00288 virtual uint32_t getNRows() const {return nrows;}
00289
00295 virtual int expandRange(ibis::qContinuousRange& rng) const {return 0;}
00296 virtual int contractRange(ibis::qContinuousRange& rng) const {return 0;}
00297
00298 typedef std::map< double, ibis::bitvector* > VMap;
00299 typedef std::map< double, uint32_t > histogram;
00300 template <typename E>
00301 static void mapValues(const array_t<E>& val, VMap& bmap);
00302 template <typename E>
00303 static void mapValues(const array_t<E>& val, histogram& hist,
00304 uint32_t count=0);
00305 template <typename E>
00306 static void mapValues(const array_t<E>& val, array_t<E>& bounds,
00307 std::vector<uint32_t>& cnts);
00308 template <typename E1, typename E2>
00309 static void mapValues(const array_t<E1>& val1, const array_t<E2>& val2,
00310 array_t<E1>& bnd1, array_t<E2>& bnd2,
00311 std::vector<uint32_t>& cnts);
00314 static void divideCounts(array_t<uint32_t>& bounds,
00315 const array_t<uint32_t>& cnt);
00316
00317
00318 static void addBits(const std::vector<ibis::bitvector*>& bits,
00319 uint32_t ib, uint32_t ie, ibis::bitvector& res);
00320 static void sumBits(const std::vector<ibis::bitvector*>& bits,
00321 uint32_t ib, uint32_t ie, ibis::bitvector& res);
00322 static void sumBits(const std::vector<ibis::bitvector*>& bits,
00323 const ibis::bitvector& tot, uint32_t ib, uint32_t ie,
00324 ibis::bitvector& res);
00325
00326 static void setBases(array_t<uint32_t>& bases, uint32_t card,
00327 uint32_t nbase = 2);
00328
00329 protected:
00330
00332 const ibis::column* col;
00335 mutable ibis::fileManager::storage* str;
00337 mutable const char* fname;
00339 mutable array_t<int32_t> offset32;
00343 mutable array_t<int64_t> offset64;
00345 mutable std::vector<ibis::bitvector*> bits;
00349 uint32_t nrows;
00350
00354 index(const ibis::column* c=0) : col(c), str(0), fname(0), nrows(0) {}
00355 index(const ibis::column* c, ibis::fileManager::storage* s);
00356
00358 void dataFileName(const char* f, std::string& name) const;
00360 void indexFileName(const char* f, std::string& name) const;
00361 static void indexFileName(std::string& name, const ibis::column* col1,
00362 const ibis::column* col2, const char* f=0);
00363
00365 virtual void activate() const;
00367 virtual void activate(uint32_t i) const;
00370 virtual void activate(uint32_t i, uint32_t j) const;
00372 virtual void clear();
00373
00375
00376
00379 void mapValues(const char* f, VMap& bmap) const;
00381 void mapValues(const char* f, histogram& hist, uint32_t count=0) const;
00382 void computeMinMax(const char* f, double& min, double& max) const;
00384 void optionalUnpack(std::vector<ibis::bitvector*>& bits,
00385 const char* opt);
00388 void addBins(uint32_t ib, uint32_t ie, ibis::bitvector& res) const;
00391 void addBins(uint32_t ib, uint32_t ie, ibis::bitvector& res,
00392 const ibis::bitvector& tot) const;
00395 void sumBins(uint32_t ib, uint32_t ie, ibis::bitvector& res) const;
00398 void sumBins(uint32_t ib, uint32_t ie, ibis::bitvector& res,
00399 uint32_t ib0, uint32_t ie0) const;
00400
00401 int initOffsets(int fdes, const char offsize, size_t start,
00402 uint32_t nobs);
00403 int initOffsets(ibis::fileManager::storage* st, size_t start,
00404 uint32_t nobs);
00405 void initBitmaps(int fdes);
00406 void initBitmaps(ibis::fileManager::storage* st);
00407
00408 class barrel;
00409
00410 private:
00411 index(const index&);
00412 index& operator=(const index&);
00413 };
00414
00415
00418 class ibis::index::barrel : public ibis::math::barrel {
00419 public:
00420 barrel(const ibis::math::term* t) : ibis::math::barrel(t) {}
00421
00422 void setValue(uint32_t i, double v) {varvalues[i] = v;}
00423 };
00424 #endif // IBIS_INDEX_H