Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

TableTem.h

Go to the documentation of this file.
00001 #ifndef Impala_Core_Table_TableTem_h
00002 #define Impala_Core_Table_TableTem_h
00003 
00004 #include <vector>
00005 #include <iostream>
00006 #include "Util/DatabaseReadString.h"
00007 #include "Util/DatabaseWriteString.h"
00008 #include "Util/IOBuffer.h"
00009 #include "Core/Table/Table.h"
00010 #include "Core/Column/ColumnTem.h"
00011 #include "Core/Column/InvalidColumn.h"
00012 
00013 namespace Impala
00014 {
00015 namespace Core
00016 {
00017 namespace Table
00018 {
00019 
00020 
00029 template<class Col1T,
00030          class Col2T = Column::InvalidColumn,
00031          class Col3T = Column::InvalidColumn,
00032          class Col4T = Column::InvalidColumn,
00033          class Col5T = Column::InvalidColumn,
00034          class Col6T = Column::InvalidColumn,
00035          class Col7T = Column::InvalidColumn,
00036          class Col8T = Column::InvalidColumn,
00037          class Col9T = Column::InvalidColumn>
00038 class TableTem : public Table
00039 {
00040 public:
00041     typedef Column::InvalidColumn InvalidColumn;
00042 
00043     typedef typename Col1T::ColElemType Col1ElemType;
00044     typedef typename Col2T::ColElemType Col2ElemType;
00045     typedef typename Col3T::ColElemType Col3ElemType;
00046     typedef typename Col4T::ColElemType Col4ElemType;
00047     typedef typename Col5T::ColElemType Col5ElemType;
00048     typedef typename Col6T::ColElemType Col6ElemType;
00049     typedef typename Col7T::ColElemType Col7ElemType;
00050     typedef typename Col8T::ColElemType Col8ElemType;
00051     typedef typename Col9T::ColElemType Col9ElemType;
00052 
00054     TableTem(int size) : mCol1(size), mCol2(size), mCol3(size), mCol4(size),
00055                          mCol5(size), mCol6(size), mCol7(size), mCol8(size),
00056                          mCol9(size), mColNames(9)
00057     {
00058     }
00059 
00060     TableTem(const Col1T& c1,
00061              const Col2T& c2 = InvalidColumn(),
00062              const Col3T& c3 = InvalidColumn(),
00063              const Col4T& c4 = InvalidColumn(),
00064              const Col5T& c5 = InvalidColumn(),
00065              const Col6T& c6 = InvalidColumn(),
00066              const Col7T& c7 = InvalidColumn(),
00067              const Col8T& c8 = InvalidColumn(),
00068              const Col9T& c9 = InvalidColumn())
00069         : mCol1(c1), mCol2(c2), mCol3(c3), mCol4(c4), mCol5(c5), mCol6(c6),
00070           mCol7(c7), mCol8(c8), mCol9(c9), mColNames(9), mInfo("no info")
00071     {
00072     }
00073 
00074     virtual
00075     ~TableTem()
00076     {
00077     }
00078 
00079     void
00080     SetInfo(String info)
00081     {
00082         mInfo = info;
00083     }
00084 
00085     String
00086     GetInfo() const
00087     {
00088         return mInfo;
00089     }
00090 
00091     // col range : 1-9
00092     void
00093     SetColName(int col, String name)
00094     {
00095         mColNames[col-1] = name;
00096     }
00097 
00098     // col range : 1-9
00099     String
00100     GetColName(int col) const
00101     {
00102         return mColNames[col-1];
00103     }
00104 
00105 #ifndef REPOSITORY_USED // Here comes the deprecated stuff
00106     void
00107     ReadColNames(String fileName, Util::Database* db)
00108     {
00109         mColNames.clear();
00110         Util::DatabaseReadString(std::back_inserter(mColNames), 
00111                                  fileName, db, false, 9);
00112     }
00113 
00114     void
00115     ReadColNames(Util::IOBuffer* buffer)
00116     {
00117         mColNames.clear();
00118         Util::DatabaseReadString(std::back_inserter(mColNames), 
00119                                  buffer, false, 9);
00120     }
00121 
00122     bool
00123     WriteColNames(String fileName, Util::Database* db)
00124     {
00125         return Util::DatabaseWriteString(fileName, db, mColNames.begin(),
00126                                          mColNames.end(), 9);
00127     }
00128 
00129     bool
00130     WriteColNames(Util::IOBuffer* buffer)
00131     {
00132         return Util::DatabaseWriteString(buffer, mColNames.begin(),
00133                                          mColNames.end(), 9);
00134     }
00135 #else // REPOSITORY_USED
00136 
00137     void
00138     ReadColNames(Util::IOBuffer* buffer)
00139     {
00140         mColNames.clear();
00141         if (buffer)
00142             buffer->ReadStrings(std::back_inserter(mColNames), false, 9);
00143     }
00144 
00145     bool
00146     WriteColNames(Util::IOBuffer* buffer)
00147     {
00148         if (buffer)
00149             return buffer->WriteStrings(mColNames.begin(), mColNames.end(), 9);
00150     }
00151 #endif // REPOSITORY_USED
00152 
00153     int
00154     Capacity() const
00155     {
00156         return mCol1.Capacity();
00157     }
00158 
00159     bool
00160     Reserve(int newCapacity, bool copyData)
00161     {
00162         if (newCapacity == Capacity())
00163             return true;
00164         if (mCol1.Valid() && (!mCol1.Reserve(newCapacity, copyData)))
00165             return false;
00166         if (mCol2.Valid() && (!mCol2.Reserve(newCapacity, copyData)))
00167             return false;
00168         if (mCol3.Valid() && (!mCol3.Reserve(newCapacity, copyData)))
00169             return false;
00170         if (mCol4.Valid() && (!mCol4.Reserve(newCapacity, copyData)))
00171             return false;
00172         if (mCol5.Valid() && (!mCol5.Reserve(newCapacity, copyData)))
00173             return false;
00174         if (mCol6.Valid() && (!mCol6.Reserve(newCapacity, copyData)))
00175             return false;
00176         if (mCol7.Valid() && (!mCol7.Reserve(newCapacity, copyData)))
00177             return false;
00178         if (mCol8.Valid() && (!mCol8.Reserve(newCapacity, copyData)))
00179             return false;
00180         if (mCol9.Valid() && (!mCol9.Reserve(newCapacity, copyData)))
00181             return false;
00182         if (mLast > newCapacity)
00183             mLast = newCapacity;
00184         return true;
00185     }
00186 
00187     bool
00188     ReserveMin(int minimalCapacity, bool copyData)
00189     {
00190         if (minimalCapacity <= Capacity())
00191             return true;
00192         return Reserve(minimalCapacity, copyData);
00193     }
00194 
00195     Col1ElemType
00196     Get1(int index) const
00197     {
00198         return mCol1.Get(index);
00199     }
00200 
00201     Col2ElemType
00202     Get2(int index) const
00203     {
00204         return mCol2.Get(index);
00205     }
00206 
00207     Col3ElemType
00208     Get3(int index) const
00209     {
00210         return mCol3.Get(index);
00211     }
00212 
00213     Col4ElemType
00214     Get4(int index) const
00215     {
00216         return mCol4.Get(index);
00217     }
00218 
00219     Col5ElemType
00220     Get5(int index) const
00221     {
00222         return mCol5.Get(index);
00223     }
00224 
00225     Col6ElemType
00226     Get6(int index) const
00227     {
00228         return mCol6.Get(index);
00229     }
00230 
00231     Col7ElemType
00232     Get7(int index) const
00233     {
00234         return mCol7.Get(index);
00235     }
00236 
00237     Col8ElemType
00238     Get8(int index) const
00239     {
00240         return mCol8.Get(index);
00241     }
00242 
00243     Col9ElemType
00244     Get9(int index) const
00245     {
00246         return mCol9.Get(index);
00247     }
00248 
00249     void
00250     Set1(int index, Col1ElemType value)
00251     {
00252         return mCol1.Set(index, value);
00253     }
00254 
00255     void
00256     Set2(int index, Col2ElemType value) 
00257     {
00258         return mCol2.Set(index, value);
00259     }
00260 
00261     void
00262     Set3(int index, Col3ElemType value) 
00263     {
00264         return mCol3.Set(index, value);
00265     }
00266 
00267     void
00268     Set4(int index, Col4ElemType value) 
00269     {
00270         return mCol4.Set(index, value);
00271     }
00272 
00273     void
00274     Set5(int index, Col5ElemType value) 
00275     {
00276         return mCol5.Set(index, value);
00277     }
00278 
00279     void
00280     Set6(int index, Col6ElemType value) 
00281     {
00282         return mCol6.Set(index, value);
00283     }
00284 
00285     void
00286     Set7(int index, Col7ElemType value) 
00287     {
00288         return mCol7.Set(index, value);
00289     }
00290 
00291     void
00292     Set8(int index, Col8ElemType value) 
00293     {
00294         return mCol8.Set(index, value);
00295     }
00296 
00297     void
00298     Set9(int index, Col9ElemType value) 
00299     {
00300         return mCol9.Set(index, value);
00301     }
00302 
00303     bool
00304     Add(Col1ElemType e1)
00305     {
00306         if (mLast == Capacity())
00307             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00308                 return false;
00309         mCol1.Set(mLast, e1);
00310         mLast++;
00311         return true;
00312     }
00313 
00314     bool
00315     Add(Col1ElemType e1, Col2ElemType e2)
00316     {
00317         if (mLast == Capacity())
00318             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00319                 return false;
00320         mCol1.Set(mLast, e1);
00321         mCol2.Set(mLast, e2);
00322         mLast++;
00323         return true;
00324     }
00325 
00326     bool
00327     Add(Col1ElemType e1, Col2ElemType e2, Col3ElemType e3)
00328     {
00329         if (mLast == Capacity())
00330             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00331                 return false;
00332         mCol1.Set(mLast, e1);
00333         mCol2.Set(mLast, e2);
00334         mCol3.Set(mLast, e3);
00335         mLast++;
00336         return true;
00337     }
00338 
00339     bool
00340     Add(Col1ElemType e1, Col2ElemType e2, Col3ElemType e3, Col4ElemType e4)
00341     {
00342         if (mLast == Capacity())
00343             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00344                 return false;
00345         mCol1.Set(mLast, e1);
00346         mCol2.Set(mLast, e2);
00347         mCol3.Set(mLast, e3);
00348         mCol4.Set(mLast, e4);
00349         mLast++;
00350         return true;
00351     }
00352 
00353     bool
00354     Add(Col1ElemType e1, Col2ElemType e2, Col3ElemType e3, Col4ElemType e4,
00355         Col5ElemType e5)
00356     {
00357         if (mLast == Capacity())
00358             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00359                 return false;
00360         mCol1.Set(mLast, e1);
00361         mCol2.Set(mLast, e2);
00362         mCol3.Set(mLast, e3);
00363         mCol4.Set(mLast, e4);
00364         mCol5.Set(mLast, e5);
00365         mLast++;
00366         return true;
00367     }
00368 
00369     bool
00370     Add(Col1ElemType e1, Col2ElemType e2, Col3ElemType e3, Col4ElemType e4,
00371         Col5ElemType e5, Col6ElemType e6)
00372     {
00373         if (mLast == Capacity())
00374             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00375                 return false;
00376         mCol1.Set(mLast, e1);
00377         mCol2.Set(mLast, e2);
00378         mCol3.Set(mLast, e3);
00379         mCol4.Set(mLast, e4);
00380         mCol5.Set(mLast, e5);
00381         mCol6.Set(mLast, e6);
00382         mLast++;
00383         return true;
00384     }
00385 
00386     bool
00387     Add(Col1ElemType e1, Col2ElemType e2, Col3ElemType e3, Col4ElemType e4,
00388         Col5ElemType e5, Col6ElemType e6, Col7ElemType e7)
00389     {
00390         if (mLast == Capacity())
00391             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00392                 return false;
00393         mCol1.Set(mLast, e1);
00394         mCol2.Set(mLast, e2);
00395         mCol3.Set(mLast, e3);
00396         mCol4.Set(mLast, e4);
00397         mCol5.Set(mLast, e5);
00398         mCol6.Set(mLast, e6);
00399         mCol7.Set(mLast, e7);
00400         mLast++;
00401         return true;
00402     }
00403 
00404     bool
00405     Add(Col1ElemType e1, Col2ElemType e2, Col3ElemType e3, Col4ElemType e4,
00406         Col5ElemType e5, Col6ElemType e6, Col7ElemType e7, Col8ElemType e8)
00407     {
00408         if (mLast == Capacity())
00409             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00410                 return false;
00411         mCol1.Set(mLast, e1);
00412         mCol2.Set(mLast, e2);
00413         mCol3.Set(mLast, e3);
00414         mCol4.Set(mLast, e4);
00415         mCol5.Set(mLast, e5);
00416         mCol6.Set(mLast, e6);
00417         mCol7.Set(mLast, e7);
00418         mCol8.Set(mLast, e8);
00419         mLast++;
00420         return true;
00421     }
00422 
00423     bool
00424     Add(Col1ElemType e1, Col2ElemType e2, Col3ElemType e3, Col4ElemType e4,
00425         Col5ElemType e5, Col6ElemType e6, Col7ElemType e7, Col8ElemType e8,
00426         Col9ElemType e9)
00427     {
00428         if (mLast == Capacity())
00429             if (!Reserve(Impala::Max(2*Capacity(),1), true))
00430                 return false;
00431         mCol1.Set(mLast, e1);
00432         mCol2.Set(mLast, e2);
00433         mCol3.Set(mLast, e3);
00434         mCol4.Set(mLast, e4);
00435         mCol5.Set(mLast, e5);
00436         mCol6.Set(mLast, e6);
00437         mCol7.Set(mLast, e7);
00438         mCol8.Set(mLast, e8);
00439         mCol9.Set(mLast, e9);
00440         mLast++;
00441         return true;
00442     }
00443 
00444     // cursor part
00445 
00446     Col1ElemType
00447     Get1AtCursor()
00448     {
00449         return mCol1[mCursor];
00450     }
00451 
00452     Col2ElemType
00453     Get2AtCursor()
00454     {
00455         return mCol2[mCursor];
00456     }
00457 
00458     Col3ElemType
00459     Get3AtCursor()
00460     {
00461         return mCol3[mCursor];
00462     }
00463 
00464     Col4ElemType
00465     Get4AtCursor()
00466     {
00467         return mCol4[mCursor];
00468     }
00469 
00470     Col5ElemType
00471     Get5AtCursor()
00472     {
00473         return mCol5[mCursor];
00474     }
00475 
00476     Col6ElemType
00477     Get6AtCursor()
00478     {
00479         return mCol6[mCursor];
00480     }
00481 
00482     Col7ElemType
00483     Get7AtCursor()
00484     {
00485         return mCol7[mCursor];
00486     }
00487 
00488     Col8ElemType
00489     Get8AtCursor()
00490     {
00491         return mCol8[mCursor];
00492     }
00493 
00494     Col9ElemType
00495     Get9AtCursor()
00496     {
00497         return mCol9[mCursor];
00498     }
00499 
00500     // misc
00501 
00502     virtual void
00503     Dump(int from = 0, int to = -1) const
00504     {
00505         if (to == -1 || to > Size())
00506             to = Size();
00507         if (to < from)
00508             to = from;
00509         std::cout << "Dumping table from " << from << " to " << to
00510                   << " (table size=" << Size() << ", capacity=" << Capacity()
00511                   << ")" << std::endl;
00512         for (size_t i=0 ; i<mColNames.size() ; i++)
00513             if (mColNames[i] != String(""))
00514                 std::cout << i+1 << "=" << mColNames[i] << ", ";
00515         std::cout << std::endl;
00516         for (int i=from ; i<to ; i++)
00517         {
00518             if (mCol1.Valid())
00519                 std::cout << Get1(i) << ", ";
00520             if (mCol2.Valid())
00521                 std::cout << Get2(i) << ", ";
00522             if (mCol3.Valid())
00523                 std::cout << Get3(i) << ", ";
00524             if (mCol4.Valid())
00525                 std::cout << Get4(i) << ", ";
00526             if (mCol5.Valid())
00527                 std::cout << Get5(i) << ", ";
00528             if (mCol6.Valid())
00529                 std::cout << Get6(i) << ", ";
00530             if (mCol7.Valid())
00531                 std::cout << Get7(i) << ", ";
00532             if (mCol8.Valid())
00533                 std::cout << Get8(i) << ", ";
00534             if (mCol9.Valid())
00535                 std::cout << Get9(i) << ", ";
00536             std::cout << std::endl;
00537         }
00538         std::cout << std::endl;
00539     }
00540 
00541     // direct access, use with care
00542 
00543     Col1T*
00544     GetColumn1()
00545     {
00546         return &mCol1;
00547     }
00548 
00549     Col2T*
00550     GetColumn2()
00551     {
00552         return &mCol2;
00553     }
00554 
00555     Col3T*
00556     GetColumn3()
00557     {
00558         return &mCol3;
00559     }
00560 
00561     Col4T*
00562     GetColumn4()
00563     {
00564         return &mCol4;
00565     }
00566 
00567     Col5T*
00568     GetColumn5()
00569     {
00570         return &mCol5;
00571     }
00572 
00573     Col6T*
00574     GetColumn6()
00575     {
00576         return &mCol6;
00577     }
00578 
00579     Col7T*
00580     GetColumn7()
00581     {
00582         return &mCol7;
00583     }
00584 
00585     Col8T*
00586     GetColumn8()
00587     {
00588         return &mCol8;
00589     }
00590 
00591     Col9T*
00592     GetColumn9()
00593     {
00594         return &mCol9;
00595     }
00596 
00597     // const direct access
00598     const Col1T*
00599     GetColumn1() const
00600     {
00601         return &mCol1;
00602     }
00603 
00604     const Col2T*
00605     GetColumn2() const
00606     {
00607         return &mCol2;
00608     }
00609 
00610     const Col3T*
00611     GetColumn3() const
00612     {
00613         return &mCol3;
00614     }
00615 
00616     const Col4T*
00617     GetColumn4() const
00618     {
00619         return &mCol4;
00620     }
00621 
00622     const Col5T*
00623     GetColumn5() const
00624     {
00625         return &mCol5;
00626     }
00627 
00628     const Col6T*
00629     GetColumn6() const
00630     {
00631         return &mCol6;
00632     }
00633 
00634     const Col7T*
00635     GetColumn7() const
00636     {
00637         return &mCol7;
00638     }
00639 
00640     const Col8T*
00641     GetColumn8() const
00642     {
00643         return &mCol8;
00644     }
00645 
00646     const Col9T*
00647     GetColumn9() const
00648     {
00649         return &mCol9;
00650     }
00651 
00652     void
00653     Append(const TableTem<Col1T, Col2T, Col3T, Col4T, Col5T, Col6T, Col7T, Col8T, Col9T>* t)
00654     {
00655         if(t==0)
00656             return;
00657 
00658         int needed = Size() + t->Size();
00659         if(needed > Capacity())
00660             Reserve(needed, true);
00661 
00662         for(int i=0 ; i<t->Size() ; i++)
00663             Add(t->Get1(i), t->Get2(i), t->Get3(i), t->Get4(i), t->Get5(i),
00664                 t->Get6(i), t->Get7(i), t->Get8(i), t->Get9(i));
00665     }
00666 
00667 private:
00668 
00669     Col1T mCol1;
00670     Col2T mCol2;
00671     Col3T mCol3;
00672     Col4T mCol4;
00673     Col5T mCol5;
00674     Col6T mCol6;
00675     Col7T mCol7;
00676     Col8T mCol8;
00677     Col9T mCol9;
00678     std::vector<String> mColNames;
00679     String mInfo;
00680 
00681 };
00682 
00683 } // namespace Table
00684 } // namespace Core
00685 } // namespace Impala
00686 
00687 #endif

Generated on Fri Mar 19 09:31:21 2010 for ImpalaSrc by  doxygen 1.5.1