3434#include " iceberg/catalog/rest/rest_catalog.h"
3535#include " iceberg/catalog/rest/rest_util.h"
3636#include " iceberg/json_internal.h"
37+ #include " iceberg/partition_spec.h"
3738#include " iceberg/result.h"
39+ #include " iceberg/schema.h"
3840#include " iceberg/table.h"
3941#include " iceberg/util/macros.h"
4042
@@ -99,7 +101,7 @@ Result<std::vector<Namespace>> RestCatalog::ListNamespaces(const Namespace& ns)
99101 if (!next_token.empty ()) {
100102 params[kQueryParamPageToken ] = next_token;
101103 }
102- ICEBERG_ASSIGN_OR_RAISE (const auto & response,
104+ ICEBERG_ASSIGN_OR_RAISE (const auto response,
103105 client_->Get (endpoint, params, /* headers=*/ {},
104106 *NamespaceErrorHandler::Instance ()));
105107 ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.body ()));
@@ -115,29 +117,69 @@ Result<std::vector<Namespace>> RestCatalog::ListNamespaces(const Namespace& ns)
115117}
116118
117119Status RestCatalog::CreateNamespace (
118- [[maybe_unused]] const Namespace& ns,
119- [[maybe_unused]] const std::unordered_map<std::string, std::string>& properties) {
120- return NotImplemented (" Not implemented" );
120+ const Namespace& ns, const std::unordered_map<std::string, std::string>& properties) {
121+ ICEBERG_ASSIGN_OR_RAISE (auto endpoint, paths_->Namespaces ());
122+ CreateNamespaceRequest request{.namespace_ = ns, .properties = properties};
123+ ICEBERG_ASSIGN_OR_RAISE (auto json_request, ToJsonString (ToJson (request)));
124+ ICEBERG_ASSIGN_OR_RAISE (const auto response,
125+ client_->Post (endpoint, json_request, /* headers=*/ {},
126+ *NamespaceErrorHandler::Instance ()));
127+ ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.body ()));
128+ ICEBERG_ASSIGN_OR_RAISE (auto create_response, CreateNamespaceResponseFromJson (json));
129+ return {};
121130}
122131
123132Result<std::unordered_map<std::string, std::string>> RestCatalog::GetNamespaceProperties (
124- [[maybe_unused]] const Namespace& ns) const {
125- return NotImplemented (" Not implemented" );
126- }
127-
128- Status RestCatalog::DropNamespace ([[maybe_unused]] const Namespace& ns) {
129- return NotImplemented (" Not implemented" );
133+ const Namespace& ns) const {
134+ ICEBERG_ASSIGN_OR_RAISE (auto endpoint, paths_->Namespace_ (ns));
135+ ICEBERG_ASSIGN_OR_RAISE (const auto response,
136+ client_->Get (endpoint, /* params=*/ {}, /* headers=*/ {},
137+ *NamespaceErrorHandler::Instance ()));
138+ ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.body ()));
139+ ICEBERG_ASSIGN_OR_RAISE (auto get_response, GetNamespaceResponseFromJson (json));
140+ return get_response.properties ;
130141}
131142
132- Result<bool > RestCatalog::NamespaceExists ([[maybe_unused]] const Namespace& ns) const {
133- return NotImplemented (" Not implemented" );
143+ Status RestCatalog::DropNamespace (const Namespace& ns) {
144+ ICEBERG_ASSIGN_OR_RAISE (auto endpoint, paths_->Namespace_ (ns));
145+ ICEBERG_ASSIGN_OR_RAISE (
146+ const auto response,
147+ client_->Delete (endpoint, /* headers=*/ {}, *DropNamespaceErrorHandler::Instance ()));
148+ return {};
149+ }
150+
151+ Result<bool > RestCatalog::NamespaceExists (const Namespace& ns) const {
152+ ICEBERG_ASSIGN_OR_RAISE (auto endpoint, paths_->Namespace_ (ns));
153+ // TODO(Feiyang Li): checks if the server supports the namespace exists endpoint, if
154+ // not, triggers a fallback mechanism
155+ auto response_or_error =
156+ client_->Head (endpoint, /* headers=*/ {}, *NamespaceErrorHandler::Instance ());
157+ if (!response_or_error.has_value ()) {
158+ const auto & error = response_or_error.error ();
159+ // catch NoSuchNamespaceException/404 and return false
160+ if (error.kind == ErrorKind::kNoSuchNamespace ) {
161+ return false ;
162+ }
163+ ICEBERG_RETURN_UNEXPECTED (response_or_error);
164+ }
165+ return true ;
134166}
135167
136168Status RestCatalog::UpdateNamespaceProperties (
137- [[maybe_unused]] const Namespace& ns,
138- [[maybe_unused]] const std::unordered_map<std::string, std::string>& updates,
139- [[maybe_unused]] const std::unordered_set<std::string>& removals) {
140- return NotImplemented (" Not implemented" );
169+ const Namespace& ns, const std::unordered_map<std::string, std::string>& updates,
170+ const std::unordered_set<std::string>& removals) {
171+ ICEBERG_ASSIGN_OR_RAISE (auto endpoint, paths_->NamespaceProperties (ns));
172+ UpdateNamespacePropertiesRequest request{
173+ .removals = std::vector<std::string>(removals.begin (), removals.end ()),
174+ .updates = updates};
175+ ICEBERG_ASSIGN_OR_RAISE (auto json_request, ToJsonString (ToJson (request)));
176+ ICEBERG_ASSIGN_OR_RAISE (const auto response,
177+ client_->Post (endpoint, json_request, /* headers=*/ {},
178+ *NamespaceErrorHandler::Instance ()));
179+ ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.body ()));
180+ ICEBERG_ASSIGN_OR_RAISE (auto update_response,
181+ UpdateNamespacePropertiesResponseFromJson (json));
182+ return {};
141183}
142184
143185Result<std::vector<TableIdentifier>> RestCatalog::ListTables (
0 commit comments