@@ -111,20 +111,15 @@ class base_index_group {
111111
112112 std::unordered_map<std::string, std::string> array_key_to_array_name_;
113113
114- /* * Check validity of key name */
115- constexpr bool is_valid_key_name (const std::string& key_name) const noexcept {
116- return valid_array_keys_.contains (key_name);
117- }
118-
119- /* * Check validity of array name */
120- constexpr bool is_valid_array_name (
121- const std::string& array_name) const noexcept {
122- return valid_array_names_.contains (array_name);
123- }
114+ // Maps from the array name (not the key) to the URI of the array. Should be
115+ // used to get array URI's because the group_uri_ may be of the form
116+ // `tiledb://foo/edc4656a-3f45-43a1-8ee5-fa692a015c53` which cannot have the
117+ // array name added as a suffix.
118+ std::unordered_map<std::string, std::string> array_name_to_uri_;
124119
125120 /* * Lookup an array name given an array key */
126121 constexpr auto array_key_to_array_name (const std::string& array_key) const {
127- if (!is_valid_key_name (array_key)) {
122+ if (!valid_array_keys_. contains (array_key)) {
128123 throw std::runtime_error (" Invalid array key: " + array_key);
129124 }
130125 return array_key_to_array_name_from_map (
@@ -140,29 +135,12 @@ class base_index_group {
140135 valid_array_keys_.insert (array_key);
141136 valid_array_names_.insert (array_name);
142137 array_key_to_array_name_[array_key] = array_name;
138+ array_name_to_uri_[array_name] =
139+ array_name_to_uri (group_uri_, array_name);
143140 }
144141 static_cast <group_type*>(this )->append_valid_array_names_impl ();
145142 }
146143
147- /* *
148- * @brief Add an array to the group.
149- *
150- * @param array_name
151- *
152- * @todo Could have type of array set here instead of by Index. Might be
153- * better to have it set in conjunction with array being set?
154- */
155- auto init_array_for_create (const std::string& array_name) {
156- if (!is_valid_array_name (array_name)) {
157- throw std::runtime_error (
158- " Invalid array name in add_array: " + array_name);
159- }
160-
161- std::filesystem::path uri = array_name_to_uri (array_name);
162-
163- return uri;
164- }
165-
166144 /* *
167145 * Open group for reading. If version_ is not set, the group will be opened
168146 * with whichever version is found in the metadata. If version_ is set,
@@ -201,10 +179,17 @@ class base_index_group {
201179 if (!name || name->empty ()) {
202180 throw std::runtime_error (" Name is empty." );
203181 }
204- if (!is_valid_array_name (*name)) {
182+ auto uri = member.uri ();
183+ if (uri.empty ()) {
184+ throw std::runtime_error (" Uri is empty." );
185+ }
186+
187+ if (!valid_array_names_.contains (*name)) {
205188 throw std::runtime_error (
206189 " Invalid array name in group: " + std::string (*name));
207190 }
191+
192+ array_name_to_uri_[*name] = uri;
208193 }
209194 }
210195
@@ -278,17 +263,16 @@ class base_index_group {
278263 static_cast <group_type*>(this )->create_default_impl (cfg);
279264 }
280265
281- /* * Convert an array name to a uri. */
282- constexpr std::string array_name_to_uri (
283- const std::string& array_name) const noexcept {
284- return array_name_to_uri (group_uri_, array_name);
285- }
286-
287266 /* * Convert an array key to a uri. */
288267 constexpr std::string array_key_to_uri (const std::string& array_key) const {
289- return (std::filesystem::path{group_uri_} /
290- std::filesystem::path{array_key_to_array_name (array_key)})
291- .string ();
268+ auto name = array_key_to_array_name (array_key);
269+ if (array_name_to_uri_.find (name) == array_name_to_uri_.end ()) {
270+ throw std::runtime_error (
271+ " Invalid key when getting the URI: " + array_key +
272+ " . Name does not exist: " + name);
273+ }
274+
275+ return array_name_to_uri_.at (name);
292276 }
293277
294278 public:
0 commit comments