You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.7 KiB
143 lines
4.7 KiB
//
|
|
// Queries.swift
|
|
// TournamentStats
|
|
//
|
|
// Created by Laurent Morvillier on 03/06/2019.
|
|
// Copyright © 2019 Stax River. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import RealmSwift
|
|
import Realm
|
|
|
|
class Queries {
|
|
|
|
static func biggestWinners(realm: Realm) -> [CumulatedResults] {
|
|
|
|
let players = realm.objects(Player.self)
|
|
var crArray: [CumulatedResults] = []
|
|
|
|
for player in players {
|
|
crArray.append(CumulatedResults(player: player))
|
|
}
|
|
|
|
return crArray.sorted(by: { (cr1, cr2) -> Bool in
|
|
return cr1.total > cr2.total
|
|
})
|
|
}
|
|
|
|
static func mostCashes(realm: Realm, notable: Bool = false) -> [CumulatedResults] {
|
|
|
|
var players = realm.objects(Player.self)
|
|
if (notable) {
|
|
players = players.filter("notable = true")
|
|
}
|
|
var crArray: [CumulatedResults] = []
|
|
|
|
for player in players {
|
|
crArray.append(CumulatedResults(player: player))
|
|
}
|
|
|
|
return crArray.sorted(by: { (cr1, cr2) -> Bool in
|
|
if cr1.numberOfCashes == cr2.numberOfCashes {
|
|
return cr1.total > cr2.total
|
|
}
|
|
return cr1.numberOfCashes > cr2.numberOfCashes
|
|
})
|
|
}
|
|
|
|
static func allWinnersSortedByEvent(realm: Realm, date: Date? = nil) -> [TournamentWinner] {
|
|
|
|
let winners: Results<Result>
|
|
if let day = date {
|
|
winners = realm.objects(Result.self).filter("rank == 1 && ANY tournaments.date IN %@", [day])
|
|
} else {
|
|
winners = realm.objects(Result.self).filter("rank == 1")
|
|
}
|
|
|
|
var tws: [TournamentWinner] = []
|
|
|
|
for w in winners {
|
|
let tw = TournamentWinner(tournament: w.tournaments.first!, result: w)
|
|
tws.append(tw)
|
|
}
|
|
|
|
tws.sort { (tw1, tw2) -> Bool in
|
|
tw1.tournament.number < tw2.tournament.number
|
|
}
|
|
|
|
return tws
|
|
}
|
|
|
|
static func notableCashes(realm: Realm, date: Date) -> [PlayerResult] {
|
|
|
|
let notableCashes: Results<Result> = realm.objects(Result.self).filter("player.notable = true && ANY tournaments.date IN %@", [date])
|
|
|
|
var prs: [PlayerResult] = []
|
|
|
|
for nc in notableCashes {
|
|
let pr = PlayerResult(tournament: nc.tournaments.first!, result: nc)
|
|
prs.append(pr)
|
|
}
|
|
|
|
prs.sort { (pr1, pr2) -> Bool in
|
|
if pr1.result.rank == pr2.result.rank {
|
|
return pr1.result.earnings > pr2.result.earnings
|
|
}
|
|
return pr1.result.rank < pr2.result.rank
|
|
}
|
|
|
|
return prs
|
|
}
|
|
|
|
static func sortedEvents(realm: Realm, fieldName: String, ascending: Bool) -> [TournamentRepresentable] {
|
|
let tournies = realm.objects(Tournament.self).sorted(byKeyPath: fieldName, ascending: ascending)
|
|
var trs: [TournamentRepresentable] = []
|
|
for tourny in tournies {
|
|
trs.append(TournamentRepresentable(tournament: tourny))
|
|
}
|
|
return trs
|
|
}
|
|
|
|
static func cashesByCountry(realm: Realm) -> [CountryCashes] {
|
|
let playerDistinctCountries = realm.objects(Player.self).distinct(by: ["country"])
|
|
var countryCashes: [CountryCashes] = []
|
|
|
|
for player in playerDistinctCountries {
|
|
let country = player.country
|
|
let resultsByCountry = realm.objects(Result.self).filter("player.country == %@", country)
|
|
|
|
let cc = CountryCashes(country: country, cashes: resultsByCountry.count)
|
|
countryCashes.append(cc)
|
|
|
|
}
|
|
|
|
countryCashes.sort { (cc1, cc2) -> Bool in
|
|
return cc1.cashes > cc2.cashes
|
|
}
|
|
|
|
return countryCashes
|
|
}
|
|
|
|
static func averageEvent(realm: Realm) -> [TournamentStats] {
|
|
|
|
let tournaments: Results<Tournament> = realm.objects(Tournament.self)
|
|
let entries: Double? = tournaments.average(ofProperty: "entries")
|
|
let buyin: Double? = tournaments.average(ofProperty: "buyin")
|
|
let prizepool: Double? = tournaments.average(ofProperty: "prizepool")
|
|
|
|
// let itmCount: Double? = tournaments.sum(ofProperty: "results.count")
|
|
|
|
let itmCount: Double = tournaments.reduce(0.0) { $0 + Double($1.results.count) }
|
|
let avgItmCount = itmCount / Double(tournaments.count)
|
|
|
|
if let entries = entries, let buyin = buyin, let prizepool = prizepool {
|
|
let itm = prizepool / avgItmCount
|
|
let ts = TournamentStats(entries: entries, buyin: buyin, prizepool: prizepool, itmValue: itm)
|
|
return [ts]
|
|
}
|
|
|
|
return []
|
|
}
|
|
|
|
}
|
|
|