-
-
Save iamsebastian/06a861c81347cd0230d63ab52e9d5161 to your computer and use it in GitHub Desktop.
group_by, api, rust
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#[derive(Debug, RustcEncodable)] | |
struct ByRoughSegm { | |
count: i32, | |
id: i32, | |
kut_id: i32, | |
oe_id: i32, | |
sector_id: i32, | |
segment_id: i32, | |
} | |
impl ToJson for ByRoughSegm { | |
fn to_json(&self) -> Json { | |
let mut map = BTreeMap::new(); | |
add!(map, "count", self.count); | |
add!(map, "id", self.id); | |
add!(map, "kut_id", self.kut_id); | |
add!(map, "oe_id", self.oe_id); | |
add!(map, "sector_id", self.sector_id); | |
add!(map, "segment_id", self.segment_id); | |
Json::Object(map) | |
} | |
} | |
/// Get report via preset id. | |
/// Grouped by segment & branche | |
pub fn gs_by_rough_segm<'mw>(req: &mut Request, res: Response<'mw>) -> MiddlewareResult<'mw> { | |
use schema::calc_fk_gs_scores::table; | |
use schema::calc_fk_gs_scores::columns::{presets_fk_gs_id as preset_field}; | |
let preset_id = query_id!(req, "preset"); | |
let preset = PresetFkGs::get_by_id(preset_id); | |
let mut result = DBResult::<ByRoughSegm> { | |
data: vec![], | |
}; | |
let mut id = 0; | |
// key: sector_id, segment_id, kboe_id, kut_id | |
// val: count | |
let mut map: BTreeMap<(i32, i32, i32, i32), i32> = BTreeMap::new(); | |
let leaders = FkVerbuendeQuery::get_leaders(preset.blz, Some(preset.container_id)); | |
let kboes = OeGroupInBank::get_keys_and_oes(&preset.blz); | |
let sectors = Sector::get_map(preset.blz); | |
let segments = SegmentFkGs::get_by_preset(preset_id); | |
let kibs = KutInBank::get_keys_and_kuts(&preset.blz); | |
// Prepare map. Fill up with zeros for every part. | |
for (_, sector_id) in §ors { | |
for seg in &segments { | |
for (_, oe) in &kboes { | |
for (_, kut) in &kibs { | |
map.insert((sector_id.to_owned(), seg.id, oe.id, kut.id), 0); | |
} | |
} | |
} | |
} | |
let scores = table | |
.filter(preset_field.eq(preset_id)) | |
.load::<CalcFkGsScoresQuery>(&establish_connection()) | |
.expect("Error on querying db"); | |
for score in scores { | |
if let Some(leader) = leaders.get(&score.klammer) { | |
if let Some(sector_id) = sectors.get(&leader.wirtsch_zweig) { | |
if let Some(oe_group) = kboes.get(&leader.kboe) { | |
if let Some(kut) = kibs.get(&leader.kut) { | |
*map.entry((sector_id.to_owned(), score.segment_id, oe_group.id.to_owned(), kut.id.to_owned())).or_insert(0) += 1; | |
} | |
} | |
} | |
} | |
} | |
for ((sec_id, segm_id, oe_id, kut_id), count) in map.into_iter() { | |
result.data.push(ByRoughSegm { | |
kut_id: kut_id, | |
oe_id: oe_id, | |
sector_id: sec_id, | |
segment_id: segm_id, | |
count: count, | |
id: id, | |
}); | |
id += 1; | |
} | |
res.send(result.to_json_with_model_key("report/fk/gs/by-rough-segments")) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment