teo_runtime/schema/load/
load_data_sets.rs1use teo_parser::ast::schema::Schema;
2use teo_parser::diagnostics::diagnostics::Diagnostics;
3use teo_parser::r#type::Type;
4use teo_parser::traits::named_identifiable::NamedIdentifiable;
5use teo_parser::traits::resolved::Resolve;
6use teo_result::Result;
7use crate::value::Value;
8use crate::{namespace, teon};
9use crate::data_set::{DataSet, Group, Record};
10use crate::schema::fetch::fetchers::fetch_literals::fetch_dictionary_literal;
11use crate::traits::named::Named;
12
13pub fn load_data_sets(namespace: &namespace::Builder, names: Option<&Vec<String>>, all: bool, schema: &Schema, diagnostics: &mut Diagnostics) -> Result<Vec<DataSet>> {
14 let mut result: Vec<DataSet> = vec![];
15 for schema_data_set in schema.data_sets() {
16 if all || (names.is_some() && names.unwrap().contains(&schema_data_set.string_path().join("."))) || (names.is_none() && schema_data_set.auto_seed) {
17 if result.iter().find(|d| &d.name == schema_data_set.string_path()).is_none() {
18 result.push(DataSet {
19 notrack: false,
20 autoseed: false,
21 name: schema_data_set.string_path().clone(),
22 groups: vec![]
23 });
24 }
25 let data_set = result.iter_mut().find(|d| &d.name == schema_data_set.string_path()).unwrap();
26 data_set.notrack = schema_data_set.notrack;
27 data_set.autoseed = schema_data_set.auto_seed;
28 for schema_group in schema_data_set.groups() {
29 if data_set.groups.iter().find(|g| &g.name == schema_group.resolved().string_path()).is_none() {
30 data_set.groups.push(Group {
31 name: schema_group.resolved().string_path().clone(),
32 records: vec![]
33 });
34 }
35 let group = data_set.groups.iter_mut().find(|g| &g.name == schema_group.resolved().string_path()).unwrap();
36 for schema_record in schema_group.records() {
37 let record = Record {
38 name: schema_record.identifier().name().to_owned(),
39 value: fetch_dictionary_literal(schema_record.dictionary(), schema, schema_record, &Type::Undetermined, namespace, diagnostics)?.clone(),
40 };
41 group.records.push(record);
42 }
43 }
44 normalize_dataset_relations(data_set, namespace);
45 }
46 }
47 Ok(result)
48}
49
50pub(crate) fn normalize_dataset_relations<'a>(dataset: &mut DataSet, namespace: &namespace::Builder) {
51 let mut assign_relation_other_sides = vec![];
52 for group in &dataset.groups {
53 let model = namespace.model_at_path(&group.model_path()).unwrap();
54 for record in &group.records {
55 for (k, v) in record.value.as_dictionary().unwrap() {
56 if let Some(relation) = model.relation(k) {
57 let (opposite_model, opposite_rel) = namespace.opposite_relation(relation);
58 if opposite_rel.is_none() {
60 continue
61 }
62 let opposite_rel = opposite_rel.unwrap();
63 if relation.is_vec() {
64 for v in v.as_array().unwrap() {
65 assign_relation_other_sides.push((dataset.name.clone(), opposite_model.path().clone(), v.as_str().unwrap().to_owned(), opposite_rel.name().to_string(), record.name.clone()));
66 }
67 } else {
68 assign_relation_other_sides.push((dataset.name.clone(), opposite_model.path().clone(), v.as_str().unwrap().to_owned(), opposite_rel.name().to_string(), record.name.clone()));
69 }
70 }
71 }
72 }
73 }
74 for (data_set_name, model_name, record_name, field_name, value_name) in &assign_relation_other_sides {
75 assign_relation_other_side(dataset, data_set_name, model_name, record_name, field_name, value_name, namespace);
76 }
77}
78
79fn assign_relation_other_side(dataset: &mut DataSet, data_set_name: &Vec<String>, model_name: &Vec<String>, record_name: &String, field_name: &String, value_name: &String, namespace: &namespace::Builder) {
80 let that_group = dataset.groups.iter_mut().find(|g| &g.name == model_name).unwrap();
81 let that_record = that_group.records.iter_mut().find(|r| &r.name == record_name).unwrap();
82 let model = namespace.model_at_path(model_name).unwrap();
83 let relation = model.relation(field_name).unwrap();
84 if relation.is_vec() {
85 if that_record.value.as_dictionary_mut().unwrap().contains_key(relation.name()) {
86 let array = that_record.value.as_dictionary_mut().unwrap().get_mut(relation.name()).unwrap().as_array_mut().unwrap();
87 let to_insert = Value::String(value_name.clone());
88 if !array.contains(&to_insert) {
89 array.push(to_insert);
90 }
91 } else {
92 that_record.value.as_dictionary_mut().unwrap().insert(relation.name().to_owned(), teon!([Value::String(value_name.clone())]));
93 }
94 } else {
95 that_record.value.as_dictionary_mut().unwrap().insert(relation.name().to_owned(), Value::String(value_name.clone()));
96 }
97}