/** * Attempt to add speakers to the presentation by fuzzy matching the FirstName / Surname * @param Presentation $p * @param VideoPresentation $v */ private function addLegacySpeakers(Presentation $p, VideoPresentation $v) { $speakers = explode(',', $v->Speakers); $created = 0; $resolved = 0; $found = 0; foreach ($speakers as $speakerName) { $speakerName = trim($speakerName); $speakerName = preg_replace('/\\s\\s+/', ' ', $speakerName); $speaker = PresentationSpeaker::get()->where("CONCAT(FirstName, ' ', LastName) = '" . Convert::raw2sql($speakerName) . "'"); if (!$speaker->exists()) { $names = explode(' ', $speakerName); $firstName = array_shift($names); $lastName = implode(' ', $names); $speaker = PresentationSpeaker::create(['FirstName' => $firstName, 'LastName' => $lastName, 'Notes' => '[LEGACY]']); $speaker->write(); $p->Speakers()->add($speaker); echo "Created legacy speaker {$speaker->getName()} from {$speakerName}" . $this->br(); $created++; } else { if ($speaker->count() > 1) { echo "Found more than one speaker matching \"{$speakerName}\": " . implode(',', $speaker->column('ID')) . $this->br(); $bestCandidate = null; $highScore = 0; foreach ($speaker as $s) { $numSpeakings = DB::query("SELECT COUNT(*) FROM `Presentation_Speakers` WHERE PresentationSpeakerID = {$s->ID}")->value(); $hasMember = (int) $s->Member()->exists(); $score = $numSpeakings + $hasMember; if ($score > $highScore) { $highScore = $score; $bestCandidate = $s; } } if ($bestCandidate) { echo "Found best candidate #{$bestCandidate->ID} with a score of {$highScore}" . $this->br(); $p->Speakers()->add($bestCandidate); $resolved++; } else { $this->addError("No speakings or MemberIDs for " . implode(',', $speaker->map('ID', 'Name')->toArray()) . " on \"{$p->Title}\""); } } else { $p->Speakers()->add($speaker->first()); echo "Added speaker " . $speaker->first()->getName() . $this->br(); $found++; } } } $this->stats['Speakers created'] += $created; $this->stats['Speakers resolved'] += $resolved; $this->stats['Speakers found'] += $found; return $p; }