diff --git a/src/main.rs b/src/main.rs index c11e8a5..f7f711e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,13 @@ -use anyhow::{Error, Result}; +use anyhow::{Error, Ok, Result}; use dotenv_codegen::dotenv; use serde_json::{from_str, Value}; use std::fs::File; use std::io::{BufRead, BufReader}; -use surrealdb::engine::remote::ws::Ws; -use surrealdb::opt::auth::Root; -use surrealdb::Surreal; +use surrealdb::{engine::remote::ws::Ws, opt::auth::Root, Surreal}; +use wikidata::Entity; mod utils; use utils::*; -use wikidata::Entity; #[tokio::main] async fn main() -> Result<(), Error> { @@ -23,7 +21,7 @@ async fn main() -> Result<(), Error> { db.use_ns("wikidata").use_db("wikidata").await?; - let file = File::open("data/w.json")?; + let file = File::open("data/ex2.json")?; let reader = BufReader::new(file); for line in reader.lines() { @@ -35,10 +33,13 @@ async fn main() -> Result<(), Error> { let json: Value = from_str(&line)?; let data = Entity::from_json(json).expect("Failed to parse JSON"); - let (id, data) = EntityMini::from_entity(data); + let (id, claims, data) = EntityMini::from_entity(data); let _: Option = db.delete(&id).await?; let _: Option = db.create(&id).content(data.clone()).await?; + + let _: Option = db.delete(&claims.0).await?; + let _: Option = db.create(&claims.0).content(claims.1).await?; } Ok(()) diff --git a/src/utils.rs b/src/utils.rs index 5dc2611..9d96282 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,54 +1,69 @@ +use dotenv_codegen::dotenv; use serde::{Deserialize, Serialize}; use surrealdb::sql::Thing; -use wikidata::ClaimValueData; -use wikidata::{ClaimValue, Entity, Lang, Pid, WikiId}; +use wikidata::{ClaimValue, ClaimValueData, Entity, Lang, Pid, WikiId}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Claims { + pub claims: Vec<(Thing, ClaimValueData)>, +} #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct EntityMini { - // In English pub label: String, - pub claims: Vec<(Thing, ClaimValueData)>, + pub claims: Thing, pub description: String, } impl EntityMini { - pub fn from_entity(entity: Entity) -> (Thing, Self) { + pub fn from_entity(entity: Entity) -> (Thing, (Thing, Claims), Self) { + let thing_claim = Thing { + id: get_id(&entity).id, + tb: "Claims".to_string(), + }; + ( get_id(&entity), + ( + thing_claim.clone(), + Self::flatten_claims(entity.claims.clone()), + ), Self { label: get_name(&entity), - claims: Self::flatten_claims(entity.claims.clone()), + claims: thing_claim, description: get_description(&entity).unwrap_or("".to_string()), }, ) } - fn flatten_claims(claims: Vec<(Pid, ClaimValue)>) -> Vec<(Thing, ClaimValueData)> { - claims - .iter() - .flat_map(|(pid, claim_value)| { - let mut flattened = vec![( - Thing { - id: pid.0.into(), - tb: "Property".to_string(), - }, - claim_value.data.clone(), - )]; + fn flatten_claims(claims: Vec<(Pid, ClaimValue)>) -> Claims { + Claims { + claims: claims + .iter() + .flat_map(|(pid, claim_value)| { + let mut flattened = vec![( + Thing { + id: pid.0.into(), + tb: "Property".to_string(), + }, + claim_value.data.clone(), + )]; - flattened.extend(claim_value.qualifiers.iter().map( - |(qualifier_pid, qualifier_value)| { - ( - Thing { - id: qualifier_pid.0.into(), - tb: "Property".to_string(), - }, - qualifier_value.clone(), - ) - }, - )); - flattened - }) - .collect() + flattened.extend(claim_value.qualifiers.iter().map( + |(qualifier_pid, qualifier_value)| { + ( + Thing { + id: qualifier_pid.0.into(), + tb: "Property".to_string(), + }, + qualifier_value.clone(), + ) + }, + )); + flattened + }) + .collect(), + } } } @@ -66,11 +81,14 @@ fn get_id(entity: &Entity) -> Thing { fn get_name(entity: &Entity) -> String { entity .labels - .get(&Lang("en".to_string())) + .get(&Lang(dotenv!("WIKIDATA_LANG").to_string())) .expect("No label found") .to_string() } fn get_description(entity: &Entity) -> Option { - entity.descriptions.get(&Lang("en".to_string())).cloned() + entity + .descriptions + .get(&Lang(dotenv!("WIKIDATA_LANG").to_string())) + .cloned() }