blob: 5e5374984be36ef2ad3dbfc0f4f6ff22fef03d75 [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 ITEMEXPRLIST_H
#define ITEMEXPRLIST_H
/* -*-C++-*-
*****************************************************************************
*
* File: <file>
* Description:
*
*
* Created: //95
* Language: C++
*
*
*
*
*****************************************************************************
*/
#include "BaseTypes.h"
#include "Collections.h"
#include "NABasicObject.h"
// -----------------------------------------------------------------------
// forward declarations
// -----------------------------------------------------------------------
class ExprValueId;
class TableDesc;
enum ItemExprShapeEnum { LEFT_LINEAR_TREE,
RIGHT_LINEAR_TREE,
BUSHY_TREE
};
// -----------------------------------------------------------------------
// a list of item expressions (takes a tree of item exprs as constructor
// argument)
// -----------------------------------------------------------------------
class ItemExprList : public LIST(ItemExpr *)
{
public:
// Constructor
ItemExprList(CollHeap* h/*=0*/)
: LIST(ItemExpr *)(h), heap_(h) {}
// Constructor
ItemExprList(Lng32 numberOfElements, CollHeap* h)
: LIST(ItemExpr *)(h, numberOfElements), heap_(h) {}
ItemExprList(ItemExpr *tree, CollHeap* h,
OperatorTypeEnum backBoneType = ITM_ITEM_LIST,
NABoolean flattenSubqueries = TRUE,
NABoolean flattenUDFs = TRUE)
: LIST(ItemExpr *)(h), heap_(h)
{
insertTree(tree, backBoneType, flattenSubqueries, flattenUDFs);
}
// Insert an ItemExpr tree
void insertTree(ItemExpr *tree,
OperatorTypeEnum backBoneType = ITM_ITEM_LIST,
NABoolean flattenSubqueries = TRUE,
NABoolean flattenUDFs = TRUE);
void addMember(ItemExpr* x) { insert(x); };
// convert the list to an ItemExpr *. if there is more then one node in the
// list, the result will be an ItemList that can be either a
// LEFT_LINEAR_TREE or a RIGHT_LINEAR_TREE
// Note: does not support BUSHY_TREE.
ItemExpr *
convertToItemExpr(ItemExprShapeEnum treeShape = LEFT_LINEAR_TREE) const;
// create a comma separated string list in argument 'result'
virtual void unparse(NAString &result,
PhaseEnum phase = OPTIMIZER_PHASE,
UnparseFormatEnum form = USER_FORMAT,
TableDesc * tabId = NULL) const;
// ---------------------------------------------------------------------
// Print
// ---------------------------------------------------------------------
void display() const;
void print( FILE* ofd = stdout,
const char* indent = DEFAULT_INDENT,
const char* title = "ItemExprList") const;
private:
CollHeap * heap_;
}; // ItemExprList
// -----------------------------------------------------------------------
// Pseudo collection class to treat a tree as a list of items. The list
// is realized as a "backbone" of nodes with arity 2 (like AND, comma,
// join, union, ...) and the nodes hanging off the backbone (the elements
// of the list).
// -----------------------------------------------------------------------
class ItemExprTreeAsList : public NABasicObject
{
public:
// make a new object that allows viewing a given tree
// as a list
ItemExprTreeAsList(ExprValueId *treePtr,
OperatorTypeEnum op,
ItemExprShapeEnum shape = RIGHT_LINEAR_TREE);
// return number of entries
Lng32 entries() const;
// insert a new entry to bottom of list
void insert(ItemExpr *treeToInsert);
// insert a new entry to top of list
void insertAtTop(ItemExpr *treeToInsert);
// remove an element that is given by its value
ItemExpr * remove(ItemExpr *treeToRemove);
// check whether an element is in the tree
NABoolean contains(const ItemExpr *treeToCheck);
// index access
ItemExpr * operator [] (CollIndex i);
private:
ExprValueId *treePtr_;
OperatorTypeEnum operator_;
ItemExprShapeEnum shape_;
}; // ItemExprTreeAsList
#endif /* ITEMEXPRLIST_H */