00001 #ifndef Impala_Core_Table_Criterion_h
00002 #define Impala_Core_Table_Criterion_h
00003
00004 #include "Basis/Quid.h"
00005
00006 namespace Impala
00007 {
00008 namespace Core
00009 {
00010 namespace Table
00011 {
00012
00013
00014 template <class T>
00015 class CriterionElement1Equals
00016 {
00017 public:
00018 typedef typename T::Col1ElemType ValType;
00019
00020 CriterionElement1Equals(ValType value)
00021 {
00022 mValue = value;
00023 }
00024
00025 bool Check(const typename T::Col1ElemType& e1,
00026 const typename T::Col2ElemType& e2,
00027 const typename T::Col3ElemType& e3,
00028 const typename T::Col4ElemType& e4,
00029 const typename T::Col5ElemType& e5,
00030 const typename T::Col6ElemType& e6,
00031 const typename T::Col7ElemType& e7,
00032 const typename T::Col8ElemType& e8,
00033 const typename T::Col9ElemType& e9)
00034 {
00035 return e1 == mValue;
00036 }
00037
00038 private:
00039 ValType mValue;
00040 };
00041
00042
00048 template <class T>
00049 class CriterionElement1InSet
00050 {
00051 public:
00052 typedef typename T::Col1ElemType ValType;
00053
00054 CriterionElement1InSet(TableTem<Column::ColumnTem<ValType> >* set)
00055 {
00056 mSet = set->GetColumn1();
00057 mEnd = set->Size();
00058 }
00059
00060 bool Check(const typename T::Col1ElemType& e1,
00061 const typename T::Col2ElemType& e2,
00062 const typename T::Col3ElemType& e3,
00063 const typename T::Col4ElemType& e4,
00064 const typename T::Col5ElemType& e5,
00065 const typename T::Col6ElemType& e6,
00066 const typename T::Col7ElemType& e7,
00067 const typename T::Col8ElemType& e8,
00068 const typename T::Col9ElemType& e9)
00069 {
00070 return Find(mSet,e1,0,mEnd) != mEnd;
00071 }
00072
00073 private:
00074 Column::ColumnTem<ValType>* mSet;
00075 int mEnd;
00076 };
00077
00078
00079 template <class T>
00080 class CriterionElement2Equals
00081 {
00082 public:
00083 typedef typename T::Col2ElemType ValType;
00084
00085 CriterionElement2Equals(ValType value)
00086 {
00087 mValue = value;
00088 }
00089
00090 bool Check(const typename T::Col1ElemType& e1,
00091 const typename T::Col2ElemType& e2,
00092 const typename T::Col3ElemType& e3,
00093 const typename T::Col4ElemType& e4,
00094 const typename T::Col5ElemType& e5,
00095 const typename T::Col6ElemType& e6,
00096 const typename T::Col7ElemType& e7,
00097 const typename T::Col8ElemType& e8,
00098 const typename T::Col9ElemType& e9)
00099 {
00100 return e2 == mValue;
00101 }
00102
00103 private:
00104 ValType mValue;
00105 };
00106
00107
00108 template <class T>
00109 class CriterionElement2NotEquals
00110 {
00111 public:
00112 typedef typename T::Col2ElemType ValType;
00113
00114 CriterionElement2NotEquals(ValType value)
00115 {
00116 mValue = value;
00117 }
00118
00119 bool Check(const typename T::Col1ElemType& e1,
00120 const typename T::Col2ElemType& e2,
00121 const typename T::Col3ElemType& e3,
00122 const typename T::Col4ElemType& e4,
00123 const typename T::Col5ElemType& e5,
00124 const typename T::Col6ElemType& e6,
00125 const typename T::Col7ElemType& e7,
00126 const typename T::Col8ElemType& e8,
00127 const typename T::Col9ElemType& e9)
00128 {
00129 return e2 != mValue;
00130 }
00131
00132 private:
00133 ValType mValue;
00134 };
00135
00136
00137 template <class T>
00138 class CriterionQuidObjectEquals
00139 {
00140 public:
00141 CriterionQuidObjectEquals(int value)
00142 {
00143 mValue = value;
00144 }
00145
00146 bool Check(const typename T::Col1ElemType& e1,
00147 const typename T::Col2ElemType& e2,
00148 const typename T::Col3ElemType& e3,
00149 const typename T::Col4ElemType& e4,
00150 const typename T::Col5ElemType& e5,
00151 const typename T::Col6ElemType& e6,
00152 const typename T::Col7ElemType& e7,
00153 const typename T::Col8ElemType& e8,
00154 const typename T::Col9ElemType& e9)
00155 {
00156 return QuidObject(e1) == mValue;
00157 }
00158
00159 private:
00160 int mValue;
00161 };
00162
00163
00164 template <class T>
00165 class CriterionQuidInSet
00166 {
00167 public:
00168
00169 CriterionQuidInSet(QuidTable* set)
00170 {
00171 mSet = set;
00172 }
00173
00174 bool Check(const typename T::Col1ElemType& e1,
00175 const typename T::Col2ElemType& e2,
00176 const typename T::Col3ElemType& e3,
00177 const typename T::Col4ElemType& e4,
00178 const typename T::Col5ElemType& e5,
00179 const typename T::Col6ElemType& e6,
00180 const typename T::Col7ElemType& e7,
00181 const typename T::Col8ElemType& e8,
00182 const typename T::Col9ElemType& e9)
00183 {
00184 return Contains(mSet->GetColumn1(), e1);
00185 }
00186 private:
00187 QuidTable* mSet;
00188 };
00189
00190
00191 template <class T>
00192 class CriterionQuidObjectInSet
00193 {
00194 public:
00195
00196 CriterionQuidObjectInSet(std::vector<int> set)
00197 {
00198 mSet = set;
00199 }
00200
00201 bool Check(const typename T::Col1ElemType& e1,
00202 const typename T::Col2ElemType& e2,
00203 const typename T::Col3ElemType& e3,
00204 const typename T::Col4ElemType& e4,
00205 const typename T::Col5ElemType& e5,
00206 const typename T::Col6ElemType& e6,
00207 const typename T::Col7ElemType& e7,
00208 const typename T::Col8ElemType& e8,
00209 const typename T::Col9ElemType& e9)
00210 {
00211 int qObj = QuidObject(e1);
00212 return std::find(mSet.begin(), mSet.end(), qObj) != mSet.end();
00213 }
00214
00215 private:
00216
00217 std::vector<int> mSet;
00218 };
00219
00220
00223 template <class T>
00224 class CriterionQuidObjectMaxId
00225 {
00226 public:
00227
00228 CriterionQuidObjectMaxId(int maxId)
00229 {
00230 mMaxId = maxId;
00231 }
00232
00233 bool Check(const typename T::Col1ElemType& e1,
00234 const typename T::Col2ElemType& e2,
00235 const typename T::Col3ElemType& e3,
00236 const typename T::Col4ElemType& e4,
00237 const typename T::Col5ElemType& e5,
00238 const typename T::Col6ElemType& e6,
00239 const typename T::Col7ElemType& e7,
00240 const typename T::Col8ElemType& e8,
00241 const typename T::Col9ElemType& e9)
00242 {
00243 int qObj = QuidObject(e1);
00244 return qObj < mMaxId;
00245 }
00246
00247 private:
00248
00249 int mMaxId;
00250
00251 };
00252
00253
00256 template <class T>
00257 class CriterionQuidObjectMaxNumber
00258 {
00259 public:
00260
00261 CriterionQuidObjectMaxNumber(int maxNumber)
00262 {
00263 mMaxNumber = maxNumber;
00264 }
00265
00266 bool Check(const typename T::Col1ElemType& e1,
00267 const typename T::Col2ElemType& e2,
00268 const typename T::Col3ElemType& e3,
00269 const typename T::Col4ElemType& e4,
00270 const typename T::Col5ElemType& e5,
00271 const typename T::Col6ElemType& e6,
00272 const typename T::Col7ElemType& e7,
00273 const typename T::Col8ElemType& e8,
00274 const typename T::Col9ElemType& e9)
00275 {
00276 int qObj = QuidObject(e1);
00277 for (int i=0 ; i<mObjs.size() ; i++)
00278 if (qObj == mObjs[i])
00279 return true;
00280 if (mObjs.size() < mMaxNumber)
00281 {
00282 mObjs.push_back(qObj);
00283 return true;
00284 }
00285 return false;
00286 }
00287
00288 private:
00289
00290 int mMaxNumber;
00291 std::vector<int> mObjs;
00292
00293 };
00294
00295
00299 template <class T>
00300 class CriterionQuidObjectMaxNumberElement2
00301 {
00302 public:
00303 typedef typename T::Col2ElemType ValType;
00304
00305 CriterionQuidObjectMaxNumberElement2(ValType value, int maxNumber)
00306 {
00307 mValue = value;
00308 mMaxNumber = maxNumber;
00309 }
00310
00311 bool Check(const typename T::Col1ElemType& e1,
00312 const typename T::Col2ElemType& e2,
00313 const typename T::Col3ElemType& e3,
00314 const typename T::Col4ElemType& e4,
00315 const typename T::Col5ElemType& e5,
00316 const typename T::Col6ElemType& e6,
00317 const typename T::Col7ElemType& e7,
00318 const typename T::Col8ElemType& e8,
00319 const typename T::Col9ElemType& e9)
00320 {
00321 if (e2 != mValue)
00322 return true;
00323 if (mMaxNumber < 1)
00324 return false;
00325
00326 int qObj = QuidObject(e1);
00327 for (int i=0 ; i<mObjs.size() ; i++)
00328 {
00329 if (qObj == mObjs[i])
00330 {
00331 if (mNr[i] < mMaxNumber)
00332 {
00333 mNr[i]++;
00334 return true;
00335 }
00336 else
00337 {
00338 return false;
00339 }
00340 }
00341 }
00342 mObjs.push_back(qObj);
00343 mNr.push_back(1);
00344 return true;
00345 }
00346
00347 private:
00348
00349 ValType mValue;
00350 int mMaxNumber;
00351 std::vector<int> mObjs;
00352 std::vector<int> mNr;
00353
00354 };
00355
00356
00357 }
00358 }
00359 }
00360
00361 #endif