/*************** BlkFil H Declares Source Code File (.H) ***************/
/*  Name: BLKFIL.H    Version 2.1                                      */
/*                                                                     */
/*  (C) Copyright to the author Olivier BERTRAND          2004-2010    */
/*                                                                     */
/*  This file contains the block optimization related classes declares */
/***********************************************************************/
#ifndef __BLKFIL__
#define __BLKFIL__

typedef class BLOCKFILTER *PBF;
typedef class BLOCKINDEX  *PBX;

/***********************************************************************/
/*  Definition of class BLOCKFILTER.                                   */
/***********************************************************************/
class DllExport BLOCKFILTER : public BLOCK {           /* Block Filter */
  friend class BLKFILLOG;
 public:
  // Constructors
  BLOCKFILTER(PTDBDOS tdbp, int op);

  // Implementation
          int  GetResult(void) {return Result;}
          bool Correlated(void) {return Correl;}

  // Methods
  virtual void Reset(PGLOBAL) = 0;
  virtual int  BlockEval(PGLOBAL) = 0;
  void Printf(PGLOBAL g, FILE *f, uint n) override;
  void Prints(PGLOBAL g, char *ps, uint z) override;

 protected:
  BLOCKFILTER(void) = default;       // Standard constructor not to be used

  // Members
  PTDBDOS Tdbp;         // Owner TDB
  bool    Correl;       // TRUE for correlated subqueries
  int     Opc;          // Comparison operator
  int     Opm;          // Operator modificator
  int     Result;       // Result from evaluation
  }; // end of class BLOCKFILTER

/***********************************************************************/
/*  Definition of class BLKFILLOG (with Op=OP_AND,OP_OR, or OP_NOT)    */
/***********************************************************************/
class DllExport BLKFILLOG : public BLOCKFILTER { /* Logical Op Block Filter */
 public:
  // Constructors
  BLKFILLOG(PTDBDOS tdbp, int op, PBF *bfp, int n);

  // Methods
  void Reset(PGLOBAL g) override;
  int  BlockEval(PGLOBAL g) override;

 protected:
  BLKFILLOG(void) = default;       // Standard constructor not to be used

  // Members
  PBF *Fil;                // Points to Block filter args
  int N;
  }; // end of class BLKFILLOG

/***********************************************************************/
/*  Definition of class BLKFILARI (with Op=OP_EQ,NE,GT,GE,LT, or LE)   */
/***********************************************************************/
class DllExport BLKFILARI : public BLOCKFILTER { /* Arithm. Op Block Filter */
 public:
  // Constructors
  BLKFILARI(PGLOBAL g, PTDBDOS tdbp, int op, PXOB *xp);

  // Methods
  void Reset(PGLOBAL g) override;
  int  BlockEval(PGLOBAL g) override;
  virtual void MakeValueBitmap(void) {}

 protected:
  BLKFILARI(void) = default;       // Standard constructor not to be used

  // Members
  PDOSCOL Colp;            // Points to column argument
  PCOL    Cpx;             // Point to subquery "constant" column
  PVAL    Valp;            // Points to constant argument Value
  bool    Sorted;          // True if the column is sorted
  }; // end of class BLKFILARI

/***********************************************************************/
/*  Definition of class BLKFILAR2 (with Op=OP_EQ,NE,GT,GE,LT, or LE)   */
/***********************************************************************/
class DllExport BLKFILAR2 : public BLKFILARI { /* Arithm. Op Block Filter */
 public:
  // Constructors
  BLKFILAR2(PGLOBAL g, PTDBDOS tdbp, int op, PXOB *xp);

  // Methods
  int  BlockEval(PGLOBAL g) override;
  void MakeValueBitmap(void) override;

 protected:
  BLKFILAR2(void) = default;       // Standard constructor not to be used

  // Members
  uint Bmp;                // The value bitmap used to test blocks
  uint Bxp;                // Bitmap used when Opc = OP_EQ
  }; // end of class BLKFILAR2

/***********************************************************************/
/*  Definition of class BLKFILAR2 (with Op=OP_EQ,NE,GT,GE,LT, or LE)   */
/*  To be used when the bitmap is an array of ULONG bitmaps;           */
/***********************************************************************/
class DllExport BLKFILMR2 : public BLKFILARI { /* Arithm. Op Block Filter */
 public:
  // Constructors
  BLKFILMR2(PGLOBAL g, PTDBDOS tdbp, int op, PXOB *xp);

  // Methods
  int  BlockEval(PGLOBAL g) override;
  void MakeValueBitmap(void) override;

 protected:
  BLKFILMR2(void) = default;       // Standard constructor not to be used

  // Members
  int    Nbm;              // The number of ULONG bitmaps
  int    N;                // The position of the leftmost ULONG
  bool   Void;             // True if all file blocks can be skipped
  uint  *Bmp;              // The values bitmaps used to test blocks
  uint  *Bxp;              // Bit of values <= max value
  }; // end of class BLKFILMR2

/***********************************************************************/
/*  Definition of class BLKSPCARI (with Op=OP_EQ,NE,GT,GE,LT, or LE)   */
/***********************************************************************/
class DllExport BLKSPCARI : public BLOCKFILTER { /* Arithm. Op Block Filter */
 public:
  // Constructors
  BLKSPCARI(PTDBDOS tdbp, int op, PXOB *xp, int bsize);

  // Methods
  void Reset(PGLOBAL g) override;
  int  BlockEval(PGLOBAL g) override;

