WIP
This commit is contained in:
@@ -19,6 +19,7 @@ arrayref = "0.3.6"
|
||||
crc32fast = "1.3.2"
|
||||
byteorder = "1.4.3"
|
||||
async-channel = "1.8.0"
|
||||
rand_xoshiro = "0.6.0"
|
||||
chrono = { version = "0.4.19", features = ["serde"] }
|
||||
wasmer = { version = "4.1.0", default-features = false, features = ["sys", "cranelift"], optional = true }
|
||||
err = { path = "../err" }
|
||||
|
||||
@@ -15,16 +15,11 @@ use std::sync::Arc;
|
||||
use std::task::Context;
|
||||
use std::task::Poll;
|
||||
|
||||
type ChEvsBox = Pin<Box<dyn Stream<Item = Sitemty<ChannelEvents>> + Send>>;
|
||||
|
||||
enum StreamState {
|
||||
Opening(
|
||||
Pin<
|
||||
Box<
|
||||
dyn Future<Output = Result<Pin<Box<dyn Stream<Item = Sitemty<ChannelEvents>> + Send>>, ::err::Error>>
|
||||
+ Send,
|
||||
>,
|
||||
>,
|
||||
),
|
||||
Reading(Pin<Box<dyn Stream<Item = Sitemty<ChannelEvents>> + Send>>),
|
||||
Opening(Pin<Box<dyn Future<Output = Result<ChEvsBox, ::err::Error>> + Send>>),
|
||||
Reading(ChEvsBox),
|
||||
}
|
||||
|
||||
struct InnerStream {
|
||||
|
||||
@@ -22,6 +22,7 @@ pub mod slidebuf;
|
||||
pub mod tcprawclient;
|
||||
#[cfg(test)]
|
||||
pub mod test;
|
||||
pub mod teststream;
|
||||
pub mod timebin;
|
||||
pub mod timebinnedjson;
|
||||
pub mod transform;
|
||||
|
||||
37
crates/streams/src/teststream.rs
Normal file
37
crates/streams/src/teststream.rs
Normal file
@@ -0,0 +1,37 @@
|
||||
use crate::timebin::cached::reader::EventsReadProvider;
|
||||
use crate::timebin::cached::reader::EventsReading;
|
||||
use futures_util::Stream;
|
||||
use items_0::streamitem::Sitemty;
|
||||
use items_2::channelevents::ChannelEvents;
|
||||
use netpod::range::evrange::SeriesRange;
|
||||
use query::api4::events::EventsSubQuery;
|
||||
use rand_xoshiro::rand_core::SeedableRng;
|
||||
use rand_xoshiro::Xoshiro128PlusPlus;
|
||||
use std::pin::Pin;
|
||||
|
||||
fn make_stream(chname: &str, range: &SeriesRange) -> Pin<Box<dyn Stream<Item = Sitemty<ChannelEvents>> + Send>> {
|
||||
if chname == "unittest;scylla;cont;scalar;f32" {
|
||||
let e = ::err::Error::with_msg_no_trace("unknown channel {chname}");
|
||||
let ret = futures_util::stream::iter([Err(e)]);
|
||||
Box::pin(ret)
|
||||
} else {
|
||||
let e = ::err::Error::with_msg_no_trace("unknown channel {chname}");
|
||||
let ret = futures_util::stream::iter([Err(e)]);
|
||||
Box::pin(ret)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct UnitTestStream {}
|
||||
|
||||
impl UnitTestStream {
|
||||
pub fn new() -> Self {
|
||||
Self {}
|
||||
}
|
||||
}
|
||||
|
||||
impl EventsReadProvider for UnitTestStream {
|
||||
fn read(&self, evq: EventsSubQuery) -> EventsReading {
|
||||
let stream = make_stream(evq.name(), evq.range());
|
||||
EventsReading::new(stream)
|
||||
}
|
||||
}
|
||||
@@ -7,9 +7,11 @@ use futures_util::StreamExt;
|
||||
use items_0::streamitem::Sitemty;
|
||||
use items_0::timebin::BinsBoxed;
|
||||
use items_2::channelevents::ChannelEvents;
|
||||
use items_2::eventsdim0::EventsDim0;
|
||||
use netpod::log::*;
|
||||
use netpod::BinnedRange;
|
||||
use netpod::DtMs;
|
||||
use netpod::EnumVariant;
|
||||
use netpod::TsNano;
|
||||
use query::api4::events::EventsSubQuery;
|
||||
use std::future::Future;
|
||||
@@ -44,7 +46,117 @@ impl Stream for EventsReading {
|
||||
type Item = Sitemty<ChannelEvents>;
|
||||
|
||||
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
|
||||
self.stream.poll_next_unpin(cx)
|
||||
use Poll::*;
|
||||
match self.stream.poll_next_unpin(cx) {
|
||||
Ready(Some(item)) => {
|
||||
use items_0::streamitem::RangeCompletableItem::*;
|
||||
use items_0::streamitem::StreamItem::*;
|
||||
match &item {
|
||||
Ok(DataItem(Data(cevs))) => match cevs {
|
||||
ChannelEvents::Events(evs) => {
|
||||
if let Some(evs) = evs.as_any_ref().downcast_ref::<EventsDim0<EnumVariant>>() {
|
||||
use items_0::Empty;
|
||||
let mut dst = EventsDim0::<u16>::empty();
|
||||
for ((&ts, &pulse), val) in evs
|
||||
.tss()
|
||||
.iter()
|
||||
.zip(evs.pulses.iter())
|
||||
.zip(evs.private_values_ref().iter())
|
||||
{
|
||||
dst.push_back(ts, pulse, val.ix());
|
||||
}
|
||||
let item = Ok(DataItem(Data(ChannelEvents::Events(Box::new(dst)))));
|
||||
Ready(Some(item))
|
||||
} else if let Some(evs) = evs.as_any_ref().downcast_ref::<EventsDim0<bool>>() {
|
||||
use items_0::Empty;
|
||||
let mut dst = EventsDim0::<u8>::empty();
|
||||
for ((&ts, &pulse), &val) in evs
|
||||
.tss()
|
||||
.iter()
|
||||
.zip(evs.pulses.iter())
|
||||
.zip(evs.private_values_ref().iter())
|
||||
{
|
||||
dst.push_back(ts, pulse, val as u8);
|
||||
}
|
||||
let item = Ok(DataItem(Data(ChannelEvents::Events(Box::new(dst)))));
|
||||
Ready(Some(item))
|
||||
} else if let Some(evs) = evs.as_any_ref().downcast_ref::<EventsDim0<String>>() {
|
||||
use items_0::Empty;
|
||||
let mut dst = EventsDim0::<u64>::empty();
|
||||
for ((&ts, &pulse), _) in evs
|
||||
.tss()
|
||||
.iter()
|
||||
.zip(evs.pulses.iter())
|
||||
.zip(evs.private_values_ref().iter())
|
||||
{
|
||||
dst.push_back(ts, pulse, 1);
|
||||
}
|
||||
let item = Ok(DataItem(Data(ChannelEvents::Events(Box::new(dst)))));
|
||||
Ready(Some(item))
|
||||
} else if let Some(evs) = evs.as_any_ref().downcast_ref::<EventsDim0<f64>>() {
|
||||
let buf = std::fs::read("evmod").unwrap_or(Vec::new());
|
||||
let s = String::from_utf8_lossy(&buf);
|
||||
if s.contains("u8") {
|
||||
use items_0::Empty;
|
||||
let mut dst = EventsDim0::<u8>::empty();
|
||||
for (ts, val) in evs.tss().iter().zip(evs.private_values_ref().iter()) {
|
||||
let v = (val * 1e6) as u8;
|
||||
dst.push_back(*ts, 0, v);
|
||||
}
|
||||
let item = Ok(DataItem(Data(ChannelEvents::Events(Box::new(dst)))));
|
||||
Ready(Some(item))
|
||||
} else if s.contains("i16") {
|
||||
use items_0::Empty;
|
||||
let mut dst = EventsDim0::<i16>::empty();
|
||||
for (ts, val) in evs.tss().iter().zip(evs.private_values_ref().iter()) {
|
||||
let v = (val * 1e6) as i16 - 50;
|
||||
dst.push_back(*ts, 0, v);
|
||||
}
|
||||
let item = Ok(DataItem(Data(ChannelEvents::Events(Box::new(dst)))));
|
||||
Ready(Some(item))
|
||||
} else if s.contains("bool") {
|
||||
use items_0::Empty;
|
||||
let mut dst = EventsDim0::<bool>::empty();
|
||||
for (ts, val) in evs.tss().iter().zip(evs.private_values_ref().iter()) {
|
||||
let g = u64::from_ne_bytes(val.to_ne_bytes());
|
||||
let val = g % 2 == 0;
|
||||
dst.push_back(*ts, 0, val);
|
||||
}
|
||||
let item = Ok(DataItem(Data(ChannelEvents::Events(Box::new(dst)))));
|
||||
Ready(Some(item))
|
||||
} else if s.contains("enum") {
|
||||
use items_0::Empty;
|
||||
let mut dst = EventsDim0::<EnumVariant>::empty();
|
||||
for (ts, val) in evs.tss().iter().zip(evs.private_values_ref().iter()) {
|
||||
let buf = val.to_ne_bytes();
|
||||
let h = buf[0] ^ buf[1] ^ buf[2] ^ buf[3] ^ buf[4] ^ buf[5] ^ buf[6] ^ buf[7];
|
||||
dst.push_back(*ts, 0, EnumVariant::new(h as u16, h.to_string()));
|
||||
}
|
||||
let item = Ok(DataItem(Data(ChannelEvents::Events(Box::new(dst)))));
|
||||
Ready(Some(item))
|
||||
} else if s.contains("string") {
|
||||
use items_0::Empty;
|
||||
let mut dst = EventsDim0::<String>::empty();
|
||||
for (ts, val) in evs.tss().iter().zip(evs.private_values_ref().iter()) {
|
||||
dst.push_back(*ts, 0, val.to_string());
|
||||
}
|
||||
let item = Ok(DataItem(Data(ChannelEvents::Events(Box::new(dst)))));
|
||||
Ready(Some(item))
|
||||
} else {
|
||||
Ready(Some(item))
|
||||
}
|
||||
} else {
|
||||
Ready(Some(item))
|
||||
}
|
||||
}
|
||||
ChannelEvents::Status(conn_status_event) => Ready(Some(item)),
|
||||
},
|
||||
_ => Ready(Some(item)),
|
||||
}
|
||||
}
|
||||
Ready(None) => Ready(None),
|
||||
Pending => Pending,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,16 +39,6 @@ impl BinnedFromEvents {
|
||||
panic!();
|
||||
}
|
||||
let stream = read_provider.read(evq);
|
||||
// let stream = stream.map(|x| {
|
||||
// let x = items_0::try_map_sitemty_data!(x, |x| match x {
|
||||
// ChannelEvents::Events(x) => {
|
||||
// let x = x.to_dim0_f32_for_binning();
|
||||
// Ok(ChannelEvents::Events(x))
|
||||
// }
|
||||
// ChannelEvents::Status(x) => Ok(ChannelEvents::Status(x)),
|
||||
// });
|
||||
// x
|
||||
// });
|
||||
let stream = if do_time_weight {
|
||||
let stream = Box::pin(stream);
|
||||
items_2::binning::timeweight::timeweight_events_dyn::BinnedEventsTimeweightStream::new(range, stream)
|
||||
|
||||
@@ -246,16 +246,6 @@ async fn timebinnable_stream_sf_databuffer_binnable_box(
|
||||
open_bytes,
|
||||
)
|
||||
.await?;
|
||||
// let stream = stream.map(|x| x);
|
||||
// let stream = stream.map(|x| ChannelEvents::Events(x));
|
||||
|
||||
// let stream = stream.map(move |k| {
|
||||
// on_sitemty_data!(k, |k| {
|
||||
// let k: Box<dyn Collectable> = Box::new(k);
|
||||
// Ok(StreamItem::DataItem(RangeCompletableItem::Data(k)))
|
||||
// })
|
||||
// });
|
||||
|
||||
let stream = PlainEventStream::new(stream);
|
||||
let stream = EventsToTimeBinnable::new(stream);
|
||||
let stream = Box::pin(stream);
|
||||
@@ -376,9 +366,10 @@ async fn timebinned_stream(
|
||||
events_read_provider: Arc<dyn EventsReadProvider>,
|
||||
) -> Result<Pin<Box<dyn Stream<Item = Sitemty<Box<dyn CollectableDyn>>> + Send>>, Error> {
|
||||
use netpod::query::CacheUsage;
|
||||
let cache_usage = query.cache_usage().unwrap_or(CacheUsage::V0NoCache);
|
||||
let cache_usage = query.cache_usage().unwrap_or(CacheUsage::Ignore);
|
||||
match cache_usage.clone() {
|
||||
CacheUsage::Use | CacheUsage::Recreate | CacheUsage::Ignore => {
|
||||
debug!("BINNING NEW METHOD");
|
||||
debug!(
|
||||
"timebinned_stream caching {:?} subgrids {:?}",
|
||||
query,
|
||||
@@ -407,18 +398,11 @@ async fn timebinned_stream(
|
||||
events_read_provider,
|
||||
)
|
||||
.map_err(Error::from_string)?;
|
||||
// let stream = stream.map(|item| {
|
||||
// on_sitemty_data!(item, |k: items_0::timebin::BinsBoxed| {
|
||||
// let ret = k.to_old_time_binned();
|
||||
// Ok(StreamItem::DataItem(RangeCompletableItem::Data(ret)))
|
||||
// })
|
||||
// });
|
||||
let stream = stream.map(|item| {
|
||||
use items_0::timebin::BinningggContainerBinsDyn;
|
||||
on_sitemty_data!(item, |x: Box<dyn BinningggContainerBinsDyn>| {
|
||||
let g = x.new_collector();
|
||||
on_sitemty_data!(item, |mut x: Box<dyn BinningggContainerBinsDyn>| {
|
||||
x.fix_numerics();
|
||||
let ret = Box::new(x) as Box<dyn CollectableDyn>;
|
||||
// let ret = x as Box<dyn CollectableDyn>;
|
||||
Ok(StreamItem::DataItem(RangeCompletableItem::Data(ret)))
|
||||
})
|
||||
});
|
||||
@@ -426,6 +410,7 @@ async fn timebinned_stream(
|
||||
Ok(stream)
|
||||
}
|
||||
_ => {
|
||||
debug!("BINNING OLD METHOD");
|
||||
let range = binned_range.binned_range_time().to_nano_range();
|
||||
let do_time_weight = true;
|
||||
let one_before_range = true;
|
||||
|
||||
Reference in New Issue
Block a user