1 /*************** Filter H Declares Source Code File (.H) ***************/ 2 /* Name: FILTER.H Version 1.3 */ 3 /* */ 4 /* (C) Copyright to the author Olivier BERTRAND 2010-2017 */ 5 /* */ 6 /* This file contains the FILTER and derived classes declares. */ 7 /***********************************************************************/ 8 #ifndef __FILTER__ 9 #define __FILTER__ 10 11 /***********************************************************************/ 12 /* Include required application header files */ 13 /***********************************************************************/ 14 #include "xobject.h" 15 16 /***********************************************************************/ 17 /* Utilities for WHERE condition building. */ 18 /***********************************************************************/ 19 PFIL MakeFilter(PGLOBAL g, PFIL filp, OPVAL vop, PFIL fp); 20 PFIL MakeFilter(PGLOBAL g, PCOL *colp, POPER pop, PPARM pfirst, bool neg); 21 22 /***********************************************************************/ 23 /* Definition of class FILTER with all its method functions. */ 24 /* Note: Most virtual implementation functions are not in use yet */ 25 /* but could be in future system evolution. */ 26 /***********************************************************************/ 27 class DllExport FILTER : public XOBJECT { /* Filter description block */ 28 //friend PFIL PrepareFilter(PGLOBAL, PFIL, bool); 29 friend DllExport bool ApplyFilter(PGLOBAL, PFIL); 30 public: 31 // Constructors 32 FILTER(PGLOBAL g, POPER pop, PPARM *tp = NULL); 33 FILTER(PGLOBAL g, OPVAL opc, PPARM *tp = NULL); 34 FILTER(PFIL fil1); 35 36 // Implementation GetType(void)37 virtual int GetType(void) {return TYPE_FILTER;} GetResultType(void)38 virtual int GetResultType(void) {return TYPE_INT;} GetLength(void)39 virtual int GetLength(void) {return 1;} GetLengthEx(void)40 virtual int GetLengthEx(void) {assert(FALSE); return 0;} GetScale()41 virtual int GetScale() {return 0;}; GetNext(void)42 PFIL GetNext(void) {return Next;} GetOpc(void)43 OPVAL GetOpc(void) {return Opc;} GetOpm(void)44 int GetOpm(void) {return Opm;} GetArgType(int i)45 int GetArgType(int i) {return Arg(i)->GetType();} GetResult(void)46 bool GetResult(void) {return Value->GetIntValue() != 0;} Arg(int i)47 PXOB &Arg(int i) {return Test[i].Arg;} Val(int i)48 PVAL &Val(int i) {return Test[i].Value;} Conv(int i)49 bool &Conv(int i) {return Test[i].Conv;} SetNext(PFIL filp)50 void SetNext(PFIL filp) {Next = filp;} 51 52 // Methods 53 virtual void Reset(void); Compare(PXOB)54 virtual bool Compare(PXOB) {return FALSE;} // Not used yet 55 virtual bool Init(PGLOBAL); 56 virtual bool Eval(PGLOBAL); SetFormat(PGLOBAL,FORMAT &)57 virtual bool SetFormat(PGLOBAL, FORMAT&) {return TRUE;} // NUY 58 //virtual int CheckColumn(PGLOBAL g, PSQL sqlp, PXOB &xp, int &ag); 59 //virtual int RefNum(PSQL); 60 //virtual PXOB SetSelect(PGLOBAL, PSQL, bool) {return NULL;} // NUY 61 //virtual PXOB CheckSubQuery(PGLOBAL, PSQL); 62 //virtual bool CheckLocal(PTDB); 63 //virtual int CheckSpcCol(PTDB tdbp, int n); 64 virtual void Printf(PGLOBAL g, FILE *f, uint n); 65 virtual void Prints(PGLOBAL g, char *ps, uint z); 66 // PFIL Linearize(bool nosep); 67 // PFIL Link(PGLOBAL g, PFIL fil2); 68 // PFIL RemoveLastSep(void); 69 // PFIL SortJoin(PGLOBAL g); 70 // bool FindJoinFilter(POPJOIN opj, PFIL fprec, bool teq, 71 // bool tek, bool tk2, bool tc2, bool tix, bool thx); 72 // bool CheckHaving(PGLOBAL g, PSQL sqlp); 73 bool Convert(PGLOBAL g, bool having); 74 // int SplitFilter(PFIL *fp); 75 // int SplitFilter(PFIL *fp, PTDB tp, int n); 76 // PFIL LinkFilter(PGLOBAL g, PFIL fp2); 77 // PFIL Copy(PTABS t); 78 79 protected: FILTER(void)80 FILTER(void) {} // Standard constructor not to be used 81 void Constr(PGLOBAL g, OPVAL opc, int opm, PPARM *tp); 82 83 // Members 84 PFIL Next; // Used for linearization 85 OPVAL Opc; // Comparison operator 86 int Opm; // Modificator 87 BYTE Bt; // Operator bitmap 88 struct { 89 int B_T; // Buffer type 90 PXOB Arg; // Points to argument 91 PVAL Value; // Points to argument value 92 bool Conv; // TRUE if argument must be converted 93 } Test[2]; 94 }; // end of class FILTER 95 96 /***********************************************************************/ 97 /* Derived class FILTERX: used to replace a filter by a derived class */ 98 /* using an Eval method optimizing the filtering evaluation. */ 99 /* Note: this works only if the members of the derived class are the */ 100 /* same than the ones of the original class (NO added members). */ 101 /***********************************************************************/ 102 class FILTERX : public FILTER { 103 public: 104 // Methods 105 virtual bool Eval(PGLOBAL) = 0; // just to prevent direct FILTERX use 106 107 // Fake operator new used to change a filter into a derived filter new(size_t,PFIL filp)108 void * operator new(size_t, PFIL filp) {return filp;} 109 #if defined(_WIN32) 110 // Avoid warning C4291 by defining a matching dummy delete operator delete(void *,PFIL)111 void operator delete(void *, PFIL) {} 112 #else delete(void *)113 void operator delete(void *) {} 114 #endif 115 }; // end of class FILTERX 116 117 /***********************************************************************/ 118 /* Derived class FILTEREQ: OP_EQ, no conversion and Xobject args. */ 119 /***********************************************************************/ 120 class FILTERCMP : public FILTERX { 121 public: 122 // Constructor 123 FILTERCMP(PGLOBAL g); 124 125 // Methods 126 virtual bool Eval(PGLOBAL); 127 }; // end of class FILTEREQ 128 129 /***********************************************************************/ 130 /* Derived class FILTERAND: OP_AND, no conversion and Xobject args. */ 131 /***********************************************************************/ 132 class FILTERAND : public FILTERX { 133 public: 134 // Methods 135 virtual bool Eval(PGLOBAL); 136 }; // end of class FILTERAND 137 138 /***********************************************************************/ 139 /* Derived class FILTEROR: OP_OR, no conversion and Xobject args. */ 140 /***********************************************************************/ 141 class FILTEROR : public FILTERX { 142 public: 143 // Methods 144 virtual bool Eval(PGLOBAL); 145 }; // end of class FILTEROR 146 147 /***********************************************************************/ 148 /* Derived class FILTERNOT: OP_NOT, no conversion and Xobject args. */ 149 /***********************************************************************/ 150 class FILTERNOT : public FILTERX { 151 public: 152 // Methods 153 virtual bool Eval(PGLOBAL); 154 }; // end of class FILTERNOT 155 156 /***********************************************************************/ 157 /* Derived class FILTERIN: OP_IN, no conversion and Array 2nd arg. */ 158 /***********************************************************************/ 159 class FILTERIN : public FILTERX { 160 public: 161 // Methods 162 virtual bool Eval(PGLOBAL); 163 }; // end of class FILTERIN 164 165 /***********************************************************************/ 166 /* Derived class FILTERTRUE: Always returns TRUE. */ 167 /***********************************************************************/ 168 class FILTERTRUE : public FILTERX { 169 public: 170 // Constructor FILTERTRUE(PVAL valp)171 FILTERTRUE(PVAL valp) {Value = valp; Value->SetValue_bool(TRUE);} 172 173 // Methods 174 virtual void Reset(void); 175 virtual bool Eval(PGLOBAL); 176 }; // end of class FILTERTRUE 177 178 #endif // __FILTER__ 179