Impala
Impalaistheopensource,nativeanalyticdatabaseforApacheHadoop.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
impala::TopNNode Class Reference

#include <topn-node.h>

Inheritance diagram for impala::TopNNode:
Collaboration diagram for impala::TopNNode:

Public Member Functions

 TopNNode (ObjectPool *pool, const TPlanNode &tnode, const DescriptorTbl &descs)
 
virtual Status Init (const TPlanNode &tnode)
 
virtual Status Prepare (RuntimeState *state)
 
virtual Status Open (RuntimeState *state)
 
virtual Status GetNext (RuntimeState *state, RowBatch *row_batch, bool *eos)
 
virtual Status Reset (RuntimeState *state)
 
virtual void Close (RuntimeState *state)
 
void CollectNodes (TPlanNodeType::type node_type, std::vector< ExecNode * > *nodes)
 
void CollectScanNodes (std::vector< ExecNode * > *nodes)
 Collect all scan node types. More...
 
std::string DebugString () const
 Returns a string representation in DFS order of the plan rooted at this. More...
 
const std::vector< ExprContext * > & conjunct_ctxs () const
 
int id () const
 
TPlanNodeType::type type () const
 
const RowDescriptorrow_desc () const
 
int64_t rows_returned () const
 
int64_t limit () const
 
bool ReachedLimit ()
 
RuntimeProfileruntime_profile ()
 
MemTrackermem_tracker ()
 
MemTrackerexpr_mem_tracker ()
 

Static Public Member Functions

static Status CreateTree (ObjectPool *pool, const TPlan &plan, const DescriptorTbl &descs, ExecNode **root)
 
static void SetDebugOptions (int node_id, TExecNodePhase::type phase, TDebugAction::type action, ExecNode *tree)
 Set debug action for node with given id in 'tree'. More...
 
static bool EvalConjuncts (ExprContext *const *ctxs, int num_ctxs, TupleRow *row)
 
static llvm::Function * CodegenEvalConjuncts (RuntimeState *state, const std::vector< ExprContext * > &conjunct_ctxs, const char *name="EvalConjuncts")
 
static int GetNodeIdFromProfile (RuntimeProfile *p)
 Extract node id from p->name(). More...
 

Static Public Attributes

static const std::string ROW_THROUGHPUT_COUNTER = "RowsReturnedRate"
 Names of counters shared by all exec nodes. More...
 

Protected Member Functions

virtual void DebugString (int indentation_level, std::stringstream *out) const
 
ExecNodechild (int i)
 
bool is_closed ()
 
virtual bool IsScanNode () const
 
void InitRuntimeProfile (const std::string &name)
 
Status ExecDebugAction (TExecNodePhase::type phase, RuntimeState *state)
 
void AddRuntimeExecOption (const std::string &option)
 Appends option to 'runtime_exec_options_'. More...
 
virtual Status QueryMaintenance (RuntimeState *state)
 
void AddExprCtxToFree (ExprContext *ctx)
 
void AddExprCtxsToFree (const std::vector< ExprContext * > &ctxs)
 
void AddExprCtxsToFree (const SortExecExprs &sort_exec_exprs)
 

Static Protected Member Functions

static Status CreateNode (ObjectPool *pool, const TPlanNode &tnode, const DescriptorTbl &descs, ExecNode **node)
 Create a single exec node derived from thrift node; place exec node in 'pool'. More...
 
static Status CreateTreeHelper (ObjectPool *pool, const std::vector< TPlanNode > &tnodes, const DescriptorTbl &descs, ExecNode *parent, int *node_idx, ExecNode **root)
 

Protected Attributes

int id_
 
TPlanNodeType::type type_
 
ObjectPoolpool_
 
std::vector< ExprContext * > conjunct_ctxs_
 
std::vector< ExecNode * > children_
 
RowDescriptor row_descriptor_
 
TExecNodePhase::type debug_phase_
 
TDebugAction::type debug_action_
 
int64_t limit_
 
int64_t num_rows_returned_
 
