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));
    }
}
Пример #2
0
TupleInfo setExpTupleInfo(const execplan::ReturnedColumn* rc, JobInfo& jobInfo)
{
	return setExpTupleInfo(rc->resultType(), rc->expressionId(), rc->alias(), jobInfo,
	                       ((rc->joinInfo() & execplan::JOIN_CORRELATED) != 0));
}
Пример #3
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;
}