perf: drop json output support

This commit is contained in:
mokurin000
2025-09-19 03:37:24 +08:00
parent 29e354204b
commit ad2903db9a
4 changed files with 52 additions and 27 deletions

View File

@@ -66,6 +66,16 @@ pub struct MusicRating {
pub achievement: i32, pub achievement: i32,
} }
#[cfg_attr(feature = "parquet", derive(parquet_derive::ParquetRecordWriter))]
#[derive(Default, Debug, Clone, PartialEq)]
pub struct MusicRatingFlatten {
pub user_id: u32,
pub music_id: u32,
pub level: u32,
pub rom_version: i64,
pub achievement: i32,
}
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))] #[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]

View File

@@ -18,6 +18,7 @@ pub use get_user_rating_api::{
GetUserRatingApi, GetUserRatingApi,
GetUserRatingApiResp, // api GetUserRatingApiResp, // api
MusicRating, MusicRating,
MusicRatingFlatten,
Udemae, Udemae,
UserRating, UserRating,
}; };

View File

@@ -363,9 +363,48 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
} }
#[cfg(feature = "fetchall")] #[cfg(feature = "fetchall")]
Commands::ScrapeAllB50Dump {} => { Commands::ScrapeAllB50Dump {} => {
use crate::{cache::B50, utils::helpers::dump_json}; use sdgb_api::title::model::{MusicRating, MusicRatingFlatten};
dump_json::<GetUserRatingApiResp>("b50.json", B50)?; use crate::{
cache::B50,
utils::helpers::{dump_parquet, read_cache},
};
let records: Vec<GetUserRatingApiResp> = read_cache(B50)?;
dump_parquet::<MusicRatingFlatten>(
records
.into_iter()
.map(
|GetUserRatingApiResp {
user_id,
user_rating,
}| {
user_rating
.rating_list
.into_iter()
.chain(user_rating.next_rating_list)
.map(
move |MusicRating {
music_id,
level,
rom_version,
achievement,
}| {
MusicRatingFlatten {
user_id,
music_id,
level,
rom_version,
achievement,
}
},
)
},
)
.flatten()
.collect::<Vec<_>>(),
"b50.parquet",
)?;
} }
Commands::Userdata { Commands::Userdata {

View File

@@ -11,7 +11,6 @@ use parquet::file::writer::SerializedFileWriter;
use parquet::record::RecordWriter; use parquet::record::RecordWriter;
use redb::ReadableTable; use redb::ReadableTable;
use redb::TableDefinition; use redb::TableDefinition;
use serde::Serialize;
use spdlog::{error, info}; use spdlog::{error, info};
use sdgb_api::title::MaiVersionExt; use sdgb_api::title::MaiVersionExt;
@@ -96,30 +95,6 @@ where
Ok(()) Ok(())
} }
pub fn dump_json<D>(
output_path: impl AsRef<Path>,
definition: TableDefinition<'_, u32, Vec<u8>>,
) -> Result<(), Box<dyn snafu::Error>>
where
D: for<'d> BorrowDecode<'d, ()> + Serialize,
{
let file = OpenOptions::new()
.create(true)
.truncate(true)
.write(true)
.open(output_path)?;
#[cfg(file_lock_ready)]
file.try_lock()?;
let data = read_cache::<D>(definition)?;
let writer = BufWriter::new(file);
serde_json::to_writer_pretty(writer, &data)?;
info!("dumped {} records", data.len());
Ok(())
}
pub async fn cached_concurrent_fetch<A: APIExt>( pub async fn cached_concurrent_fetch<A: APIExt>(
user_ids: impl Into<Vec<u32>>, user_ids: impl Into<Vec<u32>>,
client: &AsyncClient, client: &AsyncClient,