boost::scoped_ptr< RuntimeProfileruntime_profile_
 
RuntimeProfile::Counterrows_returned_counter_
 
RuntimeProfile::Counterrows_returned_rate_
 
boost::scoped_ptr< MemTrackermem_tracker_
 Account for peak memory used by this node. More...
 
boost::scoped_ptr< MemTrackerexpr_mem_tracker_
 MemTracker that should be used for ExprContexts. More...
 
boost::mutex exec_options_lock_
 
std::string runtime_exec_options_
 

Private Member Functions

void InsertTupleRow (TupleRow *tuple_row)
 
void PrepareForOutput ()
 Flatten and reverse the priority queue. More...
 

Private Attributes

int64_t offset_
 Number of rows to skip. More...
 
int64_t num_rows_skipped_
 
SortExecExprs sort_exec_exprs_
 
std::vector< boolis_asc_order_
 
std::vector< boolnulls_first_
 
TupleDescriptormaterialized_tuple_desc_
 Cached descriptor for the materialized tuple. Assigned in Prepare(). More...
 
boost::scoped_ptr
< TupleRowComparator
tuple_row_less_than_
 
boost::scoped_ptr
< std::priority_queue< Tuple
*, std::vector< Tuple * >
, TupleRowComparator > > 
priority_queue_
 
std::vector< Tuple * > sorted_top_n_
 After computing the TopN in the priority_queue, pop them and put them in this vector. More...
 
std::vector< Tuple * >::iterator get_next_iter_
 
boost::scoped_ptr< MemPooltuple_pool_
 Stores everything referenced in priority_queue_. More...
 
Tupletmp_tuple_
 

Friends

class TupleLessThan
 

Detailed Description

Node for in-memory TopN (ORDER BY ... LIMIT) This handles the case where the result fits in memory. This node will materialize its input rows into a new tuple using the expressions in sort_tuple_slot_exprs_ in its sort_exec_exprs_ member. TopN is implemented by storing rows in a priority queue.

Definition at line 38 of file topn-node.h.

Constructor & Destructor Documentation

TopNNode::TopNNode ( ObjectPool pool,
const TPlanNode &  tnode,
const DescriptorTbl descs 
)

Definition at line 38 of file topn-node.cc.

Member Function Documentation

void impala::ExecNode::AddExprCtxsToFree ( const SortExecExprs sort_exec_exprs)
protectedinherited
void impala::ExecNode::AddExprCtxToFree ( ExprContext ctx)
inlineprotectedinherited

Add an ExprContext to have its local allocations freed by QueryMaintenance(). Exprs that are evaluated in the main execution thread should be added. Exprs evaluated in a separate thread are generally not safe to add, since a local allocation may be freed while it's being used. Rather than using this mechanism, threads should call FreeLocalAllocations() on local ExprContexts periodically.

Definition at line 276 of file exec-node.h.

References impala::ExecNode::expr_ctxs_to_free_.

Referenced by impala::AnalyticEvalNode::Prepare().

ExecNode* impala::ExecNode::child ( int  i)
inlineprotectedinherited

Definition at line 241 of file exec-node.h.

References impala::ExecNode::children_.

