50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
import datetime
|
|
from typing import List, Tuple
|
|
|
|
from wow_token.db.cached_range import CachedRange
|
|
from wow_token.db.compacted import Compacted
|
|
from wow_token.db.recent import Recent
|
|
from wow_token.db.trinity import Trinity
|
|
from wow_token.flavor import Flavor
|
|
from wow_token.path_handler.relative_error import InvalidRelativePathError
|
|
from wow_token.path_handler.relative_path_handler import RelativePathHandler
|
|
from wow_token.region import Region
|
|
|
|
|
|
class MathPathHandler:
|
|
_cdb : Compacted
|
|
_rdb : Recent
|
|
def __init__(self, cdb: Compacted, rdb: Recent):
|
|
self._cdb = cdb
|
|
self._rdb = rdb
|
|
|
|
def path_handler(self, uri: str) -> List[Tuple[str, int]]:
|
|
# This URI takes the form of /v2/math/{math_function}/{flavor}/{region}/{range}
|
|
split_uri = uri.split('/')
|
|
math_function = split_uri[-4]
|
|
data = RelativePathHandler(self._cdb, self._rdb).path_handler(uri)
|
|
|
|
match math_function:
|
|
case 'avg':
|
|
return self._avg(data)
|
|
case _:
|
|
raise NotImplementedError
|
|
|
|
|
|
def _avg(self, data: List[Tuple[str, int]]) -> List[Tuple[str, int]]:
|
|
avg_buckets = []
|
|
bucket_timestamp = None
|
|
bucket_price = 0
|
|
bucket_count = 0
|
|
for timestamp, price in data:
|
|
if bucket_timestamp is None:
|
|
bucket_timestamp = datetime.datetime.fromisoformat(timestamp)
|
|
elif bucket_timestamp.date() != datetime.datetime.fromisoformat(timestamp).date():
|
|
bucket_head = datetime.datetime(year=bucket_timestamp.year, month=bucket_timestamp.month, day=bucket_timestamp.day)
|
|
avg_buckets.append((bucket_head.isoformat(), int(bucket_price/bucket_count)))
|
|
bucket_price = 0
|
|
bucket_count = 0
|
|
bucket_timestamp = datetime.datetime.fromisoformat(timestamp)
|
|
bucket_price += price
|
|
bucket_count += 1
|
|
return avg_buckets |