Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions collab/src/database/entity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use crate::database::fields::media_type_option::MediaTypeOption;
use crate::database::fields::number_type_option::NumberTypeOption;
use crate::database::fields::person_type_option::PersonTypeOption;
use crate::database::fields::relation_type_option::RelationTypeOption;
use crate::database::fields::rollup_type_option::RollupTypeOption;
use crate::database::fields::select_type_option::{MultiSelectTypeOption, SingleSelectTypeOption};
use crate::database::fields::summary_type_option::SummarizationTypeOption;
use crate::database::fields::text_type_option::RichTextTypeOption;
Expand Down Expand Up @@ -307,6 +308,7 @@ pub enum FieldType {
Time = 13,
Media = 14,
Person = 15,
Rollup = 16,
}

impl FieldType {
Expand Down Expand Up @@ -380,6 +382,7 @@ impl FieldType {
FieldType::Time => "Time",
FieldType::Media => "Media",
FieldType::Person => "Person",
FieldType::Rollup => "Rollup",
};
s.to_string()
}
Expand Down Expand Up @@ -436,6 +439,10 @@ impl FieldType {
matches!(self, FieldType::Relation)
}

pub fn is_rollup(&self) -> bool {
matches!(self, FieldType::Rollup)
}

pub fn is_time(&self) -> bool {
matches!(self, FieldType::Time)
}
Expand Down Expand Up @@ -472,6 +479,7 @@ impl From<i64> for FieldType {
13 => FieldType::Time,
14 => FieldType::Media,
15 => FieldType::Person,
16 => FieldType::Rollup,
_ => {
error!("Unknown field type: {}, fallback to text", index);
FieldType::RichText
Expand Down Expand Up @@ -501,6 +509,7 @@ pub fn default_type_option_data_from_type(field_type: FieldType) -> TypeOptionDa
FieldType::Summary => SummarizationTypeOption::default().into(),
FieldType::Translate => TranslateTypeOption::default().into(),
FieldType::Person => PersonTypeOption::default().into(),
FieldType::Rollup => RollupTypeOption::default().into(),
}
}

Expand Down
4 changes: 4 additions & 0 deletions collab/src/database/fields/type_option/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ pub mod media_type_option;
pub mod number_type_option;
pub mod person_type_option;
pub mod relation_type_option;
pub mod rollup_type_option;
pub mod select_type_option;
pub mod summary_type_option;
pub mod text_type_option;
Expand All @@ -22,6 +23,7 @@ use crate::database::fields::media_type_option::MediaTypeOption;
use crate::database::fields::number_type_option::NumberTypeOption;
use crate::database::fields::person_type_option::PersonTypeOption;
use crate::database::fields::relation_type_option::RelationTypeOption;
use crate::database::fields::rollup_type_option::RollupTypeOption;
use crate::database::fields::select_type_option::{MultiSelectTypeOption, SingleSelectTypeOption};
use crate::database::fields::summary_type_option::SummarizationTypeOption;
use crate::database::fields::timestamp_type_option::TimestampTypeOption;
Expand Down Expand Up @@ -181,6 +183,7 @@ pub fn type_option_cell_writer(
FieldType::Summary => Box::new(SummarizationTypeOption::from(type_option_data)),
FieldType::Translate => Box::new(TranslateTypeOption::from(type_option_data)),
FieldType::Person => Box::new(PersonTypeOption::from(type_option_data)),
FieldType::Rollup => Box::new(RollupTypeOption::from(type_option_data)),
}
}

Expand All @@ -205,5 +208,6 @@ pub fn type_option_cell_reader(
FieldType::Summary => Box::new(SummarizationTypeOption::from(type_option_data)),
FieldType::Translate => Box::new(TranslateTypeOption::from(type_option_data)),
FieldType::Person => Box::new(PersonTypeOption::from(type_option_data)),
FieldType::Rollup => Box::new(RollupTypeOption::from(type_option_data)),
}
}
129 changes: 129 additions & 0 deletions collab/src/database/fields/type_option/rollup_type_option.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
use super::{TypeOptionData, TypeOptionDataBuilder};
use crate::database::entity::FieldType;
use crate::database::fields::{TypeOptionCellReader, TypeOptionCellWriter};
use crate::database::rows::{Cell, new_cell_builder};
use crate::database::template::entity::CELL_DATA;
use crate::util::AnyMapExt;
use serde::{Deserialize, Serialize};
use serde_json::{Value, json};
use serde_repr::{Deserialize_repr, Serialize_repr};
use yrs::Any;

