Skip to content

Commit 77d9de4

Browse files
committed
fix: store the best records
1 parent ea6268d commit 77d9de4

3 files changed

Lines changed: 28 additions & 21 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ authors = ["RinChanNOW <https://github.com/RinChanNOWWW>"]
33
description = "ruborute is a command-line tool to get asphyxia@sdvx gaming data."
44
edition = "2018"
55
name = "ruborute"
6-
version = "0.1.2"
6+
version = "0.1.3"
77

88
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
99

src/storage/record.rs

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -313,14 +313,14 @@ impl std::ops::Add<LevelStat> for LevelStat {
313313
pub struct RecordStore {
314314
/// music records of current user.
315315
/// Vec<Record> contained music records of different levels.
316-
records: HashMap<u16, Vec<FullRecord>>,
316+
records: HashMap<u16, HashMap<u8, FullRecord>>,
317317
}
318318

319319
impl RecordStore {
320320
/// open db file and load all music data to memory
321321
pub fn open(user: String, path: impl Into<PathBuf>, music_store: &MusicStore) -> Result<Self> {
322322
let path = path.into();
323-
let mut records: HashMap<u16, Vec<FullRecord>> = HashMap::new();
323+
let mut records: HashMap<u16, HashMap<u8, FullRecord>> = HashMap::new();
324324
// load data
325325
let mut reader = BufReader::new(File::open(&path)?);
326326
let mut stream = serde_json::Deserializer::from_reader(&mut reader).into_iter::<Record>();
@@ -334,12 +334,20 @@ impl RecordStore {
334334
let music = music_store.get_music(music_record.music_id);
335335
let full_record = FullRecord::from_record_with_music(&music_record, music);
336336
if let Some(rec) = records.get_mut(&full_record.get_music_id()) {
337-
if !rec.iter().any(|r| r.level == full_record.get_level()) {
338-
rec.push(full_record.clone());
337+
let level = full_record.get_level();
338+
if !rec.contains_key(&level) {
339+
rec.insert(level, full_record);
340+
} else if let Some(r) = rec.get_mut(&level) {
341+
// record the best record
342+
if r.get_volforce() < full_record.get_volforce() {
343+
*r = full_record;
344+
}
339345
}
340-
rec.sort_by_key(|r| r.get_level());
341346
} else {
342-
records.insert(full_record.get_music_id(), vec![full_record.clone()]);
347+
let mut m = HashMap::new();
348+
let id = full_record.get_music_id();
349+
m.insert(full_record.get_level(), full_record);
350+
records.insert(id, m);
343351
}
344352
}
345353
}
@@ -357,8 +365,9 @@ impl RecordStore {
357365
.iter()
358366
.filter(|(id, _)| music_id.contains(&id))
359367
.map(|(_, rec)| rec)
360-
.collect::<Vec<&Vec<FullRecord>>>()
368+
.collect::<Vec<&HashMap<u8, FullRecord>>>()
361369
.into_iter()
370+
.map(|map| map.values().collect::<Vec<&FullRecord>>())
362371
.flatten()
363372
.collect::<Vec<&FullRecord>>()
364373
}
@@ -369,21 +378,18 @@ impl RecordStore {
369378
.records
370379
.iter()
371380
.map(|(_, rec)| rec)
372-
.collect::<Vec<&Vec<FullRecord>>>()
381+
.collect::<Vec<&HashMap<u8, FullRecord>>>()
373382
.into_iter()
383+
.map(|map| map.values().collect::<Vec<&FullRecord>>())
374384
.flatten()
375385
.collect::<Vec<&FullRecord>>();
376386
records.sort_by_key(|rec| rec.volfoce);
377-
let mut res = Vec::with_capacity(50);
378-
let mut count = 0;
379-
for &rec in records.iter().rev() {
380-
if count == 50 {
381-
break;
382-
}
383-
res.push(rec);
384-
count += 1;
385-
}
386-
res
387+
records
388+
.iter()
389+
.rev()
390+
.take(50)
391+
.cloned()
392+
.collect::<Vec<&FullRecord>>()
387393
}
388394

389395
/// compute the complete volforce
@@ -404,8 +410,9 @@ impl RecordStore {
404410
.records
405411
.iter()
406412
.map(|(_, rec)| rec)
407-
.collect::<Vec<&Vec<FullRecord>>>()
413+
.collect::<Vec<&HashMap<u8, FullRecord>>>()
408414
.into_iter()
415+
.map(|map| map.values().collect::<Vec<&FullRecord>>())
409416
.flatten()
410417
.filter(|r| match level {
411418
Some(l) => r.get_level() == l,

0 commit comments

Comments
 (0)