@@ -354,3 +354,130 @@ TEST_CASE_METHOD(
354354 vfs.remove_dir (array_name);
355355 }
356356}
357+
358+ TEST_CASE_METHOD (
359+ CurrentDomainFx,
360+ " C++ API: CurrentDomain - Read cells written outside of shape" ,
361+ " [cppapi][ArraySchema][currentDomain][luc]" ) {
362+ const std::string array_name = " test_current_domain_read" ;
363+
364+ tiledb::VFS vfs (ctx_);
365+ if (vfs.is_dir (array_name)) {
366+ vfs.remove_dir (array_name);
367+ }
368+
369+ // Create domain
370+ tiledb::Domain domain (ctx_);
371+ auto d1 = tiledb::Dimension::create<int32_t >(ctx_, " dim1" , {{0 , 100 }}, 10 );
372+ auto d2 = tiledb::Dimension::create (
373+ ctx_, " dim2" , TILEDB_STRING_ASCII, nullptr , nullptr );
374+ domain.add_dimension (d1);
375+ domain.add_dimension (d2);
376+
377+ // Create array schema.
378+ tiledb::ArraySchema schema (ctx_, TILEDB_SPARSE);
379+ schema.set_domain (domain);
380+ schema.add_attribute (tiledb::Attribute::create<int >(ctx_, " a" ));
381+
382+ // Create array
383+ tiledb::Array::create (array_name, schema);
384+
385+ tiledb::Array array (ctx_, array_name, TILEDB_WRITE);
386+
387+ // Some of the data here is outside of the current domain we will set later.
388+ std::vector<int32_t > dim1 = {12 , 14 , 16 , 18 };
389+ std::vector<char > dim2 = {' b' , ' a' , ' b' , ' c' };
390+ std::vector<uint64_t > dim2_offsets = {0 , 1 , 2 , 3 };
391+ std::vector<int > a1 = {1 , 2 , 3 , 4 };
392+
393+ // All data in current domain.
394+ tiledb::Query query (ctx_, array, TILEDB_WRITE);
395+ query.set_layout (TILEDB_UNORDERED)
396+ .set_data_buffer (" a" , a1)
397+ .set_data_buffer (" dim1" , dim1)
398+ .set_offsets_buffer (" dim2" , dim2_offsets)
399+ .set_data_buffer (" dim2" , dim2);
400+ query.submit ();
401+ array.close ();
402+
403+ // Create new currentDomain to allow all data
404+ tiledb::CurrentDomain current_domain (ctx_);
405+ int range[] = {10 , 16 };
406+ tiledb::NDRectangle ndrect (ctx_, domain);
407+ ndrect.set_range (0 , range[0 ], range[1 ]);
408+ ndrect.set_range (1 , std::string (" b" ), std::string (" c" ));
409+ current_domain.set_ndrectangle (ndrect);
410+
411+ // Schema evolution
412+ tiledb::ArraySchemaEvolution se (ctx_);
413+ se.expand_current_domain (current_domain);
414+ se.array_evolve (array_name);
415+
416+ std::vector<int32_t > dim1_read (100 );
417+ std::vector<char > dim2_read (100 );
418+ std::vector<uint64_t > dim2_offsets_read (100 );
419+ std::vector<int > a1_read (100 );
420+
421+ // Now try to read data.
422+ tiledb::Array array_read (ctx_, array_name, TILEDB_READ);
423+ tiledb::Query query_read (ctx_, array_read, TILEDB_READ);
424+ query_read.set_layout (TILEDB_UNORDERED)
425+ .set_data_buffer (" a" , a1_read)
426+ .set_data_buffer (" dim1" , dim1_read)
427+ .set_offsets_buffer (" dim2" , dim2_offsets_read)
428+ .set_data_buffer (" dim2" , dim2_read);
429+ query_read.submit ();
430+
431+ // Validate we got two results.
432+ auto res = query_read.result_buffer_elements ();
433+ CHECK (res[" a" ].second == 2 );
434+ CHECK (res[" dim1" ].second == 2 );
435+ CHECK (res[" dim2" ].first == 2 );
436+ CHECK (res[" dim2" ].second == 2 );
437+ CHECK (a1_read[0 ] == 1 );
438+ CHECK (a1_read[1 ] == 3 );
439+ CHECK (dim1_read[0 ] == 12 );
440+ CHECK (dim1_read[1 ] == 16 );
441+ CHECK (dim2_offsets_read[0 ] == 0 );
442+ CHECK (dim2_offsets_read[1 ] == 1 );
443+ CHECK (dim2_read[0 ] == ' b' );
444+ CHECK (dim2_read[1 ] == ' b' );
445+
446+ // Now try to read data with ranges outside of current domain
447+ tiledb::Query query_read2 (ctx_, array_read, TILEDB_READ);
448+ tiledb::Subarray subarray_read2 (ctx_, array_read);
449+
450+ subarray_read2.add_range <int32_t >(0 , 12 , 16 ).add_range (0 , 17 , 20 );
451+ query_read2.set_layout (TILEDB_UNORDERED)
452+ .set_data_buffer (" a" , a1_read)
453+ .set_data_buffer (" dim1" , dim1_read)
454+ .set_offsets_buffer (" dim2" , dim2_offsets_read)
455+ .set_data_buffer (" dim2" , dim2_read)
456+ .set_subarray (subarray_read2);
457+ CHECK_THROWS_WITH (
458+ query_read2.submit (),
459+ Catch::Matchers::ContainsSubstring (
460+ " A range was set outside of the current domain." ));
461+
462+ tiledb::Query query_read3 (ctx_, array_read, TILEDB_READ);
463+ tiledb::Subarray subarray_read3 (ctx_, array_read);
464+
465+ subarray_read3.add_range (1 , std::string (" a" ), std::string (" b" ));
466+ query_read3.set_layout (TILEDB_UNORDERED)
467+ .set_data_buffer (" a" , a1_read)
468+ .set_data_buffer (" dim1" , dim1_read)
469+ .set_offsets_buffer (" dim2" , dim2_offsets_read)
470+ .set_data_buffer (" dim2" , dim2_read)
471+ .set_subarray (subarray_read3);
472+ CHECK_THROWS_WITH (
473+ query_read3.submit (),
474+ Catch::Matchers::ContainsSubstring (
475+ " A range was set outside of the current domain." ));
476+
477+ array_read.close ();
478+
479+ // Clean up.
480+ if (vfs.is_dir (array_name)) {
481+ vfs.remove_dir (array_name);
482+ }
483+ }
0 commit comments