From 8f30906e1b1b094d4e3c718c08f9f7cb7e8e6214 Mon Sep 17 00:00:00 2001 From: 283375 Date: Sat, 26 Aug 2023 21:32:13 +0800 Subject: [PATCH] impr: add duplicate detect in `St3ScoreParser.write_database` --- src/arcaea_offline/external/arcaea/st3.py | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/arcaea_offline/external/arcaea/st3.py b/src/arcaea_offline/external/arcaea/st3.py index daebbd2..5dc7e28 100644 --- a/src/arcaea_offline/external/arcaea/st3.py +++ b/src/arcaea_offline/external/arcaea/st3.py @@ -1,9 +1,15 @@ +import logging import sqlite3 from typing import List +from sqlalchemy import select +from sqlalchemy.orm import Session + from ...models.scores import Score from .common import ArcaeaParser +logger = logging.getLogger(__name__) + class St3ScoreParser(ArcaeaParser): CLEAR_TYPES_MAP = {0: -1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1} @@ -42,3 +48,22 @@ class St3ScoreParser(ArcaeaParser): ) return items + + def write_database(self, session: Session, *, skip_duplicate=True): + parsed_scores = self.parse() + for parsed_score in parsed_scores: + query_score = session.scalar( + select(Score).where( + (Score.song_id == parsed_score.song_id) + & (Score.rating_class == parsed_score.rating_class) + & (Score.score == parsed_score.score) + ) + ) + + if query_score and skip_duplicate: + logger.info( + f"{repr(parsed_score)} skipped because " + f"potential duplicate item {repr(query_score)} found." + ) + continue + session.add(parsed_score)