本文整理汇总了C++中CExpression::Pop方法的典型用法代码示例。如果您正苦于以下问题:C++ CExpression::Pop方法的具体用法?C++ CExpression::Pop怎么用?C++ CExpression::Pop使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CExpression
的用法示例。
在下文中一共展示了CExpression::Pop方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CDouble
//---------------------------------------------------------------------------
// @function:
// CPhysical::GetSkew
//
// @doc:
// Helper to compute skew estimate based on given stats and
// distribution spec
//
//---------------------------------------------------------------------------
CDouble
CPhysical::GetSkew
(
IStatistics *stats,
CDistributionSpec *pds
)
{
CDouble dSkew = 1.0;
if (CDistributionSpec::EdtHashed == pds->Edt())
{
CDistributionSpecHashed *pdshashed = CDistributionSpecHashed::PdsConvert(pds);
const CExpressionArray *pdrgpexpr = pdshashed->Pdrgpexpr();
const ULONG size = pdrgpexpr->Size();
for (ULONG ul = 0; ul < size; ul++)
{
CExpression *pexpr = (*pdrgpexpr)[ul];
if (COperator::EopScalarIdent == pexpr->Pop()->Eopid())
{
// consider only hashed distribution direct columns for now
CScalarIdent *popScId = CScalarIdent::PopConvert(pexpr->Pop());
ULONG colid = popScId->Pcr()->Id();
CDouble dSkewCol = stats->GetSkew(colid);
if (dSkewCol > dSkew)
{
dSkew = dSkewCol;
}
}
}
}
return CDouble(dSkew);
}
示例2:
//---------------------------------------------------------------------------
// @function:
// CXformInnerJoin2DynamicBitmapIndexGetApply::Transform
//
// @doc:
// Actual transformation
//
//---------------------------------------------------------------------------
void
CXformInnerJoin2DynamicBitmapIndexGetApply::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *pmp = pxfctxt->Pmp();
// extract components
CExpression *pexprOuter = (*pexpr)[0];
CExpression *pexprInner = (*pexpr)[1];
CExpression *pexprScalar = (*pexpr)[2];
GPOS_ASSERT(COperator::EopLogicalDynamicGet == pexprInner->Pop()->Eopid());
CLogicalDynamicGet *popDynamicGet = CLogicalDynamicGet::PopConvert(pexprInner->Pop());
CreateHomogeneousIndexApplyAlternatives
(
pmp,
pexpr->Pop()->UlOpId(),
pexprOuter,
pexprInner,
pexprScalar,
popDynamicGet->Ptabdesc(),
popDynamicGet,
pxfres,
IMDIndex::EmdindBitmap
);
}
示例3: GPOS_NEW
//---------------------------------------------------------------------------
// @function:
// CPhysicalUnionAll::PdshashedPassThru
//
// @doc:
// Compute required hashed distribution of the n-th child
//
//---------------------------------------------------------------------------
CDistributionSpecHashed *
CPhysicalUnionAll::PdshashedPassThru
(
IMemoryPool *pmp,
CDistributionSpecHashed *pdshashedRequired,
ULONG ulChildIndex
)
const
{
DrgPexpr *pdrgpexprRequired = pdshashedRequired->Pdrgpexpr();
DrgPcr *pdrgpcrChild = (*m_pdrgpdrgpcrInput)[ulChildIndex];
const ULONG ulExprs = pdrgpexprRequired->UlLength();
const ULONG ulOutputCols = m_pdrgpcrOutput->UlLength();
DrgPexpr *pdrgpexprChildRequired = GPOS_NEW(pmp) DrgPexpr(pmp);
for (ULONG ulExpr = 0; ulExpr < ulExprs; ulExpr++)
{
CExpression *pexpr = (*pdrgpexprRequired)[ulExpr];
if (COperator::EopScalarIdent != pexpr->Pop()->Eopid())
{
// skip expressions that are not in form of scalar identifiers
continue;
}
const CColRef *pcrHashed = CScalarIdent::PopConvert(pexpr->Pop())->Pcr();
const IMDType *pmdtype = pcrHashed->Pmdtype();
if (!pmdtype->FHashable())
{
// skip non-hashable columns
continue;
}
for (ULONG ulCol = 0; ulCol < ulOutputCols; ulCol++)
{
const CColRef *pcrOutput = (*m_pdrgpcrOutput)[ulCol];
if (pcrOutput == pcrHashed)
{
const CColRef *pcrInput = (*pdrgpcrChild)[ulCol];
pdrgpexprChildRequired->Append(CUtils::PexprScalarIdent(pmp, pcrInput));
}
}
}
if (0 < pdrgpexprChildRequired->UlLength())
{
return GPOS_NEW(pmp) CDistributionSpecHashed(pdrgpexprChildRequired, true /* fNullsCollocated */);
}
// failed to create a matching hashed distribution
pdrgpexprChildRequired->Release();
if (NULL != pdshashedRequired->PdshashedEquiv())
{
// try again with equivalent distribution
return PdshashedPassThru(pmp, pdshashedRequired->PdshashedEquiv(), ulChildIndex);
}
// failed to create hashed distribution
return NULL;
}
示例4: GPOS_NEW
//---------------------------------------------------------------------------
// @function:
// CStatsPredUtils::PstatspredLikeHandleCasting
//
// @doc:
// Create a LIKE statistics filter
//---------------------------------------------------------------------------
CStatsPred *
CStatsPredUtils::PstatspredLike
(
IMemoryPool *pmp,
CExpression *pexprPred,
CColRefSet *//pcrsOuterRefs,
)
{
GPOS_ASSERT(NULL != pexprPred);
GPOS_ASSERT(CPredicateUtils::FLikePredicate(pexprPred));
CExpression *pexprLeft = (*pexprPred)[0];
CExpression *pexprRight = (*pexprPred)[1];
// we support LIKE predicate of the following patterns
// CAST(ScIdent) LIKE Const
// CAST(ScIdent) LIKE CAST(Const)
// ScIdent LIKE Const
// ScIdent LIKE CAST(Const)
// CAST(Const) LIKE ScIdent
// CAST(Const) LIKE CAST(ScIdent)
// const LIKE ScIdent
// const LIKE CAST(ScIdent)
CExpression *pexprScIdent = NULL;
CExpression *pexprScConst = NULL;
CPredicateUtils::ExtractLikePredComponents(pexprPred, &pexprScIdent, &pexprScConst);
if (NULL == pexprScIdent || NULL == pexprScConst)
{
return GPOS_NEW(pmp) CStatsPredUnsupported(ULONG_MAX, CStatsPred::EstatscmptLike);
}
CScalarIdent *popScalarIdent = CScalarIdent::PopConvert(pexprScIdent->Pop());
ULONG ulColId = popScalarIdent->Pcr()->UlId();
CScalarConst *popScalarConst = CScalarConst::PopConvert(pexprScConst->Pop());
IDatum *pdatumLiteral = popScalarConst->Pdatum();
const CColRef *pcr = popScalarIdent->Pcr();
if (!IMDType::FStatsComparable(pcr->Pmdtype(), pdatumLiteral))
{
// unsupported stats comparison between the column and datum
return GPOS_NEW(pmp) CStatsPredUnsupported(pcr->UlId(), CStatsPred::EstatscmptLike);
}
CDouble dDefaultScaleFactor(1.0);
if (pdatumLiteral->FSupportLikePredicate())
{
dDefaultScaleFactor = pdatumLiteral->DLikePredicateScaleFactor();
}
pexprLeft->AddRef();
pexprRight->AddRef();
return GPOS_NEW(pmp) CStatsPredLike(ulColId, pexprLeft, pexprRight, dDefaultScaleFactor);
}
示例5: PcnstrConjunction
//---------------------------------------------------------------------------
// @function:
// CConstraint::PcnstrFromScalarCmp
//
// @doc:
// Create constraint from scalar comparison
//
//---------------------------------------------------------------------------
CConstraint *
CConstraint::PcnstrFromScalarCmp
(
IMemoryPool *pmp,
CExpression *pexpr,
DrgPcrs **ppdrgpcrs // output equivalence classes
)
{
GPOS_ASSERT(NULL != pexpr);
GPOS_ASSERT(CUtils::FScalarCmp(pexpr));
GPOS_ASSERT(NULL != ppdrgpcrs);
GPOS_ASSERT(NULL == *ppdrgpcrs);
CExpression *pexprLeft = (*pexpr)[0];
CExpression *pexprRight = (*pexpr)[1];
// check if the scalar comparison is over scalar idents
if (COperator::EopScalarIdent == pexprLeft->Pop()->Eopid()
&& COperator::EopScalarIdent == pexprRight->Pop()->Eopid())
{
CScalarIdent *popScIdLeft = CScalarIdent::PopConvert((*pexpr)[0]->Pop());
const CColRef *pcrLeft = popScIdLeft->Pcr();
CScalarIdent *popScIdRight = CScalarIdent::PopConvert((*pexpr)[1]->Pop());
const CColRef *pcrRight = popScIdRight->Pcr();
if (!CUtils::FConstrainableType(pcrLeft->Pmdtype()->Pmdid()) ||
!CUtils::FConstrainableType(pcrRight->Pmdtype()->Pmdid()))
{
return NULL;
}
*ppdrgpcrs = GPOS_NEW(pmp) DrgPcrs(pmp);
if (CPredicateUtils::FEquality(pexpr))
{
// col1 = col2
CColRefSet *pcrsNew = GPOS_NEW(pmp) CColRefSet(pmp);
pcrsNew->Include(pcrLeft);
pcrsNew->Include(pcrRight);
(*ppdrgpcrs)->Append(pcrsNew);
}
// create NOT NULL constraints to both columns
DrgPcnstr *pdrgpcnstr = GPOS_NEW(pmp) DrgPcnstr(pmp);
pdrgpcnstr->Append(CConstraintInterval::PciUnbounded(pmp, pcrLeft, false /*fIncludesNull*/));
pdrgpcnstr->Append(CConstraintInterval::PciUnbounded(pmp, pcrRight, false /*fIncludesNull*/));
return CConstraint::PcnstrConjunction(pmp, pdrgpcnstr);
}
// TODO: , May 28, 2012; add support for other cases besides (col cmp col)
return NULL;
}
示例6: PexprNormalize
//---------------------------------------------------------------------------
// @function:
// CNormalizer::PexprSelect
//
// @doc:
// Return a Select expression, if needed, with a scalar condition made of
// given array of conjuncts
//
//---------------------------------------------------------------------------
CExpression *
CNormalizer::PexprSelect
(
IMemoryPool *pmp,
CExpression *pexpr,
DrgPexpr *pdrgpexpr
)
{
GPOS_ASSERT(NULL != pexpr);
GPOS_ASSERT(NULL != pdrgpexpr);
if (0 == pdrgpexpr->UlLength())
{
// no predicate, return given expression
pdrgpexpr->Release();
return pexpr;
}
// result expression is a select over predicates
CExpression *pexprConjunction = CPredicateUtils::PexprConjunction(pmp, pdrgpexpr);
CExpression *pexprSelect = CUtils::PexprSafeSelect(pmp, pexpr, pexprConjunction);
if (COperator::EopLogicalSelect != pexprSelect->Pop()->Eopid())
{
// Select node was pruned, return created expression
return pexprSelect;
}
CExpression *pexprLogicalChild = (*pexprSelect)[0];
COperator::EOperatorId eopidChild = pexprLogicalChild->Pop()->Eopid();
if (COperator::EopLogicalLeftOuterJoin != eopidChild)
{
// child of Select is not an outer join, return created Select expression
return pexprSelect;
}
// we have a Select on top of Outer Join expression, attempt simplifying expression into InnerJoin
CExpression *pexprSimplified = NULL;
if (FSimplifySelectOnOuterJoin(pmp, pexprLogicalChild, (*pexprSelect)[1], &pexprSimplified))
{
// simplification succeeded, normalize resulting expression
pexprSelect->Release();
CExpression *pexprResult = PexprNormalize(pmp, pexprSimplified);
pexprSimplified->Release();
return pexprResult;
}
// simplification failed, return created Select expression
return pexprSelect;
}
示例7:
//---------------------------------------------------------------------------
// @function:
// CXformPushGbWithHavingBelowJoin::Transform
//
// @doc:
// Actual transformation
//
//---------------------------------------------------------------------------
void
CXformPushGbWithHavingBelowJoin::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *mp = pxfctxt->Pmp();
CExpression *pexprGb = (*pexpr)[0];
CLogicalGbAgg *popGbAgg = CLogicalGbAgg::PopConvert(pexprGb->Pop());
if (!popGbAgg->FGlobal())
{
// xform only applies to global aggs
return;
}
CExpression *pexprResult = CXformUtils::PexprPushGbBelowJoin(mp, pexpr);
if (NULL != pexprResult)
{
// add alternative to results
pxfres->Add(pexprResult);
}
}
示例8: CColRefSet
//---------------------------------------------------------------------------
// @function:
// CXformCollapseGbAgg::Transform
//
// @doc:
// Actual transformation to collapse two cascaded group by operators;
// if the top Gb grouping columns are subset of bottom Gb grouping
// columns AND both Gb operators do not define agg functions, we can
// remove the bottom group by operator
//
//
//---------------------------------------------------------------------------
void
CXformCollapseGbAgg::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(NULL != pxfres);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *pmp = pxfctxt->Pmp();
// extract components
CLogicalGbAgg *popTopGbAgg = CLogicalGbAgg::PopConvert(pexpr->Pop());
GPOS_ASSERT(0 < popTopGbAgg->Pdrgpcr()->UlLength());
GPOS_ASSERT(popTopGbAgg->FGlobal());
CExpression *pexprRelational = (*pexpr)[0];
CExpression *pexprTopProjectList = (*pexpr)[1];
CLogicalGbAgg *popBottomGbAgg = CLogicalGbAgg::PopConvert(pexprRelational->Pop());
CExpression *pexprChild = (*pexprRelational)[0];
CExpression *pexprBottomProjectList = (*pexprRelational)[1];
if (!popBottomGbAgg->FGlobal())
{
// bottom GbAgg must be global to prevent xform from getting applied to splitted GbAggs
return;
}
if (0 < pexprTopProjectList->UlArity() || 0 < pexprBottomProjectList->UlArity())
{
// exit if any of the Gb operators has an aggregate function
return;
}
#ifdef GPOS_DEBUG
// for two cascaded GbAgg ops with no agg functions, top grouping
// columns must be a subset of bottom grouping columns
CColRefSet *pcrsTopGrpCols = GPOS_NEW(pmp) CColRefSet(pmp, popTopGbAgg->Pdrgpcr());
CColRefSet *pcrsBottomGrpCols = GPOS_NEW(pmp) CColRefSet(pmp, popBottomGbAgg->Pdrgpcr());
GPOS_ASSERT(pcrsBottomGrpCols->FSubset(pcrsTopGrpCols));
pcrsTopGrpCols->Release();
pcrsBottomGrpCols->Release();
#endif // GPOS_DEBUG
pexprChild->AddRef();
CExpression *pexprSelect = CUtils::PexprLogicalSelect(pmp, pexprChild, CPredicateUtils::PexprConjunction(pmp, NULL /*pdrgpexpr*/));
popTopGbAgg->AddRef();
pexprTopProjectList->AddRef();
CExpression *pexprGbAggNew = GPOS_NEW(pmp) CExpression(pmp, popTopGbAgg, pexprSelect, pexprTopProjectList);
pxfres->Add(pexprGbAggNew);
}
示例9: dRowsExpected
// test cardinality for predicates of the form: a + c = b
// for such predicates, NDV based cardinality estimation is not applicable
GPOS_RESULT
CJoinCardinalityNDVBasedEqPredTest::EresUnittest_NDVCardEstimationNotApplicableMultipleIdents()
{
// cartesian product / 2.5
// 2.5 = 1/.4 -- where .4 is default selectivity
CDouble dRowsExpected(76004000);
Fixture f(file_name);
IMemoryPool *mp = f.Pmp();
IStatisticsArray *statistics_array = f.PdrgPstat();
CExpression *pexprLgGet = CTestUtils::PexprLogicalGet(mp);
CLogicalGet *popGet = CLogicalGet::PopConvert(pexprLgGet->Pop());
CColRefArray *colref_array = popGet->PdrgpcrOutput();
// use the colid available in the input xml file
CColRef *pcrLeft1 = (*colref_array)[2];
CColRef *pcrLeft2 = (*colref_array)[1];
CColRef *pcrRight = (*colref_array)[0];
// create a scalar ident
// CScalarIdent "column_0000" (0)
CExpression *pexprScalarIdentRight = CUtils::PexprScalarIdent(mp, pcrRight);
CExpression *pexprScalarIdentLeft2 = CUtils::PexprScalarIdent(mp, pcrLeft2);
// create a scalar op expression column_0002 + column_0001
// CScalarOp (+)
// |--CScalarIdent "column_0002" (2)
// +--CScalarIdent "column_0001" (1)
CExpression *pexprScOp = CUtils::PexprScalarOp(mp, pcrLeft1, pexprScalarIdentLeft2,
CWStringConst(GPOS_WSZ_LIT("+")),
GPOS_NEW(mp) CMDIdGPDB(GPDB_INT4_ADD_OP));
// create a scalar comparision operator
// +--CScalarCmp (=)
// |--CScalarOp (+)
// | |--CScalarIdent "column_0002" (2)
// | +--CScalarIdent "column_0001" (1)
// +--CScalarIdent "column_0000" (0)
CExpression *pScalarCmp = CUtils::PexprScalarEqCmp(mp, pexprScOp, pexprScalarIdentRight);
IStatistics *join_stats = CJoinStatsProcessor::CalcAllJoinStats(mp, statistics_array, pScalarCmp,
IStatistics::EsjtInnerJoin);
GPOS_ASSERT(NULL != join_stats);
CDouble dRowsActual(join_stats->Rows());
GPOS_RESULT eres = GPOS_OK;
if (floor(dRowsActual.Get()) != dRowsExpected)
{
eres = GPOS_FAILED;
}
join_stats->Release();
pexprLgGet->Release();
pScalarCmp->Release();
return eres;
}
示例10: while
//---------------------------------------------------------------------------
// @function:
// CQueryContext::PopTop
//
// @doc:
// Return top level operator in the given expression
//
//---------------------------------------------------------------------------
COperator *
CQueryContext::PopTop
(
CExpression *pexpr
)
{
GPOS_ASSERT(NULL != pexpr);
// skip CTE anchors if any
CExpression *pexprCurr = pexpr;
while (COperator::EopLogicalCTEAnchor == pexprCurr->Pop()->Eopid())
{
pexprCurr = (*pexprCurr)[0];
GPOS_ASSERT(NULL != pexprCurr);
}
return pexprCurr->Pop();
}
示例11:
//---------------------------------------------------------------------------
// @function:
// CNormalizer::PushThruSelect
//
// @doc:
// Push a conjunct through a select
//
//---------------------------------------------------------------------------
void
CNormalizer::PushThruSelect
(
IMemoryPool *pmp,
CExpression *pexprSelect,
CExpression *pexprConj,
CExpression **ppexprResult
)
{
GPOS_ASSERT(NULL != pexprConj);
GPOS_ASSERT(NULL != ppexprResult);
CExpression *pexprLogicalChild = (*pexprSelect)[0];
CExpression *pexprScalarChild = (*pexprSelect)[1];
CExpression *pexprPred = CPredicateUtils::PexprConjunction(pmp, pexprScalarChild, pexprConj);
if (CUtils::FScalarConstTrue(pexprPred))
{
pexprPred->Release();
*ppexprResult = PexprNormalize(pmp, pexprLogicalChild);
return;
}
COperator::EOperatorId eopid = pexprLogicalChild->Pop()->Eopid();
if (COperator::EopLogicalLeftOuterJoin == eopid)
{
CExpression *pexprSimplified = NULL;
if (FSimplifySelectOnOuterJoin(pmp, pexprLogicalChild, pexprPred, &pexprSimplified))
{
// simplification succeeded, normalize resulting expression
*ppexprResult = PexprNormalize(pmp, pexprSimplified);
pexprPred->Release();
pexprSimplified->Release();
return;
}
}
if (FPushThruOuterChild(pexprLogicalChild))
{
PushThruOuterChild(pmp, pexprLogicalChild, pexprPred, ppexprResult);
}
else
{
// logical child may not pass all predicates through, we need to collect
// unpushable predicates, if any, into a top Select node
DrgPexpr *pdrgpexprConjuncts = CPredicateUtils::PdrgpexprConjuncts(pmp, pexprPred);
DrgPexpr *pdrgpexprRemaining = NULL;
CExpression *pexpr = NULL;
PushThru(pmp, pexprLogicalChild, pdrgpexprConjuncts, &pexpr, &pdrgpexprRemaining);
*ppexprResult = PexprSelect(pmp, pexpr, pdrgpexprRemaining);
pdrgpexprConjuncts->Release();
}
pexprPred->Release();
}
示例12: ULongPtrArray
//---------------------------------------------------------------------------
// @function:
// CPhysicalUnionAll::PdrgpulMap
//
// @doc:
// Map given array of scalar identifier expressions to positions of
// UnionAll input columns in the given child;
// the function returns NULL if no mapping could be constructed
//
//---------------------------------------------------------------------------
ULongPtrArray *
CPhysicalUnionAll::PdrgpulMap
(
IMemoryPool *mp,
CExpressionArray *pdrgpexpr,
ULONG child_index
)
const
{
GPOS_ASSERT(NULL != pdrgpexpr);
CColRefArray *colref_array = (*PdrgpdrgpcrInput())[child_index];
const ULONG ulExprs = pdrgpexpr->Size();
const ULONG num_cols = colref_array->Size();
ULongPtrArray *pdrgpul = GPOS_NEW(mp) ULongPtrArray(mp);
for (ULONG ulExpr = 0; ulExpr < ulExprs; ulExpr++)
{
CExpression *pexpr = (*pdrgpexpr)[ulExpr];
if (COperator::EopScalarIdent != pexpr->Pop()->Eopid())
{
continue;
}
const CColRef *colref = CScalarIdent::PopConvert(pexpr->Pop())->Pcr();
for (ULONG ulCol = 0; ulCol < num_cols; ulCol++)
{
if ((*colref_array)[ulCol] == colref)
{
pdrgpul->Append(GPOS_NEW(mp) ULONG(ulCol));
}
}
}
if (0 == pdrgpul->Size())
{
// mapping failed
pdrgpul->Release();
pdrgpul = NULL;
}
return pdrgpul;
}
示例13: DrgPul
//---------------------------------------------------------------------------
// @function:
// CPhysicalUnionAll::PdrgpulMap
//
// @doc:
// Map given array of scalar identifier expressions to positions of
// UnionAll input columns in the given child;
// the function returns NULL if no mapping could be constructed
//
//---------------------------------------------------------------------------
DrgPul *
CPhysicalUnionAll::PdrgpulMap
(
IMemoryPool *pmp,
DrgPexpr *pdrgpexpr,
ULONG ulChildIndex
)
const
{
GPOS_ASSERT(NULL != pdrgpexpr);
DrgPcr *pdrgpcr = (*m_pdrgpdrgpcrInput)[ulChildIndex];
const ULONG ulExprs = pdrgpexpr->UlLength();
const ULONG ulCols = pdrgpcr->UlLength();
DrgPul *pdrgpul = GPOS_NEW(pmp) DrgPul(pmp);
for (ULONG ulExpr = 0; ulExpr < ulExprs; ulExpr++)
{
CExpression *pexpr = (*pdrgpexpr)[ulExpr];
if (COperator::EopScalarIdent != pexpr->Pop()->Eopid())
{
continue;
}
const CColRef *pcr = CScalarIdent::PopConvert(pexpr->Pop())->Pcr();
for (ULONG ulCol = 0; ulCol < ulCols; ulCol++)
{
if ((*pdrgpcr)[ulCol] == pcr)
{
pdrgpul->Append(GPOS_NEW(pmp) ULONG(ulCol));
}
}
}
if (0 == pdrgpul->UlLength())
{
// mapping failed
pdrgpul->Release();
pdrgpul = NULL;
}
return pdrgpul;
}
示例14:
//---------------------------------------------------------------------------
// @function:
// CXformInnerJoinWithInnerSelect2IndexGetApply::Transform
//
// @doc:
// Actual transformation
//
//---------------------------------------------------------------------------
void
CXformInnerJoinWithInnerSelect2IndexGetApply::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *pmp = pxfctxt->Pmp();
// extract components
CExpression *pexprOuter = (*pexpr)[0];
CExpression *pexprInner = (*pexpr)[1];
CExpression *pexprScalar = (*pexpr)[2];
GPOS_ASSERT(COperator::EopLogicalSelect == pexprInner->Pop()->Eopid());
CExpression *pexprGet = (*pexprInner)[0];
GPOS_ASSERT(COperator::EopLogicalGet == pexprGet->Pop()->Eopid());
CTableDescriptor *ptabdescInner = CLogicalGet::PopConvert (pexprGet->Pop ())->Ptabdesc();
CExpression *pexprAllPredicates = CPredicateUtils::PexprConjunction(pmp, pexprScalar, (*pexprInner)[1]);
CreateHomogeneousIndexApplyAlternatives
(
pmp,
pexpr->Pop()->UlOpId(),
pexprOuter,
pexprGet,
pexprAllPredicates,
ptabdescInner,
NULL, // popDynamicGet
pxfres,
IMDIndex::EmdindBtree
);
pexprAllPredicates->Release();
}
示例15: DrgPexpr
//---------------------------------------------------------------------------
// @function:
// CCNFConverter::PexprNot2CNF
//
// @doc:
// Convert a NOT tree into CNF
//
//---------------------------------------------------------------------------
CExpression *
CCNFConverter::PexprNot2CNF
(
IMemoryPool *pmp,
CExpression *pexpr
)
{
GPOS_ASSERT(NULL != pmp);
GPOS_ASSERT(NULL != pexpr);
GPOS_ASSERT(1 == pexpr->UlArity());
CExpression *pexprNotChild = (*pexpr)[0];
if (!FScalarBoolOp(pexprNotChild))
{
pexpr->AddRef();
return pexpr;
}
CScalarBoolOp::EBoolOperator eboolopChild = CScalarBoolOp::PopConvert(pexprNotChild->Pop())->Eboolop();
// apply DeMorgan laws
// NOT(NOT(A)) ==> A
if (CScalarBoolOp::EboolopNot == eboolopChild)
{
return Pexpr2CNF(pmp, (*pexprNotChild)[0]);
}
// Not child must be either an AND or an OR
// NOT(A AND B) ==> NOT(A) OR NOT(B)
// NOT(A OR B) ==> NOT(A) AND NOT(B)
DrgPexpr *pdrgpexpr = GPOS_NEW(pmp) DrgPexpr(pmp);
const ULONG ulArity = pexprNotChild->UlArity();
for (ULONG ul = 0; ul < ulArity; ul++)
{
(*pexprNotChild)[ul]->AddRef();
pdrgpexpr->Append(CUtils::PexprNegate(pmp, (*pexprNotChild)[ul]));
}
CScalarBoolOp::EBoolOperator eboolop = CScalarBoolOp::EboolopAnd;
if (CScalarBoolOp::EboolopAnd == eboolopChild)
{
eboolop = CScalarBoolOp::EboolopOr;
}
CExpression *pexprScalarBoolOp = CUtils::PexprScalarBoolOp(pmp, eboolop, pdrgpexpr);
CExpression *pexprResult = Pexpr2CNF(pmp, pexprScalarBoolOp);
pexprScalarBoolOp->Release();
return pexprResult;
}