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]: 別名, 表示名

def get_team_list() -> list[cls.types.TeamDataDict]:
 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: 取得結果

def exsist_record(ts: str) -> cls.score.GameResult:
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: 順位, 素点