fix(reader): 排除音眼自制版权ID的录音数据
- 在聚合查询SQL中加入排除音眼自制版权ID的条件 - 更新相关的SQL查询语句,过滤掉指定版权ID的记录 - 修改测试用例,确保音眼自制版权ID的录音被正确排除 - .gitignore新增docs目录的忽略规则
Showing
5 changed files
with
46 additions
and
17 deletions
| ... | @@ -3,6 +3,9 @@ import pymysql | ... | @@ -3,6 +3,9 @@ import pymysql |
| 3 | from .config import PLATFORMS, TARGET_TABLE_NAME | 3 | from .config import PLATFORMS, TARGET_TABLE_NAME |
| 4 | 4 | ||
| 5 | 5 | ||
| 6 | YINYAN_SELF_MADE_COPYRIGHT_ID = '1871126451002978305' | ||
| 7 | |||
| 8 | |||
| 6 | _HK_SONGS_QUERY = f""" | 9 | _HK_SONGS_QUERY = f""" |
| 7 | SELECT id, name, lyricist, composer, audio_url, lyrics_url, | 10 | SELECT id, name, lyricist, composer, audio_url, lyrics_url, |
| 8 | cover_url, singer, issue_time, source_song_id, song_time | 11 | cover_url, singer, issue_time, source_song_id, song_time |
| ... | @@ -28,7 +31,7 @@ WHERE deleted = '0' | ... | @@ -28,7 +31,7 @@ WHERE deleted = '0' |
| 28 | ORDER BY id | 31 | ORDER BY id |
| 29 | """ | 32 | """ |
| 30 | 33 | ||
| 31 | _PLATFORM_QUERY = """ | 34 | _PLATFORM_QUERY = f""" |
| 32 | SELECT | 35 | SELECT |
| 33 | sar.song_id AS source_song_id, | 36 | sar.song_id AS source_song_id, |
| 34 | mr.id AS record_id, | 37 | mr.id AS record_id, |
| ... | @@ -42,11 +45,13 @@ SELECT | ... | @@ -42,11 +45,13 @@ SELECT |
| 42 | mr.record_name | 45 | mr.record_name |
| 43 | FROM hk_song_and_record sar | 46 | FROM hk_song_and_record sar |
| 44 | JOIN hk_music_record mr ON mr.id = sar.record_id | 47 | JOIN hk_music_record mr ON mr.id = sar.record_id |
| 45 | WHERE sar.song_id IN ({placeholders}) | 48 | WHERE sar.song_id IN ({{placeholders}}) |
| 46 | AND mr.platform IN ('1','2','4') | 49 | AND mr.platform IN ('1','2','4') |
| 47 | AND mr.platform_unique_key IS NOT NULL | 50 | AND mr.platform_unique_key IS NOT NULL |
| 48 | AND mr.platform_unique_key != '' | 51 | AND mr.platform_unique_key != '' |
| 49 | AND mr.deleted = 0 | 52 | AND mr.deleted = 0 |
| 53 | AND COALESCE(NULLIF(TRIM(mr.copyright_id), ''), '') | ||
| 54 | <> '{YINYAN_SELF_MADE_COPYRIGHT_ID}' | ||
| 50 | ORDER BY sar.song_id, | 55 | ORDER BY sar.song_id, |
| 51 | COALESCE(sar.is_main_version, 0) DESC, | 56 | COALESCE(sar.is_main_version, 0) DESC, |
| 52 | COALESCE(mr.is_high, 0) DESC, | 57 | COALESCE(mr.is_high, 0) DESC, |
| ... | @@ -55,7 +60,7 @@ ORDER BY sar.song_id, | ... | @@ -55,7 +60,7 @@ ORDER BY sar.song_id, |
| 55 | mr.id ASC | 60 | mr.id ASC |
| 56 | """ | 61 | """ |
| 57 | 62 | ||
| 58 | _PLATFORM_BY_RECORD_IDS_QUERY = """ | 63 | _PLATFORM_BY_RECORD_IDS_QUERY = f""" |
| 59 | SELECT | 64 | SELECT |
| 60 | sar.song_id AS source_song_id, | 65 | sar.song_id AS source_song_id, |
| 61 | mr.id AS record_id, | 66 | mr.id AS record_id, |
| ... | @@ -69,18 +74,20 @@ SELECT | ... | @@ -69,18 +74,20 @@ SELECT |
| 69 | mr.record_name | 74 | mr.record_name |
| 70 | FROM hk_song_and_record sar | 75 | FROM hk_song_and_record sar |
| 71 | JOIN hk_music_record mr ON mr.id = sar.record_id | 76 | JOIN hk_music_record mr ON mr.id = sar.record_id |
| 72 | WHERE mr.id IN ({placeholders}) | 77 | WHERE mr.id IN ({{placeholders}}) |
| 73 | AND mr.platform IN ('1','2','4') | 78 | AND mr.platform IN ('1','2','4') |
| 74 | AND mr.platform_unique_key IS NOT NULL | 79 | AND mr.platform_unique_key IS NOT NULL |
| 75 | AND mr.platform_unique_key != '' | 80 | AND mr.platform_unique_key != '' |
| 76 | AND mr.deleted = 0 | 81 | AND mr.deleted = 0 |
| 82 | AND COALESCE(NULLIF(TRIM(mr.copyright_id), ''), '') | ||
| 83 | <> '{YINYAN_SELF_MADE_COPYRIGHT_ID}' | ||
| 77 | """ | 84 | """ |
| 78 | 85 | ||
| 79 | # 同 _PLATFORM_QUERY,但不做 per-platform 去重,保留同平台全部录音供 singer fallback 遍历 | 86 | # 同 _PLATFORM_QUERY,但不做 per-platform 去重,保留同平台全部录音供 singer fallback 遍历 |
| 80 | _ALL_PLATFORM_RECORDS_QUERY = _PLATFORM_QUERY | 87 | _ALL_PLATFORM_RECORDS_QUERY = _PLATFORM_QUERY |
| 81 | 88 | ||
| 82 | # records2 只接收具备必要录音元数据的关联关系,pub_time 允许为空。 | 89 | # records2 只接收具备必要录音元数据的关联关系,pub_time 允许为空。 |
| 83 | _RECORDS2_RELATIONS_QUERY = """ | 90 | _RECORDS2_RELATIONS_QUERY = f""" |
| 84 | SELECT | 91 | SELECT |
| 85 | sar.song_id AS source_song_id, | 92 | sar.song_id AS source_song_id, |
| 86 | mr.id AS record_id, | 93 | mr.id AS record_id, |
| ... | @@ -94,11 +101,13 @@ SELECT | ... | @@ -94,11 +101,13 @@ SELECT |
| 94 | mr.record_name | 101 | mr.record_name |
| 95 | FROM hk_song_and_record sar | 102 | FROM hk_song_and_record sar |
| 96 | JOIN hk_music_record mr ON mr.id = sar.record_id | 103 | JOIN hk_music_record mr ON mr.id = sar.record_id |
| 97 | WHERE sar.song_id IN ({placeholders}) | 104 | WHERE sar.song_id IN ({{placeholders}}) |
| 98 | AND mr.platform IN ('1','2','4') | 105 | AND mr.platform IN ('1','2','4') |
| 99 | AND mr.platform_unique_key IS NOT NULL | 106 | AND mr.platform_unique_key IS NOT NULL |
| 100 | AND TRIM(mr.platform_unique_key) != '' | 107 | AND TRIM(mr.platform_unique_key) != '' |
| 101 | AND mr.deleted = 0 | 108 | AND mr.deleted = 0 |
| 109 | AND COALESCE(NULLIF(TRIM(mr.copyright_id), ''), '') | ||
| 110 | <> '{YINYAN_SELF_MADE_COPYRIGHT_ID}' | ||
| 102 | AND mr.record_name IS NOT NULL AND TRIM(mr.record_name) != '' | 111 | AND mr.record_name IS NOT NULL AND TRIM(mr.record_name) != '' |
| 103 | AND mr.duration IS NOT NULL AND mr.duration > 0 | 112 | AND mr.duration IS NOT NULL AND mr.duration > 0 |
| 104 | AND mr.singer_name IS NOT NULL AND TRIM(mr.singer_name) != '' | 113 | AND mr.singer_name IS NOT NULL AND TRIM(mr.singer_name) != '' | ... | ... |
| ... | @@ -94,7 +94,10 @@ OSS_CONFIG = { | ... | @@ -94,7 +94,10 @@ OSS_CONFIG = { |
| 94 | 94 | ||
| 95 | # ==================== 聚合查询 SQL ==================== | 95 | # ==================== 聚合查询 SQL ==================== |
| 96 | 96 | ||
| 97 | AGGREGATE_SQL = """ | 97 | YINYAN_SELF_MADE_COPYRIGHT_ID = '1871126451002978305' |
| 98 | |||
| 99 | |||
| 100 | AGGREGATE_SQL = f""" | ||
| 98 | SELECT | 101 | SELECT |
| 99 | sp.id AS source_id, | 102 | sp.id AS source_id, |
| 100 | COALESCE(NULLIF(TRIM(sp.song_name), ''), | 103 | COALESCE(NULLIF(TRIM(sp.song_name), ''), |
| ... | @@ -168,19 +171,25 @@ SELECT | ... | @@ -168,19 +171,25 @@ SELECT |
| 168 | sr_cnt.record_count | 171 | sr_cnt.record_count |
| 169 | FROM hk_song_platform sp | 172 | FROM hk_song_platform sp |
| 170 | INNER JOIN ( | 173 | INNER JOIN ( |
| 171 | SELECT song_id, | 174 | SELECT sar.song_id, |
| 172 | COALESCE( | 175 | COALESCE( |
| 173 | MIN(CASE WHEN is_main_version = 1 THEN record_id END), | 176 | MIN(CASE WHEN sar.is_main_version = 1 THEN sar.record_id END), |
| 174 | MIN(record_id) | 177 | MIN(sar.record_id) |
| 175 | ) AS record_id | 178 | ) AS record_id |
| 176 | FROM hk_song_and_record | 179 | FROM hk_song_and_record sar |
| 177 | GROUP BY song_id | 180 | JOIN hk_music_record candidate_r ON candidate_r.id = sar.record_id |
| 181 | WHERE COALESCE(NULLIF(TRIM(candidate_r.copyright_id), ''), '') | ||
| 182 | <> '{YINYAN_SELF_MADE_COPYRIGHT_ID}' | ||
| 183 | GROUP BY sar.song_id | ||
| 178 | ) sr | 184 | ) sr |
| 179 | ON sr.song_id = sp.id | 185 | ON sr.song_id = sp.id |
| 180 | LEFT JOIN ( | 186 | LEFT JOIN ( |
| 181 | SELECT song_id, COUNT(record_id) AS record_count | 187 | SELECT sar.song_id, COUNT(sar.record_id) AS record_count |
| 182 | FROM hk_song_and_record | 188 | FROM hk_song_and_record sar |
| 183 | GROUP BY song_id | 189 | JOIN hk_music_record candidate_r ON candidate_r.id = sar.record_id |
| 190 | WHERE COALESCE(NULLIF(TRIM(candidate_r.copyright_id), ''), '') | ||
| 191 | <> '{YINYAN_SELF_MADE_COPYRIGHT_ID}' | ||
| 192 | GROUP BY sar.song_id | ||
| 184 | ) sr_cnt | 193 | ) sr_cnt |
| 185 | ON sr_cnt.song_id = sp.id | 194 | ON sr_cnt.song_id = sp.id |
| 186 | LEFT JOIN hk_music_record r | 195 | LEFT JOIN hk_music_record r | ... | ... |
| ... | @@ -61,14 +61,16 @@ from lyric_dedup.checker import CandidateMatch | ... | @@ -61,14 +61,16 @@ from lyric_dedup.checker import CandidateMatch |
| 61 | class TestAggregateSqlRules: | 61 | class TestAggregateSqlRules: |
| 62 | """测试源库聚合查询中的业务过滤规则""" | 62 | """测试源库聚合查询中的业务过滤规则""" |
| 63 | 63 | ||
| 64 | def test_excludes_liancheng_xiaorui_compositions_but_not_yinyan_self_made_compositions(self): | 64 | def test_excludes_liancheng_xiaorui_and_yinyan_self_made_records(self): |
| 65 | assert '1871475560046465025' in AGGREGATE_SQL | 65 | assert '1871475560046465025' in AGGREGATE_SQL |
| 66 | assert '连城小睿音乐工作室' in AGGREGATE_SQL | 66 | assert '连城小睿音乐工作室' in AGGREGATE_SQL |
| 67 | assert '1871126451002978305' in AGGREGATE_SQL | ||
| 67 | 68 | ||
| 68 | where_clause = AGGREGATE_SQL.split('WHERE', 1)[1] | 69 | where_clause = AGGREGATE_SQL.split('WHERE', 1)[1] |
| 69 | assert 'sp.copyright_id' in where_clause | 70 | assert 'sp.copyright_id' in where_clause |
| 70 | assert 'sp.copyright_name' in where_clause | 71 | assert 'sp.copyright_name' in where_clause |
| 71 | assert '音眼自制' not in where_clause | 72 | assert 'candidate_r.copyright_id' in where_clause |
| 73 | assert '音眼自制' not in AGGREGATE_SQL | ||
| 72 | 74 | ||
| 73 | 75 | ||
| 74 | # ==================================================================== | 76 | # ==================================================================== | ... | ... |
| ... | @@ -58,6 +58,9 @@ def test_fetch_platform_records_keeps_one_record_per_song_and_platform(): | ... | @@ -58,6 +58,9 @@ def test_fetch_platform_records_keeps_one_record_per_song_and_platform(): |
| 58 | 58 | ||
| 59 | result = fetch_platform_records(conn, [10]) | 59 | result = fetch_platform_records(conn, [10]) |
| 60 | 60 | ||
| 61 | sql = conn.cursor.return_value.execute.call_args.args[0] | ||
| 62 | assert '1871126451002978305' in sql | ||
| 63 | assert 'mr.copyright_id' in sql | ||
| 61 | assert len(result) == 3 | 64 | assert len(result) == 3 |
| 62 | assert {row['record_id'] for row in result} == {100, 101, 102} | 65 | assert {row['record_id'] for row in result} == {100, 101, 102} |
| 63 | 66 | ||
| ... | @@ -83,6 +86,8 @@ def test_fetch_platform_records_by_record_ids_queries_exact_records_once(): | ... | @@ -83,6 +86,8 @@ def test_fetch_platform_records_by_record_ids_queries_exact_records_once(): |
| 83 | cur = conn.cursor.return_value | 86 | cur = conn.cursor.return_value |
| 84 | sql, params = cur.execute.call_args[0] | 87 | sql, params = cur.execute.call_args[0] |
| 85 | assert 'WHERE mr.id IN (%s)' in sql | 88 | assert 'WHERE mr.id IN (%s)' in sql |
| 89 | assert '1871126451002978305' in sql | ||
| 90 | assert 'mr.copyright_id' in sql | ||
| 86 | assert params == [200] | 91 | assert params == [200] |
| 87 | assert result[0]['record_id'] == 200 | 92 | assert result[0]['record_id'] == 200 |
| 88 | assert result[0]['platform'] == '2' | 93 | assert result[0]['platform'] == '2' |
| ... | @@ -132,6 +137,8 @@ def test_fetch_all_song_record_relations_keeps_all_records_for_a_song(): | ... | @@ -132,6 +137,8 @@ def test_fetch_all_song_record_relations_keeps_all_records_for_a_song(): |
| 132 | assert 'mr.platform_index_url IS NOT NULL' in sql | 137 | assert 'mr.platform_index_url IS NOT NULL' in sql |
| 133 | assert 'mr.storage_url IS NOT NULL' in sql | 138 | assert 'mr.storage_url IS NOT NULL' in sql |
| 134 | assert 'mr.platform_play_url IS NOT NULL' in sql | 139 | assert 'mr.platform_play_url IS NOT NULL' in sql |
| 140 | assert '1871126451002978305' in sql | ||
| 141 | assert 'mr.copyright_id' in sql | ||
| 135 | assert 'mr.pub_time IS NOT NULL' not in sql | 142 | assert 'mr.pub_time IS NOT NULL' not in sql |
| 136 | assert params == [10] | 143 | assert params == [10] |
| 137 | assert [(row['record_id'], row['platform']) for row in result] == [ | 144 | assert [(row['record_id'], row['platform']) for row in result] == [ | ... | ... |
-
Please register or sign in to post a comment