Skip to content

Instantly share code, notes, and snippets.

@iamsebastian
Created July 5, 2017 08:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iamsebastian/06a861c81347cd0230d63ab52e9d5161 to your computer and use it in GitHub Desktop.
Save iamsebastian/06a861c81347cd0230d63ab52e9d5161 to your computer and use it in GitHub Desktop.
group_by, api, rust
#[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 &sectors {
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