//--------------------------------------------------------------------------- // @function: // CBitSetTest::EresUnittest_SetOps // // @doc: // Test for set operations // //--------------------------------------------------------------------------- GPOS_RESULT CBitSetTest::EresUnittest_SetOps() { // create memory pool CAutoMemoryPool amp; IMemoryPool *pmp = amp.Pmp(); ULONG cSizeBits = 32; ULONG cInserts = 10; CBitSet *pbs1 = GPOS_NEW(pmp) CBitSet(pmp, cSizeBits); for (ULONG i = 0; i < cInserts; i += 2) { pbs1->FExchangeSet(i * cSizeBits); } CBitSet *pbs2 = GPOS_NEW(pmp) CBitSet(pmp, cSizeBits); for (ULONG i = 1; i < cInserts; i += 2) { pbs2->FExchangeSet(i * cSizeBits); } CBitSet *pbs = GPOS_NEW(pmp) CBitSet(pmp, cSizeBits); pbs->Union(pbs1); GPOS_ASSERT(pbs->FEqual(pbs1)); pbs->Intersection(pbs1); GPOS_ASSERT(pbs->FEqual(pbs1)); GPOS_ASSERT(pbs->FEqual(pbs)); GPOS_ASSERT(pbs1->FEqual(pbs1)); pbs->Union(pbs2); GPOS_ASSERT(!pbs->FEqual(pbs1) && !pbs->FEqual(pbs2)); GPOS_ASSERT(pbs->FSubset(pbs1) && pbs->FSubset(pbs2)); pbs->Difference(pbs2); GPOS_ASSERT(pbs->FEqual(pbs1)); pbs1->Release(); pbs->Union(pbs2); pbs->Intersection(pbs2); GPOS_ASSERT(pbs->FEqual(pbs2)); GPOS_ASSERT(pbs->FSubset(pbs2)); GPOS_ASSERT(pbs->CElements() == pbs2->CElements()); pbs2->Release(); pbs->Release(); return GPOS_OK; }
//--------------------------------------------------------------------------- // @function: // CJoinOrderDP::PexprBuildPred // // @doc: // Build predicate connecting the two given sets // //--------------------------------------------------------------------------- CExpression * CJoinOrderDP::PexprBuildPred ( CBitSet *pbsFst, CBitSet *pbsSnd ) { // collect edges connecting the given sets CBitSet *pbsEdges = GPOS_NEW(m_mp) CBitSet(m_mp); CBitSet *pbs = GPOS_NEW(m_mp) CBitSet(m_mp, *pbsFst); pbs->Union(pbsSnd); for (ULONG ul = 0; ul < m_ulEdges; ul++) { SEdge *pedge = m_rgpedge[ul]; if ( pbs->ContainsAll(pedge->m_pbs) && !pbsFst->IsDisjoint(pedge->m_pbs) && !pbsSnd->IsDisjoint(pedge->m_pbs) ) { #ifdef GPOS_DEBUG BOOL fSet = #endif // GPOS_DEBUG pbsEdges->ExchangeSet(ul); GPOS_ASSERT(!fSet); } } pbs->Release(); CExpression *pexprPred = NULL; if (0 < pbsEdges->Size()) { CExpressionArray *pdrgpexpr = GPOS_NEW(m_mp) CExpressionArray(m_mp); CBitSetIter bsi(*pbsEdges); while (bsi.Advance()) { ULONG ul = bsi.Bit(); SEdge *pedge = m_rgpedge[ul]; pedge->m_pexpr->AddRef(); pdrgpexpr->Append(pedge->m_pexpr); } pexprPred = CPredicateUtils::PexprConjunction(m_mp, pdrgpexpr); } pbsEdges->Release(); return pexprPred; }
//--------------------------------------------------------------------------- // @function: // CJoinOrderDP::PbsCovered // // @doc: // Return a subset of the given set covered by one or more edges // //--------------------------------------------------------------------------- CBitSet * CJoinOrderDP::PbsCovered ( CBitSet *pbsInput ) { GPOS_ASSERT(NULL != pbsInput); CBitSet *pbs = GPOS_NEW(m_mp) CBitSet(m_mp); for (ULONG ul = 0; ul < m_ulEdges; ul++) { SEdge *pedge = m_rgpedge[ul]; if (pbsInput->ContainsAll(pedge->m_pbs)) { pbs->Union(pedge->m_pbs); } } return pbs; }
//--------------------------------------------------------------------------- // @function: // CJoinOrderDP::DConnectedness // // @doc: // Return connectedness measure of given component // //--------------------------------------------------------------------------- CDouble CJoinOrderDP::DConnectedness ( ULONG ulComp ) { CBitSet *pbsConnected = GPOS_NEW(m_pmp) CBitSet(m_pmp); for (ULONG ul = 0; ul < m_ulEdges; ul++) { SEdge *pedge = m_rgpedge[ul]; if (pedge->m_pbs->FBit(ulComp)) { pbsConnected->Union(pedge->m_pbs); } } (void) pbsConnected->FExchangeClear(ulComp); DOUBLE dConnectedness = (DOUBLE) pbsConnected->CElements() / m_ulComps; pbsConnected->Release(); return CDouble(dConnectedness); }
//--------------------------------------------------------------------------- // @function: // CConfigParamMapping::PbsPack // // @doc: // Pack the GPDB config params into a bitset // //--------------------------------------------------------------------------- CBitSet * CConfigParamMapping::PbsPack ( IMemoryPool *pmp, ULONG ulXforms // number of available xforms ) { CBitSet *pbs = New(pmp) CBitSet(pmp, EopttraceSentinel); for (ULONG ul = 0; ul < GPOS_ARRAY_SIZE(m_elem); ul++) { SConfigMappingElem elem = m_elem[ul]; GPOS_ASSERT(!pbs->FBit((ULONG) elem.m_etf) && "trace flag already set"); BOOL fVal = *elem.m_pfParam; if (elem.m_fNegate) { // negate the value of config param fVal = !fVal; } if (fVal) { #ifdef GPOS_DEBUG BOOL fSet = #endif // GPOS_DEBUG pbs->FExchangeSet((ULONG) elem.m_etf); GPOS_ASSERT(!fSet); } } // pack disable flags of xforms for (ULONG ul = 0; ul < ulXforms; ul++) { GPOS_ASSERT(!pbs->FBit(EopttraceDisableXformBase + ul) && "xform trace flag already set"); if (optimizer_xforms[ul]) { #ifdef GPOS_DEBUG BOOL fSet = #endif // GPOS_DEBUG pbs->FExchangeSet(EopttraceDisableXformBase + ul); GPOS_ASSERT(!fSet); } } // disable index-join if the corresponding GUC is turned off if (!optimizer_enable_indexjoin) { CBitSet *pbsIndexJoin = CXform::PbsIndexJoinXforms(pmp); pbs->Union(pbsIndexJoin); pbsIndexJoin->Release(); } // disable bitmap scan if the corresponding GUC is turned off if (!optimizer_enable_bitmapscan) { CBitSet *pbsBitmapScan = CXform::PbsBitmapIndexXforms(pmp); pbs->Union(pbsBitmapScan); pbsBitmapScan->Release(); } // disable outerjoin to unionall transformation if GUC is turned off if (!optimizer_enable_outerjoin_to_unionall_rewrite) { pbs->FExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftOuter2InnerUnionAllLeftAntiSemiJoin)); } // disable Assert MaxOneRow plans if GUC is turned off if (!optimizer_enable_assert_maxonerow) { pbs->FExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfMaxOneRow2Assert)); } if (!optimizer_enable_partial_index) { CBitSet *pbsHeterogeneousIndex = CXform::PbsHeterogeneousIndexXforms(pmp); pbs->Union(pbsHeterogeneousIndex); pbsHeterogeneousIndex->Release(); } return pbs; }