/**********************************************************************
// @@@ 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 @@@
**********************************************************************/
#ifndef COLUMNNAMEMAP_H
#define COLUMNNAMEMAP_H
/* -*-C++-*-
**************************************************************************
*
* File:         ColumnNameMap.h        
* Description:  A name map for a Column
* Created:      4/27/94
* Language:     C++
*
*
*
*
*	Fast bind, fast find;
*	A proverb never stale in thrifty mind.
*		-- Shylock, Merchant of Venice, II:v
*
**************************************************************************
*/

// -----------------------------------------------------------------------

#include "ColumnDesc.h"
#include "TableDesc.h"
#include "ValueDesc.h"

// -----------------------------------------------------------------------
// contents of this file
// -----------------------------------------------------------------------
class ColumnNameMap;
class XCNM;

// ***********************************************************************
//
// ColumnNameMap : A column name map.
//
// A ColumnNameMap associates a column name  with its ValueId.
// A ColumnNameMap is transient and is used only during the
// name binding phase.
//
// The XCNM (Exposed Column Name Map) cache is a hash table of
// ColumnNameMaps that permits an associative lookup for column
// names that are qualified by an exposed table or correlation name.
// There is one entry in the XCNM for each column of every table 
// whose name is exposed in a given scope.
// 
// ***********************************************************************
class ColumnNameMap : public NABasicObject
{
public:
  // ---------------------------------------------------------------------
  // Constructor functions
  // ---------------------------------------------------------------------
  ColumnNameMap(const NAString& colRefName, 	// simple name of input value
                const ValueId& valId,
                CollHeap * h=0)
              : colRefName_(colRefName,h),
                valId_(valId),
                columnDesc_(NULL),
		duplicateFlag_(FALSE),
                qualColAmbiguousFlag_(FALSE) 
  {}

  ColumnNameMap(const NAString& colRefName, 	// simple name of column
                ColumnDesc *columnDesc,
                CollHeap * h=0,
		NABoolean dup = FALSE,
		NABoolean qualColAmbi = FALSE)
              : colRefName_(colRefName, h),
                valId_(columnDesc->getValueId()),
                columnDesc_(columnDesc),
		duplicateFlag_(dup),
		qualColAmbiguousFlag_(qualColAmbi)
  {}
    
  ColumnNameMap(const ColRefName& colRefName,  // colRefName including corrName
                ColumnDesc *columnDesc,
                CollHeap * h=0,
		NABoolean dup = FALSE,
		NABoolean qualColAmbi = FALSE)
              : colRefName_(colRefName.getColName(), 
			    colRefName.getCorrNameObj(), h),
                valId_(columnDesc->getValueId()),
                columnDesc_(columnDesc),
		duplicateFlag_(dup),
		qualColAmbiguousFlag_(qualColAmbi)
  {}

  // copy ctor
  ColumnNameMap (const ColumnNameMap & cnm, CollHeap * h=0) 
       : colRefName_(cnm.colRefName_, h),
         valId_(cnm.valId_),
         columnDesc_(cnm.columnDesc_),
         duplicateFlag_(cnm.duplicateFlag_),
	 qualColAmbiguousFlag_(cnm.qualColAmbiguousFlag_)
  {}

  // ---------------------------------------------------------------------
  // Accessor functions
  // ---------------------------------------------------------------------
  const ColRefName& getColRefNameObj() const 	{ return colRefName_; }

  ColumnDesc *getColumnDesc() const 		{ return columnDesc_; }

  ValueId getValueId() const 			{ return valId_; }

  NABoolean isDuplicate() const 		{ return duplicateFlag_; }
  void setDuplicateFlag() 			{ duplicateFlag_ = TRUE; }

  NABoolean isQualifiedColumnAmbiguous()        
  { return qualColAmbiguousFlag_; }
  
  void setQualifiedColumnAmbiguousFlag()        
  {  qualColAmbiguousFlag_ = TRUE; }

  // ---------------------------------------------------------------------
  // Display/print, for debugging.
  // ---------------------------------------------------------------------
  void print(FILE* ofd = stdout,
	     const char* indent = DEFAULT_INDENT,
             const char* title = "ColumnNameMap")
  {
    if (strcmp(title, "")) {
      BUMP_INDENT(indent);
      fprintf(ofd,"%s%s %s",NEW_INDENT,title,NEW_INDENT);
    }
    colRefName_.print(ofd, indent, "", TRUE /* brief */);
    fprintf(ofd," %u%s",
      CollIndex(valId_),
      isDuplicate()? " dup" : "");
    if (columnDesc_) {
      if (columnDesc_->getColRefNameObj() != colRefName_) {
	fprintf(ofd, " ");
	columnDesc_->print(ofd, indent, "");
      }
      CMPASSERT(columnDesc_->getValueId() == valId_);
    } else
      fprintf(ofd," (input value)");
    if (strcmp(title, "")) fprintf(ofd,"\n");
  } // print()

  void display() { print(); }

  // ---------------------------------------------------------------------
  // The following methods are required for each descriptor.
  // ---------------------------------------------------------------------
  const ColRefName* getKey() const	{ return &colRefName_; }

  NABoolean operator==(const ColumnNameMap& other) const
					{ return this == &other; }

private:
  // ---------------------------------------------------------------------
  // Column name
  // ---------------------------------------------------------------------
  ColRefName colRefName_;
  
  // ---------------------------------------------------------------------
  // Column descriptor
  // ---------------------------------------------------------------------
  ColumnDesc *columnDesc_;

  // ---------------------------------------------------------------------
  // Its Value Identifier
  // ---------------------------------------------------------------------
  ValueId valId_;

  // ---------------------------------------------------------------------
  // Duplicate flag - TRUE if there is more than one column with this name
  // in scope.  This must be in this class, not in ColumnDesc;
  // otherwise you'd get false duplicate conditions in joins and unions.
  // ---------------------------------------------------------------------
  NABoolean duplicateFlag_;

  NABoolean qualColAmbiguousFlag_;

}; // class ColumnNameMap

// ***********************************************************************
// Implementation for inline functions
// ***********************************************************************

// ***********************************************************************
// XCNM
//
// The Exposed Column Name Map for name lookup
// ***********************************************************************
// -- Initial size of the XCNM cache
#define XCNM_INIT_SIZE    61

class XCNM : public NAKeyLookup<ColRefName,ColumnNameMap>
{
public:
  XCNM(CollHeap* h/*=0*/) : 
    NAKeyLookup<ColRefName,ColumnNameMap> (XCNM_INIT_SIZE, 
					   NAKeyLookupEnums::KEY_INSIDE_VALUE,
					   h)
    {}

  // copy ctor
  XCNM (const XCNM & orig, CollHeap * h=0) :
       NAKeyLookup<ColRefName,ColumnNameMap> (orig, h) 
  {}
  
  ~XCNM() { clearAndDestroy(); }
private:
}; // class XCNM


#endif  /* COLUMNNAMEMAP_H */
