Struct polars_core::chunked_array::object::builder::ObjectChunkedBuilder
source · pub struct ObjectChunkedBuilder<T> { /* private fields */ }Available on crate feature
object only.Implementations§
source§impl<T> ObjectChunkedBuilder<T>where
T: PolarsObject,
impl<T> ObjectChunkedBuilder<T>where
T: PolarsObject,
sourcepub fn new(name: &str, capacity: usize) -> Self
pub fn new(name: &str, capacity: usize) -> Self
Examples found in repository?
src/chunked_array/object/builder.rs (line 88)
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
fn default() -> Self {
ObjectChunkedBuilder::new("", 0)
}
}
impl<T> NewChunkedArray<ObjectType<T>, T> for ObjectChunked<T>
where
T: PolarsObject,
{
fn from_slice(name: &str, v: &[T]) -> Self {
Self::from_iter_values(name, v.iter().cloned())
}
fn from_slice_options(name: &str, opt_v: &[Option<T>]) -> Self {
let mut builder = ObjectChunkedBuilder::<T>::new(name, opt_v.len());
opt_v
.iter()
.cloned()
.for_each(|opt| builder.append_option(opt));
builder.finish()
}
fn from_iter_options(name: &str, it: impl Iterator<Item = Option<T>>) -> ObjectChunked<T> {
let mut builder = ObjectChunkedBuilder::new(name, get_iter_capacity(&it));
it.for_each(|opt| builder.append_option(opt));
builder.finish()
}
/// Create a new ChunkedArray from an iterator.
fn from_iter_values(name: &str, it: impl Iterator<Item = T>) -> ObjectChunked<T> {
let mut builder = ObjectChunkedBuilder::new(name, get_iter_capacity(&it));
it.for_each(|v| builder.append_value(v));
builder.finish()
}More examples
src/chunked_array/ops/chunkops.rs (line 156)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
pub(crate) fn rechunk_object(&self) -> Self {
if self.chunks.len() == 1 {
self.clone()
} else {
let mut builder = ObjectChunkedBuilder::new(self.name(), self.len());
let chunks = self.downcast_iter();
// todo! use iterators once implemented
// no_null path
if !self.has_validity() {
for arr in chunks {
for idx in 0..arr.len() {
builder.append_value(arr.value(idx).clone())
}
}
} else {
for arr in chunks {
for idx in 0..arr.len() {
if arr.is_valid(idx) {
builder.append_value(arr.value(idx).clone())
} else {
builder.append_null()
}
}
}
}
builder.finish()
}
}src/chunked_array/ops/filter.rs (line 169)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
fn filter(&self, filter: &BooleanChunked) -> PolarsResult<ChunkedArray<ObjectType<T>>>
where
Self: Sized,
{
// broadcast
if filter.len() == 1 {
return match filter.get(0) {
Some(true) => Ok(self.clone()),
_ => Ok(ObjectChunked::from_chunks(self.name(), vec![])),
};
}
if self.is_empty() {
return Err(PolarsError::NoData(
"cannot filter empty object array".into(),
));
}
let chunks = self.downcast_iter().collect::<Vec<_>>();
let mut builder = ObjectChunkedBuilder::<T>::new(self.name(), self.len());
for (idx, mask) in filter.into_iter().enumerate() {
if mask.unwrap_or(false) {
let (chunk_idx, idx) = self.index_to_chunked_index(idx);
unsafe {
let arr = chunks.get_unchecked(chunk_idx);
match arr.is_null(idx) {
true => builder.append_null(),
false => {
let v = arr.value(idx);
builder.append_value(v.clone())
}
}
}
}
}
Ok(builder.finish())
}sourcepub fn append_value(&mut self, v: T)
pub fn append_value(&mut self, v: T)
Appends a value of type T into the builder
Examples found in repository?
More examples
src/chunked_array/object/builder.rs (line 48)
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
pub fn append_value_from_any(&mut self, v: &dyn Any) -> PolarsResult<()> {
match v.downcast_ref::<T>() {
None => Err(PolarsError::SchemaMisMatch(
"cannot downcast any in ObjectBuilder".into(),
)),
Some(v) => {
self.append_value(v.clone());
Ok(())
}
}
}
#[inline]
pub fn append_option(&mut self, opt: Option<T>) {
match opt {
Some(s) => self.append_value(s),
None => self.append_null(),
}
}
pub fn finish(self) -> ObjectChunked<T> {
let null_bitmap: Option<Bitmap> = self.bitmask_builder.into();
let len = self.values.len();
let arr = Box::new(ObjectArray {
values: Arc::new(self.values),
null_bitmap,
offset: 0,
len,
});
ChunkedArray {
field: Arc::new(self.field),
chunks: vec![arr],
phantom: PhantomData,
bit_settings: Default::default(),
length: len as IdxSize,
}
}
}
impl<T> Default for ObjectChunkedBuilder<T>
where
T: PolarsObject,
{
fn default() -> Self {
ObjectChunkedBuilder::new("", 0)
}
}
impl<T> NewChunkedArray<ObjectType<T>, T> for ObjectChunked<T>
where
T: PolarsObject,
{
fn from_slice(name: &str, v: &[T]) -> Self {
Self::from_iter_values(name, v.iter().cloned())
}
fn from_slice_options(name: &str, opt_v: &[Option<T>]) -> Self {
let mut builder = ObjectChunkedBuilder::<T>::new(name, opt_v.len());
opt_v
.iter()
.cloned()
.for_each(|opt| builder.append_option(opt));
builder.finish()
}
fn from_iter_options(name: &str, it: impl Iterator<Item = Option<T>>) -> ObjectChunked<T> {
let mut builder = ObjectChunkedBuilder::new(name, get_iter_capacity(&it));
it.for_each(|opt| builder.append_option(opt));
builder.finish()
}
/// Create a new ChunkedArray from an iterator.
fn from_iter_values(name: &str, it: impl Iterator<Item = T>) -> ObjectChunked<T> {
let mut builder = ObjectChunkedBuilder::new(name, get_iter_capacity(&it));
it.for_each(|v| builder.append_value(v));
builder.finish()
}src/chunked_array/ops/chunkops.rs (line 164)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
pub(crate) fn rechunk_object(&self) -> Self {
if self.chunks.len() == 1 {
self.clone()
} else {
let mut builder = ObjectChunkedBuilder::new(self.name(), self.len());
let chunks = self.downcast_iter();
// todo! use iterators once implemented
// no_null path
if !self.has_validity() {
for arr in chunks {
for idx in 0..arr.len() {
builder.append_value(arr.value(idx).clone())
}
}
} else {
for arr in chunks {
for idx in 0..arr.len() {
if arr.is_valid(idx) {
builder.append_value(arr.value(idx).clone())
} else {
builder.append_null()
}
}
}
}
builder.finish()
}
}src/chunked_array/ops/filter.rs (line 179)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
fn filter(&self, filter: &BooleanChunked) -> PolarsResult<ChunkedArray<ObjectType<T>>>
where
Self: Sized,
{
// broadcast
if filter.len() == 1 {
return match filter.get(0) {
Some(true) => Ok(self.clone()),
_ => Ok(ObjectChunked::from_chunks(self.name(), vec![])),
};
}
if self.is_empty() {
return Err(PolarsError::NoData(
"cannot filter empty object array".into(),
));
}
let chunks = self.downcast_iter().collect::<Vec<_>>();
let mut builder = ObjectChunkedBuilder::<T>::new(self.name(), self.len());
for (idx, mask) in filter.into_iter().enumerate() {
if mask.unwrap_or(false) {
let (chunk_idx, idx) = self.index_to_chunked_index(idx);
unsafe {
let arr = chunks.get_unchecked(chunk_idx);
match arr.is_null(idx) {
true => builder.append_null(),
false => {
let v = arr.value(idx);
builder.append_value(v.clone())
}
}
}
}
}
Ok(builder.finish())
}sourcepub fn append_null(&mut self)
pub fn append_null(&mut self)
Appends a null slot into the builder
Examples found in repository?
More examples
src/chunked_array/ops/chunkops.rs (line 173)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
pub(crate) fn rechunk_object(&self) -> Self {
if self.chunks.len() == 1 {
self.clone()
} else {
let mut builder = ObjectChunkedBuilder::new(self.name(), self.len());
let chunks = self.downcast_iter();
// todo! use iterators once implemented
// no_null path
if !self.has_validity() {
for arr in chunks {
for idx in 0..arr.len() {
builder.append_value(arr.value(idx).clone())
}
}
} else {
for arr in chunks {
for idx in 0..arr.len() {
if arr.is_valid(idx) {
builder.append_value(arr.value(idx).clone())
} else {
builder.append_null()
}
}
}
}
builder.finish()
}
}src/chunked_array/ops/filter.rs (line 176)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
fn filter(&self, filter: &BooleanChunked) -> PolarsResult<ChunkedArray<ObjectType<T>>>
where
Self: Sized,
{
// broadcast
if filter.len() == 1 {
return match filter.get(0) {
Some(true) => Ok(self.clone()),
_ => Ok(ObjectChunked::from_chunks(self.name(), vec![])),
};
}
if self.is_empty() {
return Err(PolarsError::NoData(
"cannot filter empty object array".into(),
));
}
let chunks = self.downcast_iter().collect::<Vec<_>>();
let mut builder = ObjectChunkedBuilder::<T>::new(self.name(), self.len());
for (idx, mask) in filter.into_iter().enumerate() {
if mask.unwrap_or(false) {
let (chunk_idx, idx) = self.index_to_chunked_index(idx);
unsafe {
let arr = chunks.get_unchecked(chunk_idx);
match arr.is_null(idx) {
true => builder.append_null(),
false => {
let v = arr.value(idx);
builder.append_value(v.clone())
}
}
}
}
}
Ok(builder.finish())
}pub fn append_value_from_any(&mut self, v: &dyn Any) -> PolarsResult<()>
sourcepub fn append_option(&mut self, opt: Option<T>)
pub fn append_option(&mut self, opt: Option<T>)
Examples found in repository?
src/chunked_array/object/builder.rs (line 105)
100 101 102 103 104 105 106 107 108 109 110 111 112 113
fn from_slice_options(name: &str, opt_v: &[Option<T>]) -> Self {
let mut builder = ObjectChunkedBuilder::<T>::new(name, opt_v.len());
opt_v
.iter()
.cloned()
.for_each(|opt| builder.append_option(opt));
builder.finish()
}
fn from_iter_options(name: &str, it: impl Iterator<Item = Option<T>>) -> ObjectChunked<T> {
let mut builder = ObjectChunkedBuilder::new(name, get_iter_capacity(&it));
it.for_each(|opt| builder.append_option(opt));
builder.finish()
}More examples
src/chunked_array/object/extension/list.rs (line 47)
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
fn append_series(&mut self, s: &Series) {
let arr = s
.as_any()
.downcast_ref::<ObjectChunked<T>>()
.expect("series of type object");
for v in arr.into_iter() {
self.values_builder.append_option(v.cloned())
}
if arr.is_empty() {
self.fast_explode = false;
}
let len_so_far = self.offsets[self.offsets.len() - 1];
self.offsets.push(len_so_far + arr.len() as i64);
}sourcepub fn finish(self) -> ObjectChunked<T>
pub fn finish(self) -> ObjectChunked<T>
Examples found in repository?
More examples
src/chunked_array/object/builder.rs (line 106)
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
fn from_slice_options(name: &str, opt_v: &[Option<T>]) -> Self {
let mut builder = ObjectChunkedBuilder::<T>::new(name, opt_v.len());
opt_v
.iter()
.cloned()
.for_each(|opt| builder.append_option(opt));
builder.finish()
}
fn from_iter_options(name: &str, it: impl Iterator<Item = Option<T>>) -> ObjectChunked<T> {
let mut builder = ObjectChunkedBuilder::new(name, get_iter_capacity(&it));
it.for_each(|opt| builder.append_option(opt));
builder.finish()
}
/// Create a new ChunkedArray from an iterator.
fn from_iter_values(name: &str, it: impl Iterator<Item = T>) -> ObjectChunked<T> {
let mut builder = ObjectChunkedBuilder::new(name, get_iter_capacity(&it));
it.for_each(|v| builder.append_value(v));
builder.finish()
}src/chunked_array/ops/chunkops.rs (line 178)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
pub(crate) fn rechunk_object(&self) -> Self {
if self.chunks.len() == 1 {
self.clone()
} else {
let mut builder = ObjectChunkedBuilder::new(self.name(), self.len());
let chunks = self.downcast_iter();
// todo! use iterators once implemented
// no_null path
if !self.has_validity() {
for arr in chunks {
for idx in 0..arr.len() {
builder.append_value(arr.value(idx).clone())
}
}
} else {
for arr in chunks {
for idx in 0..arr.len() {
if arr.is_valid(idx) {
builder.append_value(arr.value(idx).clone())
} else {
builder.append_null()
}
}
}
}
builder.finish()
}
}src/chunked_array/ops/filter.rs (line 185)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
fn filter(&self, filter: &BooleanChunked) -> PolarsResult<ChunkedArray<ObjectType<T>>>
where
Self: Sized,
{
// broadcast
if filter.len() == 1 {
return match filter.get(0) {
Some(true) => Ok(self.clone()),
_ => Ok(ObjectChunked::from_chunks(self.name(), vec![])),
};
}
if self.is_empty() {
return Err(PolarsError::NoData(
"cannot filter empty object array".into(),
));
}
let chunks = self.downcast_iter().collect::<Vec<_>>();
let mut builder = ObjectChunkedBuilder::<T>::new(self.name(), self.len());
for (idx, mask) in filter.into_iter().enumerate() {
if mask.unwrap_or(false) {
let (chunk_idx, idx) = self.index_to_chunked_index(idx);
unsafe {
let arr = chunks.get_unchecked(chunk_idx);
match arr.is_null(idx) {
true => builder.append_null(),
false => {
let v = arr.value(idx);
builder.append_value(v.clone())
}
}
}
}
}
Ok(builder.finish())
}src/chunked_array/object/extension/list.rs (line 65)
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
fn finish(&mut self) -> ListChunked {
let values_builder = std::mem::take(&mut self.values_builder);
let offsets = std::mem::take(&mut self.offsets);
let ca = values_builder.finish();
let obj_arr = ca.downcast_chunks().get(0).unwrap().clone();
let mut pe = create_extension(obj_arr.into_iter_cloned());
// Safety:
// this is safe because we just created the PolarsExtension
// meaning that the sentinel is heap allocated and the dereference of the
// pointer does not fail
unsafe { pe.set_to_series_fn::<T>() };
let extension_array = Box::new(pe.take_and_forget()) as ArrayRef;
let extension_dtype = extension_array.data_type();
let data_type = ListArray::<i64>::default_datatype(extension_dtype.clone());
// Safety:
// offsets are monotonically increasing
let arr = unsafe {
Box::new(ListArray::<i64>::new(
data_type,
Offsets::new_unchecked(offsets).into(),
extension_array,
None,
)) as ArrayRef
};
let mut listarr = ListChunked::from_chunks(ca.name(), vec![arr]);
if self.fast_explode {
listarr.set_fast_explode()
}
listarr
}