fix search with multiple results

This commit is contained in:
2020-12-18 12:24:52 +01:00
parent 6a2a4b6fa0
commit 3b678ab4a8
3 changed files with 45 additions and 36 deletions

View File

@@ -97,16 +97,20 @@ class DatabaseConnection:
cursor.execute("SELECT * FROM players WHERE name == ?", (playerName,)) cursor.execute("SELECT * FROM players WHERE name == ?", (playerName,))
row = cursor.fetchone() row = cursor.fetchone()
playerRow = None # if there is exactly one hit for the exact name just return that #
if not playerRow: if row and not cursor.fetchone():
cursor.execute("SELECT * FROM players WHERE name LIKE ?", (playerNamePrepared,)) p = player.PlayerInLeaderboard(row)
playerRow = cursor.fetchone() p.rank = self.getPlayerRank(p)
if not playerRow: return [p]
return None
playerInLeaderboard = player.PlayerInLeaderboard(playerRow) playerRows = []
playerInLeaderboard.rank = self.getPlayerRank(playerInLeaderboard) cursor.execute("SELECT * FROM players WHERE name LIKE ?", (playerNamePrepared,))
return playerInLeaderboard for pr in cursor:
p = player.PlayerInLeaderboard(pr)
p.rank = self.getPlayerRank(p)
playerRows += [p]
return playerRows
def getPlayerRank(self, player): def getPlayerRank(self, player):
'''Calculate player rank - a player rank may change rapidly and '''Calculate player rank - a player rank may change rapidly and

View File

@@ -180,22 +180,34 @@ def leaderboard():
cannotFindPlayer = "" cannotFindPlayer = ""
searchName = "" searchName = ""
playerList = None
doNotComputeRank = True
if playerName: if playerName:
playerInLeaderboard = db.findPlayerByName(playerName) playersInLeaderboard = db.findPlayerByName(playerName)
if not playerInLeaderboard: if not playersInLeaderboard:
cannotFindPlayer = flask.Markup("<div class=noPlayerFound>No player of that name</div>") cannotFindPlayer = flask.Markup("<div class=noPlayerFound>No player of that name</div>")
start = 0 start = 0
else: else:
rank = playerInLeaderboard.rank if len(playersInLeaderboard) == 1:
if(playerInLeaderboard.games < 10): rank = playersInLeaderboard[0].rank
return flask.redirect("/player?id={}".format(playerInLeaderboard.playerId)) if(playersInLeaderboard[0].games < 10):
searchName = playerInLeaderboard.name return flask.redirect("/player?id={}".format(playersInLeaderboard[0].playerId))
searchName = playersInLeaderboard[0].name
start = rank - (rank % SEGMENT) start = rank - (rank % SEGMENT)
else:
playerList = playersInLeaderboard
for p in playerList:
if p.rank == -1:
p.rankStr = "N/A"
else:
p.rankStr = str(p.rank)
doNotComputeRank = False
end = start + SEGMENT reachedEnd = False
maxEntry = 0
if not playerList:
# compute range # # compute range #
end = start + SEGMENT
maxEntry = db.getTotalPlayers() maxEntry = db.getTotalPlayers()
reachedEnd = False reachedEnd = False
if end > maxEntry: if end > maxEntry:
@@ -205,13 +217,6 @@ def leaderboard():
playerList = db.getRankRange(start, end) playerList = db.getRankRange(start, end)
columContent = flask.Markup(flask.render_template("playerLine.html", \
playerRank="Rank", \
playerName="Player", \
playerRating="Rating", \
playerGames="Games", \
playerWinratio="Winratio"))
endOfBoardIndicator = "" endOfBoardIndicator = ""
if reachedEnd: if reachedEnd:
endOfBoardHtml = "<div id='eof' class=endOfBoardIndicator> - - - End of Board - - - </div>" endOfBoardHtml = "<div id='eof' class=endOfBoardIndicator> - - - End of Board - - - </div>"
@@ -222,7 +227,7 @@ def leaderboard():
start = max(start, 0) start = max(start, 0)
finalResponse = flask.render_template("base.html", playerList=playerList, \ finalResponse = flask.render_template("base.html", playerList=playerList, \
columNames=columContent, \ doNotComputeRank=doNotComputeRank, \
start=start, \ start=start, \
endOfBoardIndicator=endOfBoardIndicator, \ endOfBoardIndicator=endOfBoardIndicator, \
findPlayer=cannotFindPlayer, \ findPlayer=cannotFindPlayer, \

View File

@@ -25,7 +25,7 @@
{% for p in playerList %} {% for p in playerList %}
{% set count = loop.index + start %} {% set count = loop.index + start %}
<tr {% if searchName and searchName == p.name %} id="targetPlayer" {% endif %}> <tr {% if searchName and searchName == p.name %} id="targetPlayer" {% endif %}>
<td>{{ count }}</td> <td>{% if doNotComputeRank %} {{ count }} {% else %} {{ p.rankStr }} {% endif %}</td>
<td><a href="/player?id={{ p.playerId }}">{{ p.name }}</a></td> <td><a href="/player?id={{ p.playerId }}">{{ p.name }}</a></td>
<td>{{ p.games }}</td> <td>{{ p.games }}</td>
<td>{{ p.rating }}</td> <td>{{ p.rating }}</td>