//---------------------------------------------------------------------------- // Check if the query for this MAV is without a GROUP BY clause. // The RelExpr tree for a query with no GROUP BY clause, does not have // a GroupBy node in it. void MavRelRootBuilder::checkForMavWithoutGroupBy(RelExpr *mvSelectTree) { // Start from the top of the RelExpe tree. RelExpr *node = mvSelectTree; // Look for a GroupBy node. while (node->child(0) != NULL && node->getOperatorType() != REL_GROUPBY) node = node->child(0); if (node->getOperatorType() != REL_GROUPBY) isMavWithoutGroupBy_ = TRUE; else { // Check if the child of our child is another GroupBy node. // This can only be the result of multi-delta optimization on a // no-groupby MAV. if ( (node->child(0)->getOperatorType() == REL_ROOT) && (node->child(0)->child(0)->getOperatorType() == REL_GROUPBY) ) { // Found another GroupBy node below. // Now verify that the top one has no grouping columns. GroupByAgg *groupByNode = (GroupByAgg *)node; if (groupByNode->getGroupExprTree() == NULL) isMavWithoutGroupBy_ = TRUE; } } } // MavRelRootBuilder::checkForMavWithoutGroupBy()
short Join::generateShape(CollHeap * c, char * buf, NAString * shapeStr) { Space * space = (Space *)c; char mybuf[100]; switch (getOperatorType()) { case REL_NESTED_JOIN: case REL_LEFT_NESTED_JOIN: case REL_NESTED_SEMIJOIN: case REL_NESTED_ANTI_SEMIJOIN: case REL_NESTED_JOIN_FLOW: sprintf(mybuf, "nested_join("); break; case REL_MERGE_JOIN: case REL_LEFT_MERGE_JOIN: case REL_MERGE_SEMIJOIN: case REL_MERGE_ANTI_SEMIJOIN: sprintf(mybuf, "merge_join("); break; case REL_HASH_SEMIJOIN: case REL_HASH_ANTI_SEMIJOIN: sprintf(mybuf, "hash_join("); break; case REL_LEFT_HYBRID_HASH_JOIN: case REL_HYBRID_HASH_SEMIJOIN: case REL_HYBRID_HASH_ANTI_SEMIJOIN: case REL_FULL_HYBRID_HASH_JOIN: sprintf(mybuf, "hybrid_hash_join("); break; case REL_LEFT_ORDERED_HASH_JOIN: case REL_ORDERED_HASH_JOIN: case REL_ORDERED_HASH_SEMIJOIN: case REL_ORDERED_HASH_ANTI_SEMIJOIN: sprintf(mybuf, "ordered_hash_join("); break; case REL_HYBRID_HASH_JOIN: if (((HashJoin *)this)->isOrderedCrossProduct()) sprintf(mybuf, "ordered_cross_product("); else sprintf(mybuf, "hybrid_hash_join("); break; default: sprintf(mybuf, "add_to_Join::generateShape("); } outputBuffer(space, buf, mybuf, shapeStr); child(0)->generateShape(space, buf, shapeStr); sprintf(mybuf, ","); outputBuffer(space, buf, mybuf, shapeStr); child(1)->generateShape(space, buf, shapeStr); // is it IndexJoin? if both children are scans and number of base tables is // 1, it is index join if (getGroupAttr()->getNumBaseTables() == 1) { NABoolean child0isScan = FALSE; NABoolean child1isScan = FALSE; RelExpr *lChild = child(0)->castToRelExpr(); while (lChild->getArity() == 1) { lChild=lChild->child(0)->castToRelExpr(); } switch( lChild->castToRelExpr()->getOperatorType()) { case REL_SCAN: case REL_FILE_SCAN: case REL_HBASE_ACCESS: case REL_HDFS_SCAN: child0isScan = TRUE; } RelExpr *rChild = child(1)->castToRelExpr(); while (rChild->getArity() == 1) { rChild = rChild->child(0)->castToRelExpr(); } switch (rChild->castToRelExpr()->getOperatorType()) { case REL_SCAN: case REL_FILE_SCAN: case REL_HBASE_ACCESS: case REL_HDFS_SCAN: child1isScan = TRUE; } if (child0isScan && child1isScan) { sprintf(mybuf, ",INDEXJOIN)"); } else { sprintf(mybuf, ")"); } } else { sprintf(mybuf, ")"); } outputBuffer(space, buf, mybuf, shapeStr); return 0; }