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