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
00092 void
00093 SetColName(int col, String name)
00094 {
00095 mColNames[col-1] = name;
00096 }
00097
00098
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
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
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
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
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 }
00684 }
00685 }
00686
00687 #endif