libs.data.lookup.db
lib/data/lookup/db.py
1""" 2lib/data/lookup/db.py 3""" 4 5from contextlib import closing 6from datetime import datetime 7 8import pandas as pd 9 10import libs.global_value as g 11from cls.score import GameResult 12from cls.types import TeamDataDict 13from libs.data import loader 14from libs.utils import dbutil 15 16 17def get_member_id(name: str | None = None) -> dict: 18 """メンバーのIDを返す 19 20 Args: 21 name (str | None, optional): 指定メンバーのみ. Defaults to None. 22 23 Returns: 24 dict: メンバー名とIDのペア 25 """ 26 27 with closing(dbutil.get_connection()) as conn: 28 rows = conn.execute("select name, id from member;") 29 id_list = dict(rows.fetchall()) 30 31 if name in id_list: 32 return {name: id_list[name]} 33 return id_list 34 35 36def member_info(name: str) -> dict: 37 """指定メンバーの記録情報を返す 38 39 Args: 40 name (str): 対象メンバー 41 42 Returns: 43 dict: 記録情報 44 """ 45 46 ret: dict = {} 47 sql = loader.query_modification(""" 48 select 49 count() as game_count, 50 min(ts) as first_game, 51 max(ts) as last_game, 52 max(rpoint) as max_rpoint, 53 min(rpoint) as min_rpoint 54 from 55 --[individual] individual_results as results 56 --[team] team_results as results 57 where 58 rule_version = ? 59 and name = ? 60 """) 61 62 with closing(dbutil.get_connection()) as conn: 63 rows = conn.execute(sql, (g.cfg.mahjong.rule_version, name)) 64 ret = dict(rows.fetchone()) 65 66 return ret 67 68 69def get_guest() -> str: 70 """ゲスト名取得 71 72 Returns: 73 str: ゲスト名 74 """ 75 76 guest_name: str = "" 77 with closing(dbutil.get_connection()) as conn: 78 rows = conn.execute("select name from member where id=0") 79 guest_name = str(rows.fetchone()[0]) 80 81 return guest_name 82 83 84def get_member_list() -> dict[str, str]: 85 """メンバー情報取得 86 87 Returns: 88 dict[str, str]: 別名, 表示名 89 """ 90 91 with closing(dbutil.get_connection()) as conn: 92 rows = conn.execute("select name, member from alias") 93 member_list = dict(rows.fetchall()) 94 95 return member_list 96 97 98def get_team_list() -> list[TeamDataDict]: 99 """チーム情報取得 100 101 Returns: 102 list[TeamDataDict]: チーム情報 103 """ 104 105 ret: list[TeamDataDict] = [] 106 with closing(dbutil.get_connection()) as conn: 107 rows = conn.execute( 108 """ 109 select 110 team.id as id, 111 team.name as team, 112 group_concat(member.name) as member 113 from 114 team 115 left join member on 116 team.id == member.team_id 117 group by 118 team.id 119 """) 120 121 for row in rows.fetchall(): 122 ret.append({ 123 "id": int(row["id"]), 124 "team": str(row["team"]), 125 "member": str(row["member"]).split(",") 126 }) 127 128 return ret 129 130 131def rule_version_range() -> dict: 132 """DBに記録されているルールバージョン毎の範囲を取得する 133 134 Returns: 135 dict: 取得結果 136 """ 137 138 rule: dict = {} 139 with closing(dbutil.get_connection()) as conn: 140 ret = conn.execute( 141 """ 142 select 143 rule_version, 144 strftime("%Y/%m/%d %H:%M:%S", min(playtime)) as min, 145 strftime("%Y/%m/%d %H:%M:%S", max(playtime)) as max 146 from 147 result 148 group by 149 rule_version 150 """ 151 ) 152 153 for version, first_time, last_time in ret.fetchall(): 154 rule[version] = { 155 "first_time": first_time, 156 "last_time": last_time, 157 } 158 159 return rule 160 161 162def regulation_list(word_type: int = 0) -> list: 163 """登録済みワードリストを取得する 164 165 Args: 166 word_type (int, optional): 取得するタイプ. Defaults to 0. 167 168 Returns: 169 list: 取得結果 170 """ 171 172 with closing(dbutil.get_connection()) as cur: 173 ret = cur.execute( 174 """ 175 select 176 word, 177 ex_point 178 from 179 words 180 where 181 type=? 182 """, (word_type,) 183 ).fetchall() 184 185 return ret 186 187 188def exsist_record(ts: str) -> GameResult: 189 """記録されているゲーム結果を返す 190 191 Args: 192 ts (str): 検索するタイムスタンプ 193 194 Returns: 195 GameResult: スコアデータ 196 """ 197 198 result = GameResult() 199 with closing(dbutil.get_connection()) as conn: 200 row = conn.execute(g.sql["SELECT_GAME_RESULTS"], {"ts": ts}).fetchone() 201 202 if row: 203 result.calc(**dict(row)) 204 205 return result 206 207 208def first_record() -> datetime: 209 """最初のゲーム記録時間を返す 210 211 Returns: 212 datetime: 最初のゲーム記録時間 213 """ 214 215 ret = datetime.now() 216 try: 217 with closing(dbutil.get_connection()) as conn: 218 table_count = conn.execute( 219 "select count() from sqlite_master where type='view' and name='game_results';", 220 ).fetchall()[0][0] 221 222 if table_count: 223 record = conn.execute( 224 "select min(playtime) from game_results where rule_version=?;", 225 (g.params.get("rule_version", g.cfg.mahjong.rule_version), ) 226 ).fetchall()[0][0] 227 if record: 228 ret = datetime.fromisoformat(record) 229 except AttributeError: 230 ret = datetime.now() 231 232 return ret 233 234 235def get_results_list(name: str, rule_version: str = "") -> pd.DataFrame: 236 """段位集計用順位リスト生成 237 238 Args: 239 name (str): 集計対象メンバー名 240 rule_version (str, optional): 集計ルールバージョン. Defaults to 空欄. 241 242 Returns: 243 pd.DataFrame: 順位, 素点 244 """ 245 246 ret_data = pd.read_sql( 247 sql=g.sql["SELECT_ALL_RESULTS"], 248 con=dbutil.get_connection(), 249 params={ 250 "rule_version": rule_version if rule_version else g.cfg.mahjong.rule_version, 251 "player_name": name, 252 } 253 ) 254 255 return ret_data
def
get_member_id(name: str | None = None) -> dict:
18def get_member_id(name: str | None = None) -> dict: 19 """メンバーのIDを返す 20 21 Args: 22 name (str | None, optional): 指定メンバーのみ. Defaults to None. 23 24 Returns: 25 dict: メンバー名とIDのペア 26 """ 27 28 with closing(dbutil.get_connection()) as conn: 29 rows = conn.execute("select name, id from member;") 30 id_list = dict(rows.fetchall()) 31 32 if name in id_list: 33 return {name: id_list[name]} 34 return id_list
メンバーのIDを返す
Arguments:
- name (str | None, optional): 指定メンバーのみ. Defaults to None.
Returns:
dict: メンバー名とIDのペア
def
member_info(name: str) -> dict:
37def member_info(name: str) -> dict: 38 """指定メンバーの記録情報を返す 39 40 Args: 41 name (str): 対象メンバー 42 43 Returns: 44 dict: 記録情報 45 """ 46 47 ret: dict = {} 48 sql = loader.query_modification(""" 49 select 50 count() as game_count, 51 min(ts) as first_game, 52 max(ts) as last_game, 53 max(rpoint) as max_rpoint, 54 min(rpoint) as min_rpoint 55 from 56 --[individual] individual_results as results 57 --[team] team_results as results 58 where 59 rule_version = ? 60 and name = ? 61 """) 62 63 with closing(dbutil.get_connection()) as conn: 64 rows = conn.execute(sql, (g.cfg.mahjong.rule_version, name)) 65 ret = dict(rows.fetchone()) 66 67 return ret
指定メンバーの記録情報を返す
Arguments:
- name (str): 対象メンバー
Returns:
dict: 記録情報
def
get_guest() -> str:
70def get_guest() -> str: 71 """ゲスト名取得 72 73 Returns: 74 str: ゲスト名 75 """ 76 77 guest_name: str = "" 78 with closing(dbutil.get_connection()) as conn: 79 rows = conn.execute("select name from member where id=0") 80 guest_name = str(rows.fetchone()[0]) 81 82 return guest_name
ゲスト名取得
Returns:
str: ゲスト名
def
get_member_list() -> dict[str, str]:
85def get_member_list() -> dict[str, str]: 86 """メンバー情報取得 87 88 Returns: 89 dict[str, str]: 別名, 表示名 90 """ 91 92 with closing(dbutil.get_connection()) as conn: 93 rows = conn.execute("select name, member from alias") 94 member_list = dict(rows.fetchall()) 95 96 return member_list
メンバー情報取得
Returns:
dict[str, str]: 別名, 表示名
99def get_team_list() -> list[TeamDataDict]: 100 """チーム情報取得 101 102 Returns: 103 list[TeamDataDict]: チーム情報 104 """ 105 106 ret: list[TeamDataDict] = [] 107 with closing(dbutil.get_connection()) as conn: 108 rows = conn.execute( 109 """ 110 select 111 team.id as id, 112 team.name as team, 113 group_concat(member.name) as member 114 from 115 team 116 left join member on 117 team.id == member.team_id 118 group by 119 team.id 120 """) 121 122 for row in rows.fetchall(): 123 ret.append({ 124 "id": int(row["id"]), 125 "team": str(row["team"]), 126 "member": str(row["member"]).split(",") 127 }) 128 129 return ret
チーム情報取得
Returns:
list[TeamDataDict]: チーム情報
def
rule_version_range() -> dict:
132def rule_version_range() -> dict: 133 """DBに記録されているルールバージョン毎の範囲を取得する 134 135 Returns: 136 dict: 取得結果 137 """ 138 139 rule: dict = {} 140 with closing(dbutil.get_connection()) as conn: 141 ret = conn.execute( 142 """ 143 select 144 rule_version, 145 strftime("%Y/%m/%d %H:%M:%S", min(playtime)) as min, 146 strftime("%Y/%m/%d %H:%M:%S", max(playtime)) as max 147 from 148 result 149 group by 150 rule_version 151 """ 152 ) 153 154 for version, first_time, last_time in ret.fetchall(): 155 rule[version] = { 156 "first_time": first_time, 157 "last_time": last_time, 158 } 159 160 return rule
DBに記録されているルールバージョン毎の範囲を取得する
Returns:
dict: 取得結果
def
regulation_list(word_type: int = 0) -> list:
163def regulation_list(word_type: int = 0) -> list: 164 """登録済みワードリストを取得する 165 166 Args: 167 word_type (int, optional): 取得するタイプ. Defaults to 0. 168 169 Returns: 170 list: 取得結果 171 """ 172 173 with closing(dbutil.get_connection()) as cur: 174 ret = cur.execute( 175 """ 176 select 177 word, 178 ex_point 179 from 180 words 181 where 182 type=? 183 """, (word_type,) 184 ).fetchall() 185 186 return ret
登録済みワードリストを取得する
Arguments:
- word_type (int, optional): 取得するタイプ. Defaults to 0.
Returns:
list: 取得結果
189def exsist_record(ts: str) -> GameResult: 190 """記録されているゲーム結果を返す 191 192 Args: 193 ts (str): 検索するタイムスタンプ 194 195 Returns: 196 GameResult: スコアデータ 197 """ 198 199 result = GameResult() 200 with closing(dbutil.get_connection()) as conn: 201 row = conn.execute(g.sql["SELECT_GAME_RESULTS"], {"ts": ts}).fetchone() 202 203 if row: 204 result.calc(**dict(row)) 205 206 return result
記録されているゲーム結果を返す
Arguments:
- ts (str): 検索するタイムスタンプ
Returns:
GameResult: スコアデータ
def
first_record() -> datetime.datetime:
209def first_record() -> datetime: 210 """最初のゲーム記録時間を返す 211 212 Returns: 213 datetime: 最初のゲーム記録時間 214 """ 215 216 ret = datetime.now() 217 try: 218 with closing(dbutil.get_connection()) as conn: 219 table_count = conn.execute( 220 "select count() from sqlite_master where type='view' and name='game_results';", 221 ).fetchall()[0][0] 222 223 if table_count: 224 record = conn.execute( 225 "select min(playtime) from game_results where rule_version=?;", 226 (g.params.get("rule_version", g.cfg.mahjong.rule_version), ) 227 ).fetchall()[0][0] 228 if record: 229 ret = datetime.fromisoformat(record) 230 except AttributeError: 231 ret = datetime.now() 232 233 return ret
最初のゲーム記録時間を返す
Returns:
datetime: 最初のゲーム記録時間
def
get_results_list(name: str, rule_version: str = '') -> pandas.core.frame.DataFrame:
236def get_results_list(name: str, rule_version: str = "") -> pd.DataFrame: 237 """段位集計用順位リスト生成 238 239 Args: 240 name (str): 集計対象メンバー名 241 rule_version (str, optional): 集計ルールバージョン. Defaults to 空欄. 242 243 Returns: 244 pd.DataFrame: 順位, 素点 245 """ 246 247 ret_data = pd.read_sql( 248 sql=g.sql["SELECT_ALL_RESULTS"], 249 con=dbutil.get_connection(), 250 params={ 251 "rule_version": rule_version if rule_version else g.cfg.mahjong.rule_version, 252 "player_name": name, 253 } 254 ) 255 256 return ret_data
段位集計用順位リスト生成
Arguments:
- name (str): 集計対象メンバー名
- rule_version (str, optional): 集計ルールバージョン. Defaults to 空欄.
Returns:
pd.DataFrame: 順位, 素点