void addAggregateColumn(AggregateColumn* agc, int idx, RetColsVector& vec, JobInfo& jobInfo) { uint32_t eid = agc->expressionId(); setExpTupleInfo(agc->resultType(), eid, agc->alias(), jobInfo); vector<pair<int, int> >::iterator i; for (i = jobInfo.aggEidIndexList.begin(); i != jobInfo.aggEidIndexList.end(); ++i) { if (i->first == (int) eid) break; } if (idx < 0 && i != jobInfo.aggEidIndexList.end()) { agc->inputIndex(i->second); jobInfo.cloneAggregateColMap.insert(make_pair(vec[i->second].get(), agc)); } else { SRCP srcp; if (idx < 0) { srcp.reset(agc->clone()); idx = vec.size(); vec.push_back(srcp); } else { srcp = vec[idx]; } jobInfo.aggEidIndexList.push_back(make_pair(eid, idx)); agc->inputIndex(idx); jobInfo.cloneAggregateColMap.insert(make_pair(srcp.get(), agc)); } }
TupleInfo setExpTupleInfo(const execplan::ReturnedColumn* rc, JobInfo& jobInfo) { return setExpTupleInfo(rc->resultType(), rc->expressionId(), rc->alias(), jobInfo, ((rc->joinInfo() & execplan::JOIN_CORRELATED) != 0)); }
uint32_t getTupleKey(JobInfo& jobInfo, const SRCP& srcp, bool add) { int key = -1; if (add) { // setTupleInfo first if add is ture, ok if already set. const SimpleColumn* sc = dynamic_cast<const SimpleColumn*>(srcp.get()); if (sc != NULL) { if (sc->schemaName().empty()) { SimpleColumn tmp(*sc, jobInfo.sessionId); tmp.oid(tableOid(sc, jobInfo.csc) + 1 + sc->colPosition()); key = getTupleKey(jobInfo, &tmp); // sub-query should be there } else { erydbSystemCatalog::ColType ct = sc->colType(); string alias(extractTableAlias(sc)); erydbSystemCatalog::OID tblOid = tableOid(sc, jobInfo.csc); TupleInfo ti(setTupleInfo(ct, sc->oid(), jobInfo, tblOid, sc, alias)); key = ti.key; erydbSystemCatalog::OID dictOid = isDictCol(ct); if (dictOid > 0) { ti = setTupleInfo(ct, dictOid, jobInfo, tblOid, sc, alias); jobInfo.keyInfo->dictKeyMap[key] = ti.key; key = ti.key; } } } else { erydbSystemCatalog::ColType ct = srcp->resultType(); TupleInfo ti(setExpTupleInfo(ct, srcp->expressionId(), srcp->alias(), jobInfo)); key = ti.key; } } else { // TupleInfo is expected to be set already const SimpleColumn* sc = dynamic_cast<const SimpleColumn*>(srcp.get()); if (sc != NULL) { if (sc->schemaName().empty()) { SimpleColumn tmp(*sc, jobInfo.sessionId); tmp.oid(tableOid(sc, jobInfo.csc) + 1 + sc->colPosition()); key = getTupleKey(jobInfo, &tmp); } else { key = getTupleKey(jobInfo, sc); } // check if this is a dictionary column if (jobInfo.keyInfo->dictKeyMap.find(key) != jobInfo.keyInfo->dictKeyMap.end()) key = jobInfo.keyInfo->dictKeyMap[key]; } else { key = getExpTupleKey(jobInfo, srcp->expressionId()); } } return key; }