Skip to content

Commit

Permalink
Add season filter function (#44)
Browse files Browse the repository at this point in the history
  • Loading branch information
Atralupus authored May 8, 2024
1 parent 1d4c28c commit c5a6ac5
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 16 deletions.
31 changes: 27 additions & 4 deletions Mimir/Controllers/ArenaController.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Libplanet.Crypto;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Mimir.Arena;
using Mimir.Models.Arena;
using Mimir.Repositories;
Expand All @@ -14,9 +15,19 @@ namespace Mimir.Controllers;
public class ArenaController(ArenaRankingRepository arenaRankingRepository) : ControllerBase
{
[HttpGet("ranking/{avatarAddress}/rank")]
public async Task<long> GetRankByAvatarAddress(string network, string avatarAddress)
public async Task<long> GetRankByAvatarAddress(
string network,
string avatarAddress,
int? championshipId,
int? round
)
{
var rank = await arenaRankingRepository.GetRankByAvatarAddress(network, avatarAddress);
var rank = await arenaRankingRepository.GetRankByAvatarAddress(
network,
avatarAddress,
championshipId,
round
);
if (rank == 0)
{
Response.StatusCode = StatusCodes.Status404NotFound;
Expand All @@ -27,9 +38,21 @@ public async Task<long> GetRankByAvatarAddress(string network, string avatarAddr
}

[HttpGet("ranking")]
public async Task<List<ArenaRanking>> GetRanking(string network, int limit, int offset)
public async Task<List<ArenaRanking>> GetRanking(
string network,
[BindRequired] int limit,
[BindRequired] int offset,
int? championshipId,
int? round
)
{
return await arenaRankingRepository.GetRanking(network, limit, offset);
return await arenaRankingRepository.GetRanking(
network,
limit,
offset,
championshipId,
round
);
}

[HttpPost("simulate")]
Expand Down
89 changes: 77 additions & 12 deletions Mimir/Repositories/ArenaRankingRespository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,28 @@ protected override string GetCollectionName()
return "arena";
}

public async Task<long> GetRankByAvatarAddress(string network, string avatarAddress)
public async Task<long> GetRankByAvatarAddress(
string network,
string avatarAddress,
int? championshipId,
int? round
)
{
var collection = GetCollection(network);

var pipelines = new BsonDocument[]
{
new BsonDocument(
"$match",
new BsonDocument(
"$and",
new BsonArray
{
new BsonDocument("RoundData.ChampionshipId", championshipId),
new BsonDocument("RoundData.Round", round)
}
)
),
new("$sort", new BsonDocument("Score.Score", -1)),
new(
"$group",
Expand All @@ -50,21 +66,70 @@ public async Task<long> GetRankByAvatarAddress(string network, string avatarAddr
return aggregation.Count == 0 ? 0 : (long)aggregation.First().Rank;
}

public async Task<List<ArenaRanking>> GetRanking(string network, long limit, long offset)
public async Task<List<ArenaRanking>> GetRanking(
string network,
long limit,
long offset,
int? championshipId,
int? round
)
{
var collection = GetCollection(network);

var pipelines = new[]
var pipelines = new List<BsonDocument>
{
@"{ $setWindowFields: { partitionBy: '', sortBy: { 'Score.Score': -1 }, output: { Rank: { $rank: {} } } } }",
$@"{{ $skip: {offset} }}",
$@"{{ $limit: {limit} }}",
@"{ $lookup: { from: 'avatars', localField: 'AvatarAddress', foreignField: 'Avatar.address', as: 'Avatar' } }",
@"{ $unwind: { path: '$Avatar', preserveNullAndEmptyArrays: true } }",
@"{ $unset: ['Avatar.Avatar.inventory', 'Avatar.Avatar.mailBox', 'Avatar.Avatar.stageMap', 'Avatar.Avatar.monsterMap', 'Avatar.Avatar.itemMap', 'Avatar.Avatar.eventMap'] }"
}
.Select(BsonDocument.Parse)
.ToArray();
new BsonDocument(
"$match",
new BsonDocument(
"$and",
new BsonArray
{
new BsonDocument("RoundData.ChampionshipId", championshipId),
new BsonDocument("RoundData.Round", round)
}
)
),
new BsonDocument(
"$setWindowFields",
new BsonDocument
{
{ "partitionBy", "" },
{ "sortBy", new BsonDocument("Score.Score", -1) },
{
"output",
new BsonDocument("Rank", new BsonDocument("$rank", new BsonDocument()))
}
}
),
new BsonDocument("$skip", offset),
new BsonDocument("$limit", limit),
new BsonDocument(
"$lookup",
new BsonDocument
{
{ "from", "avatars" },
{ "localField", "AvatarAddress" },
{ "foreignField", "Avatar.address" },
{ "as", "Avatar" }
}
),
new BsonDocument(
"$unwind",
new BsonDocument { { "path", "$Avatar" }, { "preserveNullAndEmptyArrays", true } }
),
new BsonDocument(
"$unset",
new BsonArray
{
"Avatar.Avatar.inventory",
"Avatar.Avatar.mailBox",
"Avatar.Avatar.stageMap",
"Avatar.Avatar.monsterMap",
"Avatar.Avatar.itemMap",
"Avatar.Avatar.eventMap"
}
)
};

var aggregation = collection.Aggregate<BsonDocument>(pipelines).ToList();
var arenaRankings = await Task.WhenAll(
Expand Down

0 comments on commit c5a6ac5

Please sign in to comment.