additional fields encoding and decoding

This commit is contained in:
micialware committed 2026-09-11 13:56:26 +03:00
1 parent f61f93717c
commit cbf49412ec
2 files changed
+28 -5

No files matched your search

+2 -2
View File
@@ -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<String, String>,
pub additional: LiteMap<Id, String>,
}
impl EntityData for WordData {
+26 -3
View File
@@ -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<WordData, WordDataLayer>;
pub type WordRepositoryInner = DataRepositoryInner<WordData, WordDataLayer>;
@@ -32,7 +34,7 @@ impl TableAccessQuerySet<WordData> 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<WordData> 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<WordData> 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<Id, String>) -> 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<Id, String> {
let parts = data.split('').collect::<Vec<&str>>();
let chunks = parts.chunks(2).collect::<Vec<&[&str]>>();
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
}