Referenced by impala::CrossJoinNode::BuildListDebugString(), impala::BlockingJoinNode::BuildSideThread(), impala::HashJoinNode::CodegenCreateOutputRow(), impala::PartitionedHashJoinNode::CodegenCreateOutputRow(), impala::CrossJoinNode::ConstructBuildSide(), impala::HashJoinNode::ConstructBuildSide(), impala::PartitionedHashJoinNode::ConstructBuildSide(), impala::BlockingJoinNode::GetLeftChildRowString(), impala::SelectNode::GetNext(), impala::UnionNode::GetNext(), impala::CrossJoinNode::GetNext(), impala::HashJoinNode::GetNext(), impala::AnalyticEvalNode::GetNextOutputBatch(), impala::PartitionedAggregationNode::Partition::InitStreams(), impala::HashJoinNode::LeftJoinGetNext(), impala::PartitionedHashJoinNode::NextProbeRowBatch(), impala::SelectNode::Open(), impala::SortNode::Open(), Open(), impala::BlockingJoinNode::Open(), impala::AggregationNode::Open(), impala::AnalyticEvalNode::Open(), impala::PartitionedAggregationNode::Open(), impala::UnionNode::OpenCurrentChild(), impala::SelectNode::Prepare(), impala::SortNode::Prepare(), impala::UnionNode::Prepare(), Prepare(), impala::BlockingJoinNode::Prepare(), impala::HashJoinNode::Prepare(), impala::AggregationNode::Prepare(), impala::AnalyticEvalNode::Prepare(), impala::PartitionedHashJoinNode::Prepare(), impala::PartitionedAggregationNode::Prepare(), impala::PartitionedHashJoinNode::ProcessBuildInput(), impala::AnalyticEvalNode::ProcessChildBatches(), and impala::SortNode::SortInput().

void TopNNode::Close ( RuntimeState state)
virtual

Close() will get called for every exec node, regardless of what else is called and the status of these calls (i.e. Prepare() may never have been called, or Prepare()/Open()/GetNext() returned with an error). Close() releases all resources that were allocated in Open()/GetNext(), even if the latter ended with an error. Close() can be called if the node has been prepared or the node is closed. The default implementation updates runtime profile counters and calls Close() on the children. Subclasses should check if the node has already been closed (is_closed()), then close themselves, then call the base Close(). Nodes that are using tuples returned by a child may call Close() on their children before their own Close() if the child node has returned eos. It is only safe to call Close() on the child node while the parent node is still returning rows if the parent node fully materializes the child's input.

Reimplemented from impala::ExecNode.

Definition at line 136 of file topn-node.cc.

References impala::SortExecExprs::Close(), impala::ExecNode::Close(), impala::ExecNode::is_closed(), sort_exec_exprs_, and tuple_pool_.

void impala::ExecNode::CollectNodes ( TPlanNodeType::type  node_type,
std::vector< ExecNode * > *  nodes 
)
inherited

Collect all nodes of given 'node_type' that are part of this subtree, and return in 'nodes'.

Definition at line 359 of file exec-node.cc.

References impala::ExecNode::children_, and impala::ExecNode::type_.

Referenced by impala::ExecNode::CollectScanNodes(), and impala::PlanFragmentExecutor::Prepare().

void impala::ExecNode::CollectScanNodes ( std::vector< ExecNode * > *  nodes)
inherited

Collect all scan node types.

Definition at line 366 of file exec-node.cc.

References impala::ExecNode::CollectNodes().

Referenced by impala::PlanFragmentExecutor::Prepare().

Status impala::ExecNode::CreateNode ( ObjectPool pool,
const TPlanNode &  tnode,
const DescriptorTbl descs,
ExecNode **  node 
)
staticprotectedinherited

Create a single exec node derived from thrift node; place exec node in 'pool'.

Definition at line 260 of file exec-node.cc.

References impala::ObjectPool::Add(), impala::Status::OK, and RETURN_IF_ERROR.

Referenced by impala::ExecNode::CreateTreeHelper().

Status impala::ExecNode::CreateTree ( ObjectPool pool,
const TPlan &  plan,
const DescriptorTbl descs,
ExecNode **  root 
)
staticinherited

Creates exec node tree from list of nodes contained in plan via depth-first traversal. All nodes are placed in pool. Returns error if 'plan' is corrupted, otherwise success.

Definition at line 199 of file exec-node.cc.

References impala::ExecNode::CreateTreeHelper(), impala::Status::OK, and impala::Status::ok().

Referenced by impala::PlanFragmentExecutor::Prepare().

Status impala::ExecNode::CreateTreeHelper ( ObjectPool pool,
const std::vector< TPlanNode > &  tnodes,
const DescriptorTbl descs,
ExecNode parent,
int *  node_idx,
ExecNode **  root 
)
staticprotectedinherited
void TopNNode::DebugString ( int  indentation_level,
std::stringstream *  out 
) const
protectedvirtual

