// we want BiRelat to be cacheable NABoolean BiRelat::isCacheableExpr(CacheWA& cwa) { if (cwa.getPhase() >= CmpMain::BIND && getArity() == 2) { if (getOperatorType() == ITM_EQUAL) { ItemExpr *leftC=child(0), *rightC=child(1); OperatorTypeEnum leftO = leftC->getOperatorType(); OperatorTypeEnum rightO = rightC->getOperatorType(); BaseColumn *base; if (leftO == ITM_BASECOLUMN) { base = (BaseColumn*)leftC; if (base->isKeyColumnValue(*rightC)) { cwa.addToUsedKeys(base); } return TRUE; } else if (rightO == ITM_BASECOLUMN) { base = (BaseColumn*)rightC; if (base->isKeyColumnValue(*leftC)) { cwa.addToUsedKeys(base); } return TRUE; } else if (leftO == ITM_ITEM_LIST && rightO == ITM_ITEM_LIST && ((ItemList*)leftC)->isListOfCacheableSelPred (cwa, (ItemList*)rightC)) { return TRUE; } else { // we want all other equality comparisons to be cacheable, eg, // retail_div_cd||acct_type_cd||substring(acct_id,1,8)='20V43085193' return TRUE; } } else { return TRUE; // other binary comparison predicates can be cacheable, but are // not necessarily parameterizable, see BiRelat::normalizeForCache } } return FALSE; }
// does this query's selection predicate list qualify query // to be cacheable after this phase? NABoolean ItemList::isListOfCacheableSelPred (CacheWA& cwa, ItemList *other) const { Int32 arity = getArity(); NABoolean result = FALSE; if (cwa.getPhase() >= CmpMain::BIND && other && arity == other->getArity()) { // assume this is an AND list, so, we need only one // cacheable conjunct to consider the list cacheable. for (Int32 x = 0; x < arity; x++) { ItemExpr *leftC = child(x), *rightC = other->child(x); OperatorTypeEnum leftO = leftC->getOperatorType(); OperatorTypeEnum rightO = rightC->getOperatorType(); BaseColumn *base; if (leftO == ITM_BASECOLUMN) { base = (BaseColumn*)leftC; if (base->isKeyColumnValue(*rightC)) { cwa.addToUsedKeys(base); } result = TRUE; continue; } else if (rightO == ITM_BASECOLUMN) { base = (BaseColumn*)rightC; if (base->isKeyColumnValue(*leftC)) { cwa.addToUsedKeys(base); } result = TRUE; continue; } else if (leftO == ITM_ITEM_LIST && rightO == ITM_ITEM_LIST && ((ItemList*)leftC)->isListOfCacheableSelPred (cwa, (ItemList*)rightC)) { result = TRUE; continue; } } } return result; }