Skip to content

Commit aec2053

Browse files
authored
feat: optimaze operation size
* Feat/op compose (#1392) * fix: support float value in attributes (#1396) Co-authored-by: nathan <[email protected]> * fix: changeset composing (#1398) Co-authored-by: nathan <[email protected]>
1 parent d24625c commit aec2053

33 files changed

+1789
-760
lines changed

frontend/app_flowy/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ packages:
3535
path: "packages/appflowy_editor"
3636
relative: true
3737
source: path
38-
version: "0.0.6"
38+
version: "0.0.7"
3939
appflowy_popover:
4040
dependency: "direct main"
4141
description:

frontend/rust-lib/flowy-document/src/editor/document.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ use bytes::Bytes;
22
use flowy_error::{FlowyError, FlowyResult};
33
use flowy_revision::{RevisionCompress, RevisionObjectDeserializer, RevisionObjectSerializer};
44
use flowy_sync::entities::revision::Revision;
5-
use lib_ot::core::{
6-
Body, Extension, NodeDataBuilder, NodeOperation, NodeTree, NodeTreeContext, Selection, Transaction,
7-
};
5+
use lib_ot::core::{Extension, NodeDataBuilder, NodeOperation, NodeTree, NodeTreeContext, Selection, Transaction};
86
use lib_ot::text_delta::DeltaTextOperationBuilder;
97

108
#[derive(Debug)]
@@ -46,7 +44,7 @@ pub(crate) fn make_tree_context() -> NodeTreeContext {
4644

4745
pub fn initial_document_content() -> String {
4846
let delta = DeltaTextOperationBuilder::new().insert("").build();
49-
let node_data = NodeDataBuilder::new("text").insert_body(Body::Delta(delta)).build();
47+
let node_data = NodeDataBuilder::new("text").insert_delta(delta).build();
5048
let editor_node = NodeDataBuilder::new("editor").add_node_data(node_data).build();
5149
let node_operation = NodeOperation::Insert {
5250
path: vec![0].into(),

frontend/rust-lib/flowy-document/src/editor/document_serde.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ impl DocumentTransaction {
117117

118118
impl std::convert::From<Transaction> for DocumentTransaction {
119119
fn from(transaction: Transaction) -> Self {
120-
let (before_selection, after_selection) = match transaction.extension {
120+
let (operations, extension) = transaction.split();
121+
let (before_selection, after_selection) = match extension {
121122
Extension::Empty => (Selection::default(), Selection::default()),
122123
Extension::TextSelection {
123124
before_selection,
@@ -126,9 +127,7 @@ impl std::convert::From<Transaction> for DocumentTransaction {
126127
};
127128

128129
DocumentTransaction {
129-
operations: transaction
130-
.operations
131-
.into_inner()
130+
operations: operations
132131
.into_iter()
133132
.map(|operation| operation.as_ref().into())
134133
.collect(),
@@ -139,19 +138,16 @@ impl std::convert::From<Transaction> for DocumentTransaction {
139138
}
140139

141140
impl std::convert::From<DocumentTransaction> for Transaction {
142-
fn from(transaction: DocumentTransaction) -> Self {
143-
Transaction {
144-
operations: transaction
145-
.operations
146-
.into_iter()
147-
.map(|operation| operation.into())
148-
.collect::<Vec<NodeOperation>>()
149-
.into(),
150-
extension: Extension::TextSelection {
151-
before_selection: transaction.before_selection,
152-
after_selection: transaction.after_selection,
153-
},
141+
fn from(document_transaction: DocumentTransaction) -> Self {
142+
let mut transaction = Transaction::new();
143+
for document_operation in document_transaction.operations {
144+
transaction.push_operation(document_operation);
154145
}
146+
transaction.extension = Extension::TextSelection {
147+
before_selection: document_transaction.before_selection,
148+
after_selection: document_transaction.after_selection,
149+
};
150+
transaction
155151
}
156152
}
157153

@@ -374,6 +370,17 @@ mod tests {
374370
let _ = serde_json::to_string_pretty(&document).unwrap();
375371
}
376372

373+
// #[test]
374+
// fn document_operation_compose_test() {
375+
// let json = include_str!("./test.json");
376+
// let transaction: Transaction = Transaction::from_json(json).unwrap();
377+
// let json = transaction.to_json().unwrap();
378+
// // let transaction: Transaction = Transaction::from_json(&json).unwrap();
379+
// let document = Document::from_transaction(transaction).unwrap();
380+
// let content = document.get_content(false).unwrap();
381+
// println!("{}", json);
382+
// }
383+
377384
const EXAMPLE_DOCUMENT: &str = r#"{
378385
"document": {
379386
"type": "editor",

frontend/rust-lib/flowy-document/tests/editor/op_test.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ fn attributes_insert_text_at_middle() {
3636

3737
#[test]
3838
fn delta_get_ops_in_interval_1() {
39-
let operations = OperationsBuilder::new().insert("123").insert("4").build();
40-
let delta = DeltaTextOperationBuilder::from_operations(operations);
39+
let delta = DeltaTextOperationBuilder::new().insert("123").insert("4").build();
4140

4241
let mut iterator = OperationIterator::from_interval(&delta, Interval::new(0, 4));
4342
assert_eq!(iterator.ops(), delta.ops);

frontend/rust-lib/flowy-document/tests/editor/serde_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ fn delta_deserialize_null_test() {
8989
let delta1 = DeltaTextOperations::from_json(json).unwrap();
9090

9191
let mut attribute = BuildInTextAttribute::Bold(true);
92-
attribute.remove_value();
92+
attribute.clear();
9393

9494
let delta2 = DeltaOperationBuilder::new()
9595
.retain_with_attributes(7, attribute.into())

frontend/rust-lib/flowy-document/tests/new_document/script.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use flowy_document::editor::{AppFlowyDocumentEditor, Document, DocumentTransacti
33
use flowy_document::entities::DocumentVersionPB;
44
use flowy_test::helper::ViewTest;
55
use flowy_test::FlowySDKTest;
6-
use lib_ot::core::{Body, Changeset, NodeDataBuilder, NodeOperation, Path, Transaction};
6+
use lib_ot::core::{Changeset, NodeDataBuilder, NodeOperation, Path, Transaction};
77
use lib_ot::text_delta::DeltaTextOperations;
88
use std::sync::Arc;
99

@@ -64,7 +64,7 @@ impl DocumentEditorTest {
6464
async fn run_script(&self, script: EditScript) {
6565
match script {
6666
EditScript::InsertText { path, delta } => {
67-
let node_data = NodeDataBuilder::new("text").insert_body(Body::Delta(delta)).build();
67+
let node_data = NodeDataBuilder::new("text").insert_delta(delta).build();
6868
let operation = NodeOperation::Insert {
6969
path,
7070
nodes: vec![node_data],

frontend/rust-lib/flowy-folder/src/services/workspace/event_handler.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ fn read_workspaces_on_server(
119119
let workspace_revs = server.read_workspace(&token, params).await?;
120120
let _ = persistence
121121
.begin_transaction(|transaction| {
122-
tracing::trace!("Save {} workspace", workspace_revs.len());
123122
for workspace_rev in &workspace_revs {
124123
let m_workspace = workspace_rev.clone();
125124
let app_revs = m_workspace.apps.clone();

shared-lib/lib-ot/src/core/attributes/attribute.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,14 @@ pub struct AttributeEntry {
1212
}
1313

1414
impl AttributeEntry {
15-
pub fn remove_value(&mut self) {
15+
pub fn new<K: Into<AttributeKey>, V: Into<AttributeValue>>(key: K, value: V) -> Self {
16+
Self {
17+
key: key.into(),
18+
value: value.into(),
19+
}
20+
}
21+
22+
pub fn clear(&mut self) {
1623
self.value.ty = None;
1724
self.value.value = None;
1825
}
@@ -108,6 +115,10 @@ impl AttributeHashMap {
108115
pub fn is_empty(&self) -> bool {
109116
self.0.is_empty()
110117
}
118+
119+
pub fn to_json(&self) -> Result<String, OTError> {
120+
serde_json::to_string(self).map_err(|err| OTError::serde().context(err))
121+
}
111122
}
112123

113124
impl Display for AttributeHashMap {
@@ -203,11 +214,10 @@ impl AttributeValue {
203214
pub fn none() -> Self {
204215
Self { ty: None, value: None }
205216
}
206-
pub fn from_int(val: usize) -> Self {
207-
let value = if val > 0_usize { Some(val.to_string()) } else { None };
217+
pub fn from_int(val: i64) -> Self {
208218
Self {
209219
ty: Some(ValueType::IntType),
210-
value,
220+
value: Some(val.to_string()),
211221
}
212222
}
213223

@@ -261,7 +271,7 @@ impl std::convert::From<bool> for AttributeValue {
261271

262272
impl std::convert::From<usize> for AttributeValue {
263273
fn from(value: usize) -> Self {
264-
AttributeValue::from_int(value)
274+
AttributeValue::from_int(value as i64)
265275
}
266276
}
267277

@@ -277,6 +287,12 @@ impl std::convert::From<String> for AttributeValue {
277287
}
278288
}
279289

290+
impl std::convert::From<f64> for AttributeValue {
291+
fn from(value: f64) -> Self {
292+
AttributeValue::from_float(value)
293+
}
294+
}
295+
280296
#[derive(Default)]
281297
pub struct AttributeBuilder {
282298
attributes: AttributeHashMap,

shared-lib/lib-ot/src/core/attributes/attribute_serde.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,56 +70,70 @@ impl<'de> Deserialize<'de> for AttributeValue {
7070
where
7171
E: de::Error,
7272
{
73-
Ok(AttributeValue::from_int(value as usize))
73+
Ok(AttributeValue::from_int(value as i64))
7474
}
7575

7676
fn visit_i16<E>(self, value: i16) -> Result<Self::Value, E>
7777
where
7878
E: de::Error,
7979
{
80-
Ok(AttributeValue::from_int(value as usize))
80+
Ok(AttributeValue::from_int(value as i64))
8181
}
8282

8383
fn visit_i32<E>(self, value: i32) -> Result<Self::Value, E>
8484
where
8585
E: de::Error,
8686
{
87-
Ok(AttributeValue::from_int(value as usize))
87+
Ok(AttributeValue::from_int(value as i64))
8888
}
8989

9090
fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
9191
where
9292
E: de::Error,
9393
{
94-
Ok(AttributeValue::from_int(value as usize))
94+
Ok(AttributeValue::from_int(value as i64))
9595
}
9696

9797
fn visit_u8<E>(self, value: u8) -> Result<Self::Value, E>
9898
where
9999
E: de::Error,
100100
{
101-
Ok(AttributeValue::from_int(value as usize))
101+
Ok(AttributeValue::from_int(value as i64))
102102
}
103103

104104
fn visit_u16<E>(self, value: u16) -> Result<Self::Value, E>
105105
where
106106
E: de::Error,
107107
{
108-
Ok(AttributeValue::from_int(value as usize))
108+
Ok(AttributeValue::from_int(value as i64))
109109
}
110110

111111
fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
112112
where
113113
E: de::Error,
114114
{
115-
Ok(AttributeValue::from_int(value as usize))
115+
Ok(AttributeValue::from_int(value as i64))
116116
}
117117

118118
fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
119119
where
120120
E: de::Error,
121121
{
122-
Ok(AttributeValue::from_int(value as usize))
122+
Ok(AttributeValue::from_int(value as i64))
123+
}
124+
125+
fn visit_f32<E>(self, value: f32) -> Result<Self::Value, E>
126+
where
127+
E: de::Error,
128+
{
129+
Ok(AttributeValue::from_float(value as f64))
130+
}
131+
132+
fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E>
133+
where
134+
E: de::Error,
135+
{
136+
Ok(AttributeValue::from_float(value as f64))
123137
}
124138

125139
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>

shared-lib/lib-ot/src/core/delta/builder.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::core::delta::operation::OperationAttributes;
22
use crate::core::delta::{trim, DeltaOperations};
3-
use crate::core::DeltaOperation;
43

54
/// A builder for creating new [Operations] objects.
65
///
@@ -39,12 +38,13 @@ where
3938
DeltaOperationBuilder::default()
4039
}
4140

42-
pub fn from_operations(operations: Vec<DeltaOperation<T>>) -> DeltaOperations<T> {
43-
let mut delta = DeltaOperationBuilder::default().build();
44-
operations.into_iter().for_each(|operation| {
45-
delta.add(operation);
41+
pub fn from_delta_operation(delta_operation: DeltaOperations<T>) -> Self {
42+
debug_assert!(delta_operation.utf16_base_len == 0);
43+
let mut builder = DeltaOperationBuilder::new();
44+
delta_operation.ops.into_iter().for_each(|operation| {
45+
builder.delta.add(operation);
4646
});
47-
delta
47+
builder
4848
}
4949

5050
/// Retain the 'n' characters with the attributes. Use 'retain' instead if you don't

0 commit comments

Comments
 (0)