Extract best matching config entry

This commit is contained in:
Dominik Werder
2023-06-15 10:58:01 +02:00
parent f3bb7c4d6f
commit 3cd74601a4
2 changed files with 47 additions and 27 deletions

View File

@@ -1,5 +1,6 @@
use crate::timeunits::SEC;
use crate::Dim0Kind;
use crate::TsNano;
use chrono::DateTime;
use chrono::TimeZone;
use chrono::Utc;
@@ -23,19 +24,28 @@ pub struct NanoRange {
impl fmt::Debug for NanoRange {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let beg = chrono::Utc
.timestamp_opt((self.beg / SEC) as i64, (self.beg % SEC) as u32)
.earliest();
let end = chrono::Utc
.timestamp_opt((self.end / SEC) as i64, (self.end % SEC) as u32)
.earliest();
if let (Some(a), Some(b)) = (beg, end) {
f.debug_struct("NanoRange").field("beg", &a).field("end", &b).finish()
} else {
if true {
let beg = TsNano(self.beg);
let end = TsNano(self.end);
f.debug_struct("NanoRange")
.field("beg", &beg)
.field("end", &end)
.finish()
} else {
let beg = chrono::Utc
.timestamp_opt((self.beg / SEC) as i64, (self.beg % SEC) as u32)
.earliest();
let end = chrono::Utc
.timestamp_opt((self.end / SEC) as i64, (self.end % SEC) as u32)
.earliest();
if let (Some(a), Some(b)) = (beg, end) {
f.debug_struct("NanoRange").field("beg", &a).field("end", &b).finish()
} else {
f.debug_struct("NanoRange")
.field("beg", &beg)
.field("end", &end)
.finish()
}
}
}
}
@@ -51,6 +61,14 @@ impl NanoRange {
pub fn delta(&self) -> u64 {
self.end - self.beg
}
pub fn beg(&self) -> u64 {
self.beg
}
pub fn end(&self) -> u64 {
self.end
}
}
impl TryFrom<&SeriesRange> for NanoRange {

View File

@@ -465,7 +465,6 @@ pub fn extract_matching_config_entry<'a>(
.map({
let mut nx = None;
move |(i, x)| {
debug!("MAP ENTRY {i:3} {:?}", x.ts);
let k = nx.clone();
nx = Some(x.ts.clone());
(i, x, k)
@@ -477,40 +476,43 @@ pub fn extract_matching_config_entry<'a>(
.into_iter()
.rev()
.map(|(i, e, tsn)| {
//debug!("LOOK AT CONFIG ENTRY {:3} {:?} {:?}", i, e.ts, tsn);
let ret = if let Some(ts2) = tsn.clone() {
if e.ts.ns() < range.end {
let p = if e.ts.ns() < range.beg { range.beg } else { e.ts.ns() };
let q = if ts2.ns() < range.end { ts2.ns() } else { range.end };
//debug!("P/Q {:?} {:?}", TsNano(q - p), TsNano(p - q));
if let Some(ts2) = tsn.clone() {
if e.ts.ns() < range.end() {
let p = if e.ts.ns() < range.beg() {
range.beg()
} else {
e.ts.ns()
};
let q = if ts2.ns() < range.beg() {
range.beg()
} else {
if ts2.ns() < range.end() {
ts2.ns()
} else {
range.end()
}
};
(i, TsNano(q - p), e)
} else {
(i, TsNano(0), e)
}
} else {
if e.ts.ns() < range.end {
if e.ts.ns() < range.beg {
if e.ts.ns() < range.end() {
if e.ts.ns() < range.beg() {
(i, TsNano(range.delta()), e)
} else {
(i, TsNano(range.end - e.ts.ns()), e)
(i, TsNano(range.end() - e.ts.ns()), e)
}
} else {
(i, TsNano(0), e)
}
};
debug!("LOOK AT CONFIG ENTRY {:3} {:?} {:?} {:?}", i, e.ts, tsn, ret.1);
ret
}
})
.collect();
c.sort_unstable_by_key(|x| u64::MAX - x.1.ns());
for (i, dt, e) in &c[..c.len().min(3)] {
debug!("FOUND CONFIG IN ORDER {} {:?} {:?}", i, dt, e.ts);
}
if let Some(&(i, _, _)) = c.first() {
// TODO remove temporary
Ok(MatchingConfigEntry::Single(&channel_config.entries[i]))
} else {
Ok(MatchingConfigEntry::None)