/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
/* -*-C++-*-
 *****************************************************************************
 *
 * File:         RelStoredProc.h
 * Description:  RelExpr classes for stored procedure.
 *               
 *               
 * Created:      03/12/97
 * Language:     C++
 *
 *
 *
 *
 *****************************************************************************
 */


#ifndef RELSTOREDPROC_H
#define RELSTOREDPROC_H

#include "ObjectNames.h"
#include "RelMisc.h" 
#include "RelRoutine.h" 

// consider moving all of this into RelRoutine.cpp ..


class RelInternalSP : public TableValuedFunction
{
public:
  // constructor
  RelInternalSP(const NAString & name ="", ItemExpr* params = 0,
		OperatorTypeEnum otype = REL_INTERNALSP,
                CollHeap* oHeap=0, UInt16 arkcmpInfo = 0);

  // copy ctor
  RelInternalSP(const RelInternalSP & other, CollHeap * h=0) ;
  
  virtual ~RelInternalSP();

  // enum for arkcmpInfo_ flag

  enum
  {
    executeInSameArkcmp     = 0x1,
    requiresTMFTransaction  = 0x2,
    suppressDefaultSchema   = 0x4,
    executeInLocalProcess = 0x8
  };

  // get the degree of this node (it is a leaf op).
  virtual Int32 getArity() const;

  // a virtual function for performing name binding within the query tree
  virtual RelExpr * bindNode(BindWA *bindWAPtr);
  
  // method to do code generation
  virtual short codeGen(Generator*);

  virtual void getPotentialOutputValues(ValueIdSet &vs) const;
  
  // add all the expressions that are local to this
  // node to an existing list of expressions (used by GUI tool)
  virtual void addLocalExpr(LIST(ExprNode *) &xlist,
			    LIST(NAString) &llist) const;
  virtual HashValue topHash();
  virtual NABoolean duplicateMatch(const RelExpr & other) const;
  virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
				CollHeap* outHeap = 0);

  // synthesize logical properties
  virtual void synthLogProp(NormWA * normWAPtr = NULL);
  virtual void synthEstLogProp(const EstLogPropSharedPtr& inputEstLogProp);

  // cost functions
  virtual PhysicalProperty *synthPhysicalProperty(const Context *context,
                                                  const Lng32    planNumber,
                                                  PlanWorkSpace  *pws);
  virtual CostMethod* costMethod() const;


  // this is both logical and physical node
  virtual NABoolean isLogical() const{return TRUE;};
  virtual NABoolean isPhysical() const{return TRUE;};

  virtual void pushdownCoveredExpr(const ValueIdSet & outputExprOnOperator,
                                   const ValueIdSet & newExternalInputs,
                                   ValueIdSet& predOnOperator,
				   const ValueIdSet * nonPredExprOnOperator = NULL,
                                   Lng32 childId = (-MAX_REL_ARITY) );

  // method for transformer.
  virtual void transformNode(NormWA & normWARef,
			     ExprGroupId & locationOfPointerToMe); 

  virtual void recomputeOuterReferences();

  // method for normalizer
  virtual RelExpr * normalizeNode(NormWA & normWARef);

  // get a printable string that identifies the operator
  virtual const NAString getText() const;

  virtual const char *getVirtualTableName()	{ return outTableName_; }

  ValueIdList & procTypes()			{ return procTypes_; }

  NABoolean pilotAnalysis(QueryAnalysis* qa) {return FALSE;}

  // accessors  - get flag bit value
  inline NABoolean getExecuteInSameArkcmp (void) 
    { return (arkcmpInfo_ & executeInSameArkcmp); };
  inline NABoolean getRequiresTMFTransaction (void) 
    { return (arkcmpInfo_ & requiresTMFTransaction); };
  inline NABoolean getSuppressDefaultSchema (void) 
    { return (arkcmpInfo_ & suppressDefaultSchema); };

  NABoolean isQueryCacheVirtualTable() const ;
  NABoolean isHybridQueryCacheVirtualTable() const;
  NABoolean isNATableCacheVirtualTable() const ;
  NABoolean isNARoutineCacheVirtualTable() const;
   
private:
  //assignment operator
  const RelInternalSP& operator=(const RelInternalSP&);
  // the stored procedure name
  NAString procName_;
  // the output table name, used to index NATable
  NAString outTableName_;
  // the input parameter types, a list of NATypes, i.e. NATypeToItem
  ItemExpr* procTypesTree_; 
  ValueIdList procTypes_;

  // Bitmap that contains arkcmp-related information passed from the compiler
  // to the executor. Internal stored procedures use it to indicate that
  // the procedure in execution corresponds to query cache statistics
  UInt16 arkcmpInfo_;
  
}; // class RelInternalSP

class RelUtilInternalSP : public RelInternalSP
{
public:
  // constructor
  RelUtilInternalSP(const NAString & name ="", ItemExpr* params = 0,
		    OperatorTypeEnum otype = REL_UTIL_INTERNALSP,
		    CollHeap* oHeap=0, UInt16 arkcmpInfo = 0) :
       RelInternalSP(name, params, otype, oHeap, arkcmpInfo)
  {
  }

  // a virtual function for performing name binding within the query tree
  virtual RelExpr * bindNode(BindWA *bindWAPtr);

  virtual void getPotentialOutputValues(ValueIdSet &vs) const;
  
  virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
				CollHeap* outHeap = 0);

}; // class RelUtilInternalSP


// Standalone function to determine the requirements of built-in functions
// activated through the TDMISP mechanism
UInt16 getTdmispArkcmpInfo (const char * actualSP);

#endif
