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
+27 -9
View File
@@ -1,5 +1,6 @@
use crate::timeunits::SEC; use crate::timeunits::SEC;
use crate::Dim0Kind; use crate::Dim0Kind;
use crate::TsNano;
use chrono::DateTime; use chrono::DateTime;
use chrono::TimeZone; use chrono::TimeZone;
use chrono::Utc; use chrono::Utc;
@@ -23,19 +24,28 @@ pub struct NanoRange {
impl fmt::Debug for NanoRange { impl fmt::Debug for NanoRange {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let beg = chrono::Utc if true {
.timestamp_opt((self.beg / SEC) as i64, (self.beg % SEC) as u32) let beg = TsNano(self.beg);
.earliest(); let end = TsNano(self.end);
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") f.debug_struct("NanoRange")
.field("beg", &beg) .field("beg", &beg)
.field("end", &end) .field("end", &end)
.finish() .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 { pub fn delta(&self) -> u64 {
self.end - self.beg self.end - self.beg
} }
pub fn beg(&self) -> u64 {
self.beg
}
pub fn end(&self) -> u64 {
self.end
}
} }
impl TryFrom<&SeriesRange> for NanoRange { impl TryFrom<&SeriesRange> for NanoRange {
+20 -18
View File
@@ -465,7 +465,6 @@ pub fn extract_matching_config_entry<'a>(
.map({ .map({
let mut nx = None; let mut nx = None;
move |(i, x)| { move |(i, x)| {
debug!("MAP ENTRY {i:3} {:?}", x.ts);
let k = nx.clone(); let k = nx.clone();
nx = Some(x.ts.clone()); nx = Some(x.ts.clone());
(i, x, k) (i, x, k)
@@ -477,40 +476,43 @@ pub fn extract_matching_config_entry<'a>(
.into_iter() .into_iter()
.rev() .rev()
.map(|(i, e, tsn)| { .map(|(i, e, tsn)| {
//debug!("LOOK AT CONFIG ENTRY {:3} {:?} {:?}", i, e.ts, tsn); if let Some(ts2) = tsn.clone() {
let ret = if let Some(ts2) = tsn.clone() { if e.ts.ns() < range.end() {
if e.ts.ns() < range.end { let p = if e.ts.ns() < range.beg() {
let p = if e.ts.ns() < range.beg { range.beg } else { e.ts.ns() }; range.beg()
let q = if ts2.ns() < range.end { ts2.ns() } else { range.end }; } else {
//debug!("P/Q {:?} {:?}", TsNano(q - p), TsNano(p - q)); 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) (i, TsNano(q - p), e)
} else { } else {
(i, TsNano(0), e) (i, TsNano(0), e)
} }
} else { } else {
if e.ts.ns() < range.end { if e.ts.ns() < range.end() {
if e.ts.ns() < range.beg { if e.ts.ns() < range.beg() {
(i, TsNano(range.delta()), e) (i, TsNano(range.delta()), e)
} else { } else {
(i, TsNano(range.end - e.ts.ns()), e) (i, TsNano(range.end() - e.ts.ns()), e)
} }
} else { } else {
(i, TsNano(0), e) (i, TsNano(0), e)
} }
}; }
debug!("LOOK AT CONFIG ENTRY {:3} {:?} {:?} {:?}", i, e.ts, tsn, ret.1);
ret
}) })
.collect(); .collect();
c.sort_unstable_by_key(|x| u64::MAX - x.1.ns()); 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() { if let Some(&(i, _, _)) = c.first() {
// TODO remove temporary
Ok(MatchingConfigEntry::Single(&channel_config.entries[i])) Ok(MatchingConfigEntry::Single(&channel_config.entries[i]))
} else { } else {
Ok(MatchingConfigEntry::None) Ok(MatchingConfigEntry::None)