Recursive helper method for generating a string for DebugString(). Implementations should call DebugString(int, std::stringstream) on their children. Input parameters: indentation_level: Current level in plan tree. Output parameters: out: Stream to accumulate debug string.

Reimplemented from impala::ExecNode.

Definition at line 184 of file topn-node.cc.

References impala::ExecNode::DebugString(), impala::Expr::DebugString(), is_asc_order_, impala::SortExecExprs::lhs_ordering_expr_ctxs(), nulls_first_, and sort_exec_exprs_.

Status TopNNode::GetNext ( RuntimeState state,
RowBatch row_batch,
bool eos 
)
virtual

Retrieves rows and returns them via row_batch. Sets eos to true if subsequent calls will not retrieve any more rows. Data referenced by any tuples returned in row_batch must not be overwritten by the callee until Close() is called. The memory holding that data can be returned via row_batch's tuple_data_pool (in which case it may be deleted by the caller) or held on to by the callee. The row_batch, including its tuple_data_pool, will be destroyed by the caller at some point prior to the final Close() call. In other words, if the memory holding the tuple data will be referenced by the callee in subsequent GetNext() calls, it must not be attached to the row_batch's tuple_data_pool. Caller must not be holding any io buffers. This will cause deadlock. TODO: AggregationNode and HashJoinNode cannot be "re-opened" yet.

Implements impala::ExecNode.

Definition at line 106 of file topn-node.cc.

References impala::RowBatch::AddRow(), impala::RowBatch::AtCapacity(), impala::RowBatch::CommitLastRow(), impala::RowBatch::CopyRow(), COUNTER_SET, impala::ExecNode::ExecDebugAction(), get_next_iter_, impala::RowBatch::GetRow(), impala::ExecNode::num_rows_returned_, num_rows_skipped_, offset_, impala::Status::OK, impala::ExecNode::QueryMaintenance(), RETURN_IF_CANCELLED, RETURN_IF_ERROR, impala::ExecNode::rows_returned_counter_, impala::ExecNode::runtime_profile_, SCOPED_TIMER, and sorted_top_n_.

Referenced by Open().

int impala::ExecNode::GetNodeIdFromProfile ( RuntimeProfile p)
staticinherited

Extract node id from p->name().

Definition at line 62 of file exec-node.cc.

References impala::RuntimeProfile::metadata().

Status TopNNode::Init ( const TPlanNode &  tnode)
virtual

Initializes this object from the thrift tnode desc. The subclass should do any initialization that can fail in Init() rather than the ctor. If overridden in subclass, must first call superclass's Init().

Reimplemented from impala::ExecNode.

Definition at line 44 of file topn-node.cc.

References impala::ExecNode::conjunct_ctxs_, impala::SortExecExprs::Init(), impala::ExecNode::Init(), is_asc_order_, nulls_first_, impala::Status::OK, impala::ExecNode::pool_, RETURN_IF_ERROR, and sort_exec_exprs_.

void impala::ExecNode::InitRuntimeProfile ( const std::string &  name)
protectedinherited
void TopNNode::InsertTupleRow ( TupleRow tuple_row)
private

Inserts a tuple row into the priority queue if it's in the TopN. Creates a deep copy of tuple_row, which it stores in tuple_pool_.

Definition at line 144 of file topn-node.cc.

References impala::TupleDescriptor::byte_size(), impala::Tuple::DeepCopy(), impala::ExecNode::limit_, materialized_tuple_desc_, impala::Tuple::MaterializeExprs(), offset_, priority_queue_, sort_exec_exprs_, impala::SortExecExprs::sort_tuple_slot_expr_ctxs(), tmp_tuple_, tuple_pool_, and tuple_row_less_than_.

Referenced by Open().

virtual bool impala::ExecNode::IsScanNode ( ) const
inlineprotectedvirtualinherited

Reimplemented in impala::ScanNode.

Definition at line 251 of file exec-node.h.

