Commit fcaa1aff authored by Emmanuel Raviart's avatar Emmanuel Raviart

Use an HashMap of amendements to ensure that access to a single amendement is fast.

parent a9bfd3ac
......@@ -330,12 +330,12 @@ pub struct StatutRepresentation {
#[serde(deny_unknown_fields)]
pub struct TextesEtAmendements {
#[serde(rename = "texteleg")]
pub texteleg: Vec<TextelegObject>,
pub texteleg: Vec<TexteLeg>,
}
#[derive(Debug, Deserialize, GraphQLObject)]
#[serde(deny_unknown_fields)]
pub struct TextelegObject {
pub struct TexteLeg {
#[serde(rename = "@xmlns:xsi")]
pub xml_xsi: Option<XmlNamespace>,
#[serde(rename = "amendements")]
......
use acteurs::Acteur;
use acteurs_et_organes;
use agendas::{self, Reunion};
use amendements;
use amendements::{self, Amendement};
use dossiers_legislatifs::{self, DossierParlementaire};
use juniper;
use organes::Organe;
......@@ -13,6 +13,7 @@ pub struct Context {
pub acteur_by_uid: HashMap<String, *const Acteur>,
pub acteurs_et_organes_wrappers: Vec<acteurs_et_organes::ExportJsonWrapper>,
pub agendas_wrappers: Vec<agendas::AgendaJsonWrapper>,
pub amendement_by_uid: HashMap<String, *const Amendement>,
pub amendements_wrappers: Vec<amendements::AmendementsJsonWrapper>,
pub dossier_parlementaire_by_segment: HashMap<String, *const DossierParlementaire>,
pub dossier_parlementaire_by_signet_senat: HashMap<String, *const DossierParlementaire>,
......@@ -31,6 +32,14 @@ impl Context {
.map(|acteur| unsafe { mem::transmute::<*const Acteur, &Acteur>(*acteur) })
}
pub fn get_amendement_at_uid(&self, uid: &str) -> Option<&Amendement> {
self.amendement_by_uid
.get(&uid.to_string())
.map(|amendement| unsafe {
mem::transmute::<*const Amendement, &Amendement>(*amendement)
})
}
pub fn get_dossier_parlementaire_at_segment(
&self,
segment: &str,
......
......@@ -253,6 +253,25 @@ pub fn load(
}
}
let mut amendement_by_uid: HashMap<String, *const Amendement> = HashMap::new();
for wrapper in &amendements_wrappers {
match &wrapper.textes_et_amendements {
None => (),
Some(ref textes_et_amendements) => {
for texteleg in &textes_et_amendements.texteleg {
match &texteleg.amendements {
None => (),
Some(ref amendements) => {
for amendement in &amendements.amendements {
amendement_by_uid.insert(amendement.uid.clone(), amendement);
}
}
}
}
}
}
}
let mut dossier_parlementaire_by_segment: HashMap<String, *const DossierParlementaire> =
HashMap::new();
let mut dossier_parlementaire_by_signet_senat: HashMap<String, *const DossierParlementaire> =
......@@ -332,6 +351,7 @@ pub fn load(
acteur_by_uid,
acteurs_et_organes_wrappers,
agendas_wrappers,
amendement_by_uid,
amendements_wrappers,
dossier_parlementaire_by_segment,
dossier_parlementaire_by_signet_senat,
......
......@@ -199,22 +199,7 @@ graphql_object!(Query: Context |&self| {
}
field amendement(&executor, id: String as "Identifiant (uid) de l'amendement recherché") -> FieldResult<Option<&Amendement>> as "Rechercher un amendement par son identifiant" {
let mut amendement: Option<&Amendement> = None;
for wrapper in &executor.context().amendements_wrappers{
for texteleg in &wrapper.textes_et_amendements{
for txtleg in &texteleg.texteleg{
for amds in &txtleg.amendements{
for amd in &amds.amendements{
if &amd.uid == &id {
amendement = Some(&amd)
}
}
}
}
}
}
Ok(amendement)
Ok(executor.context().get_amendement_at_uid(&id))
}
field amendements(&executor, since: Option<String> as "Date de départ de la recherche des amendements, au format YYYY-MM-DD", until: Option<String> as "Date limite de la recherche des amendements, au format YYYY-MM-DD") -> FieldResult<Vec<&Amendement>> as "Obtenir la liste des amendements, optionnellement en fournissant une date de départ et une date de fin pour la recherche."{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment