use std::sync::Arc;
use crate::prelude::{thirdparty::arrow_data::ArrayData, *};
pub struct RawQuery {
pub tx: MessageSender,
pub rx: MessageReceiver,
pub clock: Arc<HLC>,
pub source: NodeID,
pub layout: QueryID,
}
impl RawQuery {
pub fn new(
tx: MessageSender,
rx: MessageReceiver,
clock: Arc<HLC>,
source: NodeID,
layout: QueryID,
) -> Self {
Self {
tx,
rx,
clock,
source,
layout,
}
}
pub async fn query(&mut self, data: ArrayData) -> Result<DataflowMessage> {
let data = DataflowMessage {
header: Header {
timestamp: self.clock.new_timestamp(),
source: (self.source.uuid, self.layout.uuid),
},
data,
};
self.tx
.send(data)
.await
.wrap_err(report_error_sending(&self.source, &self.layout))?;
let message = self
.rx
.recv()
.await
.ok_or_eyre(report_error_receiving(&self.source, &self.layout))?;
Ok(message)
}
}