Skip to content

Commit

Permalink
Rewrap Filter and FilterList
Browse files Browse the repository at this point in the history
This updates the first APIs I wrapped to use the both the builder
pattern as well as tracking their own context references.
  • Loading branch information
davisp committed Mar 22, 2024
1 parent 18c66b2 commit 01043d0
Show file tree
Hide file tree
Showing 5 changed files with 639 additions and 488 deletions.
47 changes: 22 additions & 25 deletions tiledb/api/src/array/attribute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pub use tiledb_sys::Datatype;
use crate::context::Context;
use crate::convert::CAPIConverter;
use crate::error::Error;
use crate::filter_list::FilterList;
use crate::filter_list::{FilterList, RawFilterList};
use crate::Result as TileDBResult;

pub(crate) enum RawAttribute {
Expand Down Expand Up @@ -93,7 +93,7 @@ impl<'ctx> Attribute<'ctx> {
c_nullable == 1
}

pub fn filter_list(&self) -> TileDBResult<FilterList> {
pub fn filter_list(&self) -> TileDBResult<FilterList<'ctx>> {
let c_context = self.context.capi();
let mut c_flist: *mut ffi::tiledb_filter_list_t = out_ptr!();
let res = unsafe {
Expand All @@ -104,7 +104,10 @@ impl<'ctx> Attribute<'ctx> {
)
};
if res == ffi::TILEDB_OK {
Ok(FilterList { _wrapped: c_flist })
Ok(FilterList {
context: self.context,
raw: RawFilterList::Owned(c_flist),
})
} else {
Err(self.context.expect_last_error())
}
Expand Down Expand Up @@ -392,8 +395,8 @@ impl<'ctx> Builder<'ctx> {
#[cfg(test)]
mod test {
use super::*;
use crate::filter::Filter;
pub use tiledb_sys::FilterType;
use crate::filter::*;
use crate::filter_list::Builder as FilterListBuilder;

#[test]
fn attribute_get_name_and_type() {
Expand Down Expand Up @@ -434,7 +437,7 @@ mod test {
}

#[test]
fn attribute_get_set_filter_list() {
fn attribute_get_set_filter_list() -> TileDBResult<()> {
let ctx = Context::new().expect("Error creating context instance.");

{
Expand All @@ -446,29 +449,21 @@ mod test {
.filter_list()
.expect("Error getting attribute filter list.");
let nfilters = flist1
.get_num_filters(&ctx)
.get_num_filters()
.expect("Error getting number of filters.");
assert_eq!(nfilters, 0);
}

{
let f1 = Filter::new(&ctx, FilterType::NONE)
.expect("Error creating filter 1.");
let f2 = Filter::new(&ctx, FilterType::BIT_WIDTH_REDUCTION)
.expect("Error creating filter 2.");
let f3 = Filter::new(&ctx, FilterType::ZSTD)
.expect("Error creating filter 3.");
let mut flist2 =
FilterList::new(&ctx).expect("Error creating filter list.");
flist2
.add_filter(&ctx, &f1)
.expect("Error adding filter 1 to list.");
flist2
.add_filter(&ctx, &f2)
.expect("Error adding filter 2 to list.");
flist2
.add_filter(&ctx, &f3)
.expect("Error adding filter 3 to list.");
let flist2 = FilterListBuilder::new(&ctx)
.expect("Error creating filter list builder.")
.add_filter(NoopFilterBuilder::new(&ctx)?.build())?
.add_filter(BitWidthReductionFilterBuilder::new(&ctx)?.build())?
.add_filter(
CompressionFilterBuilder::new(&ctx, CompressionType::Zstd)?
.build(),
)?
.build();

let attr = Builder::new(&ctx, "foo", Datatype::UInt8)
.expect("Error creating attribute instance.")
Expand All @@ -479,10 +474,12 @@ mod test {
let flist3 =
attr.filter_list().expect("Error getting filter list.");
let nfilters = flist3
.get_num_filters(&ctx)
.get_num_filters()
.expect("Error getting number of filters.");
assert_eq!(nfilters, 3);
}

Ok(())
}

#[test]
Expand Down
37 changes: 23 additions & 14 deletions tiledb/api/src/array/dimension.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use serde_json::json;

use crate::context::Context;
use crate::convert::CAPIConverter;
use crate::filter_list::FilterList;
use crate::filter_list::{FilterList, RawFilterList};
use crate::fn_typed;
use crate::Datatype;
use crate::Result as TileDBResult;
Expand Down Expand Up @@ -100,7 +100,10 @@ impl<'ctx> Dimension<'ctx> {
// only fails if dimension is invalid, which Rust API will prevent
assert_eq!(ffi::TILEDB_OK, c_ret);

FilterList { _wrapped: c_fl }
FilterList {
context: self.context,
raw: RawFilterList::Owned(c_fl),
}
}
}

Expand Down Expand Up @@ -197,7 +200,8 @@ impl<'ctx> From<Builder<'ctx>> for Dimension<'ctx> {
#[cfg(test)]
mod tests {
use crate::array::dimension::*;
use crate::filter::Filter;
use crate::filter::*;
use crate::filter_list::Builder as FilterListBuilder;

#[test]
fn test_dimension_alloc() {
Expand Down Expand Up @@ -273,7 +277,7 @@ mod tests {
}

#[test]
fn test_dimension_filter_list() {
fn test_dimension_filter_list() -> TileDBResult<()> {
let context = Context::new().unwrap();

// none set
Expand All @@ -291,16 +295,22 @@ mod tests {
.into();

let fl = dimension.filters();
assert_eq!(0, fl.get_num_filters(&context).unwrap());
assert_eq!(0, fl.get_num_filters().unwrap());
}

// with some
{
let domain: [i32; 2] = [1, 4];
let extent: i32 = 4;
let lz4 = Filter::new(&context, ffi::FilterType::LZ4).unwrap();
let mut fl = FilterList::new(&context).unwrap();
fl.add_filter(&context, &lz4).unwrap();
let fl = FilterListBuilder::new(&context)?
.add_filter(
CompressionFilterBuilder::new(
&context,
CompressionType::Lz4,
)?
.build(),
)?
.build();
let dimension: Dimension = Builder::new::<i32>(
&context,
"test_dimension_alloc",
Expand All @@ -314,13 +324,12 @@ mod tests {
.into();

let fl = dimension.filters();
assert_eq!(1, fl.get_num_filters(&context).unwrap());
assert_eq!(1, fl.get_num_filters().unwrap());

let outlz4 = fl.get_filter(&context, 0).unwrap();
assert_eq!(
ffi::FilterType::LZ4,
outlz4.get_type(&context).unwrap()
);
let outlz4 = fl.get_filter(0).unwrap();
assert_eq!(ffi::FilterType::Lz4, outlz4.get_type().unwrap());
}

Ok(())
}
}
Loading

0 comments on commit 01043d0

Please sign in to comment.