public function getDuplicateCollectorNumber($start) { $retArr = array(); $sql = ''; if ($this->obsUid) { $sql = 'SELECT o.occid, o.eventdate, recordedby, o.recordnumber ' . 'FROM omoccurrences o INNER JOIN ' . '(SELECT eventdate, recordnumber FROM omoccurrences GROUP BY eventdate, recordnumber, collid, observeruid ' . 'HAVING Count(*)>1 AND collid = ' . $this->collid . ' AND observeruid = ' . $this->obsUid . ' AND eventdate IS NOT NULL AND recordnumber IS NOT NULL ' . 'AND recordnumber NOT IN("sn","s.n.","Not Provided","unknown")) intab ' . 'ON o.eventdate = intab.eventdate AND o.recordnumber = intab.recordnumber ' . 'WHERE collid = ' . $this->collid . ' AND observeruid = ' . $this->obsUid . ' '; } else { $sql = 'SELECT o.occid, o.eventdate, recordedby, o.recordnumber ' . 'FROM omoccurrences o INNER JOIN ' . '(SELECT eventdate, recordnumber FROM omoccurrences GROUP BY eventdate, recordnumber, collid ' . 'HAVING Count(*)>1 AND collid = ' . $this->collid . ' AND eventdate IS NOT NULL AND recordnumber IS NOT NULL ' . 'AND recordnumber NOT IN("sn","s.n.","Not Provided","unknown")) intab ' . 'ON o.eventdate = intab.eventdate AND o.recordnumber = intab.recordnumber ' . 'WHERE collid = ' . $this->collid . ' '; } //echo $sql; $rs = $this->conn->query($sql); $collArr = array(); while ($r = $rs->fetch_object()) { $nameArr = Agent::parseLeadingNameInList($r->recordedby); if (isset($nameArr['last']) && $nameArr['last'] && strlen($nameArr['last']) > 2) { $lastName = $nameArr['last']; $collArr[$r->eventdate][$r->recordnumber][$lastName][] = $r->occid; } } $rs->free(); //Collection duplicate clusters $occidArr = array(); $cnt = 0; foreach ($collArr as $ed => $arr1) { foreach ($arr1 as $rn => $arr2) { foreach ($arr2 as $ln => $dupArr) { if (count($dupArr) > 1) { //Skip records until start is reached if ($cnt >= $start) { $sql = 'SELECT ' . $cnt . ' AS dupid, o.occid, o.catalognumber, o.othercatalognumbers, o.othercatalognumbers, o.family, o.sciname, o.recordedby, o.recordnumber, ' . 'o.associatedcollectors, o.eventdate, o.verbatimeventdate, o.country, o.stateprovince, o.county, o.municipality, o.locality, datelastmodified ' . 'FROM omoccurrences o ' . 'WHERE occid IN(' . implode(',', $dupArr) . ') '; //echo $sql; $retArr = array_merge($retArr, $this->getDuplicates($sql)); } if ($cnt > $start + 200) { break 3; } $cnt++; } } } } return $retArr; }
/** Given a name, construct an agent object of the appropriate type. * * @param name the name of the agent to construct. * @return an agent object or null; */ public function constructAgentDetType($name) { $result = null; if (preg_match("/([|;&]| and )/", $name)) { // agent is a composite of more than one agent $result = constructNewAgent('Team', '', '', '', $name); } else { if (preg_match("/([Ee]xpedition|Exped.|[Cc]onsortium|Bureau of|[Ss]ociety|[Cc]ommission)/", $name)) { $result = constructNewAgent('Organization', '', '', '', $name); } else { $namebits = Agent::parseLeadingNameInList($name); $result = constructNewAgent('Individual', $namebits['first'], $namebits['middle'], $namebits['last'], ''); $result->setnotes($name); } } return $result; }