arthas 0.3.0

Arthas is an in-memory structure database.
Documentation

use item::Id;
use serde_json::Value;
use super::rc::{RcItem, RcChild, RcNode};
use super::Tree;

pub struct Inserter {}

impl Inserter {
    pub fn insert(tree: &mut Tree, id: Id, value: Value) {
        thread_trace!("insert id: {}", id);
        let rc_item = RcItem::new(id.clone(), value);
        tree.id_map.insert(id.clone(), rc_item.clone());
        let datas = rc_item.read().unwrap().datas.clone();

        for (field_int, rc_data) in datas {
            if rc_data.read().unwrap().can_index() {
                let mut is_min = true;
                let mut is_max = true;

                thread_trace!("current insert field data: {:?}",
                              rc_data.read().unwrap().get_value());

                let rc_child = RcChild::new(rc_data, rc_item.clone());
                let root_exists = tree.root.contains_key(&field_int);

                if root_exists {
                    let node_option = tree.root
                        .get(&field_int)
                        .unwrap()
                        .write()
                        .unwrap()
                        .insert(field_int.clone(),
                                id.clone(),
                                rc_child,
                                &mut is_min,
                                &mut is_max);

                    if node_option.is_some() {
                        let rc_node = node_option.unwrap();
                        if is_min {
                            thread_trace!("found min node: {:?}",
                                          rc_node.read().unwrap().get_value());
                            tree.min.insert(field_int, rc_node);
                        } else if is_max {
                            thread_trace!("found max node: {:?}",
                                          rc_node.read().unwrap().get_value());
                            tree.max.insert(field_int, rc_node);
                        } else {
                            unreachable!()
                        }
                    }
                } else {
                    let rc_node = RcNode::new(id.clone(), rc_child);
                    rc_node.write().unwrap().self_rc = Some(rc_node.clone());
                    rc_item.write().unwrap().nodes.insert(field_int.clone(), rc_node.clone());
                    tree.root.insert(field_int, rc_node);
                }
            }
        }
    }
}