feat: impl grpc physical plan (#212)

* chore: rename "convert.rs" to "serde.rs"

* proto definition

* impl "projection"

* add mock_input_exec for test

* impl physical plan execution
This commit is contained in:
fys
2022-08-31 21:43:50 +08:00
committed by GitHub
parent ba93aa83f2
commit db55c69117
29 changed files with 734 additions and 75 deletions

View File

@@ -4,6 +4,7 @@ fn main() {
&[
"greptime/v1/insert.proto",
"greptime/v1/select.proto",
"greptime/v1/physical_plan.proto",
"greptime/v1/greptime.proto",
],
&["."],

View File

@@ -25,14 +25,19 @@ message ExprHeader {
uint32 version = 1;
}
// TODO(fys): Only support sql now, and
// will support promql etc in the future
// TODO(fys): Only support sql now, and will support promql etc in the future
message SelectExpr {
oneof expr {
string sql = 1;
PhysicalPlan physical_plan = 15;
}
}
message PhysicalPlan {
bytes original_ql = 1;
bytes plan = 2;
}
message InsertExpr {
string table_name = 1;
repeated bytes values = 2;

View File

@@ -0,0 +1,33 @@
syntax = "proto3";
package greptime.v1.codec;
message PhysicalPlanNode {
oneof PhysicalPlanType {
ProjectionExecNode projection = 1;
MockInputExecNode mock = 99;
// TODO(fys): impl other physical plan node
}
}
message ProjectionExecNode {
PhysicalPlanNode input = 1;
repeated PhysicalExprNode expr = 2;
repeated string expr_name = 3;
}
message PhysicalExprNode {
oneof ExprType {
PhysicalColumn column = 1;
// TODO(fys): impl other physical expr node
}
}
message PhysicalColumn {
string name = 1;
uint64 index = 2;
}
message MockInputExecNode {
string name = 1;
}

View File

@@ -1,2 +1,4 @@
pub mod convert;
pub mod serde;
pub mod v1;
pub use prost::DecodeError;

View File

@@ -1,38 +1,34 @@
pub use prost::DecodeError;
use prost::Message;
use crate::v1::codec::{InsertBatch, SelectResult};
use crate::v1::codec::{InsertBatch, PhysicalPlanNode, SelectResult};
impl From<InsertBatch> for Vec<u8> {
fn from(insert: InsertBatch) -> Self {
insert.encode_to_vec()
}
macro_rules! impl_convert_with_bytes {
($data_type: ty) => {
impl From<$data_type> for Vec<u8> {
fn from(entity: $data_type) -> Self {
entity.encode_to_vec()
}
}
impl TryFrom<&[u8]> for $data_type {
type Error = DecodeError;
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
<$data_type>::decode(value.as_ref())
}
}
};
}
impl TryFrom<Vec<u8>> for InsertBatch {
type Error = DecodeError;
fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
InsertBatch::decode(value.as_ref())
}
}
impl From<SelectResult> for Vec<u8> {
fn from(result: SelectResult) -> Self {
result.encode_to_vec()
}
}
impl TryFrom<Vec<u8>> for SelectResult {
type Error = DecodeError;
fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
SelectResult::decode(value.as_ref())
}
}
impl_convert_with_bytes!(InsertBatch);
impl_convert_with_bytes!(SelectResult);
impl_convert_with_bytes!(PhysicalPlanNode);
#[cfg(test)]
mod tests {
use std::ops::Deref;
use crate::v1::codec::*;
use crate::v1::column;
use crate::v1::Column;
@@ -44,7 +40,7 @@ mod tests {
let insert_batch = mock_insert_batch();
let bytes: Vec<u8> = insert_batch.into();
let insert: InsertBatch = bytes.try_into().unwrap();
let insert: InsertBatch = bytes.deref().try_into().unwrap();
assert_eq!(8, insert.row_count);
assert_eq!(1, insert.columns.len());
@@ -70,7 +66,7 @@ mod tests {
bytes[0] = 0b1;
bytes[1] = 0b1;
let insert: InsertBatch = bytes.try_into().unwrap();
let insert: InsertBatch = bytes.deref().try_into().unwrap();
assert_eq!(8, insert.row_count);
assert_eq!(1, insert.columns.len());
@@ -90,7 +86,7 @@ mod tests {
let select_result = mock_select_result();
let bytes: Vec<u8> = select_result.into();
let result: SelectResult = bytes.try_into().unwrap();
let result: SelectResult = bytes.deref().try_into().unwrap();
assert_eq!(8, result.row_count);
assert_eq!(1, result.columns.len());
@@ -116,7 +112,7 @@ mod tests {
bytes[0] = 0b1;
bytes[1] = 0b1;
let result: SelectResult = bytes.try_into().unwrap();
let result: SelectResult = bytes.deref().try_into().unwrap();
assert_eq!(8, result.row_count);
assert_eq!(1, result.columns.len());