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(); }
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; }
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; } } }
//--------------------------------------------------------------------------// // 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); } }
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); } }
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); } } }
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; }
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); } } } }