int64_t impala::ExecNode::limit ( ) const
inlineinherited
Status TopNNode::Prepare ( RuntimeState state)
virtual

Sets up internal structures, etc., without doing any actual work. Must be called prior to Open(). Will only be called once in this node's lifetime. All code generation (adding functions to the LlvmCodeGen object) must happen in Prepare(). Retrieving the jit compiled function pointer must happen in Open(). If overridden in subclass, must first call superclass's Prepare().

Reimplemented from impala::ExecNode.

Definition at line 56 of file topn-node.cc.

References impala::ExecNode::AddExprCtxsToFree(), impala::TupleDescriptor::byte_size(), impala::ExecNode::child(), impala::ExecNode::expr_mem_tracker(), materialized_tuple_desc_, impala::ExecNode::mem_tracker(), impala::Status::OK, impala::SortExecExprs::Prepare(), impala::ExecNode::Prepare(), RETURN_IF_ERROR, impala::ExecNode::row_desc(), impala::ExecNode::row_descriptor_, impala::ExecNode::runtime_profile_, SCOPED_TIMER, sort_exec_exprs_, tmp_tuple_, impala::RowDescriptor::tuple_descriptors(), and tuple_pool_.

void TopNNode::PrepareForOutput ( )
private

Flatten and reverse the priority queue.

Definition at line 170 of file topn-node.cc.

References get_next_iter_, priority_queue_, and sorted_top_n_.

Referenced by Open().

Status impala::ExecNode::QueryMaintenance ( RuntimeState state)
protectedvirtualinherited
Status TopNNode::Reset ( RuntimeState state)
virtual

Resets all data-specific state, returning this node to the state it was in after calling Prepare() and before calling Open(). Prepare() must have already been called before calling Reset(). Open() and GetNext() may have optionally been called. Close() must not have been called. If overridden in a subclass, must call superclass's Reset() at the end. The default implementation calls Reset() on children. Note that this function may be called many times, so should be fast. For example, accumulated memory does not need to be freed on every call if it's expensive.

Reimplemented from impala::ExecNode.

Definition at line 131 of file topn-node.cc.

void impala::ExecNode::SetDebugOptions ( int  node_id,
TExecNodePhase::type  phase,
TDebugAction::type  action,
ExecNode tree 
)
staticinherited

Set debug action for node with given id in 'tree'.

Definition at line 332 of file exec-node.cc.

References impala::ExecNode::children_, impala::ExecNode::debug_action_, impala::ExecNode::debug_phase_, and impala::ExecNode::id_.

Referenced by impala::PlanFragmentExecutor::Prepare().

TPlanNodeType::type impala::ExecNode::type ( ) const
inlineinherited

Friends And Related Function Documentation

friend class TupleLessThan
friend

Definition at line 54 of file topn-node.h.

Member Data Documentation

TDebugAction::type impala::ExecNode::debug_action_
protectedinherited
TExecNodePhase::type impala::ExecNode::debug_phase_
protectedinherited

debug-only: if debug_action_ is not INVALID, node will perform action in debug_phase_

Definition at line 219 of file exec-node.h.

Referenced by impala::ExecNode::ExecDebugAction(), and impala::ExecNode::SetDebugOptions().

boost::mutex impala::ExecNode::exec_options_lock_
protectedinherited

Execution options that are determined at runtime. This is added to the runtime profile at Close(). Examples for options logged here would be "Codegen Enabled"

Definition at line 238 of file exec-node.h.

Referenced by impala::ExecNode::AddRuntimeExecOption().

boost::scoped_ptr<MemTracker> impala::ExecNode::expr_mem_tracker_
protectedinherited

MemTracker that should be used for ExprContexts.

Definition at line 233 of file exec-node.h.

Referenced by impala::ExecNode::expr_mem_tracker(), and impala::ExecNode::Prepare().

std::vector<Tuple*>::iterator impala::TopNNode::get_next_iter_
private

Definition at line 87 of file topn-node.h.

Referenced by GetNext(), and PrepareForOutput().

