TupleSchema* AbstractPlanNode::generateDMLCountTupleSchema() { // Assuming the expected output schema here saves the expense of hard-coding it into each DML plan. vector<voltdb::ValueType> columnTypes(1, VALUE_TYPE_BIGINT); vector<int32_t> columnSizes(1, sizeof(int64_t)); vector<bool> columnAllowNull(1, false); vector<bool> columnInBytes(1, false); TupleSchema* schema = TupleSchema::createTupleSchema(columnTypes, columnSizes, columnAllowNull, columnInBytes); return schema; }
TupleSchema* TupleSchema::createTupleSchema(const TupleSchema *first, const std::vector<uint16_t> firstSet, const TupleSchema *second, const std::vector<uint16_t> secondSet) { assert(first); const std::vector<uint16_t>::size_type offset = firstSet.size(); const std::vector<uint16_t>::size_type combinedColumnCount = firstSet.size() + secondSet.size(); std::vector<ValueType> columnTypes; std::vector<int32_t> columnLengths; std::vector<bool> columnAllowNull(combinedColumnCount, true); std::vector<bool> columnInBytes(combinedColumnCount, false); std::vector<uint16_t>::const_iterator iter; for (iter = firstSet.begin(); iter != firstSet.end(); iter++) { const TupleSchema::ColumnInfo *columnInfo = first->getColumnInfo(*iter); columnTypes.push_back(columnInfo->getVoltType()); columnLengths.push_back(columnInfo->length); columnAllowNull[*iter] = columnInfo->allowNull; columnInBytes[*iter] = columnInfo->inBytes; } for (iter = secondSet.begin(); second && iter != secondSet.end(); iter++) { const TupleSchema::ColumnInfo *columnInfo = second->getColumnInfo(*iter); columnTypes.push_back(columnInfo->getVoltType()); columnLengths.push_back(columnInfo->length); columnAllowNull[offset + *iter] = columnInfo->allowNull; columnInBytes[offset + *iter] = columnInfo->inBytes; } TupleSchema *schema = TupleSchema::createTupleSchema(columnTypes, columnLengths, columnAllowNull, columnInBytes); // Remember to set the inlineability of each column correctly. for (iter = firstSet.begin(); iter != firstSet.end(); iter++) { ColumnInfo *info = schema->getColumnInfo(*iter); info->inlined = first->getColumnInfo(*iter)->inlined; } for (iter = secondSet.begin(); second && iter != secondSet.end(); iter++) { ColumnInfo *info = schema->getColumnInfo((int)offset + *iter); info->inlined = second->getColumnInfo(*iter)->inlined; } return schema; }