Skip to content

Commit 169cd86

Browse files
author
xiao.dong
committed
add v1v2v3 metadata wrapper
1 parent 674167b commit 169cd86

File tree

6 files changed

+224
-28
lines changed

6 files changed

+224
-28
lines changed

src/iceberg/manifest_writer.cc

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@
2828
namespace iceberg {
2929

3030
Result<std::unique_ptr<ManifestWriter>> ManifestWriter::MakeWriter(
31-
int32_t format_version, int64_t first_row_id, std::string_view manifest_location,
32-
std::shared_ptr<FileIO> file_io, std::shared_ptr<Schema> partition_schema) {
31+
int32_t format_version, int64_t snapshot_id, int64_t first_row_id,
32+
std::string_view manifest_location, std::shared_ptr<FileIO> file_io,
33+
std::shared_ptr<Schema> partition_schema) {
3334
auto manifest_entry_schema = ManifestEntry::TypeFromPartitionType(partition_schema);
3435
auto fields_span = manifest_entry_schema->fields();
3536
std::vector<SchemaField> fields(fields_span.begin(), fields_span.end());
@@ -41,14 +42,14 @@ Result<std::unique_ptr<ManifestWriter>> ManifestWriter::MakeWriter(
4142
.io = std::move(file_io)}));
4243
switch (format_version) {
4344
case 1:
44-
return std::make_unique<ManifestWriterV1>(first_row_id, std::move(writer),
45+
return std::make_unique<ManifestWriterV1>(snapshot_id, std::move(writer),
4546
std::move(schema));
4647
case 2:
47-
return std::make_unique<ManifestWriterV2>(first_row_id, std::move(writer),
48+
return std::make_unique<ManifestWriterV2>(snapshot_id, std::move(writer),
4849
std::move(schema));
4950
case 3:
50-
return std::make_unique<ManifestWriterV3>(first_row_id, std::move(writer),
51-
std::move(schema));
51+
return std::make_unique<ManifestWriterV3>(snapshot_id, first_row_id,
52+
std::move(writer), std::move(schema));
5253

5354
default:
5455
return InvalidArgument("Unsupported manifest format version: {}", format_version);
@@ -70,12 +71,12 @@ Result<std::unique_ptr<ManifestListWriter>> ManifestListWriter::MakeWriter(
7071
switch (format_version) {
7172
case 1:
7273
return std::make_unique<ManifestListWriterV1>(snapshot_id, parent_snapshot_id,
73-
sequence_number, first_row_id,
74+
7475
std::move(writer), std::move(schema));
7576
case 2:
7677
return std::make_unique<ManifestListWriterV2>(snapshot_id, parent_snapshot_id,
77-
sequence_number, first_row_id,
78-
std::move(writer), std::move(schema));
78+
sequence_number, std::move(writer),
79+
std::move(schema));
7980
case 3:
8081
return std::make_unique<ManifestListWriterV3>(snapshot_id, parent_snapshot_id,
8182
sequence_number, first_row_id,

src/iceberg/manifest_writer.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ class ICEBERG_EXPORT ManifestWriter {
4646

4747
/// \brief Creates a writer for a manifest file.
4848
/// \param format_version Format version of the manifest.
49+
/// \param snapshot_id ID of the snapshot.
4950
/// \param first_row_id First row ID of the snapshot.
5051
/// \param manifest_location Path to the manifest file.
5152
/// \param file_io File IO implementation to use.
5253
/// \return A Result containing the writer or an error.
5354
static Result<std::unique_ptr<ManifestWriter>> MakeWriter(
54-
int32_t format_version, int64_t first_row_id, std::string_view manifest_location,
55-
std::shared_ptr<FileIO> file_io, std::shared_ptr<Schema> partition_schema);
55+
int32_t format_version, int64_t snapshot_id, int64_t first_row_id,
56+
std::string_view manifest_location, std::shared_ptr<FileIO> file_io,
57+
std::shared_ptr<Schema> partition_schema);
5658
};
5759

5860
/// \brief Write manifest files to a manifest list file.

src/iceberg/manifest_writer_internal.h

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@
2323
/// Writer implementation for manifest list files and manifest files.
2424

2525
#include "iceberg/manifest_writer.h"
26+
#include "iceberg/v1_metadata.h"
27+
#include "iceberg/v2_metadata.h"
28+
#include "iceberg/v3_metadata.h"
2629

2730
namespace iceberg {
2831

2932
/// \brief Write manifest entries to a manifest file.
3033
class ManifestWriterImpl : public ManifestWriter {
3134
public:
32-
explicit ManifestWriterImpl(int64_t first_row_id, std::unique_ptr<Writer> writer,
35+
explicit ManifestWriterImpl(int64_t snapshot_id, std::unique_ptr<Writer> writer,
3336
std::shared_ptr<Schema> schema)
3437
: schema_(std::move(schema)), writer_(std::move(writer)) {}
3538

@@ -41,44 +44,55 @@ class ManifestWriterImpl : public ManifestWriter {
4144
/// \brief Write v1 manifest entries to a manifest file.
4245
class ManifestWriterV1 : public ManifestWriterImpl {
4346
public:
44-
explicit ManifestWriterV1(int64_t first_row_id, std::unique_ptr<Writer> writer,
47+
explicit ManifestWriterV1(int64_t snapshot_id, std::unique_ptr<Writer> writer,
4548
std::shared_ptr<Schema> schema)
46-
: ManifestWriterImpl(first_row_id, std::move(writer), std::move(schema)) {}
49+
: ManifestWriterImpl(snapshot_id, std::move(writer), std::move(schema)) {}
4750

4851
Status WriteManifestEntry(const ManifestEntry& entry) const override;
4952

5053
Status Close() override;
54+
55+
private:
56+
V1MetaData::ManifestEntryWrapper wrapper_;
5157
};
5258

5359
/// \brief Write v2 manifest entries to a manifest file.
5460
class ManifestWriterV2 : public ManifestWriterImpl {
5561
public:
56-
explicit ManifestWriterV2(int64_t first_row_id, std::unique_ptr<Writer> writer,
62+
explicit ManifestWriterV2(int64_t snapshot_id, std::unique_ptr<Writer> writer,
5763
std::shared_ptr<Schema> schema)
58-
: ManifestWriterImpl(first_row_id, std::move(writer), std::move(schema)) {}
64+
: ManifestWriterImpl(snapshot_id, std::move(writer), std::move(schema)),
65+
wrapper_(snapshot_id) {}
5966

6067
Status WriteManifestEntry(const ManifestEntry& entry) const override;
6168

6269
Status Close() override;
70+
71+
private:
72+
V2MetaData::ManifestEntryWrapper wrapper_;
6373
};
6474

6575
/// \brief Write v3 manifest entries to a manifest file.
6676
class ManifestWriterV3 : public ManifestWriterImpl {
6777
public:
68-
explicit ManifestWriterV3(int64_t first_row_id, std::unique_ptr<Writer> writer,
78+
explicit ManifestWriterV3(int64_t snapshot_id, int64_t first_row_id,
79+
std::unique_ptr<Writer> writer,
6980
std::shared_ptr<Schema> schema)
70-
: ManifestWriterImpl(first_row_id, std::move(writer), std::move(schema)) {}
81+
: ManifestWriterImpl(snapshot_id, std::move(writer), std::move(schema)),
82+
wrapper_(snapshot_id) {}
7183

7284
Status WriteManifestEntry(const ManifestEntry& entry) const override;
7385

7486
Status Close() override;
87+
88+
private:
89+
V3MetaData::ManifestEntryWrapper wrapper_;
7590
};
7691

7792
/// \brief Write manifest files to a manifest list file.
7893
class ManifestListWriterImpl : public ManifestListWriter {
7994
public:
8095
explicit ManifestListWriterImpl(int64_t snapshot_id, int64_t parent_snapshot_id,
81-
int64_t sequence_number, int64_t first_row_id,
8296
std::unique_ptr<Writer> writer,
8397
std::shared_ptr<Schema> schema)
8498
: schema_(std::move(schema)), writer_(std::move(writer)) {}
@@ -92,30 +106,36 @@ class ManifestListWriterImpl : public ManifestListWriter {
92106
class ManifestListWriterV1 : public ManifestListWriterImpl {
93107
public:
94108
explicit ManifestListWriterV1(int64_t snapshot_id, int64_t parent_snapshot_id,
95-
int64_t sequence_number, int64_t first_row_id,
109+
96110
std::unique_ptr<Writer> writer,
97111
std::shared_ptr<Schema> schema)
98-
: ManifestListWriterImpl(snapshot_id, parent_snapshot_id, sequence_number,
99-
first_row_id, std::move(writer), std::move(schema)) {}
112+
: ManifestListWriterImpl(snapshot_id, parent_snapshot_id, std::move(writer),
113+
std::move(schema)) {}
100114

101115
Status WriteManifestFile(const ManifestFile& file) const override;
102116

103117
Status Close() override;
118+
119+
private:
120+
V1MetaData::ManifestFileWrapper wrapper_;
104121
};
105122

106123
/// \brief Write v2 manifest files to a manifest list file.
107124
class ManifestListWriterV2 : public ManifestListWriterImpl {
108125
public:
109126
explicit ManifestListWriterV2(int64_t snapshot_id, int64_t parent_snapshot_id,
110-
int64_t sequence_number, int64_t first_row_id,
111-
std::unique_ptr<Writer> writer,
127+
int64_t sequence_number, std::unique_ptr<Writer> writer,
112128
std::shared_ptr<Schema> schema)
113-
: ManifestListWriterImpl(snapshot_id, parent_snapshot_id, sequence_number,
114-
first_row_id, std::move(writer), std::move(schema)) {}
129+
: ManifestListWriterImpl(snapshot_id, parent_snapshot_id, std::move(writer),
130+
std::move(schema)),
131+
wrapper_(snapshot_id, sequence_number) {}
115132

116133
Status WriteManifestFile(const ManifestFile& file) const override;
117134

118135
Status Close() override;
136+
137+
private:
138+
V2MetaData::ManifestFileWrapper wrapper_;
119139
};
120140

121141
/// \brief Write v3 manifest files to a manifest list file.
@@ -125,12 +145,16 @@ class ManifestListWriterV3 : public ManifestListWriterImpl {
125145
int64_t sequence_number, int64_t first_row_id,
126146
std::unique_ptr<Writer> writer,
127147
std::shared_ptr<Schema> schema)
128-
: ManifestListWriterImpl(snapshot_id, parent_snapshot_id, sequence_number,
129-
first_row_id, std::move(writer), std::move(schema)) {}
148+
: ManifestListWriterImpl(snapshot_id, parent_snapshot_id, std::move(writer),
149+
std::move(schema)),
150+
wrapper_(snapshot_id, sequence_number) {}
130151

131152
Status WriteManifestFile(const ManifestFile& file) const override;
132153

133154
Status Close() override;
155+
156+
private:
157+
V3MetaData::ManifestFileWrapper wrapper_;
134158
};
135159

136160
} // namespace iceberg

src/iceberg/v1_metadata.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
#pragma once
21+
22+
/// \file iceberg/v1_metadata.h
23+
24+
#include "iceberg/manifest_entry.h"
25+
#include "iceberg/manifest_list.h"
26+
27+
namespace iceberg {
28+
29+
/// \brief v1 metadata wrapper.
30+
///
31+
/// Wrapper for v1 manifest list and manifest entry.
32+
class V1MetaData {
33+
public:
34+
/// \brief v1 manifest file wrapper.
35+
struct ManifestFileWrapper : public ManifestFile {
36+
explicit ManifestFileWrapper() {}
37+
38+
ManifestFile wrap(ManifestFile file, int64_t first_row_id) { return *this; }
39+
};
40+
41+
/// \brief v1 manifest entry wrapper.
42+
struct ManifestEntryWrapper : public ManifestEntry {
43+
explicit ManifestEntryWrapper() {}
44+
45+
ManifestEntry wrap(ManifestEntry entry) { return *this; }
46+
};
47+
48+
static ManifestFileWrapper manifestFileWrapper() { return ManifestFileWrapper(); }
49+
50+
static ManifestEntryWrapper manifestEntryWrapper() { return ManifestEntryWrapper(); }
51+
};
52+
53+
} // namespace iceberg

src/iceberg/v2_metadata.h

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
#pragma once
21+
22+
/// \file iceberg/v2_metadata.h
23+
24+
#include "iceberg/manifest_entry.h"
25+
#include "iceberg/manifest_list.h"
26+
27+
namespace iceberg {
28+
29+
/// \brief v2 metadata wrapper.
30+
///
31+
/// Wrapper for v2 manifest list and manifest entry.
32+
class V2MetaData {
33+
public:
34+
/// \brief v2 manifest file wrapper.
35+
struct ManifestFileWrapper : public ManifestFile {
36+
explicit ManifestFileWrapper(int64_t commit_snapshotId, int64_t sequence_number) {}
37+
38+
ManifestFile wrap(ManifestFile file, int64_t first_row_id) { return *this; }
39+
};
40+
41+
/// \brief v2 manifest entry wrapper.
42+
struct ManifestEntryWrapper : public ManifestEntry {
43+
explicit ManifestEntryWrapper(int64_t commit_snapshot_id) {}
44+
45+
ManifestEntry wrap(ManifestEntry entry) { return *this; }
46+
};
47+
48+
static ManifestFileWrapper manifestFileWrapper(int64_t commit_snapshotId,
49+
int64_t sequence_number) {
50+
return ManifestFileWrapper(commit_snapshotId, sequence_number);
51+
}
52+
53+
static ManifestEntryWrapper manifestEntryWrapper(int64_t commit_snapshot_id) {
54+
return ManifestEntryWrapper(commit_snapshot_id);
55+
}
56+
};
57+
58+
} // namespace iceberg

src/iceberg/v3_metadata.h

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
#pragma once
21+
22+
/// \file iceberg/v3_metadata.h
23+
24+
#include "iceberg/manifest_entry.h"
25+
#include "iceberg/manifest_list.h"
26+
27+
namespace iceberg {
28+
29+
/// \brief v3 metadata wrapper.
30+
///
31+
/// Wrapper for v3 manifest list and manifest entry.
32+
class V3MetaData {
33+
public:
34+
/// \brief v3 manifest file wrapper.
35+
struct ManifestFileWrapper : public ManifestFile {
36+
explicit ManifestFileWrapper(int64_t commit_snapshotId, int64_t sequence_number) {}
37+
38+
ManifestFile wrap(ManifestFile file, int64_t first_row_id) { return *this; }
39+
};
40+
41+
/// \brief v3 manifest entry wrapper.
42+
struct ManifestEntryWrapper : public ManifestEntry {
43+
explicit ManifestEntryWrapper(int64_t commit_snapshot_id) {}
44+
45+
ManifestEntry wrap(ManifestEntry entry) { return *this; }
46+
};
47+
48+
static ManifestFileWrapper manifestFileWrapper(int64_t commit_snapshotId,
49+
int64_t sequence_number) {
50+
return ManifestFileWrapper(commit_snapshotId, sequence_number);
51+
}
52+
53+
static ManifestEntryWrapper manifestEntryWrapper(int64_t commit_snapshot_id) {
54+
return ManifestEntryWrapper(commit_snapshot_id);
55+
}
56+
};
57+
58+
} // namespace iceberg

0 commit comments

Comments
 (0)