Go to the documentation of this file.00001
00002
00003
00004
00008 #ifndef IBIS_SELECTCLAUSE_H
00009 #define IBIS_SELECTCLAUSE_H
00010 #include "qExpr.h"
00011 #include "table.h"
00012
00013 namespace ibis {
00014 class selectLexer;
00015 class selectParser;
00016 }
00017
00086 class FASTBIT_CXX_DLLSPEC ibis::selectClause {
00087 public:
00089 explicit selectClause(const char *cl=0);
00091 selectClause(const ibis::table::stringList&);
00092 ~selectClause();
00093
00095 selectClause(const selectClause&);
00096
00098 int parse(const char *cl);
00099
00101 const char* getString(void) const {return clause_.c_str();}
00103 const char* operator*(void) const {return clause_.c_str();}
00104
00106 bool empty() const {return atms_.empty();}
00107
00108 void print(std::ostream&) const;
00109 void printDetails(std::ostream&) const;
00110 int find(const char*) const;
00111
00116 typedef std::vector<ibis::math::term*> mathTerms;
00118 const mathTerms& getTerms() const {return xtms_;}
00120 const ibis::math::term* termExpr(unsigned i) const {return xtms_[i];}
00121
00123 uint32_t numTerms() const {return xtms_.size();}
00127 const char* termName(unsigned i) const {return xnames_[i].c_str();}
00128 std::string termDescription(unsigned i) const;
00129 typedef std::map<const char*, const char*, ibis::lessi> nameMap;
00130 int getAliases(nameMap&) const;
00131 uint32_t numGroupbyKeys() const;
00132 int getGroupbyKeys(std::vector<std::string>& keys) const;
00134
00138 uint32_t aggSize() const {return atms_.size();}
00140 const ibis::math::term* aggExpr(unsigned i) const {return atms_[i];}
00143 const char* aggName(unsigned i) const {return names_[i].c_str();}
00144 std::string aggDescription(unsigned i) const;
00145
00147 enum AGREGADO {NIL_AGGR, AVG, CNT, MAX, MIN, SUM, DISTINCT,
00148 VARPOP, VARSAMP, STDPOP, STDSAMP, MEDIAN};
00150 AGREGADO getAggregator(uint32_t i) const {return aggr_[i];}
00151
00152 typedef std::map<std::string, unsigned> StringToInt;
00153 const StringToInt& getOrdered() const {return ordered_;}
00155
00156 int verify(const ibis::part&) const;
00157 int verifySome(const std::vector<uint32_t>&, const ibis::part&) const;
00158 static int verifyTerm(const ibis::math::term&, const ibis::part&,
00159 const ibis::selectClause* =0);
00160
00161 void getNullMask(const ibis::part&, ibis::bitvector&) const;
00162 void clear();
00163
00165 selectClause& operator=(const selectClause& rhs) {
00166 selectClause tmp(rhs);
00167 swap(tmp);
00168 return *this;
00169 }
00171 void swap(selectClause& rhs) {
00172 atms_.swap(rhs.atms_);
00173 aggr_.swap(rhs.aggr_);
00174 names_.swap(rhs.names_);
00175 ordered_.swap(rhs.ordered_);
00176 xtms_.swap(rhs.xtms_);
00177 xalias_.swap(rhs.xalias_);
00178 xnames_.swap(rhs.xnames_);
00179 clause_.swap(rhs.clause_);
00180 }
00181
00182
00183 class variable;
00184 friend class variable;
00185
00186 protected:
00188 mathTerms atms_;
00190 std::vector<AGREGADO> aggr_;
00192 std::vector<std::string> names_;
00194 StringToInt ordered_;
00196 mathTerms xtms_;
00198 StringToInt xalias_;
00200 std::vector<std::string> xnames_;
00201
00202 std::string clause_;
00203
00204 ibis::selectLexer *lexer;
00205
00206 friend class ibis::selectParser;
00207
00208 void fillNames();
00209 ibis::math::variable*
00210 addAgregado(ibis::selectClause::AGREGADO, ibis::math::term*);
00211 uint64_t decodeAName(const char*) const;
00212 void addTerm(ibis::math::term*, const std::string*);
00213 ibis::math::term* addRecursive(ibis::math::term*&);
00214 bool hasAggregation(const ibis::math::term *tm) const;
00215
00216 typedef std::map<const char*, ibis::selectClause::variable*,
00217 ibis::lessi> varMap;
00218 void gatherVariables(varMap &vmap, ibis::math::term* t) const;
00219 };
00220
00223 class ibis::selectClause::variable : public ibis::math::variable {
00224 public:
00225 variable(const char* s, const ibis::selectClause *c)
00226 : ibis::math::variable(s), sc_(c) {};
00227 variable(const variable &v) : ibis::math::variable(v), sc_(v.sc_) {};
00228 virtual variable* dup() const {return new variable(*this);}
00229 virtual void print(std::ostream&) const;
00230 void updateReference(const ibis::selectClause *c) {sc_=c;}
00231
00232 private:
00233 const ibis::selectClause *sc_;
00234
00235 variable();
00236 };
00237
00242 inline uint32_t ibis::selectClause::numGroupbyKeys() const {
00243 uint32_t ret = (atms_.size() > aggr_.size() ?
00244 atms_.size() - aggr_.size() : 0);
00245 for (uint32_t j = 0; j < aggr_.size(); ++j)
00246 ret += (aggr_[j] == NIL_AGGR);
00247 return ret;
00248 }
00249
00250 namespace std {
00251 inline ostream& operator<<(ostream& out, const ibis::selectClause& sel) {
00252 sel.print(out);
00253 return out;
00254 }
00255 }
00256 #endif