 protected:
  BLKSPCARI(void) = default;       // Standard constructor not to be used

  // Members
  PCOL    Cpx;             // Point to subquery "constant" column
  PVAL    Valp;            // Points to constant argument Value
  int     Val;             // Constant argument Value
  int     Bsize;           // Table block size
  }; // end of class BLKSPCARI

/***********************************************************************/
/*  Definition of class BLKFILIN (with Op=OP_IN)                       */
/***********************************************************************/
class DllExport BLKFILIN : public BLOCKFILTER {  // With array arguments.
 public:
  // Constructors
  BLKFILIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp);

  // Methods
  void Reset(PGLOBAL g) override;
  int  BlockEval(PGLOBAL g) override;
  virtual void MakeValueBitmap(void) {}

 protected:
  // Member
  PDOSCOL Colp;            // Points to column argument
  PARRAY  Arap;            // Points to array argument
  bool    Sorted;          // True if the column is sorted
  int     Type;            // Type of array elements
  }; // end of class BLKFILIN

/***********************************************************************/
/*  Definition of class BLKFILIN2 (with Op=OP_IN)                      */
/***********************************************************************/
class DllExport BLKFILIN2 : public BLKFILIN {  // With array arguments.
 public:
  // Constructors
  BLKFILIN2(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp);

  // Methods
//virtual void Reset(PGLOBAL g);
  int  BlockEval(PGLOBAL g) override;
  void MakeValueBitmap(void) override;

 protected:
  // Member
  int    Nbm;              // The number of ULONG bitmaps
  int    N;                // The position of the leftmost ULONG
//bool   Bitmap;           // True for IN operator (temporary)
  bool   Void;             // True if all file blocks can be skipped
  bool   Invert;           // True when Result must be inverted
  uint  *Bmp;              // The values bitmaps used to test blocks
  uint  *Bxp;              // Bit of values <= max value
  PVAL   Valp;             // Used while building the bitmaps
  }; // end of class BLKFILIN2

/***********************************************************************/
/*  Definition of class BLKSPCIN (with Op=OP_IN) Special column        */
/***********************************************************************/
class DllExport BLKSPCIN : public BLOCKFILTER {  // With array arguments.
 public:
  // Constructors
  BLKSPCIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp, int bsize);

  // Methods
  void Reset(PGLOBAL g) override;
  int  BlockEval(PGLOBAL g) override;

 protected:
  // Member
  PARRAY  Arap;            // Points to array argument
  int     Bsize;           // Table block size
  }; // end of class BLKSPCIN

// ---------------- Class used in block indexing testing ----------------

#if 0
/***********************************************************************/
/*  Definition of class BLOCKINDEX.                                    */
/*  Used to test the indexing to joined tables when the foreign key is */
/*  a clustered or sorted column. If the table is joined to several    */
/*  tables, blocks will be chained together.                           */
/***********************************************************************/
class DllExport BLOCKINDEX : public BLOCK {     /* Indexing Test Block */
 public:
  // Constructors
  BLOCKINDEX(PBX nx, PDOSCOL cp, PKXBASE kp);

  // Implementation
          PBX  GetNext(void) {return Next;}

  // Methods
          void Reset(void);
  virtual int  BlockEval(PGLOBAL);
  virtual void Printf(PGLOBAL g, FILE *f, UINT n);
  virtual void Prints(PGLOBAL g, char *ps, UINT z);

 protected:
  BLOCKINDEX(void) {}   // Standard constructor not to be used

  // Members
  PBX     Next;         // To next Index Block
  PTDBDOS Tdbp;         // To table description block
  PDOSCOL Colp;         // Clustered foreign key
  PKXBASE Kxp;          // To Kindex of joined table
  bool    Sorted;       // TRUE if column is sorted
  int     Type;         // Col/Index type
  int     Result;       // Result from evaluation
  }; // end of class BLOCKINDEX

/***********************************************************************/
/*  Definition of class BLOCKINDX2.     (XDB2)                         */
/***********************************************************************/
class DllExport BLOCKINDX2 : public BLOCKINDEX { /* Indexing Test Block */
 public:
  // Constructors
  BLOCKINDX2(PBX nx, PDOSCOL cp, PKXBASE kp);

  // Methods
  virtual int  BlockEval(PGLOBAL);

 protected:
  BLOCKINDX2(void) {}   // Standard constructor not to be used

  // Members
  int   Nbm;            // The number of ULONG bitmaps
  PVBLK Dval;           // Array of column distinct values
  PVBLK Bmap;           // Array of block bitmap values
  }; // end of class BLOCKINDX2

/***********************************************************************/
/*  Definition of class BLKSPCINDX.                                    */
/*  Used to test the indexing to joined tables when the foreign key is */
/*  the ROWID special column. If the table is joined to several        */
/*  tables, blocks will be chained together.                           */
/***********************************************************************/
class DllExport BLKSPCINDX : public BLOCKINDEX { /* Indexing Test Block */
 public:
  // Constructors
  BLKSPCINDX(PBX nx, PTDBDOS tp, PKXBASE kp, int bsize);

  // Methods
  virtual int  BlockEval(PGLOBAL);

 protected:
  BLKSPCINDX(void) {}   // Standard constructor not to be used

  // Members
  int     Bsize;        // Table block size
  }; // end of class BLOCKINDEX
#endif // 0

#endif // __BLKFIL__
