diff --git a/test/src/unit-capi-string_dims.cc b/test/src/unit-capi-string_dims.cc index e2d3135ebd96..b52143fb2113 100644 --- a/test/src/unit-capi-string_dims.cc +++ b/test/src/unit-capi-string_dims.cc @@ -58,14 +58,13 @@ struct StringDimsFx { tiledb_ctx_t* ctx_; tiledb_vfs_t* vfs_; - // Vector of supported filsystems - const std::vector> fs_vec_; - // Serialization parameters bool serialize_ = false; - bool refactored_query_v2_ = false; - // Buffers to allocate on server side for serialized queries - tiledb::test::ServerQueryBuffers server_buffers_; + + // Vector of supported filsystems + const std::vector> fs_vec_; + // Path to prepend to array name according to filesystem/mode + std::string prefix_; // Used to get the number of directories or files of another directory struct get_num_struct { @@ -179,9 +178,13 @@ StringDimsFx::StringDimsFx() : fs_vec_(vfs_test_get_fs_vec()) { // Initialize vfs test REQUIRE(vfs_test_init(fs_vec_, &ctx_, &vfs_).ok()); + auto temp_dir = fs_vec_[0]->temp_dir(); + create_temp_dir(temp_dir); + prefix_ = fs_vec_[0]->is_rest() ? "tiledb://unit/" + temp_dir : temp_dir; } StringDimsFx::~StringDimsFx() { + remove_temp_dir(fs_vec_[0]->temp_dir()); // Close vfs test REQUIRE(vfs_test_close(fs_vec_, ctx_, vfs_).ok()); tiledb_vfs_free(&vfs_); @@ -368,13 +371,11 @@ void StringDimsFx::write_array_1d( REQUIRE(rc == TILEDB_OK); // Submit query - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_); + if (layout == TILEDB_GLOBAL_ORDER) { + rc = tiledb_query_submit_and_finalize(ctx, query); + } else { + rc = tiledb_query_submit(ctx, query); + } CHECK(rc == TILEDB_OK); // Close array @@ -425,13 +426,11 @@ void StringDimsFx::write_array_2d( REQUIRE(rc == TILEDB_OK); // Submit query - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_); + if (layout == TILEDB_GLOBAL_ORDER) { + rc = tiledb_query_submit_and_finalize(ctx, query); + } else { + rc = tiledb_query_submit(ctx, query); + } CHECK(rc == TILEDB_OK); // Close array @@ -716,14 +715,7 @@ void StringDimsFx::read_array_1d( rc = tiledb_array_get_uri(ctx, array, &array_uri); CHECK(rc == TILEDB_OK); - rc = submit_query_wrapper( - ctx, - array_uri, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx, query); CHECK(rc == TILEDB_OK); // Get status @@ -837,14 +829,7 @@ void StringDimsFx::read_array_2d( const char* array_uri; rc = tiledb_array_get_uri(ctx, array, &array_uri); CHECK(rc == TILEDB_OK); - rc = submit_query_wrapper( - ctx, - array_uri, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx, query); CHECK(rc == TILEDB_OK); // Get status @@ -904,14 +889,7 @@ void StringDimsFx::read_array_2d_default_string_range( const char* array_uri; rc = tiledb_array_get_uri(ctx, array, &array_uri); CHECK(rc == TILEDB_OK); - rc = submit_query_wrapper( - ctx, - array_uri, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx, query); CHECK(rc == TILEDB_OK); // Get status @@ -931,21 +909,8 @@ void StringDimsFx::read_array_2d_default_string_range( TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, array schema", - "[capi][sparse][string-dims][array-schema]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][array-schema][rest]") { + std::string array_name = prefix_ + "string_dims"; // Create dimension tiledb_domain_t* domain; @@ -1035,29 +1000,14 @@ TEST_CASE_METHOD( tiledb_array_schema_free(&array_schema); tiledb_domain_free(&domain); tiledb_dimension_free(&d); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, check duplicates, global " "order", - "[capi][sparse][string-dims][duplicates][global]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][duplicates][global][rest]") { + std::string array_name = prefix_ + "string_dims"; create_array( ctx_, @@ -1102,14 +1052,7 @@ TEST_CASE_METHOD( REQUIRE(rc == TILEDB_OK); rc = tiledb_query_set_layout(ctx_, query, TILEDB_GLOBAL_ORDER); REQUIRE(rc == TILEDB_OK); - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx_, query); REQUIRE(rc == TILEDB_ERR); // Close array @@ -1119,29 +1062,14 @@ TEST_CASE_METHOD( // Clean up tiledb_array_free(&array); tiledb_query_free(&query); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, check duplicates, " "unordered", - "[capi][sparse][string-dims][duplicates][unordered]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][duplicates][unordered][rest]") { + std::string array_name = prefix_ + +"string_dims"; create_array( ctx_, @@ -1187,14 +1115,7 @@ TEST_CASE_METHOD( REQUIRE(rc == TILEDB_OK); rc = tiledb_query_set_layout(ctx_, query, TILEDB_UNORDERED); REQUIRE(rc == TILEDB_OK); - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx_, query); REQUIRE(rc == TILEDB_ERR); // Close array @@ -1204,29 +1125,14 @@ TEST_CASE_METHOD( // Clean up tiledb_array_free(&array); tiledb_query_free(&query); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, check global order " "violation", - "[capi][sparse][string-dims][global-order][violation]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][global-order][violation][rest]") { + std::string array_name = prefix_ + "string_dims"; create_array( ctx_, @@ -1272,14 +1178,7 @@ TEST_CASE_METHOD( REQUIRE(rc == TILEDB_OK); rc = tiledb_query_set_layout(ctx_, query, TILEDB_GLOBAL_ORDER); REQUIRE(rc == TILEDB_OK); - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx_, query); REQUIRE(rc == TILEDB_ERR); // Close array @@ -1289,28 +1188,13 @@ TEST_CASE_METHOD( // Clean up tiledb_array_free(&array); tiledb_query_free(&query); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, errors", - "[capi][sparse][string-dims][errors]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][errors][rest-fails][new]") { + std::string array_name = prefix_ + "string_dims"; // Create array create_array( @@ -1359,14 +1243,7 @@ TEST_CASE_METHOD( REQUIRE(rc == TILEDB_OK); rc = tiledb_query_set_layout(ctx_, query, TILEDB_UNORDERED); REQUIRE(rc == TILEDB_OK); - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx_, query); REQUIRE(rc == TILEDB_OK); // Close array @@ -1402,7 +1279,7 @@ TEST_CASE_METHOD( ctx_, query, TILEDB_COORDS, buff, &buff_size); REQUIRE(rc == TILEDB_ERR); int data[1]; - uint64_t data_size; + uint64_t data_size = 4; rc = tiledb_query_set_data_buffer(ctx_, query, "d", data, &data_size); REQUIRE(rc == TILEDB_OK); @@ -1419,28 +1296,13 @@ TEST_CASE_METHOD( // Clean up tiledb_array_free(&array); tiledb_query_free(&query); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, 1d", - "[capi][sparse][string-dims][1d][basic]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][1d][basic][rest]") { + std::string array_name = prefix_ + "string_dims"; // Create array create_array( @@ -1662,28 +1524,13 @@ TEST_CASE_METHOD( // Clean up tiledb_array_free(&array); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, 1d, consolidation", - "[capi][sparse][string-dims][1d][consolidation]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][1d][consolidation][non-rest]") { + std::string array_name = prefix_ + "string_dims"; // Create array create_array( @@ -1853,28 +1700,13 @@ TEST_CASE_METHOD( // Clean up tiledb_array_free(&array); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, 1d, allow duplicates", - "[capi][sparse][string-dims][1d][allow-dups]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][1d][allow-dups][rest]") { + std::string array_name = prefix_ + "string_dims"; // Create array create_array( @@ -1968,28 +1800,13 @@ TEST_CASE_METHOD( // Clean up tiledb_array_free(&array); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, 1d, dedup", - "[capi][sparse][string-dims][1d][dedup]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][1d][dedup][rest]") { + std::string array_name = prefix_ + "string_dims"; // Create array create_array( @@ -2100,28 +1917,13 @@ TEST_CASE_METHOD( // Clean up tiledb_array_free(&array); tiledb_ctx_free(&ctx); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, 2d", - "[capi][sparse][string-dims][2d]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][2d][rest]") { + std::string array_name = prefix_ + "string_dims"; // Create array int32_t dom[] = {1, 10}; @@ -2323,77 +2125,65 @@ TEST_CASE_METHOD( CHECK(rc == TILEDB_OK); tiledb_array_free(&array); - rc = tiledb_config_set(config, "sm.consolidation.mode", "fragments", &error); - CHECK(rc == TILEDB_OK); - - // Consolidate - rc = tiledb_array_consolidate(ctx_, array_name.c_str(), config); - CHECK(rc == TILEDB_OK); - rc = tiledb_array_vacuum(ctx_, array_name.c_str(), nullptr); - CHECK(rc == TILEDB_OK); - - // Open array - rc = tiledb_array_alloc(ctx_, array_name.c_str(), &array); - CHECK(rc == TILEDB_OK); - rc = tiledb_array_open(ctx_, array, TILEDB_READ); - CHECK(rc == TILEDB_OK); - - // Read [a, ff], [1, 10] - r_d1_off.resize(20); - r_d1_val.resize(20); - r_d2.resize(20); - r_a.resize(20); - read_array_2d( - ctx_, - array, - TILEDB_GLOBAL_ORDER, - "a", - "ff", - 1, - 10, - &r_d1_off, - &r_d1_val, - &r_d2, - &r_a, - &status); - CHECK(status == TILEDB_COMPLETED); - CHECK(r_d1_val == "aaabbbccddddff"); - c_d1_off = {0, 1, 3, 4, 6, 8, 12}; - CHECK(r_d1_off == c_d1_off); - c_d2 = {2, 1, 2, 2, 3, 4, 3}; - CHECK(r_d2 == c_d2); - c_a = {15, 11, 16, 12, 13, 14, 17}; - CHECK(r_a == c_a); - - // Close array - rc = tiledb_array_close(ctx_, array); - CHECK(rc == TILEDB_OK); - - // Clean up - tiledb_array_free(&array); - tiledb_config_free(&config); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + if (!fs_vec_[0]->is_rest()) { + rc = + tiledb_config_set(config, "sm.consolidation.mode", "fragments", &error); + CHECK(rc == TILEDB_OK); + + // Consolidate + rc = tiledb_array_consolidate(ctx_, array_name.c_str(), config); + CHECK(rc == TILEDB_OK); + rc = tiledb_array_vacuum(ctx_, array_name.c_str(), nullptr); + CHECK(rc == TILEDB_OK); + + // Open array + rc = tiledb_array_alloc(ctx_, array_name.c_str(), &array); + CHECK(rc == TILEDB_OK); + rc = tiledb_array_open(ctx_, array, TILEDB_READ); + CHECK(rc == TILEDB_OK); + + // Read [a, ff], [1, 10] + r_d1_off.resize(20); + r_d1_val.resize(20); + r_d2.resize(20); + r_a.resize(20); + read_array_2d( + ctx_, + array, + TILEDB_GLOBAL_ORDER, + "a", + "ff", + 1, + 10, + &r_d1_off, + &r_d1_val, + &r_d2, + &r_a, + &status); + CHECK(status == TILEDB_COMPLETED); + CHECK(r_d1_val == "aaabbbccddddff"); + c_d1_off = {0, 1, 3, 4, 6, 8, 12}; + CHECK(r_d1_off == c_d1_off); + c_d2 = {2, 1, 2, 2, 3, 4, 3}; + CHECK(r_d2 == c_d2); + c_a = {15, 11, 16, 12, 13, 14, 17}; + CHECK(r_a == c_a); + + // Close array + rc = tiledb_array_close(ctx_, array); + CHECK(rc == TILEDB_OK); + + // Clean up + tiledb_array_free(&array); + tiledb_config_free(&config); + } } TEST_CASE_METHOD( StringDimsFx, "C API: Test multiple var size global writes 1", - "[capi][sparse][var-size][multiple-global-writes-1]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][var-size][multiple-global-writes-1][rest-fails][new]") { + std::string array_name = prefix_ + "string_dims"; create_array( ctx_, @@ -2441,28 +2231,20 @@ TEST_CASE_METHOD( REQUIRE(rc == TILEDB_OK); // Submit query - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx_, query); CHECK(rc == TILEDB_OK); // Write "b, 2" d_data[0] = 'b'; a_data[0] = 2; + rc = tiledb_query_set_data_buffer(ctx_, query, "d", d_data, &d_data_size); + REQUIRE(rc == TILEDB_OK); + rc = tiledb_query_set_offsets_buffer(ctx_, query, "d", d_off, &d_off_size); + rc = tiledb_query_set_data_buffer(ctx_, query, "a", a_data, &a_size); + // Submit query - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_); + rc = tiledb_query_submit_and_finalize(ctx_, query); CHECK(rc == TILEDB_OK); // Close array @@ -2508,28 +2290,13 @@ TEST_CASE_METHOD( rc = tiledb_array_close(ctx_, array); CHECK(rc == TILEDB_OK); tiledb_array_free(&array); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test multiple var size global writes 2", - "[capi][sparse][var-size][multiple-global-writes-2]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][var-size][multiple-global-writes-2][rest-fails][new]") { + std::string array_name = prefix_ + "string_dims"; create_array( ctx_, @@ -2577,14 +2344,7 @@ TEST_CASE_METHOD( REQUIRE(rc == TILEDB_OK); // Submit query - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx_, query); CHECK(rc == TILEDB_OK); // Write "b, 2" @@ -2592,14 +2352,7 @@ TEST_CASE_METHOD( a_data[0] = 2; // Submit query - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_, - false); + rc = tiledb_query_submit(ctx_, query); CHECK(rc == TILEDB_OK); // Write c, 3; d, 4 and e, 5. @@ -2614,13 +2367,7 @@ TEST_CASE_METHOD( a_size = 3 * sizeof(int32_t); // Submit query - rc = submit_query_wrapper( - ctx_, - array_name, - &query, - server_buffers_, - serialize_, - refactored_query_v2_); + rc = tiledb_query_submit_and_finalize(ctx_, query); CHECK(rc == TILEDB_OK); // Close array @@ -2666,28 +2413,13 @@ TEST_CASE_METHOD( rc = tiledb_array_close(ctx_, array); CHECK(rc == TILEDB_OK); tiledb_array_free(&array); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); } TEST_CASE_METHOD( StringDimsFx, "C API: Test sparse array with string dimensions, 2d, default ranges", - "[capi][sparse][string-dims][2d][default-ranges]") { - SECTION("- No serialization") { - serialize_ = false; - } -#ifdef TILEDB_SERIALIZATION - SECTION("- Serialization") { - serialize_ = true; - refactored_query_v2_ = GENERATE(true, false); - } -#endif - - SupportedFsLocal local_fs; - std::string array_name = - local_fs.file_prefix() + local_fs.temp_dir() + "string_dims"; - create_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); + "[capi][sparse][string-dims][2d][default-ranges][rest]") { + std::string array_name = prefix_ + "string_dims"; // Create array int32_t dom[] = {1, 10}; @@ -2848,6 +2580,4 @@ TEST_CASE_METHOD( // Clean up tiledb_config_free(&config); - - remove_temp_dir(local_fs.file_prefix() + local_fs.temp_dir()); }