feat: impl insert via grpc (#102)

* fix: build protobuf

* feat: impl grpc insert

* Add an example of grpc insert

* fix: cargo clippy

* cr
This commit is contained in:
fys
2022-07-28 10:25:22 +08:00
committed by GitHub
parent 3e42334b92
commit 3b2716ed70
13 changed files with 694 additions and 14 deletions

View File

@@ -4,6 +4,7 @@ package greptime.v1;
import "greptime/v1/admin.proto";
import "greptime/v1/database.proto";
import "greptime/v1/insert.proto";
service Greptime {
rpc Batch(BatchRequest) returns (BatchResponse) {}

View File

@@ -1,3 +1,7 @@
syntax = "proto3";
package greptime.v1;
message InsertBatch {
repeated Column columns = 1;
uint32 row_count = 2;
@@ -28,7 +32,7 @@ message Column {
repeated double f64_values = 10;
repeated bool bool_values = 11;
repeated bytes bytes_values = 12;
repeated bytes binary_values = 12;
repeated string string_values = 13;
}
// The array of non-null values in this column.

89
src/api/src/convert.rs Normal file
View File

@@ -0,0 +1,89 @@
pub use prost::DecodeError;
use prost::Message;
use crate::v1::InsertBatch;
impl From<InsertBatch> for Vec<u8> {
fn from(insert: InsertBatch) -> Self {
insert.encode_length_delimited_to_vec()
}
}
impl TryFrom<Vec<u8>> for InsertBatch {
type Error = DecodeError;
fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
InsertBatch::decode_length_delimited(value.as_ref())
}
}
#[cfg(test)]
mod tests {
use crate::v1::*;
const SEMANTIC_TAG: i32 = 0;
#[test]
fn test_convert_insert_batch() {
let insert_batch = mock_insert_batch();
let bytes: Vec<u8> = insert_batch.into();
let insert: InsertBatch = bytes.try_into().unwrap();
assert_eq!(8, insert.row_count);
assert_eq!(1, insert.columns.len());
let column = &insert.columns[0];
assert_eq!("foo", column.column_name);
assert_eq!(SEMANTIC_TAG, column.semantic_type);
assert_eq!(vec![1], column.null_mask);
assert_eq!(
vec![2, 3, 4, 5, 6, 7, 8],
column.values.as_ref().unwrap().i32_values
);
}
#[should_panic]
#[test]
fn test_convert_insert_batch_wrong() {
let insert_batch = mock_insert_batch();
let mut bytes: Vec<u8> = insert_batch.into();
// modify some bytes
bytes[0] = 0b1;
bytes[1] = 0b1;
let insert: InsertBatch = bytes.try_into().unwrap();
assert_eq!(8, insert.row_count);
assert_eq!(1, insert.columns.len());
let column = &insert.columns[0];
assert_eq!("foo", column.column_name);
assert_eq!(SEMANTIC_TAG, column.semantic_type);
assert_eq!(vec![1], column.null_mask);
assert_eq!(
vec![2, 3, 4, 5, 6, 7, 8],
column.values.as_ref().unwrap().i32_values
);
}
fn mock_insert_batch() -> InsertBatch {
let values = column::Values {
i32_values: vec![2, 3, 4, 5, 6, 7, 8],
..Default::default()
};
let null_mask = vec![1];
let column = Column {
column_name: "foo".to_string(),
semantic_type: SEMANTIC_TAG,
values: Some(values),
null_mask,
};
InsertBatch {
columns: vec![column],
row_count: 8,
}
}
}

View File

@@ -1 +1,2 @@
pub mod convert;
pub mod v1;