/** * AddSamplesTable - Add a samples table into the 'samples_db'. * The table name is generated by concatenating db_id and table_id with '_'. */ void TupleSamplesStorage::AddSamplesTable( storage::DataTable *data_table, std::vector<std::unique_ptr<storage::Tuple>> &sampled_tuples) { auto schema = data_table->GetSchema(); auto schema_copy = catalog::Schema::CopySchema(schema); std::unique_ptr<catalog::Schema> schema_ptr(schema_copy); auto catalog = catalog::Catalog::GetInstance(); bool is_catalog = false; std::string samples_table_name = GenerateSamplesTableName( data_table->GetDatabaseOid(), data_table->GetOid()); auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance(); auto txn = txn_manager.BeginTransaction(); catalog->CreateTable(std::string(SAMPLES_DB_NAME), std::string(DEFAULT_SCHEMA_NAME), samples_table_name, std::move(schema_ptr), txn, is_catalog); auto samples_table = catalog->GetTableWithName( std::string(SAMPLES_DB_NAME), std::string(DEFAULT_SCHEMA_NAME), samples_table_name, txn); for (auto &tuple : sampled_tuples) { InsertSampleTuple(samples_table, std::move(tuple), txn); } txn_manager.CommitTransaction(txn); }
void OperatorToPlanTransformer::Visit(const PhysicalProject *) { auto project_prop = requirements_->GetPropertyOfType(PropertyType::PROJECT) ->As<PropertyProjection>(); (void)project_prop; size_t project_list_size = project_prop->GetProjectionListSize(); // expressions to evaluate TargetList tl = TargetList(); // columns which can be returned directly DirectMapList dml = DirectMapList(); // schema of the projections output std::vector<catalog::Column> columns; for (size_t project_idx = 0; project_idx < project_list_size; project_idx++) { auto expr = project_prop->GetProjection(project_idx); std::string column_name; // if the root of the expression is a column value we can // just do a direct mapping if (expr->GetExpressionType() == ExpressionType::VALUE_TUPLE) { auto tup_expr = (expression::TupleValueExpression *)expr; column_name = tup_expr->GetColumnName(); dml.push_back( DirectMap(project_idx, std::make_pair(0, tup_expr->GetColumnId()))); } // otherwise we need to evaluat the expression else { column_name = "expr" + std::to_string(project_idx); tl.push_back(Target(project_idx, expr->Copy())); } columns.push_back(catalog::Column( expr->GetValueType(), type::Type::GetTypeSize(expr->GetValueType()), column_name)); } // build the projection plan node and insert aboce the scan std::unique_ptr<planner::ProjectInfo> proj_info( new planner::ProjectInfo(std::move(tl), std::move(dml))); std::shared_ptr<catalog::Schema> schema_ptr(new catalog::Schema(columns)); std::unique_ptr<planner::AbstractPlan> project_plan( new planner::ProjectionPlan(std::move(proj_info), schema_ptr)); output_plan_ = std::move(project_plan); }