Skip to content

Commit c9c34db

Browse files
authored
Merge pull request #153 from LDeakin/chunking
Add `Variable::chunking`
2 parents e7c28ac + 0c015ab commit c9c34db

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

netcdf/src/variable.rs

+22
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,28 @@ impl<'g> Variable<'g> {
206206
pub fn access_collective(&self) -> error::Result<()> {
207207
self.access_mode(crate::par::AccessMode::Collective)
208208
}
209+
210+
/// Get the chunking for the variable.
211+
/// Returns None for a contiguous variable.
212+
///
213+
/// # Errors
214+
///
215+
/// Not a `netCDF-4` file.
216+
pub fn chunking(&self) -> error::Result<Option<Vec<usize>>> {
217+
if self.dimensions.is_empty() {
218+
return Ok(None);
219+
}
220+
let mut storage = 0;
221+
let mut chunk_size = vec![0; self.dimensions.len()];
222+
checked_with_lock(|| unsafe {
223+
nc_inq_var_chunking(self.ncid, self.varid, &mut storage, chunk_size.as_mut_ptr())
224+
})?;
225+
if storage == NC_CHUNKED {
226+
Ok(Some(chunk_size))
227+
} else {
228+
Ok(None)
229+
}
230+
}
209231
}
210232
impl<'g> VariableMut<'g> {
211233
/// Sets compression on the variable. Must be set before filling in data.

netcdf/tests/group.rs

+3
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,16 @@ fn find_variable() {
6666
assert!(group.variable("vvvvv").is_none());
6767

6868
for mut var in group.variables_mut() {
69+
assert_eq!(var.chunking().unwrap(), None);
6970
if !var.dimensions().is_empty() {
7071
var.set_compression(3, false).unwrap();
7172
}
7273
if var.name() == "z" {
7374
var.set_chunking(&[1]).unwrap();
75+
assert_eq!(var.chunking().unwrap(), Some(vec![1]));
7476
} else {
7577
var.set_chunking(&[]).unwrap();
78+
assert_eq!(var.chunking().unwrap(), None);
7679
}
7780
}
7881
}

netcdf/tests/lib.rs

+6
Original file line numberDiff line numberDiff line change
@@ -843,17 +843,21 @@ fn use_compression_chunking() {
843843
file.add_dimension("x", 10).unwrap();
844844

845845
let var = &mut file.add_variable::<i32>("compressed", &["x"]).unwrap();
846+
assert_eq!(var.chunking().unwrap(), None);
846847
var.set_compression(5, false).unwrap();
847848
var.set_chunking(&[5]).unwrap();
849+
assert_eq!(var.chunking().unwrap(), Some(vec![5]));
848850

849851
let v = vec![0i32; 10];
850852
var.put_values(&v, ..).unwrap();
851853

852854
let var = &mut file
853855
.add_variable::<i32>("compressed2", &["x", "x"])
854856
.unwrap();
857+
assert_eq!(var.chunking().unwrap(), None);
855858
var.set_compression(9, true).unwrap();
856859
var.set_chunking(&[5, 5]).unwrap();
860+
assert_eq!(var.chunking().unwrap(), Some(vec![5, 5]));
857861
var.put_values(&[1i32, 2, 3, 4, 5, 6, 7, 8, 9, 10], (..10, ..1))
858862
.unwrap();
859863

@@ -866,7 +870,9 @@ fn use_compression_chunking() {
866870
file.add_dimension("y", 0).unwrap();
867871
let var = &mut file.add_variable::<u8>("chunked4", &["y", "x"]).unwrap();
868872

873+
assert_eq!(var.chunking().unwrap(), Some(vec![1, 10])); // unlimited dim enables chunking
869874
var.set_chunking(&[100, 2]).unwrap();
875+
assert_eq!(var.chunking().unwrap(), Some(vec![100, 2]));
870876
}
871877

872878
#[test]

0 commit comments

Comments
 (0)