"""Logic for NMF Cortex search.""" import re from charts.connectors import snowflake, snowflake_cortex_search from charts.logic import sql_loader from charts.logic.new_music_friday_date import ( NewMusicFridayDateEntriesResponse, NewMusicFridayDateEntry, newMusicFridayDateEntriesSnowflakeResponseTA, newMusicFridayPlacementListTA, ) ISRC_PATTERN = re.compile(r'^[A-Z]{2}[A-Z0-9]{3}[0-9]{7}$') _CORTEX_COLUMNS = ['ISRC', 'TRACK_NAME', 'ARTIST_NAME', 'CHART_DATE'] _CORTEX_LIMIT = 100 def new_music_friday_search(date: str, term: str) -> NewMusicFridayDateEntriesResponse: term = term.strip() if ISRC_PATTERN.match(term.upper()): payload = { 'query': '', 'columns': _CORTEX_COLUMNS, 'filter': {'@and': [ {'@eq': {'ISRC': term.upper()}}, {'@eq': {'CHART_DATE': date}}, ]}, 'limit': _CORTEX_LIMIT, } else: payload = { 'query': term, 'columns': _CORTEX_COLUMNS, 'filter': {'@eq': {'CHART_DATE': date}}, 'limit': _CORTEX_LIMIT, } cortex_rows = snowflake_cortex_search.query(payload) if not cortex_rows: return NewMusicFridayDateEntriesResponse(total=0, entries=[]) isrcs = [row['ISRC'] for row in cortex_rows] isrc_list = ', '.join(f"'{isrc}'" for isrc in isrcs) sql = sql_loader.load_query('new_music_friday/by_date/search') sql = sql.replace('{{ isrc_list }}', isrc_list) params: snowflake.SnowflakeParameterType = {'date': date} raw_db_result = snowflake.fetchall_nocache(sql, params) parsed_db_result = newMusicFridayDateEntriesSnowflakeResponseTA.validate_python(raw_db_result) rows_by_isrc = { row[1]: NewMusicFridayDateEntry( isrc=row[1], track_name=row[2], artist_name=row[3], image_url=row[4], feature=row[5], average_position=row[6], top_10_rank=row[7], placements=newMusicFridayPlacementListTA.validate_json(row[8]), ) for row in parsed_db_result } entries = [rows_by_isrc[isrc] for isrc in isrcs if isrc in rows_by_isrc] return NewMusicFridayDateEntriesResponse(total=len(entries), entries=entries)