diff --git a/src/data/entities.rs b/src/data/entities.rs index b16b6fb..abbed41 100644 --- a/src/data/entities.rs +++ b/src/data/entities.rs @@ -1,5 +1,5 @@ use crate::core::srs::{FADE_PER_DAY, MAX_SCORE, WordOpenMode}; -use crate::data::{INVALID_ID, Id}; +use crate::data::{Id, SmallId, INVALID_ID}; use crate::data_provider::history::HistoryRepositoryInner; use chrono::{DateTime, Local, NaiveDate, Utc}; use fsrs::MemoryState; @@ -19,7 +19,7 @@ pub struct WordData { pub key: String, pub value: String, pub tags: String, - pub additional: LiteMap, + pub additional: LiteMap, } impl EntityData for WordData { diff --git a/src/data_provider/words.rs b/src/data_provider/words.rs index c82e85a..b1f25a8 100644 --- a/src/data_provider/words.rs +++ b/src/data_provider/words.rs @@ -1,7 +1,9 @@ +use litemap::LiteMap; use crate::data::entities::WordData; use crate::data::repositories::{DataRepository, DataRepositoryInner}; use crate::data_provider::{SqliteDbLayer, TableAccessQuerySet}; use rusqlite::{Error, Params, Row}; +use crate::data::{Id, SmallId}; pub type WordRepository = DataRepository; pub type WordRepositoryInner = DataRepositoryInner; @@ -32,7 +34,7 @@ impl TableAccessQuerySet for WordQuerySet { key: row.get(1)?, value: row.get(2)?, tags: row.get(3)?, - additional: serde_json::from_str(&additional).unwrap_or_default(), + additional: additional_from_string(additional), group_id: row.get(5)?, }) } @@ -42,7 +44,7 @@ impl TableAccessQuerySet for WordQuerySet { &entity.key, &entity.value, &entity.tags, - serde_json::to_string(&entity.additional).unwrap_or_default(), + additional_to_string(&entity.additional), entity.group_id, ) } @@ -52,8 +54,29 @@ impl TableAccessQuerySet for WordQuerySet { &entity.key, &entity.value, &entity.tags, - serde_json::to_string(&entity.additional).unwrap_or_default(), + additional_to_string(&entity.additional), entity.id, ) } } + +fn additional_to_string(map: &LiteMap) -> String { + let mut parts = vec![]; + for (id, value) in map { + parts.push(id.to_string()); + parts.push(value.clone()); + } + parts.join("") +} + +fn additional_from_string(data: String) -> LiteMap { + let parts = data.split('').collect::>(); + let chunks = parts.chunks(2).collect::>(); + let mut map = LiteMap::with_capacity(parts.len()); + for part in &chunks { + let id : Id = part[0].parse().unwrap(); + let value: String = part[1].to_string(); + map.insert(id, value); + } + map +}