bool ProjectionExecutor::p_init(AbstractPlanNode *abstractNode, TempTableLimits* limits) { VOLT_TRACE("init Projection Executor"); assert(limits); ProjectionPlanNode* node = dynamic_cast<ProjectionPlanNode*>(abstractNode); assert(node); // // Construct the output table // TupleSchema* schema = node->generateTupleSchema(true); m_columnCount = static_cast<int>(node->getOutputSchema().size()); std::string* column_names = new std::string[m_columnCount]; for (int ctr = 0; ctr < m_columnCount; ctr++) { column_names[ctr] = node->getOutputSchema()[ctr]->getColumnName(); } node->setOutputTable(TableFactory::getTempTable(node->databaseId(), "temp", schema, column_names, limits)); delete[] column_names; // initialize local variables all_tuple_array_ptr = ExpressionUtil::convertIfAllTupleValues(node->getOutputColumnExpressions()); all_tuple_array = all_tuple_array_ptr.get(); all_param_array_ptr = ExpressionUtil::convertIfAllParameterValues(node->getOutputColumnExpressions()); all_param_array = all_param_array_ptr.get(); needs_substitute_ptr = boost::shared_array<bool>(new bool[m_columnCount]); needs_substitute = needs_substitute_ptr.get(); typedef AbstractExpression* ExpRawPtr; expression_array_ptr = boost::shared_array<ExpRawPtr>(new ExpRawPtr[m_columnCount]); expression_array = expression_array_ptr.get(); for (int ctr = 0; ctr < m_columnCount; ctr++) { assert (node->getOutputColumnExpressions()[ctr] != NULL); expression_array_ptr[ctr] = node->getOutputColumnExpressions()[ctr]; needs_substitute_ptr[ctr] = node->getOutputColumnExpressions()[ctr]->hasParameter(); } output_table = dynamic_cast<TempTable*>(node->getOutputTable()); //output table should be temptable if (!node->isInline()) { input_table = node->getInputTables()[0]; tuple = TableTuple(input_table->schema()); } return true; }
bool ProjectionExecutor::p_init(AbstractPlanNode *abstractNode, TempTableLimits* limits) { VOLT_TRACE("init Projection Executor"); assert(limits); ProjectionPlanNode* node = dynamic_cast<ProjectionPlanNode*>(abstractNode); assert(node); // Create output table based on output schema from the plan setTempOutputTable(limits); m_columnCount = static_cast<int>(node->getOutputSchema().size()); // initialize local variables all_tuple_array_ptr = ExpressionUtil::convertIfAllTupleValues(node->getOutputColumnExpressions()); all_tuple_array = all_tuple_array_ptr.get(); all_param_array_ptr = ExpressionUtil::convertIfAllParameterValues(node->getOutputColumnExpressions()); all_param_array = all_param_array_ptr.get(); needs_substitute_ptr = boost::shared_array<bool>(new bool[m_columnCount]); needs_substitute = needs_substitute_ptr.get(); typedef AbstractExpression* ExpRawPtr; expression_array_ptr = boost::shared_array<ExpRawPtr>(new ExpRawPtr[m_columnCount]); expression_array = expression_array_ptr.get(); for (int ctr = 0; ctr < m_columnCount; ctr++) { assert (node->getOutputColumnExpressions()[ctr] != NULL); VOLT_TRACE("OutputColumnExpressions [%d]: %s", ctr, node->getOutputColumnExpressions()[ctr]->debug(true).c_str()); expression_array_ptr[ctr] = node->getOutputColumnExpressions()[ctr]; needs_substitute_ptr[ctr] = node->getOutputColumnExpressions()[ctr]->hasParameter(); } output_table = dynamic_cast<TempTable*>(node->getOutputTable()); //output table should be temptable if (!node->isInline()) { Table* input_table = node->getInputTable(); tuple = TableTuple(input_table->schema()); } return true; }