/**********************************************************************
// @@@ 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:         ExpAtp.cpp (previously /executor/ex_atp.cpp)
* Description:
*
* Created:      5/6/98
* Language:     C++
*
*
*
****************************************************************************
*/

#include "Platform.h"


#include "ExpAtp.h"
#include "ComPackDefs.h"
#include "exp_attrs.h"
#include "str.h"

// constructor (Allocate and initialize) for an Atp
atp_struct * allocateAtp(ex_cri_desc * criDesc, CollHeap * space)
{
  // Allocate space for the atp_struct (which has room for one tupp in
  // the tupp array) plus room for the remainder of the tupps.
  //
  Int32 atp_size = sizeof(atp_struct) + (criDesc->noTuples()-1) * sizeof(tupp);

  atp_struct * atp;
  atp = (atp_struct *) space->allocateMemory(atp_size);
  
  // set the pointer to the descriptor
  atp->setCriDesc(criDesc);

  // initialize tag data member.
  atp->set_tag(0 /* FALSE*/);  

  // no errors yet.
  atp->initDiagsArea(0);
  
  // Initialize each tupp.
  //
  Lng32 j;
  for(j=0; j<criDesc->noTuples(); j++)
  {
    atp->getTupp(j).init();
  }
  
  return atp;
}

// Create an atp inside a pre-allocated buffer instead of allocating it from
// a space object. Used by ExpDP2Expr.
atp_struct * createAtpInBuffer(ex_cri_desc * criDesc, char * & buf)
{
  atp_struct * atp = (atp_struct *)buf;
  // set the pointer to the descriptor
  atp->setCriDesc(criDesc);

  // initialize tag data member.
  atp->set_tag(0 /* FALSE*/);

  // no errors yet.
  atp->initDiagsArea(0);

  // Initialize each tupp.
  //
  Lng32 j;
  for(j=0; j<criDesc->noTuples(); j++)
  {
    atp->getTupp(j).init();
  }

  buf += sizeof(atp_struct) + (criDesc->noTuples() -1 ) * sizeof(tupp);
  return atp;
}

atp_struct * allocateAtp(Lng32 numTuples, CollHeap * space)
{
  // Allocate space for the atp_struct (which has room for one tupp in
  // the tupp array) plus room for the remainder of the tupps.
  //
  Int32 atp_size = sizeof(atp_struct) + (numTuples-1) * sizeof(tupp);

  atp_struct * atp;
  atp = (atp_struct *) space->allocateMemory(atp_size);
  
  // set the pointer to the descriptor
  atp->setCriDesc(NULL);

  // initialize tag data member.
  atp->set_tag(0 /* FALSE*/);  

  // no errors yet.
  atp->initDiagsArea(0);
  
  // Initialize each tupp.
  //
  Lng32 j;
  for(j=0; j<numTuples; j++)
  {
    atp->getTupp(j).init();
  }
  
  return atp;
}

void deallocateAtp(atp_struct * atp, CollHeap * space)
{
  if (space)
    space->deallocateMemory((char *)atp);
}

atp_struct * allocateAtpArray(
     ex_cri_desc * criDesc, Lng32 cnt, Int32 *atpSize, CollHeap * space, NABoolean failureIsFatal)
{
  const Lng32 numTuples = criDesc->noTuples();

  // Alocate space for the atp_struct (which has room for one tupp in
  // the tupp array) plus room for the remainder of the tupps,
  // times the count requested.
  *atpSize = sizeof(atp_struct) + numTuples * sizeof(tupp);
  char *atpSpace = (char *) space->allocateMemory(*atpSize * cnt, failureIsFatal);

  if (atpSpace == NULL)
    return NULL;

  atp_struct * atpStart = (atp_struct *) atpSpace;
  atp_struct * atp;

  for (Lng32 i = 0; i < cnt; i++)
    {
      atp = (atp_struct *) atpSpace;
      atpSpace += *atpSize;

      // set the pointer to the descriptor
      atp->setCriDesc(criDesc);

      // initialize tag data member.
      atp->set_tag(0 /* FALSE*/);

      // no errors yet.
      atp->initDiagsArea(0);

      // Initialize each tupp.
      //
      for(Lng32 j=0; j < numTuples; j++)
        {
          atp->getTupp(j).init();
        }
    }
  return atpStart;
}

void deallocateAtpArray(atp_struct ** atp, CollHeap * space)
{
  if (space)
    space->deallocateMemory((char *)*atp);
}

Long atp_struct::pack(void * space)
{
  for (Int32 i = 0; i < criDesc_->noTuples(); i++)
  {
    tuppArray_[i].pack(space);
  }

  criDesc_ = (ex_cri_desc *)(criDesc_->drivePack(space));
  return ((Space *)space)->convertToOffset(this);
}

Lng32 atp_struct::unpack(Lng32 base)
{
  ex_cri_desc obj;

  if (criDesc_)
  {
    criDesc_ = (ex_cri_desc *)CONVERT_TO_PTR(criDesc_, base);
    if (criDesc_->driveUnpack((void *)((long)base),&obj,NULL) == NULL) return -1;
    for (Int32 i = 0; i < criDesc_->noTuples(); i++)
    {
      tuppArray_[i].unpack(base);
    }
  }
  return 0;
}

void atp_struct::display(const char* title, ex_cri_desc* cri)
{
   cout << title << endl;
   if (!cri)
      cri = getCriDesc();

   char subtitle[100];
   unsigned short tuples = numTuples();
   for (Int32 i=0; i<tuples; i++) {
      ExpTupleDesc* tDesc = cri->getTupleDescriptor(i);

      if ( tDesc && tDesc->attrs() ) {

         tupp& tup = getTupp(i);

         // get the pointer to the composite row
         char* dataPtr = tup.getDataPointer();

         //cout << "dataPtr=" << dataPtr << endl;

         UInt32 attrs = tDesc->numAttrs();
         for (Int32 j=0; j<attrs; j++) {
             Attributes* attr = tDesc->getAttr(j);
             Int16 dt = attr->getDatatype();
             UInt32 len = attr->getLength();
             
             NABoolean isVarChar = attr->getVCIndicatorLength() > 0;

             char* realDataPtr = dataPtr;
             if ( isVarChar ) {  
                realDataPtr += attr->getVCIndicatorLength();
             } 

             sprintf(subtitle, "%dth field: ", j);
             print(subtitle, dt, realDataPtr, len);

             dataPtr = realDataPtr + len;
         }
      }
   }
   cout << endl;
}

void atp_struct::print(char* title, Int16 dt, char* ptr, UInt32 len)
{
   cout << title << "datatype=" << dt << ", len=" << len << ", data=\"";
   switch (dt) {
      case REC_DECIMAL_LSE: 
        cout << ptr ;
        //printBrief(ptr, len);
        break;

      case REC_BYTE_V_ASCII: 
        cout << ptr ;
        break;

      case REC_BYTE_F_ASCII: 
        {
           for (Int32 i=0; i<len; i++)
             cout << ptr[i];
        }
        break;

      default:
         cout << "unimplemented, skip for now";
        break;
   }
   cout << "\"" << endl;
}

