00001
00002
00003
00004 #ifndef IBIS_PART_H
00005 #define IBIS_PART_H
00006
00007
00008
00009
00010
00011
00012 #include "column.h"
00013 #include "resource.h"
00014 #include "utilidor.h"
00015
00016 #include <string>
00017 #include <vector>
00018
00027 class FASTBIT_CXX_DLLSPEC ibis::part {
00028 public:
00029 enum TABLE_STATE {
00030 UNKNOWN_STATE=0, STABLE_STATE, RECEIVING_STATE,
00031 PRETRANSITION_STATE, TRANSITION_STATE, POSTTRANSITION_STATE
00032 };
00033 struct info;
00034 class readLock;
00035
00036
00037
00038
00039
00041 virtual ~part();
00043 explicit part(const char* name=0, bool ro=false);
00045 part(const char* adir, const char* bdir, bool ro=false);
00047 part(const std::vector<const char*> &mtags, bool ro=false);
00049 part(const ibis::resource::vList &mtags, bool ro=false);
00050
00051 inline info* getInfo() const;
00052 TABLE_STATE getState() const;
00054 TABLE_STATE getStateNoLocking() const {return state;}
00055
00056 virtual int buildIndexes(const char* iopt=0, int nthr=1);
00057 void buildSorted(const char* colname) const;
00058 void loadIndexes(const char* iopt=0, int ropt=0) const;
00059 void unloadIndexes() const;
00060 void purgeIndexFiles() const;
00061
00063 const char* name() const {return m_name;}
00065 const char* description() const {return m_desc.c_str();}
00067 const char* indexSpec() const {return idxstr;}
00069 void indexSpec(const char*);
00071 time_t timestamp() const {return switchTime;}
00074 std::string metaTags() const;
00075 ibis::table::stringList columnNames() const;
00076 ibis::table::typeList columnTypes() const;
00077 column* getColumn(const char* name) const;
00078 column* getColumn(uint32_t ind) const;
00079
00081 const char* currentDataDir() const {return activeDir;}
00083 uint32_t nColumns() const {return columns.size();}
00085 uint32_t nRows() const {return nEvents;}
00086
00087 int updateData();
00088
00090 void print(std::ostream &out) const;
00091
00093 bool matchNameValuePair(const char* name, const char* value) const;
00096 bool matchMetaTags(const std::vector<const char*> &mtags) const;
00098 bool matchMetaTags(const ibis::resource::vList &mtags) const;
00100 inline const char* getMetaTag(const char*) const;
00101
00103 virtual long selfTest(int nth=1, const char* pref=0) const;
00106 void computeMinMax();
00107
00108
00109
00110
00111
00112
00113
00115 uint32_t getRowNumber(const rid_t &rid) const;
00116 long evaluateRIDSet(const ibis::RIDSet&, ibis::bitvector&) const;
00117 array_t<rid_t>* getRIDs() const {return rids;}
00118 array_t<rid_t>* getRIDs(const ibis::bitvector &mask) const;
00119 bool hasRIDs() const {return (rids!=0) ? (rids->size()==nEvents) : false;}
00120
00122 virtual double estimateCost(const ibis::qContinuousRange &cmp) const;
00123 virtual double estimateCost(const ibis::qDiscreteRange &cmp) const;
00124 virtual double estimateCost(const ibis::qIntHod &cmp) const;
00125 virtual double estimateCost(const ibis::qUIntHod &cmp) const;
00126 virtual double estimateCost(const ibis::qString &cmp) const;
00127 virtual double estimateCost(const ibis::qMultiString &cmp) const;
00128
00130 virtual long estimateRange(const ibis::qContinuousRange &cmp) const;
00131
00133 virtual long estimateRange(const ibis::qDiscreteRange &cmp) const;
00135 virtual long estimateRange(const ibis::qIntHod &cmp) const;
00137 virtual long estimateRange(const ibis::qUIntHod &cmp) const;
00138
00140 virtual long evaluateRange(const ibis::qContinuousRange &cmp,
00141 const ibis::bitvector &mask,
00142 ibis::bitvector &res) const;
00144 virtual long evaluateRange(const ibis::qDiscreteRange &cmp,
00145 const ibis::bitvector &mask,
00146 ibis::bitvector &res) const;
00148 virtual long evaluateRange(const ibis::qIntHod &cmp,
00149 const ibis::bitvector &mask,
00150 ibis::bitvector &res) const;
00152 virtual long evaluateRange(const ibis::qUIntHod &cmp,
00153 const ibis::bitvector &mask,
00154 ibis::bitvector &res) const;
00155
00157 virtual long estimateRange(const ibis::qContinuousRange &cmp,
00158 ibis::bitvector &low,
00159 ibis::bitvector &high) const;
00160
00162 virtual float getUndecidable(const ibis::qContinuousRange &cmp,
00163 ibis::bitvector &iffy) const;
00164
00166 virtual long estimateRange(const ibis::qDiscreteRange &cmp,
00167 ibis::bitvector &low,
00168 ibis::bitvector &high) const;
00170 virtual float getUndecidable(const ibis::qDiscreteRange &cmp,
00171 ibis::bitvector &iffy) const;
00172
00174 virtual long estimateRange(const ibis::qIntHod &cmp,
00175 ibis::bitvector &low,
00176 ibis::bitvector &high) const;
00178 virtual float getUndecidable(const ibis::qIntHod &cmp,
00179 ibis::bitvector &iffy) const;
00180
00182 virtual long estimateRange(const ibis::qUIntHod &cmp,
00183 ibis::bitvector &low,
00184 ibis::bitvector &high) const;
00186 virtual float getUndecidable(const ibis::qUIntHod &cmp,
00187 ibis::bitvector &iffy) const;
00188
00191 virtual long doScan(const ibis::qRange &cmp,
00192 ibis::bitvector &hits) const;
00195 virtual long doScan(const ibis::qRange &cmp,
00196 const ibis::bitvector &mask,
00197 ibis::bitvector &hits) const;
00200 virtual long negativeScan(const ibis::qRange &cmp,
00201 const ibis::bitvector &mask,
00202 ibis::bitvector &hits) const;
00203
00204 long doScan(const ibis::math::term&, const ibis::bitvector&,
00205 ibis::bitvector&) const;
00207 virtual long doScan(const ibis::compRange &cmp,
00208 ibis::bitvector &hits) const;
00211 virtual long doScan(const ibis::compRange &cmp,
00212 const ibis::bitvector &mask,
00213 ibis::bitvector &hits) const;
00214
00216 template <typename E>
00217 static long doScan(const array_t<E> &varr,
00218 const ibis::qRange &cmp,
00219 const ibis::bitvector &mask,
00220 ibis::bitvector &hits);
00222 template <typename E>
00223 static long doScan(const array_t<E> &varr,
00224 const ibis::qContinuousRange &cmp,
00225 const ibis::bitvector &mask,
00226 ibis::bitvector &hits);
00227
00229 long countHits(const ibis::qRange &cmp) const;
00230
00235 virtual long estimateMatchAny(const ibis::qAnyAny &cmp,
00236 ibis::bitvector &low,
00237 ibis::bitvector &high) const;
00238 virtual long matchAny(const ibis::qAnyAny &cmp,
00239 ibis::bitvector &hits) const;
00240 virtual long matchAny(const ibis::qAnyAny &cmp,
00241 const ibis::bitvector &mask,
00242 ibis::bitvector &hits) const;
00243
00244 long patternSearch(const ibis::qLike &cmp,
00245 ibis::bitvector &low) const;
00246 long lookforString(const ibis::qString &cmp,
00247 ibis::bitvector &low) const;
00248 long lookforString(const ibis::qMultiString &cmp,
00249 ibis::bitvector &low) const;
00250 long patternSearch(const ibis::qLike &cmp) const;
00251 long lookforString(const ibis::qString &cmp) const;
00252 long lookforString(const ibis::qMultiString &cmp) const;
00253
00258 int64_t evaluateJoin(const ibis::deprecatedJoin &cmp,
00259 const ibis::bitvector &mask,
00260 ibis::bitvector64 &pairs) const;
00263 int64_t evaluateJoin(const ibis::deprecatedJoin &cmp,
00264 const ibis::bitvector &mask,
00265 const char* pairfile) const;
00267 int64_t evaluateJoin(const ibis::deprecatedJoin &cmp,
00268 const ibis::bitvector &mask) const;
00271 int64_t evaluateJoin(const std::vector<const ibis::deprecatedJoin*> &cmp,
00272 const ibis::bitvector &mask,
00273 ibis::bitvector64 &pairs) const;
00274 int64_t evaluateJoin(const std::vector<const ibis::deprecatedJoin*> &cmp,
00275 const ibis::bitvector &mask) const;
00280 int64_t evaluateJoin(const ibis::deprecatedJoin &cmp,
00281 const ibis::bitvector64 &trial,
00282 ibis::bitvector64 &result) const;
00283 int64_t evaluateJoin(const std::vector<const ibis::deprecatedJoin*> &cmp,
00284 const ibis::bitvector64 &trial,
00285 ibis::bitvector64 &result) const;
00286
00287
00289 array_t<signed char>*
00290 selectBytes(const char* name, const ibis::bitvector &mask) const;
00292 array_t<unsigned char>*
00293 selectUBytes(const char* name, const ibis::bitvector &mask) const;
00295 array_t<int16_t>*
00296 selectShorts(const char* name, const ibis::bitvector &mask) const;
00298 array_t<uint16_t>*
00299 selectUShorts(const char* name, const ibis::bitvector &mask) const;
00301 array_t<int32_t>*
00302 selectInts(const char* name, const ibis::bitvector &mask) const;
00304 array_t<uint32_t>*
00305 selectUInts(const char* name, const ibis::bitvector &mask) const;
00307 array_t<int64_t>*
00308 selectLongs(const char* name, const ibis::bitvector &mask) const;
00310 array_t<uint64_t>*
00311 selectULongs(const char* name, const ibis::bitvector &mask) const;
00313 array_t<float>*
00314 selectFloats(const char* name, const ibis::bitvector &mask) const;
00316 array_t<double>*
00317 selectDoubles(const char* name, const ibis::bitvector &mask) const;
00319 std::vector<std::string>*
00320 selectStrings(const char* name, const ibis::bitvector &mask) const;
00322 long calculate(const ibis::math::term&, const ibis::bitvector&,
00323 array_t<double>&) const;
00324
00325
00326
00327
00328
00329
00331 double getActualMin(const char *name) const;
00333 double getActualMax(const char *name) const;
00335 double getColumnSum(const char *name) const;
00336
00340 long get1DDistribution(const char *constraints, const char *cname,
00341 double begin, double end, double stride,
00342 std::vector<uint32_t> &counts) const;
00344 long get2DDistribution(const char *constraints, const char *cname1,
00345 double begin1, double end1, double stride1,
00346 const char *cname2,
00347 double begin2, double end2, double stride2,
00348 std::vector<uint32_t> &counts) const;
00350 long get3DDistribution(const char *constraints, const char *cname1,
00351 double begin1, double end1, double stride1,
00352 const char *cname2,
00353 double begin2, double end2, double stride2,
00354 const char *cname3,
00355 double begin3, double end3, double stride3,
00356 std::vector<uint32_t> &counts) const;
00358 long get1DDistribution(const char *constraints, const char *cname,
00359 double begin, double end, double stride,
00360 const char *wtname,
00361 std::vector<double> &weights) const;
00363 long get2DDistribution(const char *constraints, const char *cname1,
00364 double begin1, double end1, double stride1,
00365 const char *cname2,
00366 double begin2, double end2, double stride2,
00367 const char *wtname,
00368 std::vector<double> &weights) const;
00370 long get3DDistribution(const char *constraints, const char *cname1,
00371 double begin1, double end1, double stride1,
00372 const char *cname2,
00373 double begin2, double end2, double stride2,
00374 const char *cname3,
00375 double begin3, double end3, double stride3,
00376 const char *wtname,
00377 std::vector<double> &weights) const;
00379 long get1DDistribution(const char *cname, uint32_t nbin,
00380 std::vector<double> &bounds,
00381 std::vector<uint32_t> &counts) const;
00383 long get1DDistribution(const char *constraints,
00384 const char *cname, uint32_t nbin,
00385 std::vector<double> &bounds,
00386 std::vector<uint32_t> &counts) const;
00388 long get2DDistribution(const char *cname1, const char *cname2,
00389 uint32_t nb1, uint32_t nb2,
00390 std::vector<double> &bounds1,
00391 std::vector<double> &bounds2,
00392 std::vector<uint32_t> &counts,
00393 const char* const option=0) const;
00395 long get2DDistribution(const char *constraints,
00396 const char *name1, const char *name2,
00397 uint32_t nb1, uint32_t nb2,
00398 std::vector<double> &bounds1,
00399 std::vector<double> &bounds2,
00400 std::vector<uint32_t> &counts) const;
00402 long get3DDistribution(const char *cname1, const char *cname2,
00403 const char *cname3,
00404 uint32_t nb1, uint32_t nb2, uint32_t nb3,
00405 std::vector<double> &bounds1,
00406 std::vector<double> &bounds2,
00407 std::vector<double> &bounds3,
00408 std::vector<uint32_t> &counts,
00409 const char* const option=0) const;
00411 long get3DDistribution(const char *constraints,
00412 const char *cname1, const char *cname2,
00413 const char *cname3,
00414 uint32_t nb1, uint32_t nb2, uint32_t nb3,
00415 std::vector<double> &bounds1,
00416 std::vector<double> &bounds2,
00417 std::vector<double> &bounds3,
00418 std::vector<uint32_t> &counts) const;
00420 long get1DBins(const char *constraints, const char *cname,
00421 double begin, double end, double stride,
00422 std::vector<ibis::bitvector> &bins) const;
00424 long get1DBins(const char *constraints, const char *cname,
00425 double begin, double end, double stride,
00426 std::vector<ibis::bitvector*> &bins) const;
00428 long get1DBins(const char *constraints, const char *cname,
00429 double begin, double end, double stride,
00430 const char *wtname,
00431 std::vector<double> &weights,
00432 std::vector<ibis::bitvector*> &bins) const;
00434 long get2DBins(const char *constraints, const char *cname1,
00435 double begin1, double end1, double stride1,
00436 const char *cname2,
00437 double begin2, double end2, double stride2,
00438 std::vector<ibis::bitvector> &bins) const;
00440 long get2DBins(const char *constraints, const char *cname1,
00441 double begin1, double end1, double stride1,
00442 const char *cname2,
00443 double begin2, double end2, double stride2,
00444 std::vector<ibis::bitvector*> &bins) const;
00446 long get2DBins(const char *constraints, const char *cname1,
00447 double begin1, double end1, double stride1,
00448 const char *cname2,
00449 double begin2, double end2, double stride2,
00450 const char *wtname,
00451 std::vector<double> &weights,
00452 std::vector<ibis::bitvector*> &bins) const;
00454 long get3DBins(const char *constraints, const char *cname1,
00455 double begin1, double end1, double stride1,
00456 const char *cname2,
00457 double begin2, double end2, double stride2,
00458 const char *cname3,
00459 double begin3, double end3, double stride3,
00460 std::vector<ibis::bitvector> &bins) const;
00462 long get3DBins(const char *constraints, const char *cname1,
00463 double begin1, double end1, double stride1,
00464 const char *cname2,
00465 double begin2, double end2, double stride2,
00466 const char *cname3,
00467 double begin3, double end3, double stride3,
00468 std::vector<ibis::bitvector*> &bins) const;
00470 long get3DBins(const char *constraints, const char *cname1,
00471 double begin1, double end1, double stride1,
00472 const char *cname2,
00473 double begin2, double end2, double stride2,
00474 const char *cname3,
00475 double begin3, double end3, double stride3,
00476 const char *wtname,
00477 std::vector<double> &weights,
00478 std::vector<ibis::bitvector*> &bins) const;
00481 long get1DBins(const char *constraints, const char *cname1, uint32_t nb1,
00482 std::vector<double> &bounds1,
00483 std::vector<ibis::bitvector> &bins) const;
00485 long get2DBins(const char *constraints,
00486 const char *cname1, const char *cname2,
00487 uint32_t nb1, uint32_t nb2,
00488 std::vector<double> &bounds1,
00489 std::vector<double> &bounds2,
00490 std::vector<ibis::bitvector> &bins) const;
00492 long get3DBins(const char *constraints,
00493 const char *cname1, const char *cname2, const char *cname3,
00494 uint32_t nb1, uint32_t nb2, uint32_t nb3,
00495 std::vector<double> &bounds1,
00496 std::vector<double> &bounds2,
00497 std::vector<double> &bounds3,
00498 std::vector<ibis::bitvector> &bins) const;
00500
00505 long getDistribution(const char *name,
00506 std::vector<double> &bounds,
00507 std::vector<uint32_t> &counts) const;
00509 long getDistribution(const char *constraints,
00510 const char *name,
00511 std::vector<double> &bounds,
00512 std::vector<uint32_t> &counts) const;
00515 long getDistribution(const char *name, uint32_t nbc,
00516 double *bounds, uint32_t *counts) const;
00519 long getDistribution(const char *name, const char *constraints,
00520 uint32_t nbc, double *bounds,
00521 uint32_t *counts) const;
00522
00524 long getJointDistribution(const char *constraints,
00525 const char *name1, const char *name2,
00526 std::vector<double> &bounds1,
00527 std::vector<double> &bounds2,
00528 std::vector<uint32_t> &counts) const;
00529
00531 long getCumulativeDistribution(const char *name,
00532 std::vector<double> &bounds,
00533 std::vector<uint32_t> &counts) const;
00536 long getCumulativeDistribution(const char *constraints,
00537 const char *name,
00538 std::vector<double> &bounds,
00539 std::vector<uint32_t> &counts) const;
00542 long getCumulativeDistribution(const char *name, uint32_t nbc,
00543 double *bounds, uint32_t *counts) const;
00546 long getCumulativeDistribution(const char *constraints, const char *name,
00547 uint32_t nbc, double *bounds,
00548 uint32_t *counts) const;
00550
00551
00562 const std::vector<uint32_t> &getMeshShape() const {return shapeSize;}
00565 const std::vector<std::string> &getMeshDimensions() const {
00566 return shapeName;}
00570 void setMeshShape(const char *shape) {
00571 digestMeshShape(shape);
00572 writeMetaData(nEvents, columns, activeDir);
00573 }
00575 void updateMetaData() const {writeMetaData(nEvents, columns, activeDir);}
00577 void combineNames(ibis::table::namesTypes &metalist) const;
00578
00579
00581 long append(const char* dir);
00586 long commit(const char* dir);
00589 long rollback();
00590 long addColumn(const char* aexpr, const char* cname,
00591 ibis::TYPE_T ctype=ibis::DOUBLE);
00592 long addColumn(const ibis::math::term* xpr, ibis::bitvector& mask,
00593 const char* cname, ibis::TYPE_T ctype=ibis::DOUBLE);
00594
00595
00596 virtual long reorder();
00597 virtual long reorder(const ibis::table::stringList &names);
00598 virtual long reorder(const ibis::table::stringList &names,
00599 const std::vector<bool> &directions);
00600
00601 long deactivate(const std::vector<uint32_t> &rows);
00602 long deactivate(const char* conds);
00603 long reactivate(const std::vector<uint32_t> &rows);
00604 long reactivate(const char* conds);
00605 long purgeInactive();
00606 void emptyCache() const;
00608 const ibis::bitvector &getNullMask() const {return amask;}
00609
00610 static const char* skipPrefix(const char*);
00612 static char* readMetaTags(const char* const dir);
00614 static void genName(const std::vector<const char*> &mtags,
00615 std::string &name);
00617 static void genName(const ibis::resource::vList &mtags,
00618 std::string &name);
00621 void rename(const ibis::partAssoc& known);
00623 static uint32_t countPages(const ibis::bitvector &mask,
00624 unsigned elemsize=4);
00626 ibis::fileManager::ACCESS_PREFERENCE
00627 accessHint(const ibis::bitvector &mask, unsigned elemsize=4) const;
00628
00630 struct thrArg {
00631 const part* et;
00632 const char* pref;
00633 long* nerrors;
00634 ibis::util::counter cnt;
00635 std::vector<std::string> conds;
00636 std::vector<unsigned> super;
00637 std::vector<unsigned> hits;
00638 };
00640 struct indexBuilderPool {
00641 ibis::util::counter cnt;
00642 const char* opt;
00643 const part &tbl;
00644 indexBuilderPool(const part &t, const char* spec)
00645 : cnt(), opt(spec), tbl(t) {}
00646 };
00647
00649 void queryTest(const char* pref, long* nerrors) const;
00651 void quickTest(const char* pref, long* nerrors) const;
00654 void testRangeOperators(const ibis::column* col,
00655 long* nerrors) const;
00656
00657
00658 void logWarning(const char* event, const char* fmt, ...) const;
00659 void logMessage(const char* event, const char* fmt, ...) const;
00660
00661 void doBackup();
00662
00663 class barrel;
00664 class vault;
00666 typedef std::map< const char*, column*, lessi > columnList;
00667
00668 template <typename T> static int
00669 writeColumn(int fdes, ibis::bitvector::word_t nold,
00670 ibis::bitvector::word_t nnew,
00671 const array_t<T>& vals, const T& fill,
00672 ibis::bitvector& totmask,
00673 const ibis::bitvector& newmask);
00674 static int writeString(int fdes, ibis::bitvector::word_t nold,
00675 ibis::bitvector::word_t nnew,
00676 const std::vector<std::string>& vals,
00677 ibis::bitvector& totmask,
00678 const ibis::bitvector& newmask);
00679 static int writeRaw(int bdes, int sdes, ibis::bitvector::word_t nold,
00680 ibis::bitvector::word_t nnew,
00681 const ibis::array_t<unsigned char>& bytes,
00682 const ibis::array_t<int64_t>& starts,
00683 ibis::bitvector& totmask,
00684 const ibis::bitvector& newmask);
00685
00686 protected:
00687 class cleaner;
00688 class writeLock;
00689 class softWriteLock;
00690 class mutexLock;
00691
00692 friend struct info;
00693 friend class cleaner;
00694 friend class readLock;
00695 friend class writeLock;
00696 friend class softWriteLock;
00697 friend class mutexLock;
00698
00699
00700
00701
00702 char* m_name;
00703 std::string m_desc;
00704 ibis::resource::vList metaList;
00705 mutable array_t<rid_t>* rids;
00706 columnList columns;
00707 uint32_t nEvents;
00708 char* activeDir;
00709 char* backupDir;
00710 time_t switchTime;
00711 TABLE_STATE state;
00712 char* idxstr;
00713
00714 ibis::bitvector amask;
00715 std::vector<const column*> colorder;
00716 std::vector<std::string> shapeName;
00717 std::vector<uint32_t> shapeSize;
00718
00719 ibis::part::cleaner* myCleaner;
00720 bool readonly;
00721
00722
00723
00724
00725
00727 int readMetaData(uint32_t &nrows, columnList &plist, const char* dir);
00729 void writeMetaData(const uint32_t nrows, const columnList &plist,
00730 const char* dir) const;
00731 void readRIDs() const;
00732 void freeRIDs() const;
00733
00734
00735
00736
00737 void extendMetaTags();
00738 void setMetaTags(const ibis::resource::vList &mts);
00739 void setMetaTags(const std::vector<const char*> &mts);
00740
00742 void readMeshShape(const char* const dir);
00744 void digestMeshShape(const char* shape);
00745
00747 void logError(const char* event, const char* fmt, ...) const;
00748
00749 void makeBackupCopy();
00750 long verifyBackupDir();
00751 void deriveBackupDirName();
00752 long appendToBackup(const char* dir);
00753
00755 template <typename T>
00756 long writeValues(const char *fname, const array_t<uint32_t> &ind);
00758 template <typename T>
00759 long reorderValues(const char *fname,
00760 array_t<uint32_t> &starts,
00761 array_t<uint32_t> &indout,
00762 const array_t<uint32_t> &indin,
00763 bool ascending);
00764 long append1(const char* dir);
00765 long append2(const char* dir);
00766
00768 long deactivate(const ibis::bitvector &rows);
00770 long reactivate(const ibis::bitvector &rows);
00772 void numbersToBitvector(const std::vector<uint32_t>&,
00773 ibis::bitvector&) const;
00774 void stringToBitvector(const char*, ibis::bitvector&) const;
00775
00776 template <typename T>
00777 long doCompare(const array_t<T> &array,
00778 const ibis::bitvector &mask,
00779 ibis::bitvector &hits,
00780 const ibis::qRange &cmp) const;
00781 template <typename T>
00782 long doCompare(const char *file,
00783 const ibis::bitvector &mask,
00784 ibis::bitvector &hits,
00785 const ibis::qRange &cmp) const;
00786 template <typename T>
00787 long negativeCompare(const array_t<T> &array,
00788 const ibis::bitvector &mask,
00789 ibis::bitvector &hits,
00790 const ibis::qRange &cmp) const;
00791 template <typename T>
00792 long negativeCompare(const char *file,
00793 const ibis::bitvector &mask,
00794 ibis::bitvector &hits,
00795 const ibis::qRange &cmp) const;
00796
00797 template <typename T>
00798 long doCompare(const array_t<T> &array,
00799 const ibis::bitvector &mask,
00800 ibis::bitvector &hits,
00801 const ibis::qIntHod &cmp) const;
00802 template <typename T>
00803 long doCompare(const char *file,
00804 const ibis::bitvector &mask,
00805 ibis::bitvector &hits,
00806 const ibis::qIntHod &cmp) const;
00807 template <typename T>
00808 long negativeCompare(const array_t<T> &array,
00809 const ibis::bitvector &mask,
00810 ibis::bitvector &hits,
00811 const ibis::qIntHod &cmp) const;
00812 template <typename T>
00813 long negativeCompare(const char *file,
00814 const ibis::bitvector &mask,
00815 ibis::bitvector &hits,
00816 const ibis::qIntHod &cmp) const;
00817
00818 template <typename T>
00819 long doCompare(const array_t<T> &array,
00820 const ibis::bitvector &mask,
00821 ibis::bitvector &hits,
00822 const ibis::qUIntHod &cmp) const;
00823 template <typename T>
00824 long doCompare(const char *file,
00825 const ibis::bitvector &mask,
00826 ibis::bitvector &hits,
00827 const ibis::qUIntHod &cmp) const;
00828 template <typename T>
00829 long negativeCompare(const array_t<T> &array,
00830 const ibis::bitvector &mask,
00831 ibis::bitvector &hits,
00832 const ibis::qUIntHod &cmp) const;
00833 template <typename T>
00834 long negativeCompare(const char *file,
00835 const ibis::bitvector &mask,
00836 ibis::bitvector &hits,
00837 const ibis::qUIntHod &cmp) const;
00838
00839 template <typename T, typename F>
00840 static long doCompare(const array_t<T> &vals, F cmp,
00841 const ibis::bitvector &mask,
00842 ibis::bitvector &hits);
00843
00844 template <typename T, typename F>
00845 static long doCompare0(const array_t<T> &vals, F cmp,
00846 const ibis::bitvector &mask,
00847 ibis::bitvector &hits);
00848
00849 template <typename T, typename F1, typename F2>
00850 static long doCompare(const array_t<T> &vals, F1 cmp1, F2 cmp2,
00851 const ibis::bitvector &mask,
00852 ibis::bitvector &hits);
00853
00854 template <typename T, typename F1, typename F2>
00855 static long doCompare0(const array_t<T> &vals, F1 cmp1, F2 cmp2,
00856 const ibis::bitvector &mask,
00857 ibis::bitvector &hits);
00858
00859 template <typename T>
00860 long doCount(const ibis::qRange &cmp) const;
00861
00864 template <typename T>
00865 long doCount(const array_t<T> &vals, const ibis::qIntHod &cmp,
00866 const ibis::bitvector &mask) const;
00867
00870 template <typename T>
00871 long doCount(const array_t<T> &vals, const ibis::qUIntHod &cmp,
00872 const ibis::bitvector &mask) const;
00873
00876 template <typename T>
00877 long doCount(const array_t<T> &vals, const ibis::qRange &cmp,
00878 const ibis::bitvector &mask) const;
00879
00881 template <typename T, typename F>
00882 long doCount(const array_t<T> &vals,
00883 const ibis::bitvector &mask, F cmp) const;
00884
00886 template <typename T, typename F1, typename F2>
00887 long doCount(const array_t<T> &vals,
00888 const ibis::bitvector &mask, F1 cmp1, F2 cmp2) const;
00889
00892 long packCumulativeDistribution(const std::vector<double> &bounds,
00893 const std::vector<uint32_t> &counts,
00894 uint32_t nbc,
00895 double *bptr, uint32_t *cptr) const;
00897 long packDistribution(const std::vector<double> &bounds,
00898 const std::vector<uint32_t> &counts,
00899 uint32_t nbc, double *bptr, uint32_t *cptr) const;
00900
00902 template <typename T1, typename T2>
00903 long count2DBins(array_t<T1> &vals1,
00904 const double &begin1, const double &end1,
00905 const double &stride1,
00906 array_t<T2> &vals2,
00907 const double &begin2, const double &end2,
00908 const double &stride2,
00909 std::vector<uint32_t> &counts) const;
00911 template <typename T1, typename T2, typename T3>
00912 long count3DBins(const array_t<T1> &vals1,
00913 const double &begin1, const double &end1,
00914 const double &stride1,
00915 const array_t<T2> &vals2,
00916 const double &begin2, const double &end2,
00917 const double &stride2,
00918 const array_t<T3> &vals3,
00919 const double &begin3, const double &end3,
00920 const double &stride3,
00921 std::vector<uint32_t> &counts) const;
00923 template <typename T1, typename T2>
00924 long count2DWeights(array_t<T1> &vals1,
00925 const double &begin1, const double &end1,
00926 const double &stride1,
00927 array_t<T2> &vals2,
00928 const double &begin2, const double &end2,
00929 const double &stride2,
00930 array_t<double> &wts,
00931 std::vector<double> &weights) const;
00933 template <typename T1, typename T2, typename T3>
00934 long count3DWeights(const array_t<T1> &vals1,
00935 const double &begin1, const double &end1,
00936 const double &stride1,
00937 const array_t<T2> &vals2,
00938 const double &begin2, const double &end2,
00939 const double &stride2,
00940 const array_t<T3> &vals3,
00941 const double &begin3, const double &end3,
00942 const double &stride3,
00943 const array_t<double> &wts,
00944 std::vector<double> &weights) const;
00945
00947 template <typename T1>
00948 long fill1DBins(const ibis::bitvector &mask, const array_t<T1> &vals1,
00949 const double &begin1, const double &end1,
00950 const double &stride1,
00951 std::vector<ibis::bitvector> &bins) const;
00953 template <typename T1>
00954 long fill1DBins(const ibis::bitvector &mask, const array_t<T1> &vals1,
00955 const double &begin1, const double &end1,
00956 const double &stride1,
00957 std::vector<ibis::bitvector*> &bins) const;
00959 template <typename T1>
00960 long fill1DBinsWeighted(const ibis::bitvector &mask,
00961 const array_t<T1> &vals1,
00962 const double &begin1, const double &end1,
00963 const double &stride1,
00964 const array_t<double> &wts,
00965 std::vector<double> &weights,
00966 std::vector<ibis::bitvector*> &bins) const;
00968 template <typename T1, typename T2>
00969 long fill2DBins(const ibis::bitvector &mask, const array_t<T1> &vals1,
00970 const double &begin1, const double &end1,
00971 const double &stride1,
00972 const array_t<T2> &vals2,
00973 const double &begin2, const double &end2,
00974 const double &stride2,
00975 std::vector<ibis::bitvector> &bins) const;
00976 template <typename T1>
00977 long fill2DBins2(const ibis::bitvector &mask, const array_t<T1> &vals1,
00978 const double &begin1, const double &end1,
00979 const double &stride1,
00980 const ibis::column &col2,
00981 const double &begin2, const double &end2,
00982 const double &stride2,
00983 std::vector<ibis::bitvector> &bins) const;
00985 template <typename T1, typename T2>
00986 long fill2DBins(const ibis::bitvector &mask, const array_t<T1> &vals1,
00987 const double &begin1, const double &end1,
00988 const double &stride1,
00989 const array_t<T2> &vals2,
00990 const double &begin2, const double &end2,
00991 const double &stride2,
00992 std::vector<ibis::bitvector*> &bins) const;
00993 template <typename T1>
00994 long fill2DBins2(const ibis::bitvector &mask, const array_t<T1> &vals1,
00995 const double &begin1, const double &end1,
00996 const double &stride1,
00997 const ibis::column &col2,
00998 const double &begin2, const double &end2,
00999 const double &stride2,
01000 std::vector<ibis::bitvector*> &bins) const;
01002 template <typename T1, typename T2>
01003 long fill2DBinsWeighted(const ibis::bitvector &mask,
01004 const array_t<T1> &vals1,
01005 const double &begin1, const double &end1,
01006 const double &stride1,
01007 const array_t<T2> &vals2,
01008 const double &begin2, const double &end2,
01009 const double &stride2,
01010 const array_t<double> &wts,
01011 std::vector<double> &weights,
01012 std::vector<ibis::bitvector*> &bins) const;
01013 template <typename T1>
01014 long fill2DBinsWeighted2(const ibis::bitvector &mask,
01015 const array_t<T1> &vals1,
01016 const double &begin1, const double &end1,
01017 const double &stride1,
01018 const ibis::column &col2,
01019 const double &begin2, const double &end2,
01020 const double &stride2,
01021 const array_t<double> &wts,
01022 std::vector<double> &weights,
01023 std::vector<ibis::bitvector*> &bins) const;
01025 template <typename T1, typename T2, typename T3>
01026 long fill3DBins(const ibis::bitvector &mask, const array_t<T1> &vals1,
01027 const double &begin1, const double &end1,
01028 const double &stride1,
01029 const array_t<T2> &vals2,
01030 const double &begin2, const double &end2,
01031 const double &stride2,
01032 const array_t<T3> &vals3,
01033 const double &begin3, const double &end3,
01034 const double &stride3,
01035 std::vector<ibis::bitvector> &bins) const;
01036 template <typename T1>
01037 long fill3DBins2(const ibis::bitvector &mask, const array_t<T1> &vals1,
01038 const double &begin1, const double &end1,
01039 const double &stride1,
01040 const ibis::column &col2,
01041 const double &begin2, const double &end2,
01042 const double &stride2,
01043 const ibis::column &col3,
01044 const double &begin3, const double &end3,
01045 const double &stride3,
01046 std::vector<bitvector> &bins) const;
01047 template <typename T1, typename T2>
01048 long fill3DBins3(const ibis::bitvector &mask, const array_t<T1> &vals1,
01049 const double &begin1, const double &end1,
01050 const double &stride1,
01051 const array_t<T2> &vals2,
01052 const double &begin2, const double &end2,
01053 const double &stride2,
01054 const ibis::column &col3,
01055 const double &begin3, const double &end3,
01056 const double &stride3,
01057 std::vector<bitvector> &bins) const;
01058 template <typename T1, typename T2, typename T3>
01059 long fill3DBins(const ibis::bitvector &mask, const array_t<T1> &vals1,
01060 const double &begin1, const double &end1,
01061 const double &stride1,
01062 const array_t<T2> &vals2,
01063 const double &begin2, const double &end2,
01064 const double &stride2,
01065 const array_t<T3> &vals3,
01066 const double &begin3, const double &end3,
01067 const double &stride3,
01068 std::vector<bitvector*> &bins) const;
01069 template <typename T1>
01070 long fill3DBins2(const ibis::bitvector &mask, const array_t<T1> &vals1,
01071 const double &begin1, const double &end1,
01072 const double &stride1,
01073 const ibis::column &col2,
01074 const double &begin2, const double &end2,
01075 const double &stride2,
01076 const ibis::column &col3,
01077 const double &begin3, const double &end3,
01078 const double &stride3,
01079 std::vector<ibis::bitvector*> &bins) const;
01080 template <typename T1, typename T2>
01081 long fill3DBins3(const ibis::bitvector &mask, const array_t<T1> &vals1,
01082 const double &begin1, const double &end1,
01083 const double &stride1,
01084 const array_t<T2> &vals2,
01085 const double &begin2, const double &end2,
01086 const double &stride2,
01087 const ibis::column &col3,
01088 const double &begin3, const double &end3,
01089 const double &stride3,
01090 std::vector<ibis::bitvector*> &bins) const;
01091 template <typename T1, typename T2, typename T3>
01092 long fill3DBinsWeighted(const ibis::bitvector &mask,
01093 const array_t<T1> &vals1,
01094 const double &begin1, const double &end1,
01095 const double &stride1,
01096 const array_t<T2> &vals2,
01097 const double &begin2, const double &end2,
01098 const double &stride2,
01099 const array_t<T3> &vals3,
01100 const double &begin3, const double &end3,
01101 const double &stride3,
01102 const array_t<double> &wts,
01103 std::vector<double> &weights,
01104 std::vector<bitvector*> &bins) const;
01105 template <typename T1>
01106 long fill3DBinsWeighted2(const ibis::bitvector &mask,
01107 const array_t<T1> &vals1,
01108 const double &begin1, const double &end1,
01109 const double &stride1,
01110 const ibis::column &col2,
01111 const double &begin2, const double &end2,
01112 const double &stride2,
01113 const ibis::column &col3,
01114 const double &begin3, const double &end3,
01115 const double &stride3,
01116 const array_t<double> &wts,
01117 std::vector<double> &weights,
01118 std::vector<ibis::bitvector*> &bins) const;
01119 template <typename T1, typename T2>
01120 long fill3DBinsWeighted3(const ibis::bitvector &mask,
01121 const array_t<T1> &vals1,
01122 const double &begin1, const double &end1,
01123 const double &stride1,
01124 const array_t<T2> &vals2,
01125 const double &begin2, const double &end2,
01126 const double &stride2,
01127 const ibis::column &col3,
01128 const double &begin3, const double &end3,
01129 const double &stride3,
01130 const array_t<double> &wts,
01131 std::vector<double> &weights,
01132 std::vector<ibis::bitvector*> &bins) const;
01133
01135 long get1DBins_(const ibis::bitvector &mask, const ibis::column &col,
01136 uint32_t nbin, std::vector<double> &bounds,
01137 std::vector<ibis::bitvector> &bins, const char *mesg) const;
01138
01140 long get1DDistribution(const ibis::column &col, uint32_t nbin,
01141 std::vector<double> &bounds,
01142 std::vector<uint32_t> &counts) const;
01144 long get2DDistributionU(const ibis::column &col1,
01145 const ibis::column &col2,
01146 uint32_t nb1, uint32_t nb2,
01147 std::vector<double> &bounds1,
01148 std::vector<double> &bounds2,
01149 std::vector<uint32_t> &counts) const;
01151 long get2DDistributionA(const ibis::column &col1,
01152 const ibis::column &col2,
01153 uint32_t nb1, uint32_t nb2,
01154 std::vector<double> &bounds1,
01155 std::vector<double> &bounds2,
01156 std::vector<uint32_t> &counts) const;
01158 long get2DDistributionI(const ibis::column &col1,
01159 const ibis::column &col2,
01160 uint32_t nb1, uint32_t nb2,
01161 std::vector<double> &bounds1,
01162 std::vector<double> &bounds2,
01163 std::vector<uint32_t> &counts) const;
01164 long old2DDistribution(const char *constraints,
01165 const char *name1, const char *name2,
01166 uint32_t nb1, uint32_t nb2,
01167 std::vector<double> &bounds1,
01168 std::vector<double> &bounds2,
01169 std::vector<uint32_t> &counts) const;
01171 int coarsenBins(const ibis::column &col, uint32_t nbin,
01172 std::vector<double> &bnds,
01173 std::vector<ibis::bitvector*> &btmp) const;
01175 long get3DDistributionA(const ibis::bitvector &mask,
01176 const ibis::column &col1,
01177 const ibis::column &col2,
01178 const ibis::column &col3,
01179 uint32_t nb1, uint32_t nb2, uint32_t nb3,
01180 std::vector<double> &bounds1,
01181 std::vector<double> &bounds2,
01182 std::vector<double> &bounds3,
01183 std::vector<uint32_t> &counts) const;
01184 template <typename E1>
01185 long get3DDistributionA1(const ibis::bitvector &mask,
01186 const array_t<E1> &vals1,
01187 const ibis::column &col2,
01188 const ibis::column &col3,
01189 uint32_t nb1, uint32_t nb2, uint32_t nb3,
01190 std::vector<double> &bounds1,
01191 std::vector<double> &bounds2,
01192 std::vector<double> &bounds3,
01193 std::vector<uint32_t> &counts) const;
01194 template <typename E1, typename E2>
01195 long get3DDistributionA2(const ibis::bitvector &mask,
01196 const array_t<E1> &vals1,
01197 const array_t<E2> &vals2,
01198 const ibis::column &col3,
01199 uint32_t nb1, uint32_t nb2, uint32_t nb3,
01200 std::vector<double> &bounds1,
01201 std::vector<double> &bounds2,
01202 std::vector<double> &bounds3,
01203 std::vector<uint32_t> &counts) const;
01204
01205 template <typename E1, typename E2>
01206 static void mapValues(array_t<E1> &val1, array_t<E2> &val2,
01207 uint32_t nb1, uint32_t nb2,
01208 array_t<E1> &bnd1, array_t<E2> &bnd2,
01209 std::vector<uint32_t> &cnts);
01210
01211 template <typename T>
01212 static void mapValues(const array_t<T> &vals,
01213 std::map<T, uint32_t> &hist);
01214
01215 template <typename T>
01216 static void equalWeightBins(const array_t<T> &vals,
01217 uint32_t nbins, array_t<T> &bounds);
01218
01219 template <typename T>
01220 static long adaptiveInts(const array_t<T> &vals, const T vmin,
01221 const T vmax, uint32_t nbins,
01222 std::vector<double> &bounds,
01223 std::vector<uint32_t> &counts);
01224
01225 template <typename T>
01226 static long adaptiveFloats(const array_t<T> &vals, const T vmin,
01227 const T vmax, uint32_t nbins,
01228 std::vector<double> &bounds,
01229 std::vector<uint32_t> &counts);
01230
01231 template <typename T1, typename T2>
01232 static long adaptive2DBins(const array_t<T1> &vals1,
01233 const array_t<T2> &vals2,
01234 uint32_t nb1, uint32_t nb2,
01235 std::vector<double> &bounds1,
01236 std::vector<double> &bounds2,
01237 std::vector<uint32_t> &counts);
01238
01239 template <typename T1, typename T2, typename T3>
01240 static long adaptive3DBins(const array_t<T1> &vals1,
01241 const array_t<T2> &vals2,
01242 const array_t<T3> &vals3,
01243 uint32_t nb1, uint32_t nb2, uint32_t nb3,
01244 std::vector<double> &bounds1,
01245 std::vector<double> &bounds2,
01246 std::vector<double> &bounds3,
01247 std::vector<uint32_t> &counts);
01248
01249 template <typename T> static long
01250 adaptiveIntsDetailed(const ibis::bitvector &mask,
01251 const array_t<T> &vals,
01252 const T vmin, const T vmax, uint32_t nbins,
01253 std::vector<double> &bounds,
01254 std::vector<ibis::bitvector> &detail);
01255
01256 template <typename T> static long
01257 adaptiveFloatsDetailed(const ibis::bitvector &mask,
01258 const array_t<T> &vals,
01259 const T vmin, const T vmax, uint32_t nbins,
01260 std::vector<double> &bounds,
01261 std::vector<ibis::bitvector> &detail);
01262
01263 void gatherSortKeys(ibis::table::stringList& names);
01264 void composeQueryString(std::string &str,
01265 const ibis::column* col1, const ibis::column* col2,
01266 const double &lower1, const double &upper1,
01267 const double &lower2, const double &upper2) const;
01268 void buildQueryList(ibis::part::thrArg &lst,
01269 unsigned nc, unsigned nq) const;
01270 void checkQueryList(const ibis::part::thrArg &lst) const;
01271 uint32_t recursiveQuery(const char* pref, const column* att,
01272 double low, double high, long* nerr) const;
01273
01274 private:
01275
01276
01277
01278 mutable pthread_mutex_t mutex;
01279 mutable pthread_rwlock_t rwlock;
01280
01281
01282
01283
01284 void init(const char* prefix);
01285
01286 void gainReadAccess(const char* mesg) const;
01287 void releaseAccess(const char* mesg) const;
01288 void gainWriteAccess(const char* mesg) const;
01289
01290 void fillRIDs(const char* fn) const;
01291 void sortRIDs() const;
01292 uint32_t searchSortedRIDs(const ibis::rid_t &rid) const;
01293 uint32_t searchRIDs(const ibis::rid_t &rid) const;
01294 void searchSortedRIDs(const ibis::RIDSet&, ibis::bitvector&) const;
01295 void searchRIDs(const ibis::RIDSet&, ibis::bitvector&) const;
01296
01297
01298 int64_t equiJoin(const ibis::deprecatedJoin &cmp,
01299 const ibis::bitvector64 &trial,
01300 ibis::bitvector64 &result) const;
01301 int64_t deprecatedJoin(const ibis::deprecatedJoin &cmp,
01302 const ibis::bitvector64 &trial,
01303 ibis::bitvector64 &result) const;
01304 int64_t compJoin(const ibis::deprecatedJoin &cmp,
01305 const ibis::bitvector64 &trial,
01306 ibis::bitvector64 &result) const;
01307
01308 int64_t loopJoin(const std::vector<const ibis::deprecatedJoin*> &cmp,
01309 const ibis::bitvector &mask,
01310 ibis::bitvector64 &pairs) const;
01311 int64_t loopJoin(const std::vector<const ibis::deprecatedJoin*> &cmp,
01312 const ibis::bitvector &mask) const;
01313 int64_t loopJoin(const ibis::deprecatedJoin &cmp,
01314 const ibis::bitvector &mask,
01315 ibis::bitvector64 &pairs) const;
01316 int64_t loopJoin(const ibis::deprecatedJoin &cmp,
01317 const ibis::bitvector &mask) const;
01318 int64_t equiJoinLoop1(const ibis::deprecatedJoin &cmp,
01319 const ibis::bitvector &mask,
01320 ibis::bitvector64 &pairs) const;
01321 int64_t equiJoinLoop1(const ibis::deprecatedJoin &cmp,
01322 const ibis::bitvector &mask) const;
01323 int64_t equiJoinLoop2(const ibis::deprecatedJoin &cmp,
01324 const ibis::bitvector &mask,
01325 ibis::bitvector64 &pairs) const;
01326 int64_t equiJoinLoop2(const ibis::deprecatedJoin &cmp,
01327 const ibis::bitvector &mask) const;
01328 template <class type1, class type2>
01329 void deprecatedJoinLoop(const array_t<type1> &arr1,
01330 const ibis::bitvector &msk1,
01331 const array_t<type2> &arr2,
01332 const ibis::bitvector &msk2,
01333 const double delta,
01334 ibis::bitvector64 &pairs) const;
01335 template <class type1, class type2>
01336 int64_t deprecatedJoinLoop(const array_t<type1> &arr1,
01337 const ibis::bitvector &msk1,
01338 const array_t<type2> &arr2,
01339 const ibis::bitvector &msk2,
01340 const double delta) const;
01341 int64_t deprecatedJoinLoop(const ibis::deprecatedJoin &cmp,
01342 const ibis::bitvector &mask,
01343 ibis::bitvector64 &pairs) const;
01344 int64_t deprecatedJoinLoop(const ibis::deprecatedJoin &cmp,
01345 const ibis::bitvector &mask) const;
01346 int64_t compJoinLoop(const ibis::deprecatedJoin &cmp,
01347 const ibis::bitvector &mask,
01348 ibis::bitvector64 &pairs) const;
01349 int64_t compJoinLoop(const ibis::deprecatedJoin &cmp,
01350 const ibis::bitvector &mask) const;
01351
01352 part(const part&);
01353 const part &operator=(const part&);
01354 };
01355
01356 namespace ibis {
01357
01358
01359 namespace util {
01361 unsigned int FASTBIT_CXX_DLLSPEC
01362 gatherParts(ibis::partList &parts,
01363 const char *adir, const char *bdir, bool ro=false);
01365 unsigned int FASTBIT_CXX_DLLSPEC
01366 gatherParts(ibis::partList &parts, const char *adir, bool ro=false);
01369 unsigned int FASTBIT_CXX_DLLSPEC
01370 gatherParts(ibis::partList &parts, const ibis::resource &res,
01371 bool ro=false);
01372 }
01373 }
01374
01378 struct FASTBIT_CXX_DLLSPEC ibis::part::info {
01379 const char* name;
01380 const char* description;
01381 const char* metaTags;
01382 const uint64_t nrows;
01383
01384 std::vector<ibis::column::info*> cols;
01385
01386 info(const char* na, const char* de, const uint64_t &nr,
01387 const ibis::part::columnList &co);
01388 info(const ibis::part &tbl);
01389 ~info();
01390
01391 private:
01392 info();
01393 info& operator=(const info&);
01394 };
01395
01397 class ibis::part::cleaner : public ibis::fileManager::cleaner {
01398 public:
01399 virtual void operator()() const;
01400 cleaner(const part* tbl) : thePart(tbl) {}
01401 virtual ~cleaner() {}
01402
01403 private:
01404 const part* thePart;
01405 };
01406
01411 class ibis::part::readLock {
01412 public:
01413 readLock(const part* tbl, const char* m) : thePart(tbl), mesg(m) {
01414 tbl->gainReadAccess(m);
01415 }
01416 ~readLock() {thePart->releaseAccess(mesg);}
01417
01418 private:
01419 const part* thePart;
01420 const char* mesg;
01421
01422 readLock() {};
01423 readLock(const readLock&) {};
01424 const readLock &operator=(const readLock&);
01425 };
01426
01428 class ibis::part::writeLock {
01429 public:
01430 writeLock(const part* tbl, const char* m) : thePart(tbl), mesg(m) {
01431 tbl->gainWriteAccess(m);
01432 }
01433 ~writeLock() {thePart->releaseAccess(mesg);}
01434
01435 private:
01436 const part* thePart;
01437 const char* mesg;
01438
01439 writeLock() {};
01440 writeLock(const writeLock&) {};
01441 const writeLock &operator=(const writeLock&);
01442 };
01443
01447 class ibis::part::softWriteLock {
01448 public:
01450 softWriteLock(const part* tbl, const char* m);
01452 ~softWriteLock() {if (lckd==0) thePart->releaseAccess(mesg);}
01455 bool isLocked() const {return (lckd==0);}
01456
01457 private:
01458 const part* thePart;
01459 const char* mesg;
01460 const int lckd;
01461
01462 softWriteLock() : thePart(0), mesg(0), lckd(0) {};
01463 softWriteLock(const softWriteLock &rhs)
01464 : thePart(rhs.thePart), mesg(rhs.mesg), lckd(0) {};
01465 const softWriteLock &operator=(const softWriteLock&);
01466 };
01467
01470 class ibis::part::mutexLock {
01471 public:
01472 mutexLock(const part* tbl, const char* m) : thePart(tbl), mesg(m) {
01473 if (ibis::gVerbose > 9)
01474 tbl->logMessage("gainExclusiveAccess",
01475 "pthread_mutex_lock for %s", m);
01476 int ierr = pthread_mutex_lock(&(tbl->mutex));
01477 if (0 != ierr)
01478 tbl->logWarning("gainExclusiveAccess", "pthread_mutex_lock for %s "
01479 "returned %d (%s)", m, ierr, strerror(ierr));
01480 }
01481 ~mutexLock() {
01482 if (ibis::gVerbose > 9)
01483 thePart->logMessage("releaseExclusiveAccess",
01484 "pthread_mutex_unlock for %s", mesg);
01485 int ierr = pthread_mutex_unlock(&(thePart->mutex));
01486 if (0 != ierr)
01487 thePart->logWarning("releaseExclusiveAccess",
01488 "pthread_mutex_unlock for %s returned %d (%s)",
01489 mesg, ierr, strerror(ierr));
01490 }
01491
01492 private:
01493 const part* thePart;
01494 const char* mesg;
01495
01496 mutexLock() {};
01497 mutexLock(const mutexLock&) {};
01498 const mutexLock &operator=(const mutexLock&);
01499 };
01500
01504 class ibis::part::barrel : public ibis::math::barrel {
01505 public:
01506 barrel(const ibis::part *t=0) : _tbl(t), position(0) {};
01507 virtual ~barrel() {close();}
01508
01509 virtual long open(const ibis::part *t=0);
01510 virtual long close();
01511 virtual long read();
01512
01513
01514 virtual long seek(uint32_t pos);
01515 uint32_t tell() const {return position;}
01516
01517 void getNullMask(ibis::bitvector &mask) const;
01518 const ibis::column* getColumn(uint32_t i) const {return cols[i];}
01519
01520 protected:
01521 const ibis::part *_tbl;
01522 uint32_t position;
01523 std::vector<const ibis::column*> cols;
01524 std::vector<ibis::fileManager::storage*> stores;
01525 std::vector<int> fdes;
01526 };
01527
01530 class ibis::part::vault : public ibis::part::barrel {
01531 public:
01532 vault(const ibis::roster &r);
01533 virtual ~vault() {close();}
01534
01535 virtual long open(const ibis::part *t=0);
01536 virtual long read();
01537 virtual long seek(uint32_t pos);
01538
01539 long seek(double val);
01542 uint32_t tellReal() const;
01543
01544 private:
01545 const ibis::roster &_roster;
01546
01547 template <class T>
01548 uint32_t seekValue(int fd, const T &val) const;
01549 template <class T>
01550 uint32_t seekValue(const array_t<T>&arr, const T &val) const;
01551
01552 vault();
01553 vault& operator=(const vault&);
01554 };
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593
01594
01595
01596
01597
01598
01599
01600
01601
01602
01603
01604
01605
01606
01607
01608 namespace ibis {
01609
01610
01611 template <> void
01612 part::equalWeightBins(const array_t<float> &vals,
01613 uint32_t nbins, array_t<float> &bounds);
01614 template <> void
01615 part::equalWeightBins(const array_t<double> &vals,
01616 uint32_t nbins, array_t<double> &bounds);
01617
01618 template <> long
01619 part::doScan(const array_t<float> &,
01620 const ibis::qContinuousRange &,
01621 const ibis::bitvector &, ibis::bitvector &);
01622 template <> long
01623 part::doScan(const array_t<double> &,
01624 const ibis::qContinuousRange &,
01625 const ibis::bitvector &, ibis::bitvector &);
01626
01627 template <> long
01628 part::doCount<float>(const ibis::qRange&) const;
01629 template <> long
01630 part::doCount<double>(const ibis::qRange&) const;
01631 }
01632
01634 inline ibis::part::info* ibis::part::getInfo() const {
01635 return new info(*this);
01636 }
01637
01641 inline ibis::column* ibis::part::getColumn(uint32_t ind) const {
01642 if (ind < columns.size()) {
01643 if (colorder.size() == columns.size()) {
01644 return const_cast<ibis::column*>(colorder[ind]);
01645 }
01646 else {
01647 ibis::part::columnList::const_iterator it = columns.begin();
01648 for (; ind > 0; -- ind) ++ it;
01649 return (*it).second;
01650 }
01651 }
01652 else {
01653 return 0;
01654 }
01655 }
01656
01657 inline const char* ibis::part::getMetaTag(const char* name) const {
01658 ibis::resource::vList::const_iterator it = metaList.find(name);
01659 if (it != metaList.end())
01660 return (*it).second;
01661 else
01662 return static_cast<const char*>(0);
01663 }
01664
01665 inline int64_t ibis::part::evaluateJoin(const ibis::deprecatedJoin &cmp,
01666 const ibis::bitvector &mask,
01667 ibis::bitvector64 &pairs) const {
01668 return loopJoin(cmp, mask, pairs);
01669 }
01670
01671 inline int64_t ibis::part::evaluateJoin(const ibis::deprecatedJoin &,
01672 const ibis::bitvector &,
01673 const char *) const {
01674 logWarning("evaluate", "not implemented yet");
01675 return -1;
01676 }
01677
01678 inline int64_t ibis::part::evaluateJoin(const ibis::deprecatedJoin &cmp,
01679 const ibis::bitvector &mask) const {
01680 return loopJoin(cmp, mask);
01681 }
01682
01683 inline int64_t ibis::part::evaluateJoin
01684 (const std::vector<const ibis::deprecatedJoin*> &cmp,
01685 const ibis::bitvector &mask, ibis::bitvector64 &pairs) const {
01686 return loopJoin(cmp, mask, pairs);
01687 }
01688
01690 inline void ibis::part::cleaner::operator()() const {
01691 const uint32_t sz = ibis::fileManager::bytesInUse();
01692 thePart->unloadIndexes();
01693 if (sz == ibis::fileManager::bytesInUse() &&
01694 thePart->getStateNoLocking() == ibis::part::STABLE_STATE) {
01695 thePart->freeRIDs();
01696 }
01697 }
01698 #endif // IBIS_PART_H