/* -*-C++-*-
****************************************************************************
*
* File:         ExplainTupleMaster.h
* Description:  
*
* Created:      5/6/98
* Language:     C++
*
*
// @@@ 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 EX_EXPLAINTUPLEM_H
#define EX_EXPLAINTUPLEM_H

#include "ExpSqlTupp.h"
#include "Int64.h"
#include "ExplainTuple.h"

class Cost;

class ExplainTupleMaster : public ExplainTuple
{
public:
  inline ExplainTupleMaster(ExplainTuple *leftChild,
			    ExplainTuple *rightChild,
			    ExplainDesc *explainDesc);
  ~ExplainTupleMaster(){};
  
  Int32 init(Space *space, NABoolean doExplainSpaceOpt);
  void setPlanId(Int64 planId);
  void setOperator(const char * op);
  void setTableName(const char *tabName);
  void setCardinality(double card);
  void setOperatorCost(double opCost);
  void setTotalCost(double totCost);
  void setDetailCost(char *detail);
  void setDescription(const char *desc);

private:

};

inline 
ExplainTupleMaster::ExplainTupleMaster(ExplainTuple *leftChild,
                                       ExplainTuple *rightChild,
                                       ExplainDesc *explainDesc)
: ExplainTuple(leftChild, rightChild, explainDesc)
{
};

#endif



