diff --git a/Sources/App/Controllers/StatsController.swift b/Sources/App/Controllers/StatsController.swift index 54a65e2..f2eebf4 100644 --- a/Sources/App/Controllers/StatsController.swift +++ b/Sources/App/Controllers/StatsController.swift @@ -3,11 +3,11 @@ import Vapor - struct CODDate { - let month:Int - let year:Int - let day: Int - } +struct CODDate { + let month:Int + let year:Int + let day: Int +} struct StatsController: RouteCollection { @@ -20,7 +20,7 @@ struct StatsController: RouteCollection { statsRoute.get("overall", use: overall) statsRoute.get("all", use: all) statsRoute.get("allDaily", use: allDaily) - + } func index(req: Request) throws -> EventLoopFuture<[Match]> { @@ -68,30 +68,30 @@ struct StatsController: RouteCollection { } func getStatsForDay(year:Int, month:Int, day:Int, req: Request) -> EventLoopFuture{ - - - let winCount = Match.query(on: req.db) - .filter(\.$date >= getStartOfDay(day:day, month: month, year: year)) - .filter(\.$date <= getEndOfDay(day: day, month: month, year: year)) - .filter(\.$win == true ) - .count() - - - let lossCount = Match.query(on: req.db) - .filter(\.$date >= getStartOfDay(day:day, month: month, year: year)) - .filter(\.$date <= getEndOfDay(day: day, month: month, year: year)) - .filter(\.$win == false ) - .count() - - let combined = winCount.and(lossCount) - - return combined.map { (winCount, lossCount) -> (Stats) in + + + let winCount = Match.query(on: req.db) + .filter(\.$date >= getStartOfDay(day:day, month: month, year: year)) + .filter(\.$date <= getEndOfDay(day: day, month: month, year: year)) + .filter(\.$win == true ) + .count() + + + let lossCount = Match.query(on: req.db) + .filter(\.$date >= getStartOfDay(day:day, month: month, year: year)) + .filter(\.$date <= getEndOfDay(day: day, month: month, year: year)) + .filter(\.$win == false ) + .count() + + let combined = winCount.and(lossCount) + + return combined.map { (winCount, lossCount) -> (Stats) in - let ratio:Double = (Double(winCount) / Double(lossCount)).truncate(places: 2) - return Stats.init(winLoss: String(ratio), totalWins: winCount, totalLosses: lossCount) - } - } - + let ratio:Double = (Double(winCount) / Double(lossCount)).truncate(places: 2) + return Stats.init(winLoss: String(ratio), totalWins: winCount, totalLosses: lossCount) + } + } + @@ -134,36 +134,36 @@ struct StatsController: RouteCollection { private func getEndOfMonth(month:Int, year:Int) -> Date { let calendar = Calendar.current - var components = DateComponents() - components.day = -1 - components.month = month + 1 - components.year = year - components.hour = 23 - components.minute = 59 - return calendar.date(from: components)! + var components = DateComponents() + components.day = -1 + components.month = month + 1 + components.year = year + components.hour = 23 + components.minute = 59 + return calendar.date(from: components)! } private func getStartOfDay(day:Int, month:Int, year:Int) -> Date { let calendar = Calendar.current - var components = DateComponents() - components.day = day - components.month = month - components.year = year - components.hour = 0 - components.minute = 0 - return calendar.date(from: components)! + var components = DateComponents() + components.day = day + components.month = month + components.year = year + components.hour = 0 + components.minute = 0 + return calendar.date(from: components)! } private func getEndOfDay(day:Int, month:Int, year:Int) -> Date { let calendar = Calendar.current - var components = DateComponents() - components.day = day - components.month = month - components.year = year - components.hour = 23 - components.minute = 59 - return calendar.date(from: components)! + var components = DateComponents() + components.day = day + components.month = month + components.year = year + components.hour = 23 + components.minute = 59 + return calendar.date(from: components)! } @@ -171,11 +171,11 @@ struct StatsController: RouteCollection { func all(req: Request) throws -> EventLoopFuture { - + var date = getStartDate() var previousMonths:[CODDate] = [] - + repeat { //let stats = getStatsByMonth(year: date.year, month: date.month, req: req) //returns eventloopfuture @@ -188,15 +188,15 @@ struct StatsController: RouteCollection { func getMonthStats (_ remaining: ArraySlice, allMonthlyStats: inout [MonthStats], eventLoop: EventLoop) -> EventLoopFuture<[MonthStats]> { var remaining = remaining if let first = remaining.popLast() { - - + + return getstatsForMonth(year: first.year, month: first.month, req: req).flatMap { [remaining, allMonthlyStats] (stats) -> EventLoopFuture<[MonthStats]> in var allMonthlyStats = allMonthlyStats allMonthlyStats.append(MonthStats(month: first.month, year: first.year, stats:stats )) return getMonthStats(remaining, allMonthlyStats:&allMonthlyStats, eventLoop: eventLoop) } - + } else { return req.eventLoop.makeSucceededFuture(allMonthlyStats) } @@ -230,13 +230,16 @@ struct StatsController: RouteCollection { return combined.map { (winCount, lossCount) -> (Stats) in - let ratio:Double = (Double(winCount) / Double(lossCount)).truncate(places: 2) - - return Stats.init(winLoss: String(ratio), totalWins: winCount, totalLosses: lossCount) + return Stats.init(winLoss: self.getRatio(num: Double(winCount), den: Double(lossCount)), totalWins: winCount, totalLosses: lossCount) } } + private func getRatio( num:Double, den:Double) -> String { + + return String((Double(num) / Double(den)).truncate(places: 2)) + + } func allDaily(req:Request) -> EventLoopFuture{ var date = getStartDate() @@ -249,58 +252,71 @@ struct StatsController: RouteCollection { } while (date < Date()) - - func getDailyStats (_ remaining: ArraySlice, allDailyStats: inout [DailyStats], eventLoop: EventLoop) -> EventLoopFuture<[DailyStats]> { - var remaining = remaining - if let first = remaining.popLast() { - + previousDays = previousDays.reversed() - - return getStatsForDay(year: first.year, month: first.month, day:first.day, req: req).flatMap { [remaining, allDailyStats] (stats) -> EventLoopFuture<[DailyStats]> in - var allDailyStats = allDailyStats - allDailyStats.append(DailyStats(day: first.day, month: first.month, year: first.year, stats: stats)) - return getDailyStats(remaining, allDailyStats:&allDailyStats, eventLoop: eventLoop) - } + + func getDailyStats (_ remaining: ArraySlice, allDailyStats: inout [DailyStats], eventLoop: EventLoop) -> EventLoopFuture<[DailyStats]> { + var remaining = remaining + if let first = remaining.popLast() { - } else { - return req.eventLoop.makeSucceededFuture(allDailyStats) - } - } - - - var stats:[DailyStats] = [] - let dailyStats = getDailyStats(previousDays[0.. AllDailyStats in - return AllDailyStats(dailyStats: dailyStats.filter({ (dailyStats) -> Bool in - if dailyStats.stats.totalWins == 0 && dailyStats.stats.totalLosses == 0 { - return false + return getStatsForDay(year: first.year, month: first.month, day:first.day, req: req).flatMap { [remaining, allDailyStats] (stats) -> EventLoopFuture<[DailyStats]> in + var allDailyStats = allDailyStats + + let totalWins = allDailyStats.reduce(0) { (total, dailyStats) -> Double in + return total + Double(dailyStats.stats.totalWins) } - return true - })) + + let totalLosses = allDailyStats.reduce(0) { (total, dailyStats) -> Double in + return total + Double(dailyStats.stats.totalLosses) + } + + allDailyStats.append(DailyStats(day: first.day, month: first.month, year: first.year, stats: stats, cumulativeRatio: self.getRatio(num: totalWins, den: totalLosses))) + return getDailyStats(remaining, allDailyStats:&allDailyStats, eventLoop: eventLoop) + } + + } else { + return req.eventLoop.makeSucceededFuture(allDailyStats) + } + } + + + var stats:[DailyStats] = [] + let dailyStats = getDailyStats(previousDays[0.. AllDailyStats in + return AllDailyStats(dailyStats: dailyStats.filter({ (dailyStats) -> Bool in + + + if dailyStats.stats.totalWins == 0 && dailyStats.stats.totalLosses == 0 { + return false + } + return true + }).reversed() + + ) } } -// func allCumulativeStats(req:Request) -> EventLoopFuture { -// -// -// } + // func allCumulativeStats(req:Request) -> EventLoopFuture { + // + // + // } private func getStartDate() -> Date { - let calendar = Calendar.current - - var components = DateComponents() - components.day = 20 - components.month = 03 - components.year = 2020 - components.hour = 0 - components.minute = 0 - - return calendar.date(from: components)! + let calendar = Calendar.current + + var components = DateComponents() + components.day = 20 + components.month = 03 + components.year = 2020 + components.hour = 0 + components.minute = 0 + + return calendar.date(from: components)! } @@ -316,7 +332,7 @@ extension Double } extension Date { - + var month:Int { let calanderDate = Calendar.current.dateComponents([.day, .year, .month], from: self) return calanderDate.month ?? 1 diff --git a/Sources/App/Models/AllStats.swift b/Sources/App/Models/AllStats.swift index 69a814c..4cb0aa2 100644 --- a/Sources/App/Models/AllStats.swift +++ b/Sources/App/Models/AllStats.swift @@ -62,20 +62,20 @@ final class AllRollingStats: Content { var cumulativeStats:[DailyStats] } - - final class DailyStats: Content { var day: String var month:String var year: String + var cumulativeRatio:String var stats:Stats - init(day:Int, month:Int, year:Int, stats:Stats) { + init(day:Int, month:Int, year:Int, stats:Stats, cumulativeRatio:String) { self.day = String(day) self.month = Utilities.monthToString(month: month) self.year = String(year) self.stats = stats + self.cumulativeRatio = cumulativeRatio } }