std::vector<bool> impala::TopNNode::is_asc_order_
private

Definition at line 70 of file topn-node.h.

Referenced by DebugString(), Init(), and Open().

TupleDescriptor* impala::TopNNode::materialized_tuple_desc_
private

Cached descriptor for the materialized tuple. Assigned in Prepare().

Definition at line 73 of file topn-node.h.

Referenced by InsertTupleRow(), and Prepare().

boost::scoped_ptr<MemTracker> impala::ExecNode::mem_tracker_
protectedinherited

Account for peak memory used by this node.

Definition at line 230 of file exec-node.h.

Referenced by impala::ExecNode::mem_tracker(), and impala::ExecNode::Prepare().

std::vector<bool> impala::TopNNode::nulls_first_
private

Definition at line 71 of file topn-node.h.

Referenced by DebugString(), Init(), and Open().

int64_t impala::TopNNode::num_rows_skipped_
private

Definition at line 65 of file topn-node.h.

Referenced by GetNext().

int64_t impala::TopNNode::offset_
private

Number of rows to skip.

Definition at line 64 of file topn-node.h.

Referenced by GetNext(), InsertTupleRow(), and Open().

boost::scoped_ptr< std::priority_queue<Tuple*, std::vector<Tuple*>, TupleRowComparator> > impala::TopNNode::priority_queue_
private

The priority queue will never have more elements in it than the LIMIT + OFFSET. The stl priority queue doesn't support a max size, so to get that functionality, the order of the queue is the opposite of what the ORDER BY clause specifies, such that the top of the queue is the last sorted element.

Definition at line 83 of file topn-node.h.

Referenced by InsertTupleRow(), Open(), and PrepareForOutput().

RowDescriptor impala::ExecNode::row_descriptor_
protectedinherited
const string impala::ExecNode::ROW_THROUGHPUT_COUNTER = "RowsReturnedRate"
staticinherited

Names of counters shared by all exec nodes.

Definition at line 169 of file exec-node.h.

Referenced by impala::ExecNode::Prepare().

RuntimeProfile::Counter* impala::ExecNode::rows_returned_rate_
protectedinherited

Definition at line 227 of file exec-node.h.

Referenced by impala::ExecNode::Prepare().

std::string impala::ExecNode::runtime_exec_options_
protectedinherited

Definition at line 239 of file exec-node.h.

Referenced by impala::ExecNode::AddRuntimeExecOption().

SortExecExprs impala::TopNNode::sort_exec_exprs_
private

sort_exec_exprs_ contains the ordering expressions used for tuple comparison and the materialization exprs for the output tuple.

Definition at line 69 of file topn-node.h.

Referenced by Close(), DebugString(), Init(), InsertTupleRow(), Open(), and Prepare().

std::vector<Tuple*> impala::TopNNode::sorted_top_n_
private

After computing the TopN in the priority_queue, pop them and put them in this vector.

Definition at line 86 of file topn-node.h.

Referenced by GetNext(), and PrepareForOutput().

Tuple* impala::TopNNode::tmp_tuple_
private

Tuple allocated once from tuple_pool_ and reused in InsertTupleRow to materialize input tuples if necessary. After materialization, tmp_tuple_ may be copied into the the tuple pool and inserted into the priority queue.

Definition at line 94 of file topn-node.h.

Referenced by InsertTupleRow(), and Prepare().

boost::scoped_ptr<MemPool> impala::TopNNode::tuple_pool_
private

Stores everything referenced in priority_queue_.

Definition at line 90 of file topn-node.h.

Referenced by Close(), InsertTupleRow(), and Prepare().

boost::scoped_ptr<TupleRowComparator> impala::TopNNode::tuple_row_less_than_
private

Definition at line 75 of file topn-node.h.

Referenced by InsertTupleRow(), and Open().

TPlanNodeType::type impala::ExecNode::type_
protectedinherited

Definition at line 210 of file exec-node.h.

Referenced by impala::ExecNode::CollectNodes(), and impala::ExecNode::type().


The documentation for this class was generated from the following files: