/** * @brief Create a physical tile * @param * @return Physical tile */ std::unique_ptr<storage::Tile> LogicalTile::Materialize() { // Create new schema according underlying physical tile std::unique_ptr<catalog::Schema> source_tile_schema(GetPhysicalSchema()); // Get the number of tuples within this logical tiles const int num_tuples = GetTupleCount(); //const catalog::Schema *output_schema; std::unordered_map<oid_t, oid_t> old_to_new_cols; oid_t column_count = source_tile_schema->GetColumnCount(); for (oid_t col = 0; col < column_count; col++) { old_to_new_cols[col] = col; } // Generate mappings. std::unordered_map<storage::Tile *, std::vector<oid_t>> tile_to_cols; GenerateTileToColMap(old_to_new_cols, tile_to_cols); // Create new physical tile. std::unique_ptr<storage::Tile> dest_tile( storage::TileFactory::GetTempTile(*source_tile_schema, num_tuples)); // Proceed to materialize logical tile by physical tile at a time. MaterializeByTiles(old_to_new_cols, tile_to_cols, dest_tile.get()); // Wrap physical tile in logical tile. return std::move(dest_tile); }
/** * @brief Create a physical tile for the given logical tile * @param source_tile Source tile from which the physical tile is created * @return a logical tile wrapper for the created physical tile */ LogicalTile *MaterializationExecutor::Physify(LogicalTile *source_tile) { std::unique_ptr<catalog::Schema> source_tile_schema( source_tile->GetPhysicalSchema()); const int num_tuples = source_tile->GetTupleCount(); const catalog::Schema *output_schema; std::unordered_map<oid_t, oid_t> old_to_new_cols; auto node = GetRawNode(); // Create a default identity mapping node if we did not get one if (node == nullptr) { assert(source_tile_schema.get()); output_schema = source_tile_schema.get(); old_to_new_cols = BuildIdentityMapping(output_schema); } // Else use the mapping in the given plan node else { const planner::MaterializationPlan &node = GetPlanNode<planner::MaterializationPlan>(); if (node.GetSchema()) { output_schema = node.GetSchema(); old_to_new_cols = node.old_to_new_cols(); } else { output_schema = source_tile_schema.get(); old_to_new_cols = BuildIdentityMapping(output_schema); } } // Generate mappings. std::unordered_map<storage::Tile *, std::vector<oid_t>> tile_to_cols; GenerateTileToColMap(old_to_new_cols, source_tile, tile_to_cols); // Create new physical tile. std::shared_ptr<storage::Tile> dest_tile( storage::TileFactory::GetTempTile(*output_schema, num_tuples)); // Proceed to materialize logical tile by physical tile at a time. MaterializeByTiles(source_tile, old_to_new_cols, tile_to_cols, dest_tile.get()); // Wrap physical tile in logical tile. return LogicalTileFactory::WrapTiles({dest_tile}); }