Exemplo n.º 1
0
void CRUTbl::BuildEmpCheckVector()
{
	// Verify that the vector is non-initialized
	RUASSERT(FALSE == pEmpCheckVector_->IsValid());

	// CRUEmpCheckTask is created only if there is
	// at least one incrementally refreshed MV.
	RUASSERT(FALSE == pIncInvolvedMVsUsingMe_->IsEmpty());

	TInt64 tblUid = GetUID();
	
	DSListPosition lpos = pIncInvolvedMVsUsingMe_->GetHeadPosition();
	while (NULL != lpos)
	{
		CRUMV *pMV = pIncInvolvedMVsUsingMe_->GetNext(lpos);	
		RUASSERT (TRUE == pMV->IsInvolved() 
				  && 
				  FALSE == pMV->WillBeRecomputed());

		// Register the epoch in the vector ...
		pEmpCheckVector_->AddEpochForCheck(pMV->GetEpoch(tblUid));
	}	

	pEmpCheckVector_->Build();
}
Exemplo n.º 2
0
BOOL CRUTbl::IsUsedOnlyByMultiTxnMvs() const
{
	if (TRUE == pIncInvolvedMVsUsingMe_->IsEmpty())
	{
		return FALSE;
	}

	DSListPosition pos = pIncInvolvedMVsUsingMe_->GetHeadPosition();
	while (NULL != pos)
	{
		CRUMV *pMV = pIncInvolvedMVsUsingMe_->GetNext(pos);
	
		RUASSERT(
			CDDObject::eON_REQUEST == pMV->GetRefreshType()
			&&
			TRUE == pMV->IsInvolved()
		);

		if (0 == pMV->GetCommitNRows())
		{
			return FALSE;
		}
	}

	return TRUE;
}
Exemplo n.º 3
0
void CRUTbl::BuildListOfIncrementalInvolvedMVsUsingMe()
{
	// Verify that the list is not initialized already
	RUASSERT(TRUE == pIncInvolvedMVsUsingMe_->IsEmpty());

	DSListPosition pos = pOnRequestInvolvedMVsUsingMe_->GetHeadPosition();
	while (NULL != pos)
	{
		CRUMV *pMV = pOnRequestInvolvedMVsUsingMe_->GetNext(pos);
		RUASSERT(CDDObject::eON_REQUEST == pMV->GetRefreshType()
				 &&
				 TRUE == pMV->IsInvolved()
		);

		if (TRUE == pMV->WillBeRecomputed()) 
		{	
			continue;
		}

		pIncInvolvedMVsUsingMe_->AddTail(pMV);

		CDDObject::EMVQueryType qt = pMV->GetQueryType();
		if (CDDObject::eMJV == qt
			||
			CDDObject::eOTHER == qt	// Is this MJV on single table?
			)
		{
			isUsedByIncrementalMJV_ = TRUE;
		}
	}
}
Exemplo n.º 4
0
//--------------------------------------------------------------------------//
//	CRUCache::FetchForceData()
//	
//--------------------------------------------------------------------------//
void CRUCache::FetchForceData()
{
	CRUForceOptionsParser forceParser;
	
	forceParser.SetFile(
		CRUGlobals::GetInstance()->GetOptions().GetForceFilename());

	forceParser.Parse();

	CRUForceOptions& forceOption = forceParser.GetForceOptions();

	// Place the force data on the involved mv's.
	CRUMVList &mvList = GetMVList();
	DSListPosition pos = mvList.GetHeadPosition();
	
	while (NULL != pos)
	{
		CRUMV *pMV = mvList.GetNext(pos);
		if (FALSE == pMV->IsInvolved())
		{
			continue;
		}

		UpdateForceOptionForMV(forceOption, pMV);
	}
}
Exemplo n.º 5
0
void CRUCache::FixupMVTblInterfaces()
{
	DSListPosition pos = mvList_.GetHeadPosition();
	
	while (NULL != pos)
	{
		CRUMV *pMV = mvList_.GetNext(pos);

		if (FALSE == pMV->IsInvolved())
		{
			continue;	// Skip the non-involved MVs
		}

		CRUTbl *pTbl = GetTable(pMV->GetUID());
		if (NULL == pTbl)
		{
			continue; // No table object in the cache, skip
		}

		// Setup pointers MV <---> table
		pMV->SetTblInterface(pTbl);

		pTbl->SetMVInterface(pMV);
	}
}
Exemplo n.º 6
0
void CRUCache::FetchNonInvolvedUsedObjectsMetadata()
{
	DSListPosition pos = mvList_.GetHeadPosition();

	while (NULL != pos)
	{
		CRUMV *pMV = mvList_.GetNext(pos);
		if (FALSE == pMV->IsInvolved()
			||
			CDDObject::eON_REQUEST != pMV->GetRefreshType())
		{
			continue;
		}

		if (NULL == GetTable(pMV->GetUID())) 
		{
			CDDSchema *pddSch = 
				GetDDSchemaByName(pMV->GetCatName(), pMV->GetSchName());

			CDDMV *pddMV = GetDDMVByName(pddSch, pMV->GetName());
			CRUTbl *pTbl = new CRUMVTbl(pddMV);
			
			pTbl->FetchMetadata();

			tableList_.AddTail(pTbl);
		}
	}
}
Exemplo n.º 7
0
BOOL CRUCache::IsOnRequestMVInvolved()
{
	DSListPosition pos = mvList_.GetHeadPosition();
	while (NULL != pos)
	{
		CRUMV *pMV = mvList_.GetNext(pos);

		if (TRUE == pMV->IsInvolved()
			&&
			CDDMV::eON_REQUEST == pMV->GetRefreshType()
			)
		{
			return TRUE;
		}
	}
	
	return FALSE;
}
Exemplo n.º 8
0
void CRUCache::FetchNonInvolvedMVsMetadata()
{
	DSListPosition tpos = tableList_.GetHeadPosition();
	while (NULL != tpos) 
	{
		CRUTbl *pTbl = tableList_.GetNext(tpos);
		
		// Retrieve the table's private dependency list
		CDDUIDTripleList &privTblList = pTbl->GetUIDsOfAllMVsUsingMe();
			
		DSListPosition mvpos = privTblList.GetHeadPosition();
		while (NULL != mvpos)
		{
			CDDUIDTriple &uidt = privTblList.GetNext(mvpos);

			CRUMV *pMV = GetMV(uidt.objUID); 
			if (NULL == pMV)
			{
				// The MV is non-involved, fetch the DD object
				CDDMV *pddMV = GetDDMVByUID(uidt);

				// If the MV is not ON REQUEST, skip it
				if (CDDObject::eON_REQUEST != pddMV->GetRefreshType())
				{
					continue;
				}

				pMV = FetchSingleNonInvolvedMV(pddMV);
			}

			if (FALSE == pMV->IsInvolved())
			{
				// If the MV is involved, the pointer exists already
				pTbl->AddRefToUsingMV(pMV);
			}
		}
	}	
}