Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-expr/src/dispatch/range/time_range.rs
7884 views
1
use polars_core::prelude::*;
2
use polars_time::{ClosedWindow, Duration, time_range_impl};
3
4
use super::utils::{
5
ensure_items_contain_exactly_one_value, temporal_ranges_impl_broadcast,
6
temporal_series_to_i64_scalar,
7
};
8
9
const CAPACITY_FACTOR: usize = 5;
10
11
pub(super) fn time_range(
12
s: &[Column],
13
interval: Duration,
14
closed: ClosedWindow,
15
) -> PolarsResult<Column> {
16
let start = &s[0];
17
let end = &s[1];
18
let name = start.name();
19
20
ensure_items_contain_exactly_one_value(&[start, end], &["start", "end"])?;
21
22
let dtype = DataType::Time;
23
let start = temporal_series_to_i64_scalar(&start.cast(&dtype)?)
24
.ok_or_else(|| polars_err!(ComputeError: "start is an out-of-range time."))?;
25
let end = temporal_series_to_i64_scalar(&end.cast(&dtype)?)
26
.ok_or_else(|| polars_err!(ComputeError: "end is an out-of-range time."))?;
27
28
let out = time_range_impl(name.clone(), start, end, interval, closed)?;
29
Ok(out.cast(&dtype).unwrap().into_column())
30
}
31
32
pub(super) fn time_ranges(
33
s: &[Column],
34
interval: Duration,
35
closed: ClosedWindow,
36
) -> PolarsResult<Column> {
37
let start = &s[0];
38
let end = &s[1];
39
40
let start = start.cast(&DataType::Time)?;
41
let end = end.cast(&DataType::Time)?;
42
43
let start_phys = start.to_physical_repr();
44
let end_phys = end.to_physical_repr();
45
let start = start_phys.i64().unwrap();
46
let end = end_phys.i64().unwrap();
47
48
let len = std::cmp::max(start.len(), end.len());
49
let mut builder = ListPrimitiveChunkedBuilder::<Int64Type>::new(
50
start.name().clone(),
51
len,
52
len * CAPACITY_FACTOR,
53
DataType::Int64,
54
);
55
56
let range_impl = |start, end, builder: &mut ListPrimitiveChunkedBuilder<Int64Type>| {
57
let rng = time_range_impl(PlSmallStr::EMPTY, start, end, interval, closed)?;
58
builder.append_slice(rng.physical().cont_slice().unwrap());
59
Ok(())
60
};
61
62
let out = temporal_ranges_impl_broadcast(start, end, range_impl, &mut builder)?;
63
64
let to_type = DataType::List(Box::new(DataType::Time));
65
out.cast(&to_type)
66
}
67
68