/**********************************************************************
// @@@ 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:         ComTdbUnPackRows.cpp
* Description:  
*
* Created:      5/6/98
* Language:     C++
*
*
*
*
****************************************************************************
*/

#include "ComTdbUnPackRows.h"
#include "ComTdbCommon.h"

//////////////////////////////////////////////////////////////////////////////
//
//  TDB procedures
//
//////////////////////////////////////////////////////////////////////////////

// Default Constructor
// Used when unpacking the UnPackRows TDB to get a pointer
// to the Virtual Method Table. Called by ComTdb::fixupVTblPtr().
//
ComTdbUnPackRows::ComTdbUnPackRows() 
  : ComTdb(ComTdb::ex_UNPACKROWS, eye_UNPACKROWS)
{
}

// Construct a copy of the given UnPackRows Tdb.
// (This constructor does not seem to be used)

// Exclude this code from coverage analysis.
ComTdbUnPackRows::ComTdbUnPackRows(const ComTdbUnPackRows *unPackRowsTdb)
  : ComTdb(ComTdb::ex_UNPACKROWS,
	   eye_UNPACKROWS,
           unPackRowsTdb->getEstRowsUsed(),
	   unPackRowsTdb->criDescDown_,
	   unPackRowsTdb->criDescUp_,
           unPackRowsTdb->queueSizeDown_,
	   unPackRowsTdb->queueSizeUp_,
           unPackRowsTdb->numBuffers_,
	   unPackRowsTdb->bufferSize_),
    childTdb_(unPackRowsTdb->childTdb_),
    packingFactor_(unPackRowsTdb->packingFactor_),
    unPackColsExpr_(unPackRowsTdb->unPackColsExpr_),
    unPackColsTupleLen_(unPackRowsTdb->unPackColsTupleLen_),
    unPackColsAtpIndex_(unPackRowsTdb->unPackColsAtpIndex_),
    indexValueAtpIndex_(unPackRowsTdb->indexValueAtpIndex_),
    workCriDesc_(unPackRowsTdb->workCriDesc_),
    flags_(unPackRowsTdb->flags_)
{
}

// Construct a new UnPackRows TDB.
// This constructor is call by the generator (PhysUnPackRows::codeGen() in
// GenRelPackedRows.cpp.) 
//
// Parameters
//
// ComTdb *childTdb
//  IN: The child of this UnPackRows TDB.
//
// ex_expr *unPackColsExpr
//  IN: A move expression which unpacks one value from each packed column.
//
// ex_expr *packingFactorExpr
//  IN: A move expression used to extract the packing factor from one of
//      the packed columns.
//
// long unPackColsTupleLen
//  IN: The length of the tuple which will hold the unpacked values.  This
//      tuple will be allocated by the UnPackRows node.
//
// unsigned short unPackColsAtpIndex
//  IN: The index of the UnPackRows tuple in the work and returned ATP.
//
// unsigned short indexValueAtpIndex
//  IN: The index of the index Value tuple in the work.
//
// ex_cri_desc *criDescDown
//  IN: The Cri Descriptor given to this node by its parent.
//
// ex_cri_desc *criDescUp
//  IN: The Cri Descriptor returned to the parent node.
//
// ex_cri_desc *workCriDesc
//  IN: The Cri Descriptor for the work Atp.
//
// queue_index queueSizeDown
//  IN: Recommended queue size for the down queue used to communicate 
//      with the parent.
//
// queue_index queueSizeUp
//  IN: Recommended queue size for the up queue used to communicate
//      with the parent.
//
// Cardinality estimatedRowCount
//  IN: compiler estimate on number of returned rows
//
ComTdbUnPackRows::ComTdbUnPackRows(ComTdb *childTdb,
				   ex_expr *packingFactor,
				   ex_expr *unPackColsExpr,
				   Lng32 unPackColsTupleLen,
				   unsigned short unPackColsAtpIndex,
				   unsigned short indexValueAtpIndex,
				   ex_cri_desc *criDescDown,
				   ex_cri_desc *criDescUp,
				   ex_cri_desc *workCriDesc,
				   queue_index queueSizeDown,
				   queue_index queueSizeUp,
				   Cardinality estimatedRowCount,
				   NABoolean rowsetIterator,
				   NABoolean tolerateNonFatalError) :
  ComTdb(ComTdb::ex_UNPACKROWS,
	 eye_UNPACKROWS,
         estimatedRowCount,
	 criDescDown,
	 criDescUp,
         queueSizeDown,
	 queueSizeUp,
         0,
	 0),
  childTdb_(childTdb),
  packingFactor_(packingFactor),
  unPackColsExpr_(unPackColsExpr),
  unPackColsTupleLen_(unPackColsTupleLen),
  unPackColsAtpIndex_(unPackColsAtpIndex),
  indexValueAtpIndex_(indexValueAtpIndex),
  workCriDesc_(workCriDesc),
  flags_(0)
{
    if (rowsetIterator == TRUE)
    flags_ |= ROWSET_ITERATOR;

    setTolerateNonFatalError(tolerateNonFatalError);
}

ComTdbUnPackRows::ComTdbUnPackRows(ComTdb *childTdb,
				   ex_expr *inputSizeExpr,
				   ex_expr *maxInputRowlenExpr,
				   ex_expr *rwrsBufferAddrExpr,
				   unsigned short rwrsAtpIndex,
				   ex_cri_desc *criDescDown,
				   ex_cri_desc *criDescUp,
				   ex_cri_desc *workCriDesc,
				   queue_index queueSizeDown,
				   queue_index queueSizeUp,
				   Cardinality estimatedRowCount,
				   Lng32 num_buffers,
				   ULng32 buffer_size) :
     ComTdb(ComTdb::ex_UNPACKROWS,
	    eye_UNPACKROWS,
	    estimatedRowCount,
	    criDescDown,
	    criDescUp,
	    queueSizeDown,
	    queueSizeUp,
	    num_buffers,
	    buffer_size),
  childTdb_(childTdb),
  packingFactor_(inputSizeExpr),
  unPackColsExpr_(maxInputRowlenExpr),
  rwrsBufferAddrExpr_(rwrsBufferAddrExpr),
  unPackColsTupleLen_(0),
  unPackColsAtpIndex_(rwrsAtpIndex),
  indexValueAtpIndex_(0),
  workCriDesc_(workCriDesc),
  flags_(0)
{
  setRowwiseRowset(TRUE);
}

// ComTdbUnPackRows::Display() -----------------------------------------
// (Don't know why this is here.  It does not seem to be virtual and
// on class seems to do anything for this method.)
//
//
// Exclude this code from coverage analysis.
// This code could be deleted since it is not used.
void
ComTdbUnPackRows::display() const 
{
  // Do nothing for now.
  //
}

// ComTdbUnPackRows::pack() ---------------------------------------------
// Pack the unPackRows TDB for transmission from the compiler to the
// executor, or from an ESP to DP2, etc.  This method needs to convert
// all pointers to offsets, so that the memory containing this TDB fragment,
// can be relocated and 'unpacked' at a new base address.
//
// Parameters
//
// void *space
//  IN - The space object which was used to allocate this TDB. Used to
//       compute offsets all pointers.  It is an error if any pointer
//       that can be reached from this TDB points to memory outside 
//       this space object.
//
Long
ComTdbUnPackRows::pack(void * space)
{
  // Pack the child TDB, (this calls the pack() method on the child.
  //
  childTdb_.pack(space);

  // Pack all the pointers that can be reach from the data members of this
  // TDB.
  //
  workCriDesc_.pack(space);

  packingFactor_.pack(space);
  unPackColsExpr_.pack(space);
  
  rwrsBufferAddrExpr_.pack(space);

  // Return the packed pointer to 'this', so that my parent can store the
  // packed version of my address.
  //
  return ComTdb::pack(space);
}

// ComTdbUnPackRows::unpack() ---------------------------------------------
// Unpack the unPackRows TDB after transmission from the compiler to the
// executor, or from an ESP to DP2, etc.  This method needs to convert
// all offsets to pointers, so that all pointers now reflected the new
// location of the TDB fragment.
//
// Parameters
//
// long base
//  IN - The base address of the TDB fragment.  Pointers are calculated
//       by adding the offset to the base address (more or less).
//
Lng32
ComTdbUnPackRows::unpack(void * base, void * reallocator)
{
  if(childTdb_.unpack(base, reallocator)) return -1;
  if(workCriDesc_.unpack(base, reallocator)) return -1;
  if(packingFactor_.unpack(base, reallocator)) return -1;
  if(unPackColsExpr_.unpack(base, reallocator)) return -1;
  if(rwrsBufferAddrExpr_.unpack(base, reallocator)) return -1;
  return ComTdb::unpack(base, reallocator);
}

void ComTdbUnPackRows::displayContents(Space * space,ULng32 flag)
{
  ComTdb::displayContents(space,flag & 0xFFFFFFFE);
  
  if(flag & 0x00000008)
    {
      char buf[100];
      str_sprintf(buf, "\nFor ComTdbUnPackRows :");
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
      
      if (rowwiseRowset())
	{
	  str_sprintf(buf,"rwrsAtpIndex_  = %d", 
		      unPackColsAtpIndex_);
	  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
	}
      else
	{
	  str_sprintf(buf,"unPackColsTupleLen_  = %d, unPackColsAtpIndex_  = %d, indexValueAtpIndex_ = %d", 
		      unPackColsTupleLen_, unPackColsAtpIndex_, indexValueAtpIndex_);
	  space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
	}

      str_sprintf(buf,"flags_ = %x", flags_);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short));
    }
  
  if(flag & 0x00000001)
    {
      displayExpression(space,flag);
      displayChildren(space,flag);
    }
}




