PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/SchemaConnection.php

https://github.com/EOL/eol_php_code
PHP | 353 lines | 297 code | 41 blank | 15 comment | 43 complexity | 714637bba484d20e37ee0d381e9d148c MD5 | raw file
  1. <?php
  2. namespace php_active_record;
  3. class SchemaConnection
  4. {
  5. private $resource;
  6. private $content_manager;
  7. function __construct(&$resource)
  8. {
  9. $this->mysqli =& $GLOBALS['db_connection'];
  10. $this->content_manager = new ContentManager();
  11. $this->resource =& $resource;
  12. $this->harvested_data_object_ids = array();
  13. }
  14. function get_resource()
  15. {
  16. return $this->resource;
  17. }
  18. function add_taxon($t)
  19. {
  20. $hierarchy_entry = HierarchyEntry::create_entries_for_taxon($t, $this->resource->hierarchy_id);
  21. if(@!$hierarchy_entry->id) return false;
  22. $this->resource->harvest_event->add_hierarchy_entry($hierarchy_entry, 'inserted');
  23. $hierarchy_entry->delete_common_names();
  24. if(@$t['common_names'])
  25. {
  26. foreach($t['common_names'] as &$c)
  27. {
  28. $name = Name::find_or_create_by_string($c['name']);
  29. $hierarchy_entry->add_synonym($name->id, SynonymRelation::find_or_create_by_translated_label('common name')->id, @$c['language']->id ?: 0, 0);
  30. }
  31. }
  32. $hierarchy_entry->delete_synonyms();
  33. if(@$t['synonyms'])
  34. {
  35. foreach($t['synonyms'] as &$s)
  36. {
  37. $hierarchy_entry->add_synonym($s['name']->id, @$s['synonym_relation']->id ?: 0, 0, 0);
  38. }
  39. }
  40. $hierarchy_entry->delete_agents();
  41. if(@$t['agents'])
  42. {
  43. $i = 0;
  44. foreach($t['agents'] as &$a)
  45. {
  46. $agent = Agent::find_or_create($a);
  47. if($agent->logo_url && !$agent->logo_cache_url)
  48. {
  49. if($logo_cache_url = $this->content_manager->grab_file($agent->logo_url, "partner"))
  50. {
  51. $agent->logo_cache_url = $logo_cache_url;
  52. $agent->save();
  53. }
  54. }
  55. $hierarchy_entry->add_agent($agent->id, @$a['agent_role']->id ?: 0, $i);
  56. unset($a);
  57. $i++;
  58. }
  59. }
  60. $hierarchy_entry->delete_refs();
  61. if(@$t['refs'])
  62. {
  63. foreach($t['refs'] as &$r)
  64. {
  65. if(@$r->id)
  66. {
  67. $hierarchy_entry->add_reference($r->id);
  68. $r->publish();
  69. }
  70. unset($r);
  71. }
  72. }
  73. foreach($t['data_objects'] as &$d)
  74. {
  75. $this->add_data_object($hierarchy_entry, $d);
  76. unset($d);
  77. }
  78. return $hierarchy_entry;
  79. }
  80. function add_data_object($hierarchy_entry, $options)
  81. {
  82. $d = $options[0];
  83. $parameters = $options[1];
  84. // Add default values from resource
  85. if(@!$d->rights_statement && $this->resource->rights_statement) $d->rights_statement = $this->resource->rights_statement;
  86. if(@!$d->rights_holder && $this->resource->rights_holder) $d->rights_holder = $this->resource->rights_holder;
  87. if(@!$d->license_id && $this->resource->license_id) $d->license_id = $this->resource->license_id;
  88. if(@!$d->language_id && $this->resource->language_id) $d->language_id = $this->resource->language_id;
  89. // print_r($d);
  90. list($data_object, $status, $existing_data_object) = DataObject::find_and_compare($this->resource, $d, $this->content_manager);
  91. $GLOBALS['db_connection']->commit();
  92. if(@!$data_object->id) return false;
  93. $vetted_id = Vetted::unknown()->id;
  94. $visibility_id = Visibility::preview()->id;
  95. if($existing_data_object)
  96. {
  97. // if($existing_data_object && ($this->resource->title != "Wikipedia" || $status == "Unchanged") && $v = $existing_data_object->best_vetted())
  98. if($existing_data_object && $v = $existing_data_object->best_vetted())
  99. {
  100. $vetted_id = $v->id;
  101. }
  102. if($existing_data_object && $v = $existing_data_object->best_visibility())
  103. {
  104. if($v != Visibility::visible())
  105. {
  106. // if the existing object is visible - this will go on as preview
  107. // otherwise this will inherit the visibility (unpublished)
  108. $visibility_id = $v->id;
  109. }
  110. }
  111. }
  112. // we only delete the object's entries the first time we see it, to allow for multiple taxa per object
  113. if(!isset($this->harvested_data_object_ids[$data_object->id])) $data_object->delete_hierarchy_entries();
  114. $this->harvested_data_object_ids[$data_object->id] = 1;
  115. $hierarchy_entry->add_data_object($data_object->id, $vetted_id, $visibility_id);
  116. $this->resource->harvest_event->add_data_object($data_object, $status);
  117. if($status!="Reused")
  118. {
  119. $i = 0;
  120. $data_object->delete_agents();
  121. foreach($parameters['agents'] as &$a)
  122. {
  123. $agent = Agent::find_or_create($a);
  124. if($agent->logo_url && !$agent->logo_cache_url)
  125. {
  126. if($logo_cache_url = $this->content_manager->grab_file($agent->logo_url, "partner"))
  127. {
  128. $agent->logo_cache_url = $logo_cache_url;
  129. $agent->save();
  130. }
  131. }
  132. $data_object->add_agent($agent->id, @$a['agent_role']->id ?: 0, $i);
  133. unset($a);
  134. $i++;
  135. }
  136. $data_object->delete_audiences();
  137. foreach($parameters['audiences'] as &$a)
  138. {
  139. $data_object->add_audience($a->id);
  140. unset($a);
  141. }
  142. $data_object->delete_info_items();
  143. $data_object->delete_table_of_contents();
  144. if(@$parameters['info_items'])
  145. {
  146. foreach($parameters['info_items'] as &$ii)
  147. {
  148. $data_object->add_info_item($ii->id);
  149. unset($ii);
  150. }
  151. }
  152. $data_object->delete_refs();
  153. if(@$parameters['refs'])
  154. {
  155. foreach($parameters['refs'] as &$r)
  156. {
  157. if(@$r->id)
  158. {
  159. $data_object->add_reference($r->id);
  160. $r->publish();
  161. }
  162. unset($r);
  163. }
  164. }
  165. }
  166. }
  167. static function force_wikipedia_taxon($t)
  168. {
  169. $wikipedia_resource = Resource::wikipedia();
  170. $last_wikipedia_harvest = new HarvestEvent($wikipedia_resource->most_recent_published_harvest_event_id());
  171. $content_manager = new ContentManager();
  172. $hierarchy_entry = HierarchyEntry::create_entries_for_taxon($t, $wikipedia_resource->hierarchy_id);
  173. if(@!$hierarchy_entry->id) return false;
  174. $last_wikipedia_harvest->add_hierarchy_entry($hierarchy_entry, 'inserted');
  175. foreach($t['data_objects'] as &$d)
  176. {
  177. list($data_object, $status) = DataObject::find_and_compare($wikipedia_resource, $d, $content_manager);
  178. if(@!$data_object->id) return false;
  179. $hierarchy_entry->add_data_object($data_object->id);
  180. $last_wikipedia_harvest->add_data_object($data_object, $status);
  181. if(@$d->info_items_ids)
  182. {
  183. $data_object->delete_info_items();
  184. foreach($d->info_items_ids as &$id)
  185. {
  186. $data_object->add_info_item($id);
  187. unset($id);
  188. }
  189. }
  190. return array($hierarchy_entry, $data_object);
  191. }
  192. return false;
  193. }
  194. static function add_translated_taxon($t, $resource)
  195. {
  196. foreach($t['data_objects'] as &$d)
  197. {
  198. self::add_translated_data_object($d, $resource);
  199. unset($d);
  200. }
  201. //return $hierarchy_entry;
  202. }
  203. static function add_translated_data_object($options, $resource)
  204. {
  205. $d = $options[0];
  206. $parameters = $options[1];
  207. if($d->EOLDataObjectID)
  208. {
  209. if($existing_data_object = DataObject::find($d->EOLDataObjectID))
  210. {
  211. $new_data_object = clone $existing_data_object;
  212. $new_data_object->id = NULL;
  213. $new_data_object->identifier = $d->identifier;
  214. $new_data_object->object_created_at = $d->object_created_at;
  215. $new_data_object->object_modified_at = $d->object_modified_at;
  216. $new_data_object->object_title = $d->object_title;
  217. $new_data_object->language = $d->language;
  218. $new_data_object->rights_statement = $d->rights_statement;
  219. $new_data_object->rights_holder = $d->rights_holder;
  220. $new_data_object->description = $d->description;
  221. $new_data_object->description_linked = null;
  222. $new_data_object->location = $d->location;
  223. // check to see if this translation exists by looking in data_object_translations
  224. // if its found, check to see if its different
  225. // otherwise add it, then add all associations (agents, references, hierarchy_entries)
  226. // then add new agents
  227. $content_manager = new ContentManager();
  228. list($data_object, $status) = DataObject::find_and_compare($resource, $new_data_object, $content_manager);
  229. if(@!$data_object->id) return false;
  230. self::add_entries_for_translated_object($existing_data_object, $data_object, $resource);
  231. $resource->harvest_event->add_data_object($data_object, $status);
  232. if($status!="Reused")
  233. {
  234. $i = 0;
  235. $data_object->delete_agents();
  236. foreach($parameters['agents'] as &$a)
  237. {
  238. $agent = Agent::find_or_create($a);
  239. if($agent->logo_url && !$agent->logo_cache_url)
  240. {
  241. if($logo_cache_url = $this->content_manager->grab_file($agent->logo_url, "partner"))
  242. {
  243. $agent->logo_cache_url = $logo_cache_url;
  244. $agent->save();
  245. }
  246. }
  247. $data_object->add_agent($agent->id, @$a['agent_role']->id ?: 0, $i);
  248. unset($a);
  249. $i++;
  250. }
  251. $data_object->delete_translations();
  252. $data_object->add_translation($existing_data_object->id, $data_object->language_id);
  253. $data_object->delete_info_items();
  254. foreach($existing_data_object->info_items as $ii)
  255. {
  256. $data_object->add_info_item($ii->id);
  257. }
  258. // audience
  259. // info items
  260. // table of contents
  261. // all related tables....
  262. }
  263. }else
  264. {
  265. echo "DataObject $d->EOLDataObjectID doesn't exist\n";
  266. }
  267. }else
  268. {
  269. return false;
  270. }
  271. }
  272. static function add_entries_for_translated_object($existing_data_object, $new_data_object, $resource)
  273. {
  274. $new_data_object->delete_hierarchy_entries();
  275. foreach($existing_data_object->hierarchy_entries as $he)
  276. {
  277. if($hierarchy_entry = self::lookup_existing_entry_and_ancestors($he, $resource->hierarchy_id))
  278. {
  279. $resource->harvest_event->add_hierarchy_entry($hierarchy_entry, 'inserted');
  280. $hierarchy_entry->add_data_object($new_data_object->id);
  281. }else return false;
  282. }
  283. return true;
  284. }
  285. static function lookup_existing_entry_and_ancestors($hierarchy_entry, $hierarchy_id)
  286. {
  287. $params = array();
  288. $params["name_id"] = $hierarchy_entry->name_id;
  289. $params["guid"] = $hierarchy_entry->guid;
  290. $params["hierarchy_id"] = $hierarchy_id;
  291. $params["rank_id"] = $hierarchy_entry->rank_id;
  292. $params["ancestry"] = $hierarchy_entry->ancestry;
  293. $params["taxon_concept_id"] = $hierarchy_entry->taxon_concept_id;
  294. $params["parent_id"] = 0;
  295. // $params["identifier"] = $taxon['identifier'];
  296. // $params["source_url"] = $taxon['source_url'];
  297. $params["visibility_id"] = Visibility::preview()->id;
  298. if($parent = $hierarchy_entry->parent())
  299. {
  300. if($parent_entry = self::lookup_existing_entry_and_ancestors($parent, $hierarchy_id))
  301. {
  302. $params["parent_id"] = $parent_entry->id;
  303. }else return false;
  304. }
  305. return HierarchyEntry::find_or_create_by_array($params);
  306. }
  307. }
  308. ?>