@@ -33,8 +33,8 @@ namespace iceberg {
3333TableScanBuilder::TableScanBuilder (const Table& table) : table_(table) {}
3434
3535TableScanBuilder& TableScanBuilder::WithColumnNames (
36- const std::vector<std::string>& column_names) {
37- column_names_ = column_names;
36+ std::vector<std::string> column_names) {
37+ column_names_ = std::move ( column_names) ;
3838 return *this ;
3939}
4040
@@ -43,9 +43,8 @@ TableScanBuilder& TableScanBuilder::WithSnapshotId(int64_t snapshot_id) {
4343 return *this ;
4444}
4545
46- TableScanBuilder& TableScanBuilder::WithFilter (
47- const std::shared_ptr<Expression>& filter) {
48- filter_ = filter;
46+ TableScanBuilder& TableScanBuilder::WithFilter (std::shared_ptr<Expression> filter) {
47+ filter_ = std::move (filter);
4948 return *this ;
5049}
5150
@@ -56,33 +55,37 @@ Result<std::unique_ptr<TableScan>> TableScanBuilder::Build() {
5655 } else {
5756 snapshot = table_.current_snapshot ();
5857 }
58+ if (snapshot == nullptr ) {
59+ return InvalidArgument (" No snapshot found for table {}" , table_.name ());
60+ }
5961
6062 std::shared_ptr<Schema> schema;
6163 if (snapshot->schema_id ) {
6264 const auto & schemas = table_.schemas ();
6365 if (auto it = schemas.find (*snapshot->schema_id ); it != schemas.end ()) {
6466 schema = it->second ;
6567 } else {
66- return InvalidData (" Schema {} in snapshot {} is not found" , *snapshot-> schema_id ,
67- snapshot->snapshot_id );
68+ return InvalidArgument (" Schema {} in snapshot {} is not found" ,
69+ *snapshot-> schema_id , snapshot->snapshot_id );
6870 }
6971 } else {
7072 schema = table_.schema ();
7173 }
7274
73- std::vector<int32_t > field_ids ;
74- field_ids .reserve (column_names_.size ());
75+ std::vector<SchemaField> project_fields ;
76+ project_fields .reserve (column_names_.size ());
7577 for (const auto & column_name : column_names_) {
7678 auto field_opt = schema->GetFieldByName (column_name);
7779 if (!field_opt) {
7880 return InvalidArgument (" Column {} not found in schema" , column_name);
7981 }
80- field_ids .emplace_back (field_opt.value ().get (). field_id ());
82+ project_fields .emplace_back (field_opt.value ().get ());
8183 }
8284
85+ auto projected_schema =
86+ std::make_shared<Schema>(std::move (project_fields), schema->schema_id ());
8387 TableScan::ScanContext context{.snapshot = std::move (snapshot),
84- .schema = std::move (schema),
85- .field_ids = std::move (field_ids),
88+ .projected_schema = std::move (projected_schema),
8689 .filter = std::move (filter_)};
8790 return std::make_unique<TableScan>(std::move (context), table_.io ());
8891}
@@ -103,23 +106,11 @@ Result<std::vector<std::shared_ptr<FileScanTask>>> TableScan::PlanFiles() const
103106
104107 for (const auto & manifest : manifests) {
105108 const auto & data_file = manifest->data_file ;
106- tasks.emplace_back (std::make_shared<FileScanTask>(
107- data_file.file_path , 0 , data_file.file_size_in_bytes , data_file.record_count ,
108- data_file.content , data_file.file_format , context_.schema , context_.field_ids ,
109- context_.filter ));
109+ tasks.emplace_back (
110+ std::make_shared<FileScanTask>(data_file, 0 , data_file->file_size_in_bytes ));
110111 }
111112 }
112113 return tasks;
113114}
114115
115- Result<std::unique_ptr<ManifestListReader>> TableScan::CreateManifestListReader (
116- const std::string& file_path) const {
117- return NotImplemented (" manifest list reader" );
118- }
119-
120- Result<std::unique_ptr<ManifestReader>> TableScan::CreateManifestReader (
121- const std::string& file_path) const {
122- return NotImplemented (" manifest reader" );
123- }
124-
125116} // namespace iceberg
0 commit comments