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();
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 }
00183 }
00184 }
00185
00186 #endif