Skip to main content

ocel_duckdb_export/
ocel_duckdb_export.rs

1use std::{collections::HashSet, env::args, path::PathBuf};
2
3use process_mining::{Exportable, Importable, OCEL};
4use std::error::Error;
5
6pub fn main() -> Result<(), Box<dyn Error>> {
7    let path_opt = args().nth(1);
8    if let Some(mut path) = path_opt.map(PathBuf::from) {
9        let mut ocel = OCEL::import_from_path(&path)?;
10        // Including invalid E2O relations (i.e., to objects that do not exist) can cause corrupted or incomplete SQL exports
11        // Thus, we filter the E2O relations to only keep valid ones
12        let all_obj_ids: HashSet<_> = ocel.objects.iter().map(|o| &o.id).collect();
13        for e in &mut ocel.events {
14            e.relationships
15                .retain(|r| all_obj_ids.contains(&r.object_id));
16        }
17        // Export
18        path.set_file_name(format!(
19            "{}.duckdb",
20            path.file_name()
21                .and_then(|p| p.to_str())
22                .unwrap_or_default()
23        ));
24        ocel.export_to_path(&path)?;
25    }
26    Ok(())
27}