Commit 59e59a59 59e59a596ddbb01f0958e833e2188e5f9fd9e7cd by 沈秋雨

fix(reader): 排除音眼自制版权ID的录音数据

- 在聚合查询SQL中加入排除音眼自制版权ID的条件
- 更新相关的SQL查询语句,过滤掉指定版权ID的记录
- 修改测试用例,确保音眼自制版权ID的录音被正确排除
- .gitignore新增docs目录的忽略规则
1 parent 7a8fed26
...@@ -21,3 +21,5 @@ output/ ...@@ -21,3 +21,5 @@ output/
21 *.csv 21 *.csv
22 *.sql 22 *.sql
23 *.xlsx 23 *.xlsx
24
25 docs/
......
...@@ -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] == [
......