blob: 189fdbe33e8f9aeb310b4fab34eabd4b5b440336 [file] [log] [blame]
/**********************************************************************
// @@@ 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 RELSEQUENCE_H
#define RELSEQUENCE_H
/* -*-C++-*-
******************************************************************************
*
* File: RelSequence.h
* Description: Class definitions for the classes RelSequence
* and PhysSequence
* Created: 6/17/97
* Language: C++
*
*
*
*
******************************************************************************
*/
#include "RelExpr.h"
// forward references
class Generator;
class MapTable;
class Attributes;
// Class RelSequence
// --------------------------------------------------------
// The RelSequence RelExpr is the logical RelExpr used to implement the
// "sequence by clause" and is introduced by the parser. The physical
// version of this node is the RelExpr class PhysSequence. The data
// members of this class are:
//
// ItemExpr *requiredOrderTree_ : An ItemExpr list of columns
// representing the reqired sort order for this node. A required sort
// order is specified withg th sort by clause.
//
// ValueIdList requiredOrder_ : The bound version of
// requiredOrderTree_.
//
// ValueIdSet sequenceFunctions_ : A set of all the sequence
// functions associated with this RelSequence node. They are gathered
// and assigned to the RelSequence node during binding.
//
class RelSequence : public RelExpr
{
public:
// The constructor
//
RelSequence(RelExpr *child = NULL,
ItemExpr *requiredOrder = NULL,
CollHeap *oHeap = CmpCommon::statementHeap());
RelSequence(RelExpr *child,
ItemExpr *partitionBy,
ItemExpr *orderBy,
CollHeap *oHeap = CmpCommon::statementHeap());
// The destructor
//
virtual ~RelSequence();
// RelSequence has one child.
//
virtual Int32 getArity() const {return 1;};
//++MV
void addRequiredOrderTree(ItemExpr *orderExpr);
// a virtual function for performing name binding within the query tree
//
RelExpr * bindNode(BindWA *bindWAPtr);
// Each operator supports a (virtual) method for transforming its
// scalar expressions to a canonical form
//
virtual void transformNode(NormWA & normWARef,
ExprGroupId & locationOfPointerToMe);
// a method used during subquery transformation for pulling up predicates
// towards the root of the transformed subquery tree
//
// RelSequence cannot pull up any preds. so redefine this method.
//
virtual void pullUpPreds();
// a method used for recomputing the outer references (external dataflow
// input values) that are still referenced by each operator in the
// subquery tree after the predicate pull up is complete.
//
virtual void recomputeOuterReferences();
// Each operator supports a (virtual) method for rewriting its
// value expressions.
//
virtual void rewriteNode(NormWA & normWARef);
// Each operator supports a (virtual) method for performing
// predicate pushdown and computing a "minimal" set of
// characteristic input and characteristic output values.
//
// The default implementation is adequate for RelSequence
// virtual RelExpr * normalizeNode(NormWA & normWARef);
// Method to push down predicates from a RelSequence node into the
// children
//
virtual
void pushdownCoveredExpr(const ValueIdSet & outputExprOnOperator,
const ValueIdSet & newExternalInputs,
ValueIdSet& predOnOperator,
const ValueIdSet * nonPredExprOnOperator = NULL,
Lng32 childId = (-MAX_REL_ARITY) );
// Return a the set of potential output values of this node.
// For RelSequence, this is the output of the child, plus all
// the values generated by RelSequence
//
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 and Explain)
//
virtual void addLocalExpr(LIST(ExprNode *) &xlist,
LIST(NAString) &llist) const;
// Compute a hash value for a chain of derived RelExpr nodes.
// Used by the Cascade engine as a quick way to determine if
// two nodes are identical.
// Can produce false positives, but should not produce false
// negatives.
//
virtual HashValue topHash();
// A more thorough method to compare two RelExpr nodes.
// Used by the Cascades engine.
//
virtual NABoolean duplicateMatch(const RelExpr & other) const;
// Copy a chain of derived nodes (Calls RelExpr::copyTopNode).
// Needs to copy all relevant fields.
// Used by the Cascades engine.
//
virtual RelExpr *copyTopNode(RelExpr *derivedNode = NULL,
CollHeap *outHeap = NULL);
// synthesize logical properties
//
virtual void synthLogProp(NormWA * normWAPtr = NULL);
virtual void synthEstLogProp(const EstLogPropSharedPtr& inputEstLogProp);
virtual Context* createContextForAChild(Context* myContext,
PlanWorkSpace* pws,
Lng32& childIndex);
// get a printable string that identifies the operator
//
virtual const NAString getText() const {return "Sequence";};
inline void setCancelExprTree(ItemExpr *expr)
{ cancelExprTree_ = expr; }
ValueIdList mapSortKey(const ValueIdList &sortKey) const;
// Accessor methods
inline const ValueIdList & requiredOrder() const { return requiredOrder_; }
inline const ValueIdList & partition() const { return partition_; }
inline const ValueIdSet & sequenceFunctions() const
{ return sequenceFunctions_; }
inline const ValueIdSet & returnSeqFunctions() const
{
return returnSeqFunctions_;
}
inline const ValueIdSet & movePartIdsExpr() const
{
return movePartIdsExpr_;
}
inline const ValueIdSet & sequencedColumns() const
{ return sequencedColumns_; }
inline void addSequencedColumn(ValueId col)
{ sequencedColumns_ += col; }
inline const ValueIdList & cancelExpr() const
{ return cancelExpr_; }
// Add unresolved sequence functions to the RelSequence operator
// found when binding the select list. Also, if OLAP, bind the
// partition by and order by clauses and add to RelSequence.
//
void addUnResolvedSeqFunctions(ValueIdSet &unresolvedSeqFuncs,
BindWA *bindWA);
inline void setRequiredOrder(const ValueIdList &reqOrder)
{ requiredOrder_ = reqOrder; }
inline void setPartition(const ValueIdList &partition)
{ partition_ = partition; }
ValueIdList getPartitionChange() { return partitionChange_ ;}
ItemExpr * getPartitionBy() { return partitionBy_;}
void setPartitionBy(ItemExpr * part) {partitionBy_ = part;}
inline void setSequenceFunctions(const ValueIdSet &seqFuncs)
{ sequenceFunctions_ = seqFuncs; }
inline void setSequencedColumns(const ValueIdSet &seqCols)
{ sequencedColumns_ = seqCols; }
inline void setCancelExpr(const ValueIdList &expr)
{ cancelExpr_ = expr; }
inline void setHasOlapFunctions(const NABoolean v)
{ hasOlapFunctions_ = v; }
inline const NABoolean getHasOlapFunctions() const
{ return hasOlapFunctions_; }
inline void setHasTDFunctions(const NABoolean v)
{ hasTDFunctions_ = v; }
inline const NABoolean getHasTDFunctions() const
{ return hasTDFunctions_; }
ItemExpr * getRequiredOrderTree() {return requiredOrderTree_;}
Lng32 getCachedNumHistoryRows()
{
return cachedNumHistoryRows_;
}
void setCachedNumHistoryRows( Lng32 v)
{
cachedNumHistoryRows_ = v;
}
NABoolean getCachedUnboundedFollowing()
{
return cachedUnboundedFollowing_;
}
void setCachedUnboundedFollowing( NABoolean v)
{
cachedUnboundedFollowing_ = v;
}
Lng32 getCachedMinFollowingRows()
{
return cachedMinFollowingRows_;
}
void setCachedMinFollowingRows( Lng32 v)
{
cachedMinFollowingRows_ = v;
}
Lng32 getCachedHistoryRowLength()
{
return cachedHistoryRowLength_;
}
void setCachedHistoryRowLength( Lng32 v)
{
cachedHistoryRowLength_ = v;
}
NABoolean getHistoryInfoCached()
{
return historyInfoCached_;
}
void setHistoryInfoCached( NABoolean v)
{
historyInfoCached_ = v;
}
protected:
inline ValueIdList & requiredOrder() { return requiredOrder_; }
inline ValueIdList & partition() { return partition_; }
inline ValueIdSet & sequenceFunctions() { return sequenceFunctions_; }
inline ValueIdSet & readSeqFunctions() { return sequenceFunctions_; }
inline ValueIdSet & returnSeqFunctions() { return returnSeqFunctions_; }
inline ValueIdSet & sequencedColumns() { return sequencedColumns_; }
inline ValueIdList & cancelExpr() { return cancelExpr_; }
void addCancelExpr(CollHeap *wHeap);
inline ValueIdSet & checkPartitionChangeExpr() { return checkPartitionChangeExpr_; }
inline ValueIdSet & movePartIdsExpr() { return movePartIdsExpr_; }
private:
// Return a pointer to the required order tree after
// setting it to NULL.
//
ItemExpr *removeRequiredOrderTree();
// An ItemExpr list of columns representing the reqired sort order
// for this node.
//
ItemExpr *requiredOrderTree_;
// The ItemExpr list of columns representing the partition by clause.
//
ItemExpr *partitionBy_;
// -- MV
// During execution, when the cancelExpr evaluates to TRUE, the Sequence
// node cancels the parent request.
ItemExpr *cancelExprTree_;
// The bound version of requiredOrderTree_.
//
ValueIdList requiredOrder_;
// The bound version of partitionByTree_
//
ValueIdList partition_;
ValueIdList partitionChange_;
// A set of all the sequence functions associated with this
// RelSequence node. They are gathered and assigned to the
// RelSequence node during binding.
//
ValueIdSet sequenceFunctions_;
ValueIdSet returnSeqFunctions_;
ValueIdSet sequencedColumns_;
// -- MV
ValueIdList cancelExpr_;
// flag that defines whether this RelSequence was created for TD functions
// or not
NABoolean hasTDFunctions_;
NABoolean hasOlapFunctions_;
ValueIdSet checkPartitionChangeExpr_;
ValueIdSet movePartIdsExpr_;
//cached parameters
NABoolean historyInfoCached_;
Lng32 cachedNumHistoryRows_;
NABoolean cachedUnboundedFollowing_;
Lng32 cachedMinFollowingRows_;
Lng32 cachedHistoryRowLength_;
}; // class RelSequence
// Class PhysSequence ----------------------------------------------------
// The PhysSequence node replaces the logical RelSequence node through the
// application of the PhysSequenceRule. This transformation is
// designed to present a purely physical verison of this operator
// that is both a logical and physical node. The PhysSequence node
// does not add any data members. It adds a few virtual methods.
// -----------------------------------------------------------------------
class PhysSequence : public RelSequence
{
public:
// The constructor
//
PhysSequence(RelExpr *child = NULL,
CollHeap *oHeap = CmpCommon::statementHeap())
: RelSequence(child, NULL, oHeap)
{
numHistoryRows_ = getDefault(DEF_MAX_HISTORY_ROWS);
minFixedHistoryRows_ = 0;
unboundedFollowing_ = FALSE;
minFollowingRows_ = 0;
};
// The destructor.
//
virtual ~PhysSequence();
// methods to do code generation of the physical node.
//
virtual RelExpr * preCodeGen(Generator * generator,
const ValueIdSet & externalInputs,
ValueIdSet &pulledNewInputs);
virtual short codeGen(Generator*);
// generate CONTROL QUERY SHAPE fragment for this node.
//
virtual short generateShape(CollHeap * space, char * buf, NAString * shapeStr = NULL);
// Copy a chain of derived nodes (Calls RelSequence::copyTopNode).
// Needs to copy all relevant fields (in this case no fields
// need to be copied)
// Used by the Cascades engine.
//
virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
CollHeap *outHeap = NULL);
// cost functions
//
virtual PhysicalProperty *synthPhysicalProperty(const Context *context,
const Lng32 planNumber,
PlanWorkSpace *pws);
virtual CostMethod* costMethod() const;
// The method gets redefined since Sequnece may be a BMO depending
// on its inputs.
virtual NABoolean isBigMemoryOperator(const Context* context,
const Lng32 planNumber);
virtual CostScalar getEstimatedRunTimeMemoryUsage(Generator *generator, NABoolean perNode, Lng32 *numStreams = NULL);
// Redefine these virtual methods to declare this node as a
// physical node.
//
virtual NABoolean isLogical() const {return FALSE;};
virtual NABoolean isPhysical() const {return TRUE;};
ExplainTuple *addSpecificExplainInfo(ExplainTupleMaster *explainTuple,
ComTdb * tdb,
Generator *generator);
// Helper function that traverses the set of root sequence functions
// supplied by the compiler and constructs the set of all of the
// attributes that must be materialized in the history row.
//
void getHistoryAttributes(const ValueIdSet &sequenceFunctions,
const ValueIdSet &outputFromChild,
ValueIdSet &historyAttributes,
NABoolean addConvNodes = FALSE,
CollHeap *wHeap = NULL,
ValueIdMap *origAttributes = NULL) const;
// Helper function to compute the attribute for the history buffer
// based on the items projected from the child and the computed
// history items. Also, adds the attribute information the the map
// table.
//
void computeHistoryAttributes(Generator *generator,
MapTable *localMapTable,
Attributes **attrs,
const ValueIdSet &historyIds) const;
// Helper function that traverses the set of root sequence functions
// supplied by the compiler and dynamically determines the size
// of the history buffer.
//
void computeHistoryRows(const ValueIdSet &sequenceFunctions,
Lng32 &computedHistoryRows,
Lng32 &unableToCalculate,
//long &minFixedHistoryRows,
NABoolean &unboundedFollowing, //&unlimitedHistoryRows,
Lng32 &minFollowingRows,
const ValueIdSet &outputFromChild);
// Return a READ-ONLY reference to the number of history rows to be
// allocated in the history buffer.
//
inline const Lng32 & numHistoryRows() const { return numHistoryRows_; }
// Set the number of history rows to be allowed in the history buffer.
void setNumHistoryRows(Lng32 numHistoryRows);
void setUnboundedFollowing(NABoolean v);
NABoolean getUnboundedFollowing() const ;
void setMinFollowingRows(Lng32 v);
// set the min following rows to max(v, minFollowingRows_);
void computeAndSetMinFollowingRows(Lng32 v);
Lng32 getMinFollowingRows() const ;
Lng32 getEstHistoryRowLength() const
{
return estHistoryRowLength_;
}
void setEstHistoryRowLength(Lng32 v)
{
estHistoryRowLength_ = v;
}
void updateEstHistoryRowLength(ValueIdSet &histIds,
ValueId newValId,
Lng32 &estimatedLength)
{
if (!histIds.contains(newValId))
{
estimatedLength += newValId.getType().getTotalSize();
histIds += newValId;
}
}
void seperateReadAndReturnItems(CollHeap *wHeap);
void computeReadNReturnItems(ValueId seqVid,
ValueId vid,
const ValueIdSet &outputFromChild,
CollHeap *wHeap);
void transformOlapFunctions(CollHeap *wHeap);
void computeHistoryParams( Lng32 histRecLength,
Lng32 &maxRowsInOLAPBuffer,
Lng32 &minNumberOfOLAPBuffers,
Lng32 &numberOfWinOLAPBuffers,
Lng32 &maxNumberOfOLAPBuffers,
Lng32 &olapBufferSize);
void retrieveCachedHistoryInfo(RelSequence * cacheRelSeq) ;
void estimateHistoryRowLength(const ValueIdSet &sequenceFunctions,
const ValueIdSet &outputFromChild,
ValueIdSet &histIds,
Lng32 &estimatedLength);
void addCheckPartitionChangeExpr( Generator *generator,
NABoolean addConvNodes = FALSE,
ValueIdMap *origAttributes = NULL);
private:
// The number of history rows to allocate for the history buffer.
// Is initialized to the value of the default REF_MAX_HISTORY_ROWS.
// Later it may be reduced if it can be determined that fewer rows
// can safely be used.
//
Lng32 numHistoryRows_;
// minimum number of rows that need to fit in the history buffer
// unbounded to Bounded and bounded to bounded cases
// if there is an unbounded following we still need to detremine the size for above cases
Lng32 minFixedHistoryRows_;
// do need to have unlimited size-- unbounded following cases
NABoolean unboundedFollowing_; //unlimitedHistoryRows_;
Lng32 minFollowingRows_;
//estimated history row length
Lng32 estHistoryRowLength_;
}; // class PhysSequence
#endif