//----------------------------------------------------------------------------
// 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()
Example #2
0
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;
}