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

Select.h

Go to the documentation of this file.
00001 #ifndef Impala_Core_Table_Select_h
00002 #define Impala_Core_Table_Select_h
00003 
00004 #include "Core/Column/Select.h"
00005 #include "Core/Column/FilterUnique.h"
00006 #include "Core/Table/Filter.h"
00007 #include "Core/Table/SelectOneColumn.h"
00008 
00009 namespace Impala
00010 {
00011 namespace Core
00012 {
00013 namespace Table
00014 {
00015 
00019 template <class T1, class T2>
00020 inline void
00021 Select(T1* dst, T2* src, bool* filter, bool doClearDst)
00022 {
00023     int srcSize = src->Size(); // keep orignal size in case dst == src
00024     if (doClearDst)
00025         dst->SetSize(0);
00026     int nr = 0;
00027     if (filter)
00028     {
00029         for (int i=0 ; i<srcSize ; i++)
00030             if (filter[i])
00031                 nr++;
00032     }
00033     else
00034     {
00035         nr = srcSize;
00036     }
00037     dst->ReserveMin(dst->Size() + nr, true);
00038     Column::Select(dst->GetColumn1(), src->GetColumn1(), filter, dst->Size(), 0,
00039                    srcSize);
00040     Column::Select(dst->GetColumn2(), src->GetColumn2(), filter, dst->Size(), 0,
00041                    srcSize);
00042     Column::Select(dst->GetColumn3(), src->GetColumn3(), filter, dst->Size(), 0,
00043                    srcSize);
00044     Column::Select(dst->GetColumn4(), src->GetColumn4(), filter, dst->Size(), 0,
00045                    srcSize);
00046     Column::Select(dst->GetColumn5(), src->GetColumn5(), filter, dst->Size(), 0,
00047                    srcSize);
00048     Column::Select(dst->GetColumn6(), src->GetColumn6(), filter, dst->Size(), 0,
00049                    srcSize);
00050     Column::Select(dst->GetColumn7(), src->GetColumn7(), filter, dst->Size(), 0,
00051                    srcSize);
00052     Column::Select(dst->GetColumn8(), src->GetColumn8(), filter, dst->Size(), 0,
00053                    srcSize);
00054     Column::Select(dst->GetColumn9(), src->GetColumn9(), filter, dst->Size(), 0,
00055                    srcSize);
00056     dst->SetSize(dst->Size() + nr);
00057 }
00058 
00061 template <class T>
00062 inline void
00063 Select(T* dst, T* src, int from, int to, bool doClearDst)
00064 {
00065     int size = src->Size();
00066     bool* filter = new bool[size];
00067     for(int i=0 ; i<from ; ++i)
00068         filter[i] = false;
00069     for(int i=from ; i<to ; ++i)
00070         filter[i] = true;
00071     for(int i=to ; i<size ; ++i)
00072         filter[i] = false;
00073 
00074     Select(dst, src, filter, doClearDst);
00075 }
00076 
00077 
00081 template <class T1, class T2, class Criterion> 
00082 void
00083 Select(T1* dst, T2* src, Criterion& c, bool doClearDst)
00084 {
00085     bool* filter = Filter(src, c);
00086     Select(dst, src, filter, doClearDst);
00087     delete filter;
00088 }
00089 
00094 template <class T, class Criterion> 
00095 T*
00096 Select(T* src, Criterion& c)
00097 {
00098     bool* filter = Filter(src, c);
00099     T* dst = new T();
00100     Select(dst, src, filter, false);
00101     delete filter;
00102     return dst;
00103 }
00104 
00108 template <class T1, class T2>
00109 inline void
00110 SelectUniqueOnCol(T1* dst, T2* src, int col, bool doClearDst)
00111 {
00112     if (doClearDst)
00113         dst->SetSize(0);
00114     bool* filter = 0;
00115     switch (col) {
00116     case 1:
00117         Column::FilterUnique(filter, dst->GetColumn1(), src->GetColumn1(),
00118                              dst->Size(), src->Size());
00119         break;
00120     case 2:
00121         Column::FilterUnique(filter, dst->GetColumn2(), src->GetColumn2(),
00122                              dst->Size(), src->Size());
00123         break;
00124     case 3:
00125         Column::FilterUnique(filter, dst->GetColumn3(), src->GetColumn3(),
00126                              dst->Size(), src->Size());
00127         break;
00128     case 4:
00129         Column::FilterUnique(filter, dst->GetColumn4(), src->GetColumn4(),
00130                              dst->Size(), src->Size());
00131         break;
00132     case 5:
00133         Column::FilterUnique(filter, dst->GetColumn5(), src->GetColumn5(),
00134                              dst->Size(), src->Size());
00135         break;
00136     case 6:
00137         Column::FilterUnique(filter, dst->GetColumn6(), src->GetColumn6(),
00138                              dst->Size(), src->Size());
00139         break;
00140     case 7:
00141         Column::FilterUnique(filter, dst->GetColumn7(), src->GetColumn7(),
00142                              dst->Size(), src->Size());
00143         break;
00144     case 8:
00145         Column::FilterUnique(filter, dst->GetColumn8(), src->GetColumn8(),
00146                              dst->Size(), src->Size());
00147         break;
00148     case 9:
00149         Column::FilterUnique(filter, dst->GetColumn9(), src->GetColumn9(),
00150                              dst->Size(), src->Size());
00151         break;
00152     }
00153 
00154     int nr = 0;
00155     for (int i=0 ; i<src->Size() ; i++)
00156         if (filter[i])
00157             nr++;
00158     dst->ReserveMin(dst->Size() + nr, true); 
00159 
00160     Column::Select(dst->GetColumn1(), src->GetColumn1(), filter, dst->Size(), 0,
00161                    src->Size());
00162     Column::Select(dst->GetColumn2(), src->GetColumn2(), filter, dst->Size(), 0,
00163                    src->Size());
00164     Column::Select(dst->GetColumn3(), src->GetColumn3(), filter, dst->Size(), 0,
00165                    src->Size());
00166     Column::Select(dst->GetColumn4(), src->GetColumn4(), filter, dst->Size(), 0,
00167                    src->Size());
00168     Column::Select(dst->GetColumn5(), src->GetColumn5(), filter, dst->Size(), 0,
00169                    src->Size());
00170     Column::Select(dst->GetColumn6(), src->GetColumn6(), filter, dst->Size(), 0,
00171                    src->Size());
00172     Column::Select(dst->GetColumn7(), src->GetColumn7(), filter, dst->Size(), 0,
00173                    src->Size());
00174     Column::Select(dst->GetColumn8(), src->GetColumn8(), filter, dst->Size(), 0,
00175                    src->Size());
00176     Column::Select(dst->GetColumn9(), src->GetColumn9(), filter, dst->Size(), 0,
00177                    src->Size());
00178     dst->SetSize(dst->Size() + nr);
00179     delete filter;
00180 }
00181 
00182 } // namespace Table
00183 } // namespace Core
00184 } // namespace Impala
00185 
00186 #endif

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