void CRURefreshTaskExecutor::ComposeControlTableStmtForUsedTable(CRUTbl &tbl,
																 Int32 &stmtIndex,
																 CRUForceOptions::MdamOptions mdamOpt)
{
   	CRURefreshSQLComposer myComposer(GetRefreshTask());
	

	if (CRUForceOptions::MDAM_NO_FORCE == mdamOpt)
	{
		CRUTableForceOptions *forceOpt = GetForceOptionForTable(tbl.GetFullName());
		
		if (NULL == forceOpt)
		{
			mdamOpt = GetDefaultMdamOptForTable(tbl);
		}
		else
		{
			mdamOpt = forceOpt->GetMdamOptions();
		}
	}

	if (CRUForceOptions::MDAM_NO_FORCE != mdamOpt)
	{
		// Compose CONTROL TABLE table_name MDAM option
		myComposer.ComposeCntrlTableMDAMText(mdamOpt, &(tbl.GetFullName()));
		pRefreshTEDynamicContainer_->SetStatementText
#pragma nowarn(1506)   // warning elimination 
			(stmtIndex++, myComposer.GetSQL());
#pragma warn(1506)  // warning elimination 
		
		forceFlags_ |= FORCE_TABLE_MDAM;
	}

}
//--------------------------------------------------------------------------//
//	CRURefreshTaskExecutor::ComposeMDAMStatements()
//
//--------------------------------------------------------------------------//
void CRURefreshTaskExecutor::ComposeMDAMStatements()
{
	BOOL hasActiveCQS = FALSE;
	
	CRURefreshSQLComposer myComposer(GetRefreshTask());
	
	CRUMV &rootMV = GetRefreshTask()->GetRootMV();
	const CRUMVForceOptions* pForceOption = rootMV.GetMVForceOption();

	// Even if there are no force options, we still force mdam for tables
	// with more than two columns.
	ComposeControlTableStmtForUsedTables();

	// MV base tables force options
	// LCOV_EXCL_START :rfi
	if (NULL != pForceOption &&
		CRUForceOptions::MDAM_NO_FORCE != pForceOption->GetMDAMoption())
	{
		// Compose CONTROL TABLE mv_name MDAM option
		myComposer.ComposeCntrlTableMDAMText(pForceOption->GetMDAMoption(), 
											 &rootMV.GetFullName());
		pRefreshTEDynamicContainer_->SetStatementText(MV_MDAM_STAT, myComposer.GetSQL());
					
		forceFlags_ |= FORCE_MV_MDAM;
	}

	// Compose reset MDAMs
	if (forceFlags_ & FORCE_MV_MDAM || 	forceFlags_ & FORCE_TABLE_MDAM)
	{
		// Compose CONTROL TABLE * MDAM 'RESET'
		myComposer.ComposeResetCntrlTableMDAMText();
		pRefreshTEDynamicContainer_->SetStatementText(RESET_MDAM_STAT, myComposer.GetSQL());
	}
	// LCOV_EXCL_STOP
}
void CRULogCleanupTaskExecutor::ComposeMySql()
{
	CRULogCleanupSQLComposer myComposer(GetLogCleanupTask());

	myComposer.ComposeIUDLogCleanup(CLEAN_IUD_BASIC);
	logCleanupTEDynamicContainer_.
		SetStatementText(CLEAN_IUD_BASIC, myComposer.GetSQL());

	myComposer.ComposeIUDLogCleanup(CLEAN_IUD_FIRSTN);
	logCleanupTEDynamicContainer_.
		SetStatementText(CLEAN_IUD_FIRSTN, myComposer.GetSQL());

	myComposer.ComposeIUDLogCleanup(CLEAN_IUD_MCOMMIT);
	logCleanupTEDynamicContainer_.
		SetStatementText(CLEAN_IUD_MCOMMIT, myComposer.GetSQL());

	if (TRUE == hasRangeLog_)
	{
		myComposer.ComposeRangeLogCleanup();

		logCleanupTEDynamicContainer_.
			SetStatementText(CLEAN_RANGE,myComposer.GetSQL());
	}

	myComposer.composeGetRowCount();
	logCleanupTEDynamicContainer_.
		SetStatementText(CLEAN_ROWCOUNT, myComposer.GetSQL());
}
void CRUUnAuditRefreshTaskExecutor::ComposeMySql()
{
	CRURefreshTask *pTask = GetRefreshTask();
	CRUMV &mv = pTask->GetRootMV();

	CRUSimpleRefreshSQLComposer myComposer(pTask);

	// UNLOCK TABLE statement
	myComposer.ComposeUnLock(GetRootMVName());
	
	unAuditRefreshTEDynamicContainer_.SetStatementText
				(RU_UNLOCK_TABLE, myComposer.GetSQL());

	// POPINDEX CatApi request
	if (TRUE == isPopindex_)
	{
		numOfIndexes_ = mv.GetIndexList().GetCount();
		
		if (0 < numOfIndexes_)
		{
			ComposeIndexesSql();
		}
	}

	// Compose the LOCK TABLE sql statements for locking all tables 
	// in the on statement MV initialization 
	if (CDDObject::eON_STATEMENT == GetRootMVType())
	{	
		CRUTblList &tblList = mv.GetTablesUsedByMe();
		
		DSListPosition pos = tblList.GetHeadPosition();
		
		pLockTablesTEDynamicContainer_ = 
			new CRUSQLDynamicStatementContainer((short)tblList.GetCount());
		
		Int32 i=0;
		
		while (NULL != pos)
		{
			CRUTbl *pTbl = tblList.GetNext(pos);
			myComposer.ComposeLock(pTbl->GetFullName(), FALSE /*shared*/);
			pLockTablesTEDynamicContainer_->SetStatementText
#pragma nowarn(1506)   // warning elimination 
				(i,myComposer.GetSQL());
#pragma warn(1506)  // warning elimination 
			i++;
		}
	}
}
void CRURefreshTaskExecutor::ComposeMySql()
{
	CRURefreshSQLComposer myComposer(GetRefreshTask());

	CRUMV &rootMV = GetRefreshTask()->GetRootMV();

	numOfStmtInContainer_ = rootMV.GetTablesUsedByMe().GetCount() + FIRST_TBL_STAT;

	pRefreshTEDynamicContainer_ = 
#pragma nowarn(1506)   // warning elimination 
		new CRUSQLDynamicStatementContainer(numOfStmtInContainer_);
#pragma warn(1506)  // warning elimination 

	ComposeForceStatements();
}
void CRUAuditRefreshTaskExecutor::ComposeMySql()
{
	CRUSimpleRefreshSQLComposer myComposer(GetRefreshTask());
	CRUMV &rootMV = GetRootMV();        	

	if (TRUE == isDeleteMultiTxnContext_)
	{
		myComposer.ComposeDeleteContextLogTable();

		auditRefreshTEDynamicContainer_.SetStatementText
			(DELETE_MULT_TXN_CTX_TBL,myComposer.GetSQL());
	}

        // POPINDEX CatApi request
	if (TRUE == isPopindex_)
	{
		numOfIndexes_ = rootMV.GetIndexList().GetCount();
		              
		if (0 < numOfIndexes_)
		{
			ComposeIndexesSql();
		}
	}

	// Compose the LOCK TABLE sql statements for locking all tables 
	// in the on statement MV initialization 
	if (CDDObject::eON_STATEMENT == GetRootMVType())
	{	
		CRUTblList &tblList = rootMV.GetTablesUsedByMe();
		
		DSListPosition pos = tblList.GetHeadPosition();
		
		pLockTablesTEDynamicContainer_ = 
			new CRUSQLDynamicStatementContainer((short)tblList.GetCount());
		
		Int32 i=0;
		
		while (NULL != pos)
		{
			CRUTbl *pTbl = tblList.GetNext(pos);
			myComposer.ComposeLock(pTbl->GetFullName(), FALSE /*shared*/);
			pLockTablesTEDynamicContainer_->SetStatementText
				(i,myComposer.GetSQL());
			i++;
		}
	}
}
//--------------------------------------------------------------------------//
//	CRURefreshTaskExecutor::ComposeCQSStatements()
//
//--------------------------------------------------------------------------//
void CRURefreshTaskExecutor::ComposeCQSStatements()
{
	BOOL hasActiveCQS = FALSE;
	
	CRURefreshSQLComposer myComposer(GetRefreshTask());
	
	CRUMV &rootMV = GetRefreshTask()->GetRootMV();
	const CRUMVForceOptions* pForceOption = rootMV.GetMVForceOption();

	if (NULL == pForceOption)
	{
		return;
	}

	// MV force options
	// LCOV_EXCL_START :rfi
	if ((CRUForceOptions::GB_NO_FORCE != pForceOption->GetGroupByoption() ||
	    CRUForceOptions::JOIN_NO_FORCE !=   pForceOption->GetJoinoption()))
	{
		// Compose Control query shape for internal refresh stmt
		myComposer.ComposeControlQueryShape();
		pRefreshTEDynamicContainer_->SetStatementText(CQS_STAT, myComposer.GetSQL());
		forceFlags_ = forceFlags_ | FORCE_CQS;
		hasActiveCQS = TRUE;
	}

	// Deal with a specific user CQS
	if (FALSE == pForceOption->GetCQSStatment().IsEmpty())
	{
		pRefreshTEDynamicContainer_->SetStatementText
			(USER_CQS_FORCE, pForceOption->GetCQSStatment());
		forceFlags_ = forceFlags_ | FORCE_USER_CQS;
		hasActiveCQS = TRUE;
	}

	if (TRUE == hasActiveCQS)
	{
		myComposer.ComposeControlQueryShapeCut();
		pRefreshTEDynamicContainer_->SetStatementText(CQS_CUT_STAT, myComposer.GetSQL());
	}
	// LCOV_EXCL_STOP
}
void CRURefreshTaskExecutor::ComposeForceStatements()
{
	CRUMV &rootMV = GetRefreshTask()->GetRootMV();
	const CRUMVForceOptions* pForceOption = rootMV.GetMVForceOption();
	CRURefreshSQLComposer myComposer(GetRefreshTask());

	// Deal with explain data
	// LCOV_EXCL_START :rfi
	if (NULL != pForceOption &&
		CRUForceOptions::EXPLAIN_ON == pForceOption->GetExplainOption())
	{
		forceFlags_ = forceFlags_ | FORCE_SHOW_EXPLAIN; 
		myComposer.ComposeShowExplain();
		pRefreshTEDynamicContainer_->SetStatementText(SHOW_EXPLAIN, myComposer.GetSQL());
	}
	// LCOV_EXCL_STOP

	ComposeCQSStatements();
	
	ComposeMDAMStatements();
}