chore: fix transform field type error

This commit is contained in:
appflowy 2022-04-10 20:21:28 +08:00
parent 43095cb0dd
commit 9d629412c8
12 changed files with 71 additions and 44 deletions

View File

@ -30,7 +30,7 @@ macro_rules! impl_type_option {
($target: ident, $field_type:expr) => { ($target: ident, $field_type:expr) => {
impl std::convert::From<&FieldMeta> for $target { impl std::convert::From<&FieldMeta> for $target {
fn from(field_meta: &FieldMeta) -> $target { fn from(field_meta: &FieldMeta) -> $target {
match field_meta.get_type_option_entry::<$target>(Some($field_type)) { match field_meta.get_type_option_entry::<$target>(&$field_type) {
None => $target::default(), None => $target::default(),
Some(target) => target, Some(target) => target,
} }
@ -63,7 +63,7 @@ macro_rules! impl_type_option {
} }
} }
impl TypeOptionDataEntity for $target { impl TypeOptionDataDeserializer for $target {
fn from_json_str(s: &str) -> $target { fn from_json_str(s: &str) -> $target {
match serde_json::from_str(s) { match serde_json::from_str(s) {
Ok(obj) => obj, Ok(obj) => obj,

View File

@ -4,7 +4,10 @@ use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellD
use bytes::Bytes; use bytes::Bytes;
use flowy_derive::ProtoBuf; use flowy_derive::ProtoBuf;
use flowy_error::FlowyError; use flowy_error::FlowyError;
use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry}; use flowy_grid_data_model::entities::{
CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::str::FromStr; use std::str::FromStr;

View File

@ -5,7 +5,10 @@ use chrono::format::strftime::StrftimeItems;
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
use flowy_error::FlowyError; use flowy_error::FlowyError;
use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry}; use flowy_grid_data_model::entities::{
CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::str::FromStr; use std::str::FromStr;

View File

@ -2,7 +2,10 @@ use crate::impl_type_option;
use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellData}; use crate::services::row::{CellDataChangeset, CellDataOperation, TypeOptionCellData};
use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
use flowy_error::FlowyError; use flowy_error::FlowyError;
use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry}; use flowy_grid_data_model::entities::{
CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use lazy_static::lazy_static; use lazy_static::lazy_static;
use rust_decimal::Decimal; use rust_decimal::Decimal;

View File

@ -7,7 +7,7 @@ use bytes::Bytes;
use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
use flowy_error::{ErrorCode, FlowyError}; use flowy_error::{ErrorCode, FlowyError};
use flowy_grid_data_model::entities::{ use flowy_grid_data_model::entities::{
CellMeta, CellMetaChangeset, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry, CellMeta, CellMetaChangeset, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
}; };
use flowy_grid_data_model::parser::NotEmptyUuid; use flowy_grid_data_model::parser::NotEmptyUuid;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};

View File

@ -4,7 +4,9 @@ use crate::services::row::{decode_cell_data, CellDataChangeset, CellDataOperatio
use bytes::Bytes; use bytes::Bytes;
use flowy_derive::ProtoBuf; use flowy_derive::ProtoBuf;
use flowy_error::FlowyError; use flowy_error::FlowyError;
use flowy_grid_data_model::entities::{CellMeta, FieldMeta, FieldType, TypeOptionDataEntity, TypeOptionDataEntry}; use flowy_grid_data_model::entities::{
CellMeta, FieldMeta, FieldType, TypeOptionDataDeserializer, TypeOptionDataEntry,
};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::str::FromStr; use std::str::FromStr;
@ -38,7 +40,7 @@ impl CellDataOperation for RichTextTypeOption {
|| type_option_cell_data.is_multi_select() || type_option_cell_data.is_multi_select()
|| type_option_cell_data.is_number() || type_option_cell_data.is_number()
{ {
decode_cell_data(data, field_meta).unwrap_or_else(|_| "".to_owned()) decode_cell_data(data, &field_meta, &type_option_cell_data.field_type).unwrap_or_else(|| "".to_owned())
} else { } else {
type_option_cell_data.data type_option_cell_data.data
} }

View File

@ -106,17 +106,43 @@ pub fn apply_cell_data_changeset<T: Into<CellDataChangeset>>(
FieldType::Checkbox => CheckboxTypeOption::from(field_meta).apply_changeset(changeset, cell_meta), FieldType::Checkbox => CheckboxTypeOption::from(field_meta).apply_changeset(changeset, cell_meta),
} }
} }
//
// #[tracing::instrument(level = "trace", skip(field_meta, data), fields(content), err)]
// pub fn decode_cell_data(data: String, field_meta: &FieldMeta, field_type: &FieldType) -> Result<String, FlowyError> {
// let s = match field_meta.field_type {
// FieldType::RichText => RichTextTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::Number => NumberTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::DateTime => DateTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::SingleSelect => SingleSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::MultiSelect => MultiSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// FieldType::Checkbox => CheckboxTypeOption::from(field_meta).decode_cell_data(data, field_meta),
// };
// tracing::Span::current().record("content", &format!("{:?}: {}", field_meta.field_type, s).as_str());
// Ok(s)
// }
#[tracing::instrument(level = "trace", skip(field_meta, data), fields(content), err)] #[tracing::instrument(level = "trace", skip(field_meta, data), fields(content))]
pub fn decode_cell_data(data: String, field_meta: &FieldMeta) -> Result<String, FlowyError> { pub fn decode_cell_data(data: String, field_meta: &FieldMeta, field_type: &FieldType) -> Option<String> {
let s = match field_meta.field_type { let s = match field_type {
FieldType::RichText => RichTextTypeOption::from(field_meta).decode_cell_data(data, field_meta), FieldType::RichText => field_meta
FieldType::Number => NumberTypeOption::from(field_meta).decode_cell_data(data, field_meta), .get_type_option_entry::<RichTextTypeOption>(field_type)?
FieldType::DateTime => DateTypeOption::from(field_meta).decode_cell_data(data, field_meta), .decode_cell_data(data, field_meta),
FieldType::SingleSelect => SingleSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta), FieldType::Number => field_meta
FieldType::MultiSelect => MultiSelectTypeOption::from(field_meta).decode_cell_data(data, field_meta), .get_type_option_entry::<NumberTypeOption>(field_type)?
FieldType::Checkbox => CheckboxTypeOption::from(field_meta).decode_cell_data(data, field_meta), .decode_cell_data(data, field_meta),
FieldType::DateTime => field_meta
.get_type_option_entry::<DateTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
FieldType::SingleSelect => field_meta
.get_type_option_entry::<SingleSelectTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
FieldType::MultiSelect => field_meta
.get_type_option_entry::<MultiSelectTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
FieldType::Checkbox => field_meta
.get_type_option_entry::<CheckboxTypeOption>(field_type)?
.decode_cell_data(data, field_meta),
}; };
tracing::Span::current().record("content", &format!("{:?}: {}", field_meta.field_type, s).as_str()); tracing::Span::current().record("content", &format!("{:?}: {}", field_meta.field_type, s).as_str());
Ok(s) Some(s)
} }

View File

@ -34,28 +34,16 @@ pub fn make_cell_by_field_id(
cell_meta: CellMeta, cell_meta: CellMeta,
) -> Option<(String, Cell)> { ) -> Option<(String, Cell)> {
let field_meta = field_map.get(&field_id)?; let field_meta = field_map.get(&field_id)?;
match decode_cell_data(cell_meta.data, field_meta) { let content = decode_cell_data(cell_meta.data, field_meta, &field_meta.field_type)?;
Ok(content) => { let cell = Cell::new(&field_id, content);
let cell = Cell::new(&field_id, content); Some((field_id, cell))
Some((field_id, cell))
}
Err(e) => {
tracing::error!("{}", e);
None
}
}
} }
#[allow(dead_code)] #[allow(dead_code)]
pub fn make_cell(field_id: &str, field_meta: &FieldMeta, row_meta: &RowMeta) -> Option<Cell> { pub fn make_cell(field_id: &str, field_meta: &FieldMeta, row_meta: &RowMeta) -> Option<Cell> {
let cell_meta = row_meta.cells.get(field_id)?.clone(); let cell_meta = row_meta.cells.get(field_id)?.clone();
match decode_cell_data(cell_meta.data, field_meta) { let content = decode_cell_data(cell_meta.data, field_meta, &field_meta.field_type)?;
Ok(content) => Some(Cell::new(field_id, content)), Some(Cell::new(field_id, content))
Err(e) => {
tracing::error!("{}", e);
None
}
}
} }
pub(crate) fn make_row_orders_from_row_metas(row_metas: &[Arc<RowMeta>]) -> Vec<RowOrder> { pub(crate) fn make_row_orders_from_row_metas(row_metas: &[Arc<RowMeta>]) -> Vec<RowOrder> {

View File

@ -287,7 +287,7 @@ async fn grid_row_add_date_cell_test() {
let date_field = date_field.unwrap(); let date_field = date_field.unwrap();
let cell_data = context.cell_by_field_id.get(&date_field.id).unwrap().clone(); let cell_data = context.cell_by_field_id.get(&date_field.id).unwrap().clone();
assert_eq!( assert_eq!(
decode_cell_data(cell_data.data.clone(), &date_field).unwrap(), decode_cell_data(cell_data.data.clone(), &date_field, &date_field.field_type).unwrap(),
"2022/03/16 08:31", "2022/03/16 08:31",
); );
let scripts = vec![CreateRow { context }]; let scripts = vec![CreateRow { context }];

View File

@ -258,7 +258,7 @@ pub fn create_text_field(grid_id: &str) -> (CreateFieldParams, FieldMeta) {
let cloned_field_meta = field_meta.clone(); let cloned_field_meta = field_meta.clone();
let type_option_data = field_meta let type_option_data = field_meta
.get_type_option_entry::<RichTextTypeOption>(None) .get_type_option_entry::<RichTextTypeOption>(&field_meta.field_type)
.unwrap() .unwrap()
.protobuf_bytes() .protobuf_bytes()
.to_vec(); .to_vec();
@ -290,7 +290,7 @@ pub fn create_single_select_field(grid_id: &str) -> (CreateFieldParams, FieldMet
let field_meta = FieldBuilder::new(single_select).name("Name").visibility(true).build(); let field_meta = FieldBuilder::new(single_select).name("Name").visibility(true).build();
let cloned_field_meta = field_meta.clone(); let cloned_field_meta = field_meta.clone();
let type_option_data = field_meta let type_option_data = field_meta
.get_type_option_entry::<SingleSelectTypeOption>(None) .get_type_option_entry::<SingleSelectTypeOption>(&field_meta.field_type)
.unwrap() .unwrap()
.protobuf_bytes() .protobuf_bytes()
.to_vec(); .to_vec();

View File

@ -122,12 +122,14 @@ impl FieldMeta {
} }
} }
pub fn insert_type_option_entry<T: TypeOptionDataEntry + ?Sized>(&mut self, entry: &T) { pub fn insert_type_option_entry<T>(&mut self, entry: &T)
where
T: TypeOptionDataEntry + ?Sized,
{
self.type_options.insert(entry.field_type().type_id(), entry.json_str()); self.type_options.insert(entry.field_type().type_id(), entry.json_str());
} }
pub fn get_type_option_entry<T: TypeOptionDataEntity>(&self, field_type: Option<FieldType>) -> Option<T> { pub fn get_type_option_entry<T: TypeOptionDataDeserializer>(&self, field_type: &FieldType) -> Option<T> {
let field_type = field_type.as_ref().unwrap_or(&self.field_type);
self.type_options self.type_options
.get(&field_type.type_id()) .get(&field_type.type_id())
.map(|s| T::from_json_str(s)) .map(|s| T::from_json_str(s))
@ -149,7 +151,7 @@ pub trait TypeOptionDataEntry {
fn protobuf_bytes(&self) -> Bytes; fn protobuf_bytes(&self) -> Bytes;
} }
pub trait TypeOptionDataEntity { pub trait TypeOptionDataDeserializer {
fn from_json_str(s: &str) -> Self; fn from_json_str(s: &str) -> Self;
fn from_protobuf_bytes(bytes: Bytes) -> Self; fn from_protobuf_bytes(bytes: Bytes) -> Self;
} }

View File

@ -165,8 +165,8 @@ impl GridBlockMetaPad {
Some(delta) => { Some(delta) => {
tracing::debug!("[GridBlockMeta] Composing delta {}", delta.to_delta_str()); tracing::debug!("[GridBlockMeta] Composing delta {}", delta.to_delta_str());
tracing::debug!( tracing::debug!(
"[GridBlockMeta] Composing str {}", "[GridBlockMeta] current delta: {}",
delta.to_str().unwrap_or("".to_string()) self.delta.to_str().unwrap_or("".to_string())
); );
self.delta = self.delta.compose(&delta)?; self.delta = self.delta.compose(&delta)?;
Ok(Some(GridBlockMetaChange { delta, md5: self.md5() })) Ok(Some(GridBlockMetaChange { delta, md5: self.md5() }))