#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
#[repr(i64)]
pub enum RollupDisplayMode {
#[default]
Calculated = 0,
OriginalList = 1,
UniqueList = 2,
}

impl From<i64> for RollupDisplayMode {
fn from(value: i64) -> Self {
match value {
0 => RollupDisplayMode::Calculated,
1 => RollupDisplayMode::OriginalList,
2 => RollupDisplayMode::UniqueList,
_ => RollupDisplayMode::Calculated,
}
}
}

impl From<RollupDisplayMode> for i64 {
fn from(value: RollupDisplayMode) -> Self {
value as i64
}
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RollupTypeOption {
pub relation_field_id: String,
pub target_field_id: String,
pub calculation_type: i64,
pub show_as: RollupDisplayMode,
#[serde(default)]
pub condition_value: String,
}

impl Default for RollupTypeOption {
fn default() -> Self {
Self {
relation_field_id: String::new(),
target_field_id: String::new(),
// Default to Count, which is applicable across all field types.
calculation_type: 5,
show_as: RollupDisplayMode::Calculated,
condition_value: String::new(),
}
}
}

impl From<TypeOptionData> for RollupTypeOption {
fn from(data: TypeOptionData) -> Self {
let relation_field_id: String = data.get_as("relation_field_id").unwrap_or_default();
let target_field_id: String = data.get_as("target_field_id").unwrap_or_default();
let calculation_type: i64 = data.get_as("calculation_type").unwrap_or(5);
let show_as: i64 = data.get_as("show_as").unwrap_or(0);
let condition_value: String = data.get_as("condition_value").unwrap_or_default();
Self {
relation_field_id,
target_field_id,
calculation_type,
show_as: show_as.into(),
condition_value,
}
}
}

impl From<RollupTypeOption> for TypeOptionData {
fn from(data: RollupTypeOption) -> Self {
TypeOptionDataBuilder::from([
(
"relation_field_id".into(),
Any::String(data.relation_field_id.into()),
),
(
"target_field_id".into(),
Any::String(data.target_field_id.into()),
),
(
"calculation_type".into(),
Any::BigInt(data.calculation_type),
),
("show_as".into(), Any::BigInt(i64::from(data.show_as))),
(
"condition_value".into(),
Any::String(data.condition_value.into()),
),
])
}
}

impl TypeOptionCellReader for RollupTypeOption {
fn json_cell(&self, cell: &Cell) -> Value {
json!(self.stringify_cell(cell))
}

fn numeric_cell(&self, cell: &Cell) -> Option<f64> {
self.stringify_cell(cell).parse().ok()
}

fn convert_raw_cell_data(&self, cell_data: &str) -> String {
cell_data.to_string()
}
}

impl TypeOptionCellWriter for RollupTypeOption {
fn convert_json_to_cell(&self, json_value: Value) -> Cell {
let mut cell = new_cell_builder(FieldType::Rollup);
match json_value {
Value::String(value_str) => {
cell.insert(CELL_DATA.into(), value_str.into());
},
_ => {
cell.insert(CELL_DATA.into(), json_value.to_string().into());
},
}
cell
}
}
1 change: 0 additions & 1 deletion collab/src/entity/proto/collab.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// This file is @generated by prost-build.
/// Originating from an AppFlowy Client.
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
Expand Down
1 change: 1 addition & 0 deletions collab/tests/database/database_test/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ mod group_test;
pub mod helper;
mod layout_test;
// mod restore_test;
mod rollup_type_option_test;
mod row_observe_test;
mod row_test;
mod sort_test;
Expand Down
Loading
Loading