Exemplo n.º 1
0
 /**
  *
  */
 function __construct($pb_dont_cache = false)
 {
     // is the graph already in memory?
     if (!$pb_dont_cache && DataModel::$s_graph) {
         return;
     }
     // is there an on-disk cache of the internal graph?
     if (is_object($vo_cache = $this->_getCacheObject())) {
         if ($va_graph = $vo_cache->load('ca_datamodel_graph')) {
             $this->opo_graph = new Graph($va_graph);
             return;
         }
     }
     $o_config = Configuration::load();
     if ($vs_data_model_path = $o_config->get("data_model")) {
         // is it cached in memory?
         if ($_DATAMODEL_CACHE[$vs_data_model_path]) {
             $this->opo_graph = $_DATAMODEL_CACHE[$vs_data_model_path];
             return true;
         }
         $o_datamodel = Configuration::load($vs_data_model_path);
         $this->opo_graph = new Graph();
         # add tables
         if (!($va_tables = $o_datamodel->getAssoc("tables"))) {
             $va_tables = array();
         }
         foreach ($va_tables as $vs_table => $vn_num) {
             $this->opo_graph->addNode($vs_table);
             $this->opo_graph->addAttribute("num", $vn_num, $vs_table);
             $this->opo_graph->addNode("t#" . $vn_num);
             $this->opo_graph->addAttribute("name", $vs_table, "t#" . $vn_num);
         }
         # add relationships
         if (!($va_relationships = $o_datamodel->getList("relationships"))) {
             $va_relationships = array();
         }
         foreach ($va_relationships as $vs_relationship) {
             $va_keys = preg_split("/[\t ]*=[\t ]*/", $vs_relationship);
             $vn_num_keys = sizeof($va_keys);
             switch ($vn_num_keys) {
                 case 2:
                     $vs_key1 = $va_keys[0];
                     $va_tmp = preg_split('/[ ]+/', $va_keys[1]);
                     $vs_key2 = $va_tmp[0];
                     list($vs_table1, $vs_field1) = explode(".", $vs_key1);
                     list($vs_table2, $vs_field2) = explode(".", $vs_key2);
                     $vn_weight = isset($va_tmp[1]) && intval($va_tmp[1]) > 0 ? intval($va_tmp[1]) : 10;
                     break;
                 default:
                     die("Fatal error: syntax error in datamodel relationship specification: '{$vs_relationship}'\n");
                     break;
             }
             if (!$this->opo_graph->hasNode($vs_table1)) {
                 die("Fatal error: invalid table '{$vs_table1}' in relationship in datamodel definition\n");
             }
             if (!$this->opo_graph->hasNode($vs_table2)) {
                 die("Fatal error: invalid table '{$vs_table2}' in relationship in datamodel definition\n");
             }
             if (!($va_attr = $this->opo_graph->getAttributes($vs_table1, $vs_table2))) {
                 $va_attr = array();
                 $this->opo_graph->addRelationship($vs_table1, $vs_table2);
             }
             $va_attr["relationships"][$vs_table1][$vs_table2][] = array($vs_field1, $vs_field2);
             $va_attr["relationships"][$vs_table2][$vs_table1][] = array($vs_field2, $vs_field1);
             $va_attr['WEIGHT'] = $vn_weight;
             $this->opo_graph->setAttributes($va_attr, $vs_table1, $vs_table2);
         }
         if (is_object($vo_cache)) {
             $vo_cache->save(DataModel::$s_graph = $this->opo_graph->getInternalData(), 'ca_datamodel_graph', array('ca_datamodel_cache'));
         }
     }
 }