WIP to deliver also wave events
This commit is contained in:
+43
-18
@@ -6,7 +6,7 @@ use items::waveevents::WaveEvents;
|
|||||||
use items::{Framable, RangeCompletableItem, StreamItem};
|
use items::{Framable, RangeCompletableItem, StreamItem};
|
||||||
use netpod::log::*;
|
use netpod::log::*;
|
||||||
use netpod::query::RawEventsQuery;
|
use netpod::query::RawEventsQuery;
|
||||||
use netpod::{NanoRange, ScalarType, ScyllaConfig};
|
use netpod::{NanoRange, ScalarType, ScyllaConfig, Shape};
|
||||||
use scylla::frame::response::cql_to_rust::FromRowError as ScyFromRowError;
|
use scylla::frame::response::cql_to_rust::FromRowError as ScyFromRowError;
|
||||||
use scylla::transport::errors::{NewSessionError as ScyNewSessionError, QueryError as ScyQueryError};
|
use scylla::transport::errors::{NewSessionError as ScyNewSessionError, QueryError as ScyQueryError};
|
||||||
use scylla::Session as ScySession;
|
use scylla::Session as ScySession;
|
||||||
@@ -72,6 +72,7 @@ macro_rules! impl_read_values_fut {
|
|||||||
struct ReadValues {
|
struct ReadValues {
|
||||||
series: i64,
|
series: i64,
|
||||||
scalar_type: ScalarType,
|
scalar_type: ScalarType,
|
||||||
|
shape: Shape,
|
||||||
range: NanoRange,
|
range: NanoRange,
|
||||||
ts_msp: VecDeque<u64>,
|
ts_msp: VecDeque<u64>,
|
||||||
fut: Pin<Box<dyn Future<Output = Box<dyn Framable>> + Send>>,
|
fut: Pin<Box<dyn Future<Output = Box<dyn Framable>> + Send>>,
|
||||||
@@ -82,6 +83,7 @@ impl ReadValues {
|
|||||||
fn new(
|
fn new(
|
||||||
series: i64,
|
series: i64,
|
||||||
scalar_type: ScalarType,
|
scalar_type: ScalarType,
|
||||||
|
shape: Shape,
|
||||||
range: NanoRange,
|
range: NanoRange,
|
||||||
ts_msp: VecDeque<u64>,
|
ts_msp: VecDeque<u64>,
|
||||||
scy: Arc<ScySession>,
|
scy: Arc<ScySession>,
|
||||||
@@ -89,6 +91,7 @@ impl ReadValues {
|
|||||||
Self {
|
Self {
|
||||||
series,
|
series,
|
||||||
scalar_type,
|
scalar_type,
|
||||||
|
shape,
|
||||||
range,
|
range,
|
||||||
ts_msp,
|
ts_msp,
|
||||||
fut: Box::pin(futures_util::future::lazy(|_| panic!())),
|
fut: Box::pin(futures_util::future::lazy(|_| panic!())),
|
||||||
@@ -107,13 +110,25 @@ impl ReadValues {
|
|||||||
|
|
||||||
fn make_fut(&mut self, ts_msp: u64) -> Pin<Box<dyn Future<Output = Box<dyn Framable>> + Send>> {
|
fn make_fut(&mut self, ts_msp: u64) -> Pin<Box<dyn Future<Output = Box<dyn Framable>> + Send>> {
|
||||||
// TODO this also needs to differentiate on Shape.
|
// TODO this also needs to differentiate on Shape.
|
||||||
let fut = match &self.scalar_type {
|
let fut = match &self.shape {
|
||||||
ScalarType::F32 => {
|
Shape::Scalar => match &self.scalar_type {
|
||||||
impl_read_values_fut!(read_next_values_scalar_f32, self, ts_msp)
|
ScalarType::I32 => {
|
||||||
}
|
impl_read_values_fut!(read_next_values_scalar_i32, self, ts_msp)
|
||||||
ScalarType::F64 => {
|
}
|
||||||
impl_read_values_fut!(read_next_values_scalar_f64, self, ts_msp)
|
ScalarType::F32 => {
|
||||||
}
|
impl_read_values_fut!(read_next_values_scalar_f32, self, ts_msp)
|
||||||
|
}
|
||||||
|
ScalarType::F64 => {
|
||||||
|
impl_read_values_fut!(read_next_values_scalar_f64, self, ts_msp)
|
||||||
|
}
|
||||||
|
_ => err::todoval(),
|
||||||
|
},
|
||||||
|
Shape::Wave(_) => match &self.scalar_type {
|
||||||
|
ScalarType::U16 => {
|
||||||
|
impl_read_values_fut!(read_next_values_array_u16, self, ts_msp)
|
||||||
|
}
|
||||||
|
_ => err::todoval(),
|
||||||
|
},
|
||||||
_ => err::todoval(),
|
_ => err::todoval(),
|
||||||
};
|
};
|
||||||
fut
|
fut
|
||||||
@@ -122,7 +137,7 @@ impl ReadValues {
|
|||||||
|
|
||||||
enum FrState {
|
enum FrState {
|
||||||
New,
|
New,
|
||||||
FindSeries(Pin<Box<dyn Future<Output = Result<(i64, ScalarType), Error>> + Send>>),
|
FindSeries(Pin<Box<dyn Future<Output = Result<(i64, ScalarType, Shape), Error>> + Send>>),
|
||||||
FindMsp(Pin<Box<dyn Future<Output = Result<Vec<u64>, Error>> + Send>>),
|
FindMsp(Pin<Box<dyn Future<Output = Result<Vec<u64>, Error>> + Send>>),
|
||||||
ReadValues(ReadValues),
|
ReadValues(ReadValues),
|
||||||
Done,
|
Done,
|
||||||
@@ -134,6 +149,7 @@ pub struct ScyllaFramableStream {
|
|||||||
channel_name: String,
|
channel_name: String,
|
||||||
range: NanoRange,
|
range: NanoRange,
|
||||||
scalar_type: Option<ScalarType>,
|
scalar_type: Option<ScalarType>,
|
||||||
|
shape: Option<Shape>,
|
||||||
series: i64,
|
series: i64,
|
||||||
scy: Arc<ScySession>,
|
scy: Arc<ScySession>,
|
||||||
}
|
}
|
||||||
@@ -146,6 +162,7 @@ impl ScyllaFramableStream {
|
|||||||
channel_name: evq.channel.name().into(),
|
channel_name: evq.channel.name().into(),
|
||||||
range: evq.range.clone(),
|
range: evq.range.clone(),
|
||||||
scalar_type: None,
|
scalar_type: None,
|
||||||
|
shape: None,
|
||||||
series: 0,
|
series: 0,
|
||||||
scy,
|
scy,
|
||||||
}
|
}
|
||||||
@@ -166,10 +183,11 @@ impl Stream for ScyllaFramableStream {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
FrState::FindSeries(ref mut fut) => match fut.poll_unpin(cx) {
|
FrState::FindSeries(ref mut fut) => match fut.poll_unpin(cx) {
|
||||||
Ready(Ok((series, scalar_type))) => {
|
Ready(Ok((series, scalar_type, shape))) => {
|
||||||
info!("ScyllaFramableStream found series {}", series);
|
info!("ScyllaFramableStream found series {}", series);
|
||||||
self.series = series;
|
self.series = series;
|
||||||
self.scalar_type = Some(scalar_type);
|
self.scalar_type = Some(scalar_type);
|
||||||
|
self.shape = Some(shape);
|
||||||
let fut = find_ts_msp(series, self.range.clone(), self.scy.clone());
|
let fut = find_ts_msp(series, self.range.clone(), self.scy.clone());
|
||||||
let fut = Box::pin(fut);
|
let fut = Box::pin(fut);
|
||||||
self.state = FrState::FindMsp(fut);
|
self.state = FrState::FindMsp(fut);
|
||||||
@@ -190,6 +208,7 @@ impl Stream for ScyllaFramableStream {
|
|||||||
let mut st = ReadValues::new(
|
let mut st = ReadValues::new(
|
||||||
self.series,
|
self.series,
|
||||||
self.scalar_type.as_ref().unwrap().clone(),
|
self.scalar_type.as_ref().unwrap().clone(),
|
||||||
|
self.shape.as_ref().unwrap().clone(),
|
||||||
self.range.clone(),
|
self.range.clone(),
|
||||||
ts_msp.into(),
|
ts_msp.into(),
|
||||||
self.scy.clone(),
|
self.scy.clone(),
|
||||||
@@ -226,7 +245,11 @@ impl Stream for ScyllaFramableStream {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn find_series(facility: String, channel_name: String, scy: Arc<ScySession>) -> Result<(i64, ScalarType), Error> {
|
async fn find_series(
|
||||||
|
facility: String,
|
||||||
|
channel_name: String,
|
||||||
|
scy: Arc<ScySession>,
|
||||||
|
) -> Result<(i64, ScalarType, Shape), Error> {
|
||||||
info!("find_series");
|
info!("find_series");
|
||||||
let res = {
|
let res = {
|
||||||
let cql =
|
let cql =
|
||||||
@@ -253,8 +276,9 @@ async fn find_series(facility: String, channel_name: String, scy: Arc<ScySession
|
|||||||
info!("make_scylla_stream row {row:?}");
|
info!("make_scylla_stream row {row:?}");
|
||||||
let series = row.0;
|
let series = row.0;
|
||||||
let scalar_type = ScalarType::from_scylla_i32(row.1)?;
|
let scalar_type = ScalarType::from_scylla_i32(row.1)?;
|
||||||
info!("make_scylla_stream series {series}");
|
let shape = Shape::from_scylla_shape_dims(&row.2)?;
|
||||||
Ok((series, scalar_type))
|
info!("make_scylla_stream series {series} scalar_type {scalar_type:?} shape {shape:?}");
|
||||||
|
Ok((series, scalar_type, shape))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn find_ts_msp(series: i64, range: NanoRange, scy: Arc<ScySession>) -> Result<Vec<u64>, Error> {
|
async fn find_ts_msp(series: i64, range: NanoRange, scy: Arc<ScySession>) -> Result<Vec<u64>, Error> {
|
||||||
@@ -316,7 +340,7 @@ macro_rules! read_next_scalar_values {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! read_next_1d_values {
|
macro_rules! read_next_array_values {
|
||||||
($fname:ident, $st:ty, $scyty:ty, $table_name:expr) => {
|
($fname:ident, $st:ty, $scyty:ty, $table_name:expr) => {
|
||||||
async fn $fname(
|
async fn $fname(
|
||||||
series: i64,
|
series: i64,
|
||||||
@@ -346,12 +370,12 @@ macro_rules! read_next_1d_values {
|
|||||||
.query(cql, (series, ts_msp as i64, ts_lsp_max as i64))
|
.query(cql, (series, ts_msp as i64, ts_lsp_max as i64))
|
||||||
.await
|
.await
|
||||||
.err_conv()?;
|
.err_conv()?;
|
||||||
let mut ret = ScalarEvents::<ST>::empty();
|
let mut ret = WaveEvents::<ST>::empty();
|
||||||
for row in res.rows_typed_or_empty::<(i64, i64, SCYTY)>() {
|
for row in res.rows_typed_or_empty::<(i64, i64, Vec<SCYTY>)>() {
|
||||||
let row = row.err_conv()?;
|
let row = row.err_conv()?;
|
||||||
let ts = ts_msp + row.0 as u64;
|
let ts = ts_msp + row.0 as u64;
|
||||||
let pulse = row.1 as u64;
|
let pulse = row.1 as u64;
|
||||||
let value = row.2 as ST;
|
let value = row.2.into_iter().map(|x| x as ST).collect();
|
||||||
ret.push(ts, pulse, value);
|
ret.push(ts, pulse, value);
|
||||||
}
|
}
|
||||||
info!("found in total {} events ts_msp {}", ret.tss.len(), ts_msp);
|
info!("found in total {} events ts_msp {}", ret.tss.len(), ts_msp);
|
||||||
@@ -360,10 +384,11 @@ macro_rules! read_next_1d_values {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
read_next_scalar_values!(read_next_values_scalar_i32, i32, i32, "events_scalar_i32");
|
||||||
read_next_scalar_values!(read_next_values_scalar_f32, f32, f32, "events_scalar_f32");
|
read_next_scalar_values!(read_next_values_scalar_f32, f32, f32, "events_scalar_f32");
|
||||||
read_next_scalar_values!(read_next_values_scalar_f64, f64, f64, "events_scalar_f64");
|
read_next_scalar_values!(read_next_values_scalar_f64, f64, f64, "events_scalar_f64");
|
||||||
|
|
||||||
read_next_1d_values!(read_next_values_1d_u16, u16, u16, "events_wave_u16");
|
read_next_array_values!(read_next_values_array_u16, u16, i16, "events_wave_u16");
|
||||||
|
|
||||||
pub async fn make_scylla_stream(
|
pub async fn make_scylla_stream(
|
||||||
evq: &RawEventsQuery,
|
evq: &RawEventsQuery,
|
||||||
|
|||||||
Reference in New Issue
Block a user