00001
00002
00003
00004 #ifndef IBIS_JOIN_H
00005 #define IBIS_JOIN_H
00006
00013 #include "table.h"
00014 #include "part.h"
00015
00016 namespace ibis {
00017 class join;
00018 }
00019
00030 class ibis::join {
00031 public:
00039 static join* create(const ibis::part& partr, const ibis::part& parts,
00040 const char* colname, const char* condr = 0,
00041 const char* conds = 0);
00042
00046 virtual void estimate(uint64_t& nmin, uint64_t& nmax) =0;
00050 virtual int64_t evaluate() =0;
00051
00052 class result;
00060 virtual result* select(const std::vector<const char*>& colnames) =0;
00061
00062 virtual ~join() {};
00063
00064 protected:
00065 join() {}
00066
00067 private:
00068 join(const join&);
00069 join& operator=(const join&);
00070 };
00071
00074 class ibis::join::result {
00075 public:
00076 virtual ~result() {};
00077
00078 virtual uint64_t nRows() const=0;
00079 virtual uint32_t nColumns() const=0;
00080
00082 virtual std::vector<std::string> columnNames() const=0;
00084 virtual ibis::table::typeList columnTypes() const=0;
00086 virtual void describe(std::ostream& out) const=0;
00087
00090 virtual int fetch() =0;
00091
00093 virtual int dump(std::ostream& out, const char* del=", ") const=0;
00094
00099 virtual int getColumnAsByte(const char* cname, char&) const=0;
00100 virtual int getColumnAsUByte(const char* cname, unsigned char&) const=0;
00101 virtual int getColumnAsShort(const char* cname, int16_t&) const=0;
00102 virtual int getColumnAsUShort(const char* cname, uint16_t&) const=0;
00103 virtual int getColumnAsInt(const char* cname, int32_t&) const=0;
00104 virtual int getColumnAsUInt(const char* cname, uint32_t&) const=0;
00105 virtual int getColumnAsLong(const char* cname, int64_t&) const=0;
00106 virtual int getColumnAsULong(const char* cname, uint64_t&) const=0;
00107 virtual int getColumnAsFloat(const char* cname, float&) const=0;
00108 virtual int getColumnAsDouble(const char* cname, double&) const=0;
00109 virtual int getColumnAsString(const char* cname, std::string&) const=0;
00111
00118 virtual int getColumnAsByte(uint32_t cnum, char&) const=0;
00119 virtual int getColumnAsUByte(uint32_t cnum, unsigned char&) const=0;
00120 virtual int getColumnAsShort(uint32_t cnum, int16_t&) const=0;
00121 virtual int getColumnAsUShort(uint32_t cnum, uint16_t&) const=0;
00122 virtual int getColumnAsInt(uint32_t cnum, int32_t&) const=0;
00123 virtual int getColumnAsUInt(uint32_t cnum, uint32_t&) const=0;
00124 virtual int getColumnAsLong(uint32_t cnum, int64_t&) const=0;
00125 virtual int getColumnAsULong(uint32_t cnum, uint64_t&) const=0;
00126 virtual int getColumnAsFloat(uint32_t cnum, float&) const=0;
00127 virtual int getColumnAsDouble(uint32_t cnum, double&) const=0;
00128 virtual int getColumnAsString(uint32_t cnum, std::string&) const=0;
00130
00131 protected:
00132 result() {}
00133
00134 private:
00135 result(const result&);
00136 result& operator=(const result&);
00137 };
00138 #endif