mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-05-24 00:40:40 +00:00
refactor: changes CreateTableRequest::schema to RawSchema (#1018)
* refactor: changes CreateTableRequest::schema to RawSchema * refactor(grpc-expr): create_table_schema returns RawSchema
This commit is contained in:
@@ -22,15 +22,38 @@ use crate::schema::{ColumnSchema, Schema, SchemaBuilder};
|
||||
/// This struct only contains necessary data to recover the Schema.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct RawSchema {
|
||||
/// Schema of columns.
|
||||
pub column_schemas: Vec<ColumnSchema>,
|
||||
/// Index of the timestamp column.
|
||||
pub timestamp_index: Option<usize>,
|
||||
/// Schema version.
|
||||
pub version: u32,
|
||||
}
|
||||
|
||||
impl RawSchema {
|
||||
/// Creates a new [RawSchema] from specific `column_schemas`.
|
||||
///
|
||||
/// Sets [RawSchema::timestamp_index] to the first index of the timestamp
|
||||
/// column. It doesn't check whether time index column is duplicate.
|
||||
pub fn new(column_schemas: Vec<ColumnSchema>) -> RawSchema {
|
||||
let timestamp_index = column_schemas
|
||||
.iter()
|
||||
.position(|column_schema| column_schema.is_time_index());
|
||||
|
||||
RawSchema {
|
||||
column_schemas,
|
||||
timestamp_index,
|
||||
version: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<RawSchema> for Schema {
|
||||
type Error = Error;
|
||||
|
||||
fn try_from(raw: RawSchema) -> Result<Schema> {
|
||||
// While building Schema, we don't trust the fields, such as timestamp_index,
|
||||
// in RawSchema. We use SchemaBuilder to perform the validation.
|
||||
SchemaBuilder::try_from(raw.column_schemas)?
|
||||
.version(raw.version)
|
||||
.build()
|
||||
@@ -74,4 +97,33 @@ mod tests {
|
||||
|
||||
assert_eq!(schema, schema_new);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_new_raw_schema_with_time_index() {
|
||||
let column_schemas = vec![
|
||||
ColumnSchema::new("col1", ConcreteDataType::int32_datatype(), true),
|
||||
ColumnSchema::new(
|
||||
"ts",
|
||||
ConcreteDataType::timestamp_millisecond_datatype(),
|
||||
false,
|
||||
)
|
||||
.with_time_index(true),
|
||||
];
|
||||
let schema = RawSchema::new(column_schemas);
|
||||
assert_eq!(1, schema.timestamp_index.unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_new_raw_schema_without_time_index() {
|
||||
let column_schemas = vec![
|
||||
ColumnSchema::new("col1", ConcreteDataType::int32_datatype(), true),
|
||||
ColumnSchema::new(
|
||||
"ts",
|
||||
ConcreteDataType::timestamp_millisecond_datatype(),
|
||||
false,
|
||||
),
|
||||
];
|
||||
let schema = RawSchema::new(column_schemas);
|
||||
assert!(schema.timestamp_index.is_none());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user