From af8a417dc102cfefbb1199248b4ee50c840de6ce Mon Sep 17 00:00:00 2001 From: Hide_D Date: Thu, 27 Jul 2023 17:23:11 +0000 Subject: [PATCH] =?UTF-8?q?refac,=20wip:=20GeneralLite=EC=97=90=EB=8A=94?= =?UTF-8?q?=20RankVar=EA=B0=80=20=EC=9D=BD=EA=B8=B0=EC=A0=84=EC=9A=A9?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=ED=95=84=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/GeneralLite.php | 65 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/hwe/sammo/GeneralLite.php b/hwe/sammo/GeneralLite.php index 0412d01a..d692f75d 100644 --- a/hwe/sammo/GeneralLite.php +++ b/hwe/sammo/GeneralLite.php @@ -17,6 +17,9 @@ class GeneralLite protected $raw = []; protected $rawCity = null; + /** @var Map */ + protected Map $rankVarRead; + /** @var \sammo\ActionLogger */ protected $logger; @@ -49,7 +52,7 @@ class GeneralLite * @param int|null $year 게임 연도 * @param int|null $month 게임 월 */ - public function __construct(array $raw, ?array $city, ?array $nation, ?int $year, ?int $month) + public function __construct(array $raw, ?Map $rawRank, ?array $city, ?array $nation, ?int $year, ?int $month) { if ($nation === null) { $nation = getNationStaticInfo($raw['nation']); @@ -61,6 +64,12 @@ class GeneralLite if ($year !== null && $month !== null) { $this->initLogger($year, $month); } + + if ($rawRank) { + $this->rankVarRead = $rawRank; + } else { + $this->rankVarRead = new Map(); + } } function initLogger(int $year, int $month) @@ -163,6 +172,20 @@ class GeneralLite $this->raw[$key] = $value; } + + function getRankVar(RankColumn $key, $defaultValue = null): int + { + if (!$this->rankVarRead->hasKey($key)) { + if ($defaultValue === null) { + throw new \RuntimeException('인자가 없음 : ' . $key->value); + } + return $defaultValue; + } + + return $this->rankVarRead[$key]; + } + + /** * @param \MeekroDB $db */ @@ -299,7 +322,7 @@ class GeneralLite /** * @var string[] $column */ - [$column,,] = static::mergeQueryColumn($column, $queryMode); + [$column, $rankColumn,] = static::mergeQueryColumn($column, $queryMode); if ($generalIDList === null) { $rawGenerals = Util::convertArrayToDict( @@ -315,13 +338,31 @@ class GeneralLite ); } + /** @var Map> */ + $rawRanks = new Map(); + if ($rankColumn) { + $rawValue = $db->queryAllLists( + 'SELECT `general_id`, `type`, `value` FROM rank_data WHERE general_id IN %li AND `type` IN %ls', + $generalIDList, + array_map(fn (\BackedEnum $e) => $e->value, $rankColumn) + ); + foreach ($rawValue as [$generalID, $rawRankType, $rankValue]) { + if (!$rawRanks->hasKey($generalID)) { + $rawRanks[$generalID] = new Map(); + } + + $rankType = RankColumn::from($rawRankType); + $rawRanks[$generalID][$rankType] = $rankValue; + } + } + $result = []; foreach ($generalIDList as $generalID) { if (!key_exists($generalID, $rawGenerals)) { $result[$generalID] = new DummyGeneral($queryMode->value > 0); continue; } - $result[$generalID] = new static($rawGenerals[$generalID], null, null, $year, $month); + $result[$generalID] = new static($rawGenerals[$generalID], $rawRanks[$generalID] ?? null, null, null, $year, $month); } return $result; @@ -344,8 +385,9 @@ class GeneralLite /** * @var string[] $column + * @var RankColumn[] $rankColumn */ - [$column,,] = static::mergeQueryColumn($column, $queryMode); + [$column, $rankColumn,] = static::mergeQueryColumn($column, $queryMode); $rawGeneral = $db->queryFirstRow('SELECT %l FROM general WHERE no = %i', Util::formatListOfBackticks($column), $generalID); @@ -353,7 +395,20 @@ class GeneralLite return new DummyGeneral($queryMode->value > 0); } - $general = new static($rawGeneral, null, null, $year, $month); + $rawRankValues = new Map(); + if ($rankColumn) { + $rawValue = $db->queryAllLists( + 'SELECT `type`, `value` FROM rank_data WHERE general_id = %i AND `type` IN %ls', + $generalID, + array_map(fn (\BackedEnum $e) => $e->value, $rankColumn) + ); + foreach ($rawValue as [$rawRankType, $rankValue]) { + $rankType = RankColumn::tryFrom($rawRankType); + $rawRankValues->put($rankType, $rankValue); + } + } + + $general = new static($rawGeneral, $rawRankValues, null, null, $year, $month); return $general; }