added preference for places not seen by user in the selection of places for the game
This commit is contained in:
1 parent
66c871fbc2
commit
01f3c7c8cf
2 files changed
+151
-3
No files matched your search
@@ -28,6 +28,16 @@ class PlaceRepository
|
||||
yield from $this->pdm->selectMultipleFromDb($select, Place::class);
|
||||
}
|
||||
|
||||
//TODO: use Map and User instead of id
|
||||
public function getRandomNPlaces(int $mapId, int $n, int $userId = null): array
|
||||
{
|
||||
if(!isset($userId)) {
|
||||
return $this->getRandomNForMapWithValidPano($mapId, $n);
|
||||
} else {
|
||||
return $this->getRandomNewNForMapWithValidPano($mapId, $n, $userId);
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: use Map instead of id
|
||||
public function getRandomNForMapWithValidPano(int $mapId, int $n, array $exclude = []): array
|
||||
{
|
||||
@@ -79,4 +89,119 @@ class PlaceRepository
|
||||
|
||||
return $this->pdm->selectFromDb($select, Place::class);
|
||||
}
|
||||
|
||||
private function getRandomNewNForMapWithValidPano(int $mapId, int $n, int $userId, array $exclude = []): array
|
||||
{
|
||||
$places = [];
|
||||
|
||||
// Never visited places
|
||||
do {
|
||||
$place = $this->getRandomNeverVisitedForMapWithValidPano($mapId, $userId, $exclude);
|
||||
if(isset($place)) {
|
||||
$places[] = $place;
|
||||
$exclude[] = $place->getId();
|
||||
}
|
||||
} while(count($places) < $n && isset($place));
|
||||
|
||||
// Places visited in the longest time
|
||||
while(count($places) < $n)
|
||||
{
|
||||
$place = $this->getRandomOldPlaceForMapWithValidPano($mapId, $userId, $exclude);
|
||||
if(isset($place))
|
||||
{
|
||||
$places[] = $place;
|
||||
$exclude[] = $place->getId();
|
||||
}
|
||||
}
|
||||
|
||||
return $places;
|
||||
}
|
||||
|
||||
private function getRandomNeverVisitedForMapWithValidPano(int $mapId, $userId, array $exclude = []): ?Place
|
||||
{
|
||||
do {
|
||||
$place = $this->selectRandomNeverVisitedFromDbForMap($mapId, $userId, $exclude);
|
||||
if($place === null) {
|
||||
// there is no more never visited place left
|
||||
return null;
|
||||
}
|
||||
|
||||
$panoId = $place->getFreshPanoId();
|
||||
if($panoId === null) {
|
||||
$exclude[] = $place->getId();
|
||||
}
|
||||
} while($panoId === null);
|
||||
|
||||
return $place;
|
||||
}
|
||||
|
||||
private function selectRandomNeverVisitedFromDbForMap(int $mapId, $userId, array $exclude): ?Place
|
||||
{
|
||||
$select_places_by_current_user = new Select(\Container::$dbConnection, 'user_played_place');
|
||||
$select_places_by_current_user->columns(['place_id', 'last_time']);
|
||||
$select_places_by_current_user->where('user_id', '=', $userId);
|
||||
$select_places_by_current_user->setDerivedTableAlias('places_by_current_user');
|
||||
|
||||
$select_unvisited = new Select(\Container::$dbConnection, 'places');
|
||||
$select_unvisited->leftJoin($select_places_by_current_user, ['places', 'id'], '=', ['places_by_current_user', 'place_id']);
|
||||
$select_unvisited->where('map_id', '=', $mapId);
|
||||
$select_unvisited->where('last_time', '=', null);
|
||||
$select_unvisited->where('id', 'NOT IN', $exclude);
|
||||
$numberOfUnvisitedPlaces = $select_unvisited->count();
|
||||
|
||||
if($numberOfUnvisitedPlaces == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$randomOffset = random_int(0, $numberOfUnvisitedPlaces - 1);
|
||||
|
||||
// $select_unvisited->orderBy('last_time');
|
||||
$select_unvisited->limit(1, $randomOffset);
|
||||
|
||||
return $this->pdm->selectFromDb($select_unvisited, Place::class);
|
||||
}
|
||||
|
||||
private function getRandomOldPlaceForMapWithValidPano(int $mapId, $userId, array $exclude = []): ?Place
|
||||
{
|
||||
do {
|
||||
$place = $this->selectRandomOldPlaceFromDbForMap($mapId, $userId, $exclude);
|
||||
if($place === null) {
|
||||
// there is no more never visited place left
|
||||
return null;
|
||||
}
|
||||
|
||||
$panoId = $place->getFreshPanoId();
|
||||
if($panoId === null) {
|
||||
$exclude[] = $place->getId();
|
||||
}
|
||||
} while($panoId === null);
|
||||
|
||||
return $place;
|
||||
}
|
||||
|
||||
private function selectRandomOldPlaceFromDbForMap(int $mapId, $userId, array $exclude): ?Place
|
||||
{
|
||||
$select_places_by_current_user = new Select(\Container::$dbConnection, 'user_played_place');
|
||||
$select_places_by_current_user->columns(['place_id', 'last_time']);
|
||||
$select_places_by_current_user->where('user_id', '=', $userId);
|
||||
$select_places_by_current_user->setDerivedTableAlias('places_by_current_user');
|
||||
|
||||
$select_old_place = new Select(\Container::$dbConnection, 'places');
|
||||
$select_old_place->leftJoin($select_places_by_current_user, ['places', 'id'], '=', ['places_by_current_user', 'place_id']);
|
||||
$select_old_place->where('map_id', '=', $mapId);
|
||||
$select_old_place->where('last_time', 'IS NOT', null);
|
||||
$select_old_place->where('id', 'NOT IN', $exclude);
|
||||
$numberOfOldPlaces = $select_old_place->count();
|
||||
|
||||
if($numberOfOldPlaces == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$randomOffset = random_int(0, $numberOfOldPlaces - 1);
|
||||
|
||||
// $select_unvisited->orderBy('last_time');
|
||||
$select_old_place->limit(1, $randomOffset);
|
||||
|
||||
return $this->pdm->selectFromDb($select_old_place, Place::class);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user