/** * Hook into the task scheduler to run the rules against new records on the system. */ function data_cleaner_scheduled_task($timestamp, $db, $endtime) { $rules = data_cleaner::get_rules(); data_cleaner_cleanout_old_messages($rules, $db); data_cleaner_run_rules($rules, $db); data_cleaner_update_occurrence_metadata($db, $endtime); data_cleaner_set_cache_fields($db); }
/** * Retrieve the definition of a single rule. * @param string $type Rule type name * @return array Rule definition */ public static function get_rule($type) { $rules = data_cleaner::get_rules(); foreach ($rules as $rule) { if (strcasecmp($rule['testType'], $type) === 0) { if (!array_key_exists('required', $rule)) { $rule['required'] = array(); } if (!array_key_exists('optional', $rule)) { $rule['optional'] = array(); } return $rule; } } // If we got this far then the rule type is not found. throw new exception("Test type {$type} not found"); }
/** * Hook into the task scheduler to run the rules against new records on the system. */ function data_cleaner_scheduled_task() { $db = new Database(); $rules = data_cleaner::get_rules(); $count = data_cleaner_get_occurrence_list($db); try { if ($count > 0) { data_cleaner_cleanout_old_messages($rules, $db); data_cleaner_run_rules($rules, $db); data_cleaner_update_occurrence_metadata($db); data_cleaner_set_cache_fields($db); } $db->query('drop table occlist'); } catch (Exception $e) { $db->query('drop table occlist'); throw $e; } }
/** * Performs the task of running the rules against the temporary */ private function runRules($db) { $rules = data_cleaner::get_rules(); if (!empty($_REQUEST['rule_types'])) { $ruleTypes = json_decode(strtoupper($_REQUEST['rule_types']), true); } $r = array(); foreach ($rules as $rule) { // skip rule types if only running certain ones if (isset($ruleTypes) && !in_array(strtoupper($rule['testType']), $ruleTypes)) { continue; } if (isset($rule['errorMsgField'])) { // rules are able to specify a different field (e.g. from the verification rule data) to provide the error message. $errorField = $rule['errorMsgField']; } else { $errorField = 'error_message'; } foreach ($rule['queries'] as $query) { // queries can override the error message field. $ruleErrorField = isset($query['errorMsgField']) ? $query['errorMsgField'] : $errorField; $errorMsgSuffix = isset($rule['errorMsgSuffix']) ? $rule['errorMsgSuffix'] : ''; $sql = 'select distinct co.taxa_taxon_list_id, ' . $ruleErrorField . $errorMsgSuffix . ' as message from occdelta co'; if (isset($query['joins'])) { $sql .= "\n" . $query['joins']; } $sql .= "\nwhere co.verification_checks_enabled=true"; if (isset($query['where'])) { $sql .= "\nand " . $query['where']; } // we now have the query ready to run which will return a list of the occurrence ids that fail the check. $messages = $db->query($sql)->result_array(false); $r = $r + $messages; } } return $r; }
/** * Overrides the postSubmit function to add in additional metadata and data values. */ protected function postSubmit($isInsert) { require_once DOCROOT . 'client_helpers/helper_base.php'; $result = true; if (isset($this->submission['metaFields'])) { $currentRule = data_cleaner::get_rule($this->test_type); if (isset($this->submission['metaFields']['metadata']['value'])) { $metadata = helper_base::explode_lines_key_value_pairs($this->submission['metaFields']['metadata']['value']); $this->save_verification_rule_metadata($currentRule, $metadata); $data = data_cleaner::parse_test_file($this->submission['metaFields']['data']['value']); $this->save_verification_rule_data($currentRule, $data); $this->postProcessRule($currentRule); } } return true; }
/** * Process the content of a verification rule file. */ private function read_rule_content($rulesettings, $filename, $source_url) { if (!isset($rulesettings['metadata'])) { throw new exception("Missing Metadata section in {$filename}"); } if (!isset($rulesettings['metadata']['testtype'])) { throw new exception("Missing Metadata TestType value in {$filename}"); } require_once MODPATH . 'data_cleaner/plugins/data_cleaner.php'; $currentRule = data_cleaner::get_rule($rulesettings['metadata']['testtype']); // Ensure that the required key/value pairs for this rule type are all present. foreach ($currentRule['required'] as $category => $keys) { $category = strtolower($category); foreach ($keys as $key) { // every key must exist. A * key means that anything is accepted. if ($key = '*') { if (!isset($rulesettings[$category])) { throw new exception("Missing content for {$category} section in {$filename}. " . print_r($rulesettings, true)); } } elseif (!isset($rulesettings[$category][$key])) { throw new exception("Missing {$category} {$key} value in {$filename}"); } } } $this->model->save_verification_rule($source_url, $filename, $rulesettings['metadata']); $this->model->save_verification_rule_metadata($currentRule, $rulesettings['metadata']); unset($rulesettings['metadata']); if (!empty($rulesettings)) { $this->model->save_verification_rule_data($currentRule, $rulesettings); } $this->model->postProcessRule($currentRule); }