[🍏 0xf13b] [11 May 20:30:00.029359] [DEBUG] [🚀 MultiFetcher.initialize_sources] Begin initialization of 2 children.
[🍏 0xf13b] [11 May 20:30:00.029701] .. [DEBUG] [🚀 MemoryFetcher.initialize_sources] Begin initialization of 'MemoryFetcher' at 0x74426fb646e0.
[🍏 0xf13b] [11 May 20:30:00.029812] .. [INFO] [✅ MemoryFetcher.initialize_sources] Finished initialization of 'MemoryFetcher' in 311 Ξs: MemoryFetcher(sources=['category'], return_all=True)
[🍏 0xf13b] [11 May 20:30:00.029887] .. [DEBUG] [🚀 SqlFetcher.initialize_sources] Begin initialization of 'SqlFetcher' at 0x74426fb64ec0.
[🍏 0xf13b] [11 May 20:30:00.107301] .... [DEBUG] [id_translation.fetching] Metadata for 'postgresql+pg8000://postgres:***@localhost:5002/sakila' created in 77 ms.
[🍏 0xf13b] [11 May 20:30:00.107411] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'str_uuid', 'comment', 'uuid'} for source='uuid_test_table'.
[🍏 0xf13b] [11 May 20:30:00.107496] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='uuid_test_table' for ['id']x['str_uuid', 'comment', 'uuid'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.107617] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.107704] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.107739] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.107821] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='uuid_test_table':
    ('id', ['uuid', 'str_uuid', 'comment']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.333, 0.142, -0.002].
[🍏 0xf13b] [11 May 20:30:00.107887] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='uuid_test_table':
    ('id', ['uuid', 'str_uuid', 'comment']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.1, 0.374, -0.002].
[🍏 0xf13b] [11 May 20:30:00.107948] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='uuid_test_table':
    ('id', ['uuid', 'str_uuid', 'comment']) -> ('uuid_test_table_id', *).
    Positional penalty=0.010. Scores before penalty: [0.033, 0.022, -0.002].
[🍏 0xf13b] [11 May 20:30:00.108042] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='uuid_test_table':
    ('id', ['uuid', 'str_uuid', 'comment']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.333, 0.142, -0.002].
[🍏 0xf13b] [11 May 20:30:00.108097] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['uuid': 0.33 -> 0.33 (+0.00), 'str_uuid': 0.14 -> 0.37 (+0.23), 'comment': -0.00 -> -0.00 (+0.00)]
[🍏 0xf13b] [11 May 20:30:00.109951] ...... [DEBUG] [id_translation.fetching.map] Computed 1x3 match scores in context='uuid_test_table' in 686 Ξs:
candidates  str_uuid  comment  uuid
values                             
id              0.37    -0.00  0.33
[🍏 0xf13b] [11 May 20:30:00.110073] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'str_uuid'; score=0.369 < 0.9 (below threshold).
    'id' -> 'uuid'; score=0.333 < 0.9 (below threshold).
    'id' -> 'comment'; score=-0.002 < 0.9 (below threshold).
[🍏 0xf13b] [11 May 20:30:00.110146] ...... [DEBUG] [id_translation.fetching.map] Could not map {'id'} in context='uuid_test_table' to any of candidates={'uuid', 'str_uuid', 'comment'}.
[🍏 0xf13b] [11 May 20:30:00.110189] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x{'uuid', 'str_uuid', 'comment'} in 3 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.110242] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='uuid_test_table': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.110290] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'address2', 'address_id', 'address', 'postal_code', 'last_update', 'phone', 'district', 'city_id'} for source='address'.
[🍏 0xf13b] [11 May 20:30:00.110351] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='address' for ['id']x['address2', 'address_id', 'address', 'postal_code', 'last_update', 'phone', 'district', 'city_id'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.110431] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.110477] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.110507] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.110612] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='address':
    ('id', ['address_id', 'address', 'postal_code', 'phone', 'district', 'city_id', 'address2', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.111, -0.001, -0.002, -0.003, -0.004, 0.162, -0.006, -0.007].
[🍏 0xf13b] [11 May 20:30:00.110690] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='address':
    ('id', ['address_id', 'address', 'postal_code', 'phone', 'district', 'city_id', 'address2', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.167, -0.001, -0.002, -0.003, 0.121, 0.209, -0.006, -0.007].
[🍏 0xf13b] [11 May 20:30:00.110760] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='address':
    ('id', ['address_id', 'address', 'postal_code', 'phone', 'district', 'city_id', 'address2', 'last_update']) -> ('address_id', *).
    Positional penalty=0.010. Scores before penalty: [1.0, -0.001, -0.002, -0.003, 0.038, 0.102, -0.006, 0.043].
[🍏 0xf13b] [11 May 20:30:00.110825] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='address':
    ('id', ['address_id', 'address', 'postal_code', 'phone', 'district', 'city_id', 'address2', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.111, -0.001, -0.002, -0.003, -0.004, 0.162, -0.006, -0.007].
[🍏 0xf13b] [11 May 20:30:00.110881] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['address_id': 0.11 -> 0.99 (+0.88), 'address': -0.00 -> -0.00 (+0.00), 'postal_code': -0.00 -> -0.00 (+0.00), 'phone': -0.00 -> -0.00 (+0.00), 'district': -0.00 -> 0.12 (+0.12), 'city_id': 0.16 -> 0.20 (+0.04), 'address2': -0.01 -> -0.01 (+0.00), 'last_update': -0.01 -> 0.03 (+0.04)]
[🍏 0xf13b] [11 May 20:30:00.112041] ...... [DEBUG] [id_translation.fetching.map] Computed 1x8 match scores in context='address' in 611 Ξs:
candidates  address2  address_id  address  postal_code  last_update  phone  district  city_id
values                                                                                       
id             -0.01        0.99    -0.00        -0.00         0.03  -0.00      0.12     0.20
[🍏 0xf13b] [11 May 20:30:00.112287] ...... [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'address_id'; score=0.990 >= 0.9.
[🍏 0xf13b] [11 May 20:30:00.112375] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['address2', 'address_id', 'address', 'postal_code', 'last_update', 'phone', 'district', 'city_id'] in 2 ms. Matches:
    'id' -> ('address_id',)
Matched 1/1 values with 1 different candidates.
[🍏 0xf13b] [11 May 20:30:00.112439] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='address': {'id': 'address_id'}.
[🍏 0xf13b] [11 May 20:30:00.112495] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'} for source='payment_p2007_06'.
[🍏 0xf13b] [11 May 20:30:00.112591] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='payment_p2007_06' for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.112667] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.112721] ...... [DEBUG] [id_translation.mapping.filter_functions.filter_names] Discard source='payment_p2007_06'; matches pattern=re.compile('.*p2007.*', re.IGNORECASE).
[🍏 0xf13b] [11 May 20:30:00.112755] ...... [DEBUG] [id_translation.fetching.map] All candidates removed by filtering. Applied 1 filters for value='id', removing candidates={'staff_id', 'customer_id', 'rental_id', 'amount', 'payment_id', 'payment_date'}.
[🍏 0xf13b] [11 May 20:30:00.113735] ...... [DEBUG] [id_translation.fetching.map] Computed 1x6 match scores in context='payment_p2007_06' in 245 Ξs:
candidates  staff_id  customer_id  amount  payment_id  rental_id  payment_date
values                                                                        
id              -inf         -inf    -inf        -inf       -inf          -inf
[🍏 0xf13b] [11 May 20:30:00.113852] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'staff_id'; score=-inf (filtered).
    'id' -> 'customer_id'; score=-inf (filtered).
    'id' -> 'amount'; score=-inf (filtered).
    'id' -> 'payment_id'; score=-inf (filtered).
    'id' -> 'rental_id'; score=-inf (filtered).
    'id' -> 'payment_date'; score=-inf (filtered).
[🍏 0xf13b] [11 May 20:30:00.113928] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] in 1 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.113982] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='payment_p2007_06': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.114031] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'fulltext', 'film_id', 'length', 'last_update'} for source='film'.
[🍏 0xf13b] [11 May 20:30:00.114094] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='film' for ['id']x['title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'fulltext', 'film_id', 'length', 'last_update'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.114175] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.114215] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.114245] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.114334] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='film':
    ('id', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.0, -0.001, -0.002, -0.003, 0.096, -0.005, -0.006, 0.046, -0.008, -0.009, -0.01, 0.156, -0.012, -0.013].
[🍏 0xf13b] [11 May 20:30:00.114424] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='film':
    ('id', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.0, -0.001, 0.012, 0.028, 0.09, 0.106, -0.006, 0.022, -0.008, -0.009, 0.021, 0.203, -0.012, 0.237].
[🍏 0xf13b] [11 May 20:30:00.114504] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='film':
    ('id', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> ('film_id', *).
    Positional penalty=0.010. Scores before penalty: [0.0, -0.001, -0.002, 0.026, 0.082, -0.005, -0.006, 0.024, -0.008, -0.009, -0.01, 0.989, -0.012, 0.058].
[🍏 0xf13b] [11 May 20:30:00.114609] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='film':
    ('id', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.0, -0.001, -0.002, -0.003, 0.096, -0.005, -0.006, 0.046, -0.008, -0.009, -0.01, 0.156, -0.012, -0.013].
[🍏 0xf13b] [11 May 20:30:00.114680] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['last_update': 0.00 -> 0.00 (+0.00), 'title': -0.00 -> -0.00 (+0.00), 'special_features': -0.00 -> 0.01 (+0.01), 'description': -0.00 -> 0.02 (+0.03), 'language_id': 0.10 -> 0.10 (+0.00), 'rating': -0.01 -> 0.10 (+0.11), 'replacement_cost': -0.01 -> -0.01 (+0.00), 'original_language_id': 0.05 -> 0.05 (+0.00), 'rental_rate': -0.01 -> -0.01 (+0.00), 'release_year': -0.01 -> -0.01 (+0.00), 'rental_duration': -0.01 -> 0.02 (+0.03), 'film_id': 0.16 -> 0.98 (+0.82), 'length': -0.01 -> -0.01 (+0.00), 'fulltext': -0.01 -> 0.23 (+0.24)]
[🍏 0xf13b] [11 May 20:30:00.116136] ...... [DEBUG] [id_translation.fetching.map] Computed 1x14 match scores in context='film' in 682 Ξs:
candidates  title  special_features  description  language_id  rating  replacement_cost  original_language_id  rental_rate  release_year  rental_duration  fulltext  film_id  length  last_update
values                                                                                                                                                                                           
id          -0.00              0.01         0.02         0.10    0.10             -0.01                  0.05        -0.01         -0.01             0.02      0.23     0.98   -0.01         0.00
[🍏 0xf13b] [11 May 20:30:00.116299] ...... [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'film_id'; score=0.979 >= 0.9.
[🍏 0xf13b] [11 May 20:30:00.116364] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'fulltext', 'film_id', 'length', 'last_update'] in 2 ms. Matches:
    'id' -> ('film_id',)
Matched 1/1 values with 1 different candidates.
[🍏 0xf13b] [11 May 20:30:00.116424] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='film': {'id': 'film_id'}.
[🍏 0xf13b] [11 May 20:30:00.116477] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'name', 'language_id', 'last_update'} for source='language'.
[🍏 0xf13b] [11 May 20:30:00.116554] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='language' for ['id']x['name', 'language_id', 'last_update'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.116626] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.116667] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.116698] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.116761] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='language':
    ('id', ['name', 'language_id', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.0, 0.099, -0.002].
[🍏 0xf13b] [11 May 20:30:00.116820] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='language':
    ('id', ['name', 'language_id', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.0, 0.093, -0.002].
[🍏 0xf13b] [11 May 20:30:00.116876] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='language':
    ('id', ['name', 'language_id', 'last_update']) -> ('language_id', *).
    Positional penalty=0.010. Scores before penalty: [0.0, 0.999, 0.18].
[🍏 0xf13b] [11 May 20:30:00.116929] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='language':
    ('id', ['name', 'language_id', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.0, 0.099, -0.002].
[🍏 0xf13b] [11 May 20:30:00.116977] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['name': 0.00 -> 0.00 (+0.00), 'language_id': 0.10 -> 0.99 (+0.89), 'last_update': -0.00 -> 0.17 (+0.17)]
[🍏 0xf13b] [11 May 20:30:00.117684] ...... [DEBUG] [id_translation.fetching.map] Computed 1x3 match scores in context='language' in 505 Ξs:
candidates  name  language_id  last_update
values                                    
id          0.00         0.99         0.17
[🍏 0xf13b] [11 May 20:30:00.117774] ...... [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'language_id'; score=0.989 >= 0.9.
[🍏 0xf13b] [11 May 20:30:00.117831] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['name', 'language_id', 'last_update'] in 1 ms. Matches:
    'id' -> ('language_id',)
Matched 1/1 values with 1 different candidates.
[🍏 0xf13b] [11 May 20:30:00.117884] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='language': {'id': 'language_id'}.
[🍏 0xf13b] [11 May 20:30:00.117935] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'customer_id', 'first_name', 'address_id', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update'} for source='customer'.
[🍏 0xf13b] [11 May 20:30:00.117999] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='customer' for ['id']x['customer_id', 'first_name', 'address_id', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.118067] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.118108] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.118138] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.118212] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='customer':
    ('id', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.1, 0.11, -0.002, -0.003, 0.121, 0.138, -0.006, -0.007, -0.008, -0.009].
[🍏 0xf13b] [11 May 20:30:00.118287] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='customer':
    ('id', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.094, 0.166, -0.002, 0.039, 0.046, 0.37, 0.05, -0.007, -0.008, -0.009].
[🍏 0xf13b] [11 May 20:30:00.118364] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='customer':
    ('id', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> ('customer_id', *).
    Positional penalty=0.010. Scores before penalty: [1.0, 0.149, -0.002, 0.097, 0.053, 0.089, -0.006, -0.007, 0.083, 0.173].
[🍏 0xf13b] [11 May 20:30:00.118431] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='customer':
    ('id', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.1, 0.11, -0.002, -0.003, 0.121, 0.138, -0.006, -0.007, -0.008, -0.009].
[🍏 0xf13b] [11 May 20:30:00.118495] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['customer_id': 0.10 -> 0.99 (+0.89), 'address_id': 0.11 -> 0.16 (+0.05), 'first_name': -0.00 -> -0.00 (+0.00), 'activebool': -0.00 -> 0.09 (+0.09), 'email': 0.12 -> 0.12 (+0.00), 'store_id': 0.14 -> 0.36 (+0.23), 'active': -0.01 -> 0.04 (+0.05), 'last_name': -0.01 -> -0.01 (+0.00), 'create_date': -0.01 -> 0.07 (+0.08), 'last_update': -0.01 -> 0.16 (+0.17)]
[🍏 0xf13b] [11 May 20:30:00.119626] ...... [DEBUG] [id_translation.fetching.map] Computed 1x10 match scores in context='customer' in 597 Ξs:
candidates  customer_id  first_name  address_id  activebool  email  store_id  active  last_name  create_date  last_update
values                                                                                                                   
id                 0.99       -0.00        0.16        0.09   0.12      0.36    0.04      -0.01         0.07         0.16
[🍏 0xf13b] [11 May 20:30:00.119755] ...... [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'customer_id'; score=0.990 >= 0.9.
[🍏 0xf13b] [11 May 20:30:00.119812] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['customer_id', 'first_name', 'address_id', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update'] in 2 ms. Matches:
    'id' -> ('customer_id',)
Matched 1/1 values with 1 different candidates.
[🍏 0xf13b] [11 May 20:30:00.119873] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='customer': {'id': 'customer_id'}.
[🍏 0xf13b] [11 May 20:30:00.119922] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'} for source='payment_p2007_04'.
[🍏 0xf13b] [11 May 20:30:00.119977] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='payment_p2007_04' for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.120046] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.120088] ...... [DEBUG] [id_translation.mapping.filter_functions.filter_names] Discard source='payment_p2007_04'; matches pattern=re.compile('.*p2007.*', re.IGNORECASE).
[🍏 0xf13b] [11 May 20:30:00.120121] ...... [DEBUG] [id_translation.fetching.map] All candidates removed by filtering. Applied 1 filters for value='id', removing candidates={'staff_id', 'customer_id', 'rental_id', 'amount', 'payment_id', 'payment_date'}.
[🍏 0xf13b] [11 May 20:30:00.121020] ...... [DEBUG] [id_translation.fetching.map] Computed 1x6 match scores in context='payment_p2007_04' in 222 Ξs:
candidates  staff_id  customer_id  amount  payment_id  rental_id  payment_date
values                                                                        
id              -inf         -inf    -inf        -inf       -inf          -inf
[🍏 0xf13b] [11 May 20:30:00.121129] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'staff_id'; score=-inf (filtered).
    'id' -> 'customer_id'; score=-inf (filtered).
    'id' -> 'amount'; score=-inf (filtered).
    'id' -> 'payment_id'; score=-inf (filtered).
    'id' -> 'rental_id'; score=-inf (filtered).
    'id' -> 'payment_date'; score=-inf (filtered).
[🍏 0xf13b] [11 May 20:30:00.121204] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] in 1 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.121258] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='payment_p2007_04': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.121301] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'last_update', 'actor_id', 'film_id'} for source='film_actor'.
[🍏 0xf13b] [11 May 20:30:00.121352] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='film_actor' for ['id']x['last_update', 'actor_id', 'film_id'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.121424] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.121463] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.121493] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.121561] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='film_actor':
    ('id', ['film_id', 'actor_id', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.167, 0.142, -0.002].
[🍏 0xf13b] [11 May 20:30:00.121623] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='film_actor':
    ('id', ['film_id', 'actor_id', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.214, 0.374, -0.002].
[🍏 0xf13b] [11 May 20:30:00.121678] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='film_actor':
    ('id', ['film_id', 'actor_id', 'last_update']) -> ('film_actor_id', *).
    Positional penalty=0.010. Scores before penalty: [0.061, 0.166, 0.028].
[🍏 0xf13b] [11 May 20:30:00.121730] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='film_actor':
    ('id', ['film_id', 'actor_id', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.167, 0.142, -0.002].
[🍏 0xf13b] [11 May 20:30:00.121778] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['film_id': 0.17 -> 0.21 (+0.04), 'actor_id': 0.14 -> 0.37 (+0.23), 'last_update': -0.00 -> 0.02 (+0.02)]
[🍏 0xf13b] [11 May 20:30:00.122502] ...... [DEBUG] [id_translation.fetching.map] Computed 1x3 match scores in context='film_actor' in 486 Ξs:
candidates  last_update  actor_id  film_id
values                                    
id                 0.02      0.37     0.21
[🍏 0xf13b] [11 May 20:30:00.122618] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'actor_id'; score=0.369 < 0.9 (below threshold).
    'id' -> 'film_id'; score=0.209 < 0.9 (below threshold).
    'id' -> 'last_update'; score=0.018 < 0.9 (below threshold).
[🍏 0xf13b] [11 May 20:30:00.122692] ...... [DEBUG] [id_translation.fetching.map] Could not map {'id'} in context='film_actor' to any of candidates={'film_id', 'actor_id', 'last_update'}.
[🍏 0xf13b] [11 May 20:30:00.122733] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x{'film_id', 'actor_id', 'last_update'} in 1 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.122782] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='film_actor': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.122825] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'} for source='payment_p2007_01'.
[🍏 0xf13b] [11 May 20:30:00.122880] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='payment_p2007_01' for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.122945] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.122986] ...... [DEBUG] [id_translation.mapping.filter_functions.filter_names] Discard source='payment_p2007_01'; matches pattern=re.compile('.*p2007.*', re.IGNORECASE).
[🍏 0xf13b] [11 May 20:30:00.123019] ...... [DEBUG] [id_translation.fetching.map] All candidates removed by filtering. Applied 1 filters for value='id', removing candidates={'staff_id', 'customer_id', 'rental_id', 'amount', 'payment_id', 'payment_date'}.
[🍏 0xf13b] [11 May 20:30:00.123886] ...... [DEBUG] [id_translation.fetching.map] Computed 1x6 match scores in context='payment_p2007_01' in 194 Ξs:
candidates  staff_id  customer_id  amount  payment_id  rental_id  payment_date
values                                                                        
id              -inf         -inf    -inf        -inf       -inf          -inf
[🍏 0xf13b] [11 May 20:30:00.123998] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'staff_id'; score=-inf (filtered).
    'id' -> 'customer_id'; score=-inf (filtered).
    'id' -> 'amount'; score=-inf (filtered).
    'id' -> 'payment_id'; score=-inf (filtered).
    'id' -> 'rental_id'; score=-inf (filtered).
    'id' -> 'payment_date'; score=-inf (filtered).
[🍏 0xf13b] [11 May 20:30:00.124078] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] in 1 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.124132] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='payment_p2007_01': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.124175] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'last_update', 'country', 'country_id'} for source='country'.
[🍏 0xf13b] [11 May 20:30:00.124227] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='country' for ['id']x['last_update', 'country', 'country_id'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.124291] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.124331] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.124360] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.124419] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='country':
    ('id', ['country_id', 'country', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.111, -0.001, -0.002].
[🍏 0xf13b] [11 May 20:30:00.124482] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='country':
    ('id', ['country_id', 'country', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.125, -0.001, -0.002].
[🍏 0xf13b] [11 May 20:30:00.124538] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='country':
    ('id', ['country_id', 'country', 'last_update']) -> ('country_id', *).
    Positional penalty=0.010. Scores before penalty: [1.0, -0.001, -0.002].
[🍏 0xf13b] [11 May 20:30:00.124621] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='country':
    ('id', ['country_id', 'country', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.111, -0.001, -0.002].
[🍏 0xf13b] [11 May 20:30:00.124673] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['country_id': 0.11 -> 0.99 (+0.88), 'country': -0.00 -> -0.00 (+0.00), 'last_update': -0.00 -> -0.00 (+0.00)]
[🍏 0xf13b] [11 May 20:30:00.125347] ...... [DEBUG] [id_translation.fetching.map] Computed 1x3 match scores in context='country' in 503 Ξs:
candidates  last_update  country  country_id
values                                      
id                -0.00    -0.00        0.99
[🍏 0xf13b] [11 May 20:30:00.125436] ...... [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'country_id'; score=0.990 >= 0.9.
[🍏 0xf13b] [11 May 20:30:00.125491] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['last_update', 'country', 'country_id'] in 1 ms. Matches:
    'id' -> ('country_id',)
Matched 1/1 values with 1 different candidates.
[🍏 0xf13b] [11 May 20:30:00.125555] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='country': {'id': 'country_id'}.
[🍏 0xf13b] [11 May 20:30:00.125609] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'} for source='payment_p2007_02'.
[🍏 0xf13b] [11 May 20:30:00.125668] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='payment_p2007_02' for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.125735] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.125775] ...... [DEBUG] [id_translation.mapping.filter_functions.filter_names] Discard source='payment_p2007_02'; matches pattern=re.compile('.*p2007.*', re.IGNORECASE).
[🍏 0xf13b] [11 May 20:30:00.125808] ...... [DEBUG] [id_translation.fetching.map] All candidates removed by filtering. Applied 1 filters for value='id', removing candidates={'staff_id', 'customer_id', 'rental_id', 'amount', 'payment_id', 'payment_date'}.
[🍏 0xf13b] [11 May 20:30:00.126671] ...... [DEBUG] [id_translation.fetching.map] Computed 1x6 match scores in context='payment_p2007_02' in 201 Ξs:
candidates  staff_id  customer_id  amount  payment_id  rental_id  payment_date
values                                                                        
id              -inf         -inf    -inf        -inf       -inf          -inf
[🍏 0xf13b] [11 May 20:30:00.126780] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'staff_id'; score=-inf (filtered).
    'id' -> 'customer_id'; score=-inf (filtered).
    'id' -> 'amount'; score=-inf (filtered).
    'id' -> 'payment_id'; score=-inf (filtered).
    'id' -> 'rental_id'; score=-inf (filtered).
    'id' -> 'payment_date'; score=-inf (filtered).
[🍏 0xf13b] [11 May 20:30:00.126855] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] in 1 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.126908] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='payment_p2007_02': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.126954] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'last_update', 'category_id', 'film_id'} for source='film_category'.
[🍏 0xf13b] [11 May 20:30:00.127007] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='film_category' for ['id']x['last_update', 'category_id', 'film_id'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.127070] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.127108] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.127139] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.127197] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='film_category':
    ('id', ['film_id', 'category_id', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.167, 0.099, -0.002].
[🍏 0xf13b] [11 May 20:30:00.127261] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='film_category':
    ('id', ['film_id', 'category_id', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.214, 0.093, -0.002].
[🍏 0xf13b] [11 May 20:30:00.127323] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='film_category':
    ('id', ['film_id', 'category_id', 'last_update']) -> ('film_category_id', *).
    Positional penalty=0.010. Scores before penalty: [0.043, 0.166, 0.013].
[🍏 0xf13b] [11 May 20:30:00.127375] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='film_category':
    ('id', ['film_id', 'category_id', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.167, 0.099, -0.002].
[🍏 0xf13b] [11 May 20:30:00.127423] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['film_id': 0.17 -> 0.21 (+0.04), 'category_id': 0.10 -> 0.16 (+0.06), 'last_update': -0.00 -> 0.00 (+0.01)]
[🍏 0xf13b] [11 May 20:30:00.128116] ...... [DEBUG] [id_translation.fetching.map] Computed 1x3 match scores in context='film_category' in 471 Ξs:
candidates  last_update  category_id  film_id
values                                       
id                 0.00         0.16     0.21
[🍏 0xf13b] [11 May 20:30:00.128209] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'film_id'; score=0.209 < 0.9 (below threshold).
    'id' -> 'category_id'; score=0.156 < 0.9 (below threshold).
    'id' -> 'last_update'; score=0.003 < 0.9 (below threshold).
[🍏 0xf13b] [11 May 20:30:00.128271] ...... [DEBUG] [id_translation.fetching.map] Could not map {'id'} in context='film_category' to any of candidates={'film_id', 'category_id', 'last_update'}.
[🍏 0xf13b] [11 May 20:30:00.128311] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x{'film_id', 'category_id', 'last_update'} in 1 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.128359] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='film_category': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.128403] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'staff_id', 'first_name', 'address_id', 'username', 'picture', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update'} for source='staff'.
[🍏 0xf13b] [11 May 20:30:00.128465] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='staff' for ['id']x['staff_id', 'first_name', 'address_id', 'username', 'picture', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.128532] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.128601] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.128636] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.128718] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='staff':
    ('id', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.143, -0.001, 0.109, -0.003, -0.004, 0.12, 0.065, 0.136, -0.008, -0.009, -0.01].
[🍏 0xf13b] [11 May 20:30:00.128798] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='staff':
    ('id', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.375, -0.001, 0.165, 0.068, -0.004, 0.045, 0.244, 0.368, 0.048, -0.009, -0.01].
[🍏 0xf13b] [11 May 20:30:00.128874] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='staff':
    ('id', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> ('staff_id', *).
    Positional penalty=0.010. Scores before penalty: [1.0, -0.001, 0.123, -0.003, -0.004, 0.045, 0.119, 0.618, 0.048, -0.009, -0.01].
[🍏 0xf13b] [11 May 20:30:00.128946] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='staff':
    ('id', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.143, -0.001, 0.109, -0.003, -0.004, 0.12, 0.065, 0.136, -0.008, -0.009, -0.01].
[🍏 0xf13b] [11 May 20:30:00.129008] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['staff_id': 0.14 -> 0.99 (+0.85), 'first_name': -0.00 -> -0.00 (+0.00), 'address_id': 0.11 -> 0.16 (+0.05), 'picture': -0.00 -> 0.06 (+0.07), 'username': -0.00 -> -0.00 (+0.00), 'email': 0.12 -> 0.12 (+0.00), 'password': 0.07 -> 0.24 (+0.17), 'store_id': 0.14 -> 0.61 (+0.47), 'active': -0.01 -> 0.04 (+0.05), 'last_name': -0.01 -> -0.01 (+0.00), 'last_update': -0.01 -> -0.01 (+0.00)]
[🍏 0xf13b] [11 May 20:30:00.130202] ...... [DEBUG] [id_translation.fetching.map] Computed 1x11 match scores in context='staff' in 628 Ξs:
candidates  staff_id  first_name  address_id  username  picture  email  password  store_id  active  last_name  last_update
values                                                                                                                    
id              0.99       -0.00        0.16     -0.00     0.06   0.12      0.24      0.61    0.04      -0.01        -0.01
[🍏 0xf13b] [11 May 20:30:00.130335] ...... [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'staff_id'; score=0.990 >= 0.9.
[🍏 0xf13b] [11 May 20:30:00.130391] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['staff_id', 'first_name', 'address_id', 'username', 'picture', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update'] in 2 ms. Matches:
    'id' -> ('staff_id',)
Matched 1/1 values with 1 different candidates.
[🍏 0xf13b] [11 May 20:30:00.130447] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='staff': {'id': 'staff_id'}.
[🍏 0xf13b] [11 May 20:30:00.130494] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'last_name', 'first_name', 'actor_id', 'last_update'} for source='actor'.
[🍏 0xf13b] [11 May 20:30:00.130561] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='actor' for ['id']x['last_name', 'first_name', 'actor_id', 'last_update'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.130646] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.130686] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.130716] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.130777] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='actor':
    ('id', ['last_name', 'first_name', 'actor_id', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.0, -0.001, 0.141, -0.003].
[🍏 0xf13b] [11 May 20:30:00.130839] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='actor':
    ('id', ['last_name', 'first_name', 'actor_id', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.0, -0.001, 0.373, -0.003].
[🍏 0xf13b] [11 May 20:30:00.130897] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='actor':
    ('id', ['last_name', 'first_name', 'actor_id', 'last_update']) -> ('actor_id', *).
    Positional penalty=0.010. Scores before penalty: [0.125, 0.041, 0.998, -0.003].
[🍏 0xf13b] [11 May 20:30:00.130956] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='actor':
    ('id', ['last_name', 'first_name', 'actor_id', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.0, -0.001, 0.141, -0.003].
[🍏 0xf13b] [11 May 20:30:00.131007] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['last_name': 0.00 -> 0.12 (+0.12), 'first_name': -0.00 -> 0.03 (+0.03), 'actor_id': 0.14 -> 0.99 (+0.85), 'last_update': -0.00 -> -0.00 (+0.00)]
[🍏 0xf13b] [11 May 20:30:00.131763] ...... [DEBUG] [id_translation.fetching.map] Computed 1x4 match scores in context='actor' in 514 Ξs:
candidates  last_name  first_name  actor_id  last_update
values                                                  
id               0.12        0.03      0.99        -0.00
[🍏 0xf13b] [11 May 20:30:00.131864] ...... [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'actor_id'; score=0.988 >= 0.9.
[🍏 0xf13b] [11 May 20:30:00.131921] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['last_name', 'first_name', 'actor_id', 'last_update'] in 1 ms. Matches:
    'id' -> ('actor_id',)
Matched 1/1 values with 1 different candidates.
[🍏 0xf13b] [11 May 20:30:00.131974] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='actor': {'id': 'actor_id'}.
[🍏 0xf13b] [11 May 20:30:00.132022] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'country_id', 'last_update', 'city', 'city_id'} for source='city'.
[🍏 0xf13b] [11 May 20:30:00.132076] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='city' for ['id']x['country_id', 'last_update', 'city', 'city_id'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.132164] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.132209] ...... [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🍏 0xf13b] [11 May 20:30:00.132240] ...... [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🍏 0xf13b] [11 May 20:30:00.132303] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='city':
    ('id', ['last_update', 'city', 'city_id', 'country_id']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.0, -0.001, 0.165, 0.108].
[🍏 0xf13b] [11 May 20:30:00.132364] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='city':
    ('id', ['last_update', 'city', 'city_id', 'country_id']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.0, -0.001, 0.212, 0.122].
[🍏 0xf13b] [11 May 20:30:00.132424] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='city':
    ('id', ['last_update', 'city', 'city_id', 'country_id']) -> ('city_id', *).
    Positional penalty=0.010. Scores before penalty: [0.0, -0.001, 0.998, 0.14].
[🍏 0xf13b] [11 May 20:30:00.132488] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='city':
    ('id', ['last_update', 'city', 'city_id', 'country_id']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.0, -0.001, 0.165, 0.108].
[🍏 0xf13b] [11 May 20:30:00.132539] ...... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['last_update': 0.00 -> 0.00 (+0.00), 'city': -0.00 -> -0.00 (+0.00), 'city_id': 0.16 -> 0.99 (+0.82), 'country_id': 0.11 -> 0.13 (+0.02)]
[🍏 0xf13b] [11 May 20:30:00.133308] ...... [DEBUG] [id_translation.fetching.map] Computed 1x4 match scores in context='city' in 535 Ξs:
candidates  country_id  last_update  city  city_id
values                                            
id                0.13         0.00 -0.00     0.99
[🍏 0xf13b] [11 May 20:30:00.133400] ...... [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'city_id'; score=0.988 >= 0.9.
[🍏 0xf13b] [11 May 20:30:00.133455] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['country_id', 'last_update', 'city', 'city_id'] in 1 ms. Matches:
    'id' -> ('city_id',)
Matched 1/1 values with 1 different candidates.
[🍏 0xf13b] [11 May 20:30:00.133507] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='city': {'id': 'city_id'}.
[🍏 0xf13b] [11 May 20:30:00.133569] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'} for source='payment_p2007_03'.
[🍏 0xf13b] [11 May 20:30:00.133628] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='payment_p2007_03' for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.133700] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.133741] ...... [DEBUG] [id_translation.mapping.filter_functions.filter_names] Discard source='payment_p2007_03'; matches pattern=re.compile('.*p2007.*', re.IGNORECASE).
[🍏 0xf13b] [11 May 20:30:00.133781] ...... [DEBUG] [id_translation.fetching.map] All candidates removed by filtering. Applied 1 filters for value='id', removing candidates={'staff_id', 'customer_id', 'rental_id', 'amount', 'payment_id', 'payment_date'}.
[🍏 0xf13b] [11 May 20:30:00.134631] ...... [DEBUG] [id_translation.fetching.map] Computed 1x6 match scores in context='payment_p2007_03' in 210 Ξs:
candidates  staff_id  customer_id  amount  payment_id  rental_id  payment_date
values                                                                        
id              -inf         -inf    -inf        -inf       -inf          -inf
[🍏 0xf13b] [11 May 20:30:00.134739] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'staff_id'; score=-inf (filtered).
    'id' -> 'customer_id'; score=-inf (filtered).
    'id' -> 'amount'; score=-inf (filtered).
    'id' -> 'payment_id'; score=-inf (filtered).
    'id' -> 'rental_id'; score=-inf (filtered).
    'id' -> 'payment_date'; score=-inf (filtered).
[🍏 0xf13b] [11 May 20:30:00.134812] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] in 1 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.134865] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='payment_p2007_03': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.134914] .... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'id'} to actual placeholders={'staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'} for source='payment_p2007_05'.
[🍏 0xf13b] [11 May 20:30:00.134968] ...... [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='payment_p2007_05' for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🍏 0xf13b] [11 May 20:30:00.135032] ...... [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['id'].
[🍏 0xf13b] [11 May 20:30:00.135071] ...... [DEBUG] [id_translation.mapping.filter_functions.filter_names] Discard source='payment_p2007_05'; matches pattern=re.compile('.*p2007.*', re.IGNORECASE).
[🍏 0xf13b] [11 May 20:30:00.135103] ...... [DEBUG] [id_translation.fetching.map] All candidates removed by filtering. Applied 1 filters for value='id', removing candidates={'staff_id', 'customer_id', 'rental_id', 'amount', 'payment_id', 'payment_date'}.
[🍏 0xf13b] [11 May 20:30:00.135937] ...... [DEBUG] [id_translation.fetching.map] Computed 1x6 match scores in context='payment_p2007_05' in 194 Ξs:
candidates  staff_id  customer_id  amount  payment_id  rental_id  payment_date
values                                                                        
id              -inf         -inf    -inf        -inf       -inf          -inf
[🍏 0xf13b] [11 May 20:30:00.136046] ...... [DEBUG] [id_translation.fetching.map] Could not map value='id'. Rejected matches:
    'id' -> 'staff_id'; score=-inf (filtered).
    'id' -> 'customer_id'; score=-inf (filtered).
    'id' -> 'amount'; score=-inf (filtered).
    'id' -> 'payment_id'; score=-inf (filtered).
    'id' -> 'rental_id'; score=-inf (filtered).
    'id' -> 'payment_date'; score=-inf (filtered).
[🍏 0xf13b] [11 May 20:30:00.136122] ...... [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['id']x['staff_id', 'customer_id', 'amount', 'payment_id', 'rental_id', 'payment_date'] in 1 ms. Matches:
    'id' -> <no matches>
Matched 0/1 values with 0 different candidates.
[🍏 0xf13b] [11 May 20:30:00.136175] .... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='payment_p2007_05': {'id': None}.
[🍏 0xf13b] [11 May 20:30:00.136221] .... [DEBUG] [id_translation.fetching] Discarded 9 tables. Reason: {'no ID column': ['uuid_test_table', 'payment_p2007_06', 'payment_p2007_04', 'film_actor', 'payment_p2007_01', 'payment_p2007_02', 'film_category', 'payment_p2007_03', 'payment_p2007_05']}
[🍏 0xf13b] [11 May 20:30:00.136329] .. [INFO] [✅ SqlFetcher.initialize_sources] Finished initialization of 'SqlFetcher' in 106 ms: SqlFetcher('postgresql+pg8000://postgres:***@localhost:5002/sakila', sources=['address', 'film', 'language', 'customer', 'country', 'staff', 'actor', 'city'])
[🍏 0xf13b] [11 May 20:30:00.136385] [DEBUG] [✅ MultiFetcher.initialize_sources] Finished initialization 2 children and 9 sources in 107 ms.
[🎃 0xe949] [11 May 20:30:00.279761] [DEBUG] [id_translation.dio] Using rank-0 (priority=1999) implementation 'id_translation.dio.integration.pandas.PandasIO' for translatable of type='pandas.DataFrame'.
[🎃 0xe949] [11 May 20:30:00.280018] [DEBUG] [🚀 Translator.translate] Begin translation of 'DataFrame'-type data. Names to translate: Derive based on type.
[🎃 0xe949] [11 May 20:30:00.280111] .. [DEBUG] [id_translation.Translator] Name extraction complete. Found names=['customer_id', 'film_id', 'category_id', 'staff_id', 'rental_date', 'return_date'] for 'DataFrame'-type data.
[🎃 0xe949] [11 May 20:30:00.280174] .. [DEBUG] [🚀 Translator.map] Begin name-to-source mapping of names=['customer_id', 'film_id', 'category_id', 'staff_id', 'rental_date', 'return_date'] in 'DataFrame' against sources=['category', 'address', 'film', 'language', 'customer', 'country', 'staff', 'actor', 'city'].
[🎃 0xe949] [11 May 20:30:00.280246] .... [DEBUG] [id_translation.Translator.map] Begin computing match scores for ['customer_id', 'film_id', 'category_id', 'staff_id', 'rental_date', 'return_date']x['category', 'address', 'film', 'language', 'customer', 'country', 'staff', 'actor', 'city'] using HeuristicScore([like_database_table()] -> modified_hamming).
[🎃 0xe949] [11 May 20:30:00.280352] .... [DEBUG] [id_translation.Translator.map] Applied 1 filters for value='customer_id', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.280384] .... [DEBUG] [id_translation.Translator.map] Compute match scores for value='customer_id'.
[🎃 0xe949] [11 May 20:30:00.280473] .... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function like_database_table() in context=None:
    ('customer_id', ['address', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city']) -> ('customer', ['addres', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city']).
    Positional penalty=0.000. Scores before penalty: [0.056, -0.001, 0.123, 0.997, -0.004, -0.005, -0.006, 0.043, -0.008].
[🎃 0xe949] [11 May 20:30:00.280552] .... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='customer_id': ['address': 0.03 -> 0.06 (+0.03), 'film': -0.00 -> -0.00 (+0.00), 'category': 0.03 -> 0.12 (+0.09), 'customer': -0.00 -> 1.00 (+1.00), 'language': -0.00 -> -0.00 (+0.00), 'country': -0.01 -> -0.01 (+0.00), 'staff': -0.01 -> -0.01 (+0.00), 'actor': -0.01 -> 0.04 (+0.05), 'city': -0.01 -> -0.01 (+0.00)]
[🎃 0xe949] [11 May 20:30:00.280619] .... [DEBUG] [id_translation.Translator.map] Applied 1 filters for value='film_id', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.280650] .... [DEBUG] [id_translation.Translator.map] Compute match scores for value='film_id'.
[🎃 0xe949] [11 May 20:30:00.280714] .... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function like_database_table() in context=None:
    ('film_id', ['address', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city']) -> ('film', ['addres', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city']).
    Positional penalty=0.000. Scores before penalty: [0.0, 0.999, -0.002, -0.003, -0.004, -0.005, -0.006, -0.007, 0.242].
[🎃 0xe949] [11 May 20:30:00.280779] .... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='film_id': ['address': 0.00 -> 0.00 (+0.00), 'film': -0.00 -> 1.00 (+1.00), 'category': -0.00 -> -0.00 (+0.00), 'customer': -0.00 -> -0.00 (+0.00), 'language': -0.00 -> -0.00 (+0.00), 'country': -0.01 -> -0.01 (+0.00), 'staff': -0.01 -> -0.01 (+0.00), 'actor': -0.01 -> -0.01 (+0.00), 'city': -0.01 -> 0.24 (+0.25)]
[🎃 0xe949] [11 May 20:30:00.280836] .... [DEBUG] [id_translation.Translator.map] Applied 1 filters for value='category_id', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.280864] .... [DEBUG] [id_translation.Translator.map] Compute match scores for value='category_id'.
[🎃 0xe949] [11 May 20:30:00.280926] .... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function like_database_table() in context=None:
    ('category_id', ['address', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city']) -> ('category', ['addres', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city']).
    Positional penalty=0.000. Scores before penalty: [0.0, -0.001, 0.998, 0.122, 0.121, 0.138, -0.006, -0.007, 0.042].
[🎃 0xe949] [11 May 20:30:00.281006] .... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='category_id': ['address': 0.00 -> 0.00 (+0.00), 'film': -0.00 -> -0.00 (+0.00), 'category': -0.00 -> 1.00 (+1.00), 'customer': -0.00 -> 0.12 (+0.12), 'language': -0.00 -> 0.12 (+0.12), 'country': 0.02 -> 0.14 (+0.11), 'staff': -0.01 -> -0.01 (+0.00), 'actor': -0.01 -> -0.01 (+0.00), 'city': -0.01 -> 0.04 (+0.05)]
[🎃 0xe949] [11 May 20:30:00.281065] .... [DEBUG] [id_translation.Translator.map] Applied 1 filters for value='staff_id', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.281095] .... [DEBUG] [id_translation.Translator.map] Compute match scores for value='staff_id'.
[🎃 0xe949] [11 May 20:30:00.281155] .... [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function like_database_table() in context=None:
    ('staff_id', ['address', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city']) -> ('staff', ['addres', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city']).
    Positional penalty=0.000. Scores before penalty: [0.0, -0.001, -0.002, -0.003, 0.046, -0.005, 0.994, -0.007, -0.008].
[🎃 0xe949] [11 May 20:30:00.281219] .... [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='staff_id': ['address': 0.00 -> 0.00 (+0.00), 'film': 0.05 -> 0.05 (+0.00), 'category': -0.00 -> -0.00 (+0.00), 'customer': -0.00 -> -0.00 (+0.00), 'language': -0.00 -> 0.05 (+0.05), 'country': -0.01 -> -0.01 (+0.00), 'staff': -0.01 -> 0.99 (+1.00), 'actor': -0.01 -> -0.01 (+0.00), 'city': -0.01 -> -0.01 (+0.00)]
[🎃 0xe949] [11 May 20:30:00.281277] .... [DEBUG] [id_translation.mapping.filter_functions.filter_names] Do not translate name='rental_date'; does not match pattern=re.compile('.*_id$', re.IGNORECASE).
[🎃 0xe949] [11 May 20:30:00.281311] .... [DEBUG] [id_translation.Translator.map] All candidates removed by filtering. Applied 1 filters for value='rental_date', removing candidates={'address', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city'}.
[🎃 0xe949] [11 May 20:30:00.281350] .... [DEBUG] [id_translation.mapping.filter_functions.filter_names] Do not translate name='return_date'; does not match pattern=re.compile('.*_id$', re.IGNORECASE).
[🎃 0xe949] [11 May 20:30:00.281380] .... [DEBUG] [id_translation.Translator.map] All candidates removed by filtering. Applied 1 filters for value='return_date', removing candidates={'address', 'film', 'category', 'customer', 'language', 'country', 'staff', 'actor', 'city'}.
[🎃 0xe949] [11 May 20:30:00.282716] .... [DEBUG] [id_translation.Translator.map] Computed 6x9 match scores in context=None in 1 ms:
candidates   category  address  film  language  customer  country  staff  actor  city
values                                                                               
customer_id      0.12     0.06 -0.00     -0.00      1.00    -0.01  -0.01   0.04 -0.01
film_id         -0.00     0.00  1.00     -0.00     -0.00    -0.01  -0.01  -0.01  0.24
category_id      1.00     0.00 -0.00      0.12      0.12     0.14  -0.01  -0.01  0.04
staff_id        -0.00     0.00  0.05      0.05     -0.00    -0.01   0.99  -0.01 -0.01
rental_date      -inf     -inf  -inf      -inf      -inf     -inf   -inf   -inf  -inf
return_date      -inf     -inf  -inf      -inf      -inf     -inf   -inf   -inf  -inf
[🎃 0xe949] [11 May 20:30:00.282923] .... [DEBUG] [id_translation.Translator.map] Accepted: 'film_id' -> 'film'; score=0.999 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.282978] .... [DEBUG] [id_translation.Translator.map] Accepted: 'category_id' -> 'category'; score=0.998 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.283021] .... [DEBUG] [id_translation.Translator.map] Accepted: 'customer_id' -> 'customer'; score=0.997 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.283053] .... [DEBUG] [id_translation.Translator.map] Accepted: 'staff_id' -> 'staff'; score=0.994 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.283087] .... [DEBUG] [id_translation.Translator.map] Could not map value='rental_date'. Rejected matches:
    'rental_date' -> 'category'; score=-inf (filtered).
    'rental_date' -> 'address'; score=-inf (filtered).
    'rental_date' -> 'film'; score=-inf (filtered).
    'rental_date' -> 'language'; score=-inf (filtered).
    'rental_date' -> 'customer'; score=-inf (filtered).
    'rental_date' -> 'country'; score=-inf (filtered).
    'rental_date' -> 'staff'; score=-inf (filtered).
    'rental_date' -> 'actor'; score=-inf (filtered).
    'rental_date' -> 'city'; score=-inf (filtered).
[🎃 0xe949] [11 May 20:30:00.283154] .... [DEBUG] [id_translation.Translator.map] Could not map value='return_date'. Rejected matches:
    'return_date' -> 'category'; score=-inf (filtered).
    'return_date' -> 'address'; score=-inf (filtered).
    'return_date' -> 'film'; score=-inf (filtered).
    'return_date' -> 'language'; score=-inf (filtered).
    'return_date' -> 'customer'; score=-inf (filtered).
    'return_date' -> 'country'; score=-inf (filtered).
    'return_date' -> 'staff'; score=-inf (filtered).
    'return_date' -> 'actor'; score=-inf (filtered).
    'return_date' -> 'city'; score=-inf (filtered).
[🎃 0xe949] [11 May 20:30:00.283245] .... [DEBUG] [id_translation.Translator.map] Mapping with cardinality='ManyToOne' finished for ['customer_id', 'film_id', 'category_id', 'staff_id', 'rental_date', 'return_date']x['category', 'address', 'film', 'language', 'customer', 'country', 'staff', 'actor', 'city'] in 3 ms. Matches:
    'customer_id' -> ('customer',)
    'film_id' -> ('film',)
    'category_id' -> ('category',)
    'staff_id' -> ('staff',)
    'rental_date' -> <no matches>
    'return_date' -> <no matches>
Matched 4/6 values with 4 different candidates.
[🎃 0xe949] [11 May 20:30:00.283325] .. [INFO] [✅ Translator.map] Finished mapping of 4/6 names in 'DataFrame' in 3 ms: {'customer_id': 'customer', 'film_id': 'film', 'category_id': 'category', 'staff_id': 'staff', 'rental_date': None, 'return_date': None}.
[🎃 0xe949] [11 May 20:30:00.283728] .. [DEBUG] [🚀 MultiFetcher.fetch] Dispatch FETCH jobs for 4 sources using 2 different fetchers on 2 threads.
[🎃 0xe949] [11 May 20:30:00.284039] .... [DEBUG] [id_translation.fetching.MultiFetcher] Begin FETCH job for 3 sources using rank-1 fetcher SqlFetcher('postgresql+pg8000://postgres:***@localhost:5002/sakila', sources=['address', 'film', 'language', 'customer', 'country', 'staff', 'actor', 'city']) at 0x74426fb64ec0.
[🎃 0xe949] [11 May 20:30:00.284135] .... [DEBUG] [🚀 SqlFetcher.fetch] Begin fetching placeholders=('id', 'name', 'last_name') for 22 IDs from 3 sources: {'staff': 2, 'customer': 10, 'film': 10}.
[🎃 0xe949] [11 May 20:30:00.284210] ...... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'last_name', 'id', 'name'} to actual placeholders={'staff_id', 'first_name', 'address_id', 'username', 'picture', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update'} for source='staff'.
[🎃 0xe949] [11 May 20:30:00.284298] ........ [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='staff' for ['last_name', 'id', 'name']x['staff_id', 'first_name', 'address_id', 'username', 'picture', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🎃 0xe949] [11 May 20:30:00.284384] ........ [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['last_name', 'id', 'name'].
[🎃 0xe949] [11 May 20:30:00.284439] ........ [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='last_name', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.284497] ........ [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.284553] ........ [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🎃 0xe949] [11 May 20:30:00.284631] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='staff':
    ('id', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.143, -0.001, 0.109, -0.003, -0.004, 0.12, 0.065, 0.136, -0.008, -0.009, -0.01].
[🎃 0xe949] [11 May 20:30:00.284848] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='staff':
    ('id', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.375, -0.001, 0.165, 0.068, -0.004, 0.045, 0.244, 0.368, 0.048, -0.009, -0.01].
[🎃 0xe949] [11 May 20:30:00.284962] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='staff':
    ('id', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> ('staff_id', *).
    Positional penalty=0.010. Scores before penalty: [1.0, -0.001, 0.123, -0.003, -0.004, 0.045, 0.119, 0.618, 0.048, -0.009, -0.01].
[🎃 0xe949] [11 May 20:30:00.285045] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='staff':
    ('id', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.143, -0.001, 0.109, -0.003, -0.004, 0.12, 0.065, 0.136, -0.008, -0.009, -0.01].
[🎃 0xe949] [11 May 20:30:00.285123] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['staff_id': 0.14 -> 0.99 (+0.85), 'first_name': -0.00 -> -0.00 (+0.00), 'address_id': 0.11 -> 0.16 (+0.05), 'picture': -0.00 -> 0.06 (+0.07), 'username': -0.00 -> -0.00 (+0.00), 'email': 0.12 -> 0.12 (+0.00), 'password': 0.07 -> 0.24 (+0.17), 'store_id': 0.14 -> 0.61 (+0.47), 'active': -0.01 -> 0.04 (+0.05), 'last_name': -0.01 -> -0.01 (+0.00), 'last_update': -0.01 -> -0.01 (+0.00)]
[🎃 0xe949] [11 May 20:30:00.285202] ........ [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='name', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.285248] ........ [DEBUG] [id_translation.fetching.map] Compute match scores for value='name'.
[🎃 0xe949] [11 May 20:30:00.285313] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='staff':
    ('name', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.0, 0.142, -0.002, 0.059, 0.196, 0.12, -0.006, -0.007, 0.075, 0.158, 0.052].
[🎃 0xe949] [11 May 20:30:00.285396] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='staff':
    ('name', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> ('first_name', *).
    Positional penalty=0.005. Scores before penalty: [0.0, 0.999, -0.002, 0.033, 0.204, 0.028, -0.006, -0.007, 0.025, 0.38, 0.09].
[🎃 0xe949] [11 May 20:30:00.285481] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='staff':
    ('name', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> ('staff_name', *).
    Positional penalty=0.010. Scores before penalty: [0.0, 0.499, -0.002, 0.033, 0.163, 0.028, -0.006, -0.007, 0.025, 0.324, 0.09].
[🎃 0xe949] [11 May 20:30:00.285571] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='staff':
    ('name', ['staff_id', 'first_name', 'address_id', 'picture', 'username', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update']) -> ('staff', *).
    Positional penalty=0.015. Scores before penalty: [0.0, 0.032, 0.031, 0.064, 0.046, 0.195, 0.044, -0.007, 0.092, 0.031, 0.019].
[🎃 0xe949] [11 May 20:30:00.285646] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='name': ['staff_id': 0.00 -> 0.00 (+0.00), 'first_name': 0.14 -> 0.99 (+0.85), 'address_id': -0.00 -> 0.02 (+0.02), 'picture': 0.06 -> 0.06 (+0.00), 'username': 0.20 -> 0.20 (+0.00), 'email': 0.12 -> 0.18 (+0.06), 'password': -0.01 -> 0.03 (+0.04), 'store_id': -0.01 -> -0.01 (+0.00), 'active': 0.08 -> 0.08 (+0.00), 'last_name': 0.16 -> 0.37 (+0.22), 'last_update': 0.05 -> 0.09 (+0.03)]
[🎃 0xe949] [11 May 20:30:00.287441] ........ [DEBUG] [id_translation.fetching.map] Computed 3x11 match scores in context='staff' in 1 ms:
candidates  staff_id  first_name  address_id  username  picture  email  password  store_id  active  last_name  last_update
values                                                                                                                    
last_name       -inf        -inf        -inf      -inf     -inf   -inf      -inf      -inf    -inf        inf         -inf
id              0.99       -0.00        0.16     -0.00     0.06   0.12      0.24      0.61    0.04      -0.01        -0.01
name            0.00        0.99        0.02      0.20     0.06   0.18      0.03     -0.01    0.08       0.37         0.09
[🎃 0xe949] [11 May 20:30:00.287793] ........ [DEBUG] [id_translation.fetching.map] Accepted: 'last_name' -> 'last_name'; score=inf (short-circuit or override).
[🎃 0xe949] [11 May 20:30:00.287862] ........ [DEBUG] [id_translation.fetching.map] Accepted: 'name' -> 'first_name'; score=0.994 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.287912] ........ [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'staff_id'; score=0.990 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.287981] ........ [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['last_name', 'id', 'name']x['staff_id', 'first_name', 'address_id', 'username', 'picture', 'email', 'password', 'store_id', 'active', 'last_name', 'last_update'] in 4 ms. Matches:
    'last_name' -> ('last_name',)
    'id' -> ('staff_id',)
    'name' -> ('first_name',)
Matched 3/3 values with 3 different candidates.
[🎃 0xe949] [11 May 20:30:00.288055] ...... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='staff': {'last_name': 'last_name', 'name': 'first_name', 'id': 'staff_id'}.
[🎃 0xe949] [11 May 20:30:00.288125] ...... [DEBUG] [🚀 SqlFetcher.fetch_translations] Begin fetching 2 IDs from source='staff'. Placeholders: ('staff_id', 'first_name', 'last_name').
[🎃 0xe949] [11 May 20:30:00.288661] ........ [DEBUG] [id_translation.fetching] Full SELECT-query using 'postgresql+pg8000://postgres:***@localhost:5002/sakila':
SELECT staff.staff_id, staff.first_name, staff.last_name 
FROM staff 
WHERE staff.staff_id IN (1, 2)
[🎃 0xe949] [11 May 20:30:00.289031] ........ [DEBUG] [id_translation.fetching.MultiFetcher] Begin FETCH job for 1 sources using rank-0 fetcher MemoryFetcher(sources=['category'], return_all=True) at 0x74426fb646e0.
[🎃 0xe949] [11 May 20:30:00.289130] ........ [DEBUG] [🚀 MemoryFetcher.fetch] Begin fetching placeholders=('id', 'name', 'last_name') for 7 IDs from 1 sources: {'category': 7}.
[🎃 0xe949] [11 May 20:30:00.289201] .......... [DEBUG] [🚀 MemoryFetcher.map_placeholders] Begin mapping of wanted placeholders={'last_name', 'id', 'name'} to actual placeholders={'id', 'name'} for source='category'.
[🎃 0xe949] [11 May 20:30:00.289279] ............ [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='category' for ['last_name', 'id', 'name']x['id', 'name'] using HeuristicScore([force_lower_case()] -> MemoryFetcher.default_score_function).
[🎃 0xe949] [11 May 20:30:00.289342] ............ [DEBUG] [id_translation.fetching.map] Compute match scores for value='last_name'.
[🎃 0xe949] [11 May 20:30:00.289408] ............ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='category':
    ('last_name', ['id', 'name']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.0, 0.166].
[🎃 0xe949] [11 May 20:30:00.289474] ............ [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='last_name': ['id': 0.00 -> 0.00 (+0.00), 'name': 0.17 -> 0.17 (+0.00)]
[🎃 0xe949] [11 May 20:30:00.290649] ............ [DEBUG] [id_translation.fetching.map] Computed 3x2 match scores in context='category' in 273 Ξs:
candidates   id  name
values               
last_name  0.00  0.17
id          inf  -inf
name       -inf   inf
[🎃 0xe949] [11 May 20:30:00.290812] ............ [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'id'; score=inf (short-circuit or override).
[🎃 0xe949] [11 May 20:30:00.290870] ............ [DEBUG] [id_translation.fetching.map] Accepted: 'name' -> 'name'; score=inf (short-circuit or override).
[🎃 0xe949] [11 May 20:30:00.290920] ............ [DEBUG] [id_translation.fetching.map] Could not map value='last_name'. Rejected matches:
    'last_name' -> 'name'; score=0.166 < 0.9 (below threshold).
    'last_name' -> 'id'; score=0.000 < 0.9 (below threshold).
[🎃 0xe949] [11 May 20:30:00.290995] ............ [DEBUG] [id_translation.fetching.map] Could not map {'last_name'} in context='category' to any of candidates={'id', 'name'}.
[🎃 0xe949] [11 May 20:30:00.291050] ............ [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['last_name', 'id', 'name']x{'id', 'name'} in 2 ms. Matches:
    'last_name' -> <no matches>
    'id' -> ('id',)
    'name' -> ('name',)
Matched 2/3 values with 2 different candidates.
[🎃 0xe949] [11 May 20:30:00.291135] .......... [DEBUG] [✅ MemoryFetcher.map_placeholders] Finished placeholder mapping for source='category': {'id': 'id', 'name': 'name', 'last_name': None}.
[🎃 0xe949] [11 May 20:30:00.291200] .......... [DEBUG] [🚀 MemoryFetcher.fetch_translations] Begin fetching 7 IDs from source='category'. Placeholders: ('id', 'name', 'last_name').
[🎃 0xe949] [11 May 20:30:00.291257] .......... [DEBUG] [✅ MemoryFetcher.fetch_translations] Finished fetching 16 IDs from source='category' in 56 Ξs. Placeholders: ('id', 'name').
[🎃 0xe949] [11 May 20:30:00.291325] ........ [INFO] [✅ MemoryFetcher.fetch] Finished fetching from 1 sources in 2 ms: ['category' x ('id', 'name') x 16/7 IDs].
[🎃 0xe949] [11 May 20:30:00.291926] ...... [DEBUG] [✅ SqlFetcher.fetch_translations] Finished fetching 2 IDs from source='staff' in 4 ms. Placeholders: ('staff_id', 'first_name', 'last_name').
[🎃 0xe949] [11 May 20:30:00.292011] ...... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'last_name', 'id', 'name'} to actual placeholders={'customer_id', 'first_name', 'address_id', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update'} for source='customer'.
[🎃 0xe949] [11 May 20:30:00.292112] ........ [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='customer' for ['last_name', 'id', 'name']x['customer_id', 'first_name', 'address_id', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🎃 0xe949] [11 May 20:30:00.292188] ........ [DEBUG] [id_translation.fetching.map] Applied 2 overrides, but none were a match for the given values=['last_name', 'id', 'name'].
[🎃 0xe949] [11 May 20:30:00.292228] ........ [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='last_name', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.292271] ........ [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.292300] ........ [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🎃 0xe949] [11 May 20:30:00.292360] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='customer':
    ('id', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.1, 0.11, -0.002, -0.003, 0.121, 0.138, -0.006, -0.007, -0.008, -0.009].
[🎃 0xe949] [11 May 20:30:00.292439] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='customer':
    ('id', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.094, 0.166, -0.002, 0.039, 0.046, 0.37, 0.05, -0.007, -0.008, -0.009].
[🎃 0xe949] [11 May 20:30:00.292525] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='customer':
    ('id', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> ('customer_id', *).
    Positional penalty=0.010. Scores before penalty: [1.0, 0.149, -0.002, 0.097, 0.053, 0.089, -0.006, -0.007, 0.083, 0.173].
[🎃 0xe949] [11 May 20:30:00.292602] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='customer':
    ('id', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.1, 0.11, -0.002, -0.003, 0.121, 0.138, -0.006, -0.007, -0.008, -0.009].
[🎃 0xe949] [11 May 20:30:00.292665] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['customer_id': 0.10 -> 0.99 (+0.89), 'address_id': 0.11 -> 0.16 (+0.05), 'first_name': -0.00 -> -0.00 (+0.00), 'activebool': -0.00 -> 0.09 (+0.09), 'email': 0.12 -> 0.12 (+0.00), 'store_id': 0.14 -> 0.36 (+0.23), 'active': -0.01 -> 0.04 (+0.05), 'last_name': -0.01 -> -0.01 (+0.00), 'create_date': -0.01 -> 0.07 (+0.08), 'last_update': -0.01 -> 0.16 (+0.17)]
[🎃 0xe949] [11 May 20:30:00.292729] ........ [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='name', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.292761] ........ [DEBUG] [id_translation.fetching.map] Compute match scores for value='name'.
[🎃 0xe949] [11 May 20:30:00.292814] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='customer':
    ('name', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.0, -0.001, 0.141, -0.003, 0.121, -0.005, 0.077, 0.16, 0.054, 0.053].
[🎃 0xe949] [11 May 20:30:00.292885] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='customer':
    ('name', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> ('first_name', *).
    Positional penalty=0.005. Scores before penalty: [0.0, -0.001, 0.998, -0.003, 0.029, -0.005, 0.027, 0.382, 0.142, 0.091].
[🎃 0xe949] [11 May 20:30:00.292954] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='customer':
    ('name', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> ('customer_name', *).
    Positional penalty=0.010. Scores before penalty: [0.0, -0.001, 0.123, -0.003, 0.018, -0.005, 0.015, 0.104, 0.083, 0.052].
[🎃 0xe949] [11 May 20:30:00.293020] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='customer':
    ('name', ['customer_id', 'address_id', 'first_name', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update']) -> ('customer', *).
    Positional penalty=0.015. Scores before penalty: [0.0, -0.001, -0.002, -0.003, -0.004, -0.005, -0.006, -0.007, -0.008, -0.009].
[🎃 0xe949] [11 May 20:30:00.293081] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='name': ['customer_id': 0.00 -> 0.00 (+0.00), 'address_id': -0.00 -> -0.00 (+0.00), 'first_name': 0.14 -> 0.99 (+0.85), 'activebool': -0.00 -> -0.00 (+0.00), 'email': 0.12 -> 0.12 (+0.00), 'store_id': -0.01 -> -0.01 (+0.00), 'active': 0.08 -> 0.08 (+0.00), 'last_name': 0.16 -> 0.38 (+0.22), 'create_date': 0.05 -> 0.14 (+0.08), 'last_update': 0.05 -> 0.09 (+0.03)]
[🎃 0xe949] [11 May 20:30:00.294307] ........ [DEBUG] [id_translation.fetching.map] Computed 3x10 match scores in context='customer' in 1 ms:
candidates  customer_id  first_name  address_id  activebool  email  store_id  active  last_name  create_date  last_update
values                                                                                                                   
last_name          -inf        -inf        -inf        -inf   -inf      -inf    -inf        inf         -inf         -inf
id                 0.99       -0.00        0.16        0.09   0.12      0.36    0.04      -0.01         0.07         0.16
name               0.00        0.99       -0.00       -0.00   0.12     -0.01    0.08       0.38         0.14         0.09
[🎃 0xe949] [11 May 20:30:00.294489] ........ [DEBUG] [id_translation.fetching.map] Accepted: 'last_name' -> 'last_name'; score=inf (short-circuit or override).
[🎃 0xe949] [11 May 20:30:00.294536] ........ [DEBUG] [id_translation.fetching.map] Accepted: 'name' -> 'first_name'; score=0.993 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.294604] ........ [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'customer_id'; score=0.990 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.294658] ........ [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['last_name', 'id', 'name']x['customer_id', 'first_name', 'address_id', 'activebool', 'email', 'store_id', 'active', 'last_name', 'create_date', 'last_update'] in 3 ms. Matches:
    'last_name' -> ('last_name',)
    'id' -> ('customer_id',)
    'name' -> ('first_name',)
Matched 3/3 values with 3 different candidates.
[🎃 0xe949] [11 May 20:30:00.294716] ...... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='customer': {'last_name': 'last_name', 'name': 'first_name', 'id': 'customer_id'}.
[🎃 0xe949] [11 May 20:30:00.294764] ...... [DEBUG] [🚀 SqlFetcher.fetch_translations] Begin fetching 10 IDs from source='customer'. Placeholders: ('customer_id', 'first_name', 'last_name').
[🎃 0xe949] [11 May 20:30:00.295063] ........ [DEBUG] [id_translation.fetching] Full SELECT-query using 'postgresql+pg8000://postgres:***@localhost:5002/sakila':
SELECT customer.customer_id, customer.first_name, customer.last_name 
FROM customer 
WHERE customer.customer_id IN (419, 261, 107, 493, 20, 565, 54, 313, 26, 381)
[🎃 0xe949] [11 May 20:30:00.297457] ...... [DEBUG] [✅ SqlFetcher.fetch_translations] Finished fetching 10 IDs from source='customer' in 3 ms. Placeholders: ('customer_id', 'first_name', 'last_name').
[🎃 0xe949] [11 May 20:30:00.297572] ...... [DEBUG] [🚀 SqlFetcher.map_placeholders] Begin mapping of wanted placeholders={'last_name', 'id', 'name'} to actual placeholders={'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'fulltext', 'film_id', 'length', 'last_update'} for source='film'.
[🎃 0xe949] [11 May 20:30:00.297690] ........ [DEBUG] [id_translation.fetching.map] Begin computing match scores in context='film' for ['last_name', 'id', 'name']x['title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'fulltext', 'film_id', 'length', 'last_update'] using HeuristicScore([force_lower_case() | value_fstring_alias(fstring='first_{value}') | value_fstring_alias(fstring='{context}_{value}') | value_fstring_alias(fstring='{context}', for_value='name')] -> AbstractFetcher.default_score_function).
[🎃 0xe949] [11 May 20:30:00.297823] ........ [DEBUG] [id_translation.fetching.map] Applied 2 overrides, and found 1 matches={'name': 'title'} in the given values=['last_name', 'id', 'name'].
[🎃 0xe949] [11 May 20:30:00.297871] ........ [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='last_name', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.297903] ........ [DEBUG] [id_translation.fetching.map] Compute match scores for value='last_name'.
[🎃 0xe949] [11 May 20:30:00.297980] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='film':
    ('last_name', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.074, 0.039, -0.002, -0.003, -0.004, -0.005, 0.022, -0.007, 0.103, 0.074, -0.01, -0.011, 0.03, -0.013].
[🎃 0xe949] [11 May 20:30:00.298072] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='film':
    ('last_name', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> ('first_last_name', *).
    Positional penalty=0.005. Scores before penalty: [0.036, 0.017, -0.002, -0.003, -0.004, -0.005, 0.061, -0.007, 0.047, 0.053, -0.01, -0.011, 0.005, -0.013].
[🎃 0xe949] [11 May 20:30:00.298158] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='film':
    ('last_name', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> ('film_last_name', *).
    Positional penalty=0.010. Scores before penalty: [0.045, 0.019, -0.002, -0.003, -0.004, -0.005, 0.042, -0.007, 0.06, 0.074, -0.01, -0.011, 0.007, -0.013].
[🎃 0xe949] [11 May 20:30:00.298237] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='film':
    ('last_name', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.074, 0.039, -0.002, -0.003, -0.004, -0.005, 0.022, -0.007, 0.103, 0.074, -0.01, -0.011, 0.03, -0.013].
[🎃 0xe949] [11 May 20:30:00.298308] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='last_name': ['last_update': 0.07 -> 0.07 (+0.00), 'title': 0.04 -> 0.04 (+0.00), 'special_features': -0.00 -> -0.00 (+0.00), 'description': -0.00 -> -0.00 (+0.00), 'language_id': -0.00 -> -0.00 (+0.00), 'rating': -0.01 -> -0.01 (+0.00), 'replacement_cost': 0.02 -> 0.06 (+0.03), 'original_language_id': -0.01 -> -0.01 (+0.00), 'rental_rate': 0.10 -> 0.10 (+0.00), 'release_year': 0.07 -> 0.07 (+0.00), 'rental_duration': -0.01 -> -0.01 (+0.00), 'film_id': -0.01 -> -0.01 (+0.00), 'length': 0.03 -> 0.03 (+0.00), 'fulltext': -0.01 -> -0.01 (+0.00)]
[🎃 0xe949] [11 May 20:30:00.298389] ........ [DEBUG] [id_translation.fetching.map] Applied 1 filters for value='id', but did not remove any candidates.
[🎃 0xe949] [11 May 20:30:00.298420] ........ [DEBUG] [id_translation.fetching.map] Compute match scores for value='id'.
[🎃 0xe949] [11 May 20:30:00.298473] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function force_lower_case() in context='film':
    ('id', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> (*, *).
    Positional penalty=0.000. Scores before penalty: [0.0, -0.001, -0.002, -0.003, 0.096, -0.005, -0.006, 0.046, -0.008, -0.009, -0.01, 0.156, -0.012, -0.013].
[🎃 0xe949] [11 May 20:30:00.298577] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='first_{value}') in context='film':
    ('id', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> ('first_id', *).
    Positional penalty=0.005. Scores before penalty: [0.0, -0.001, 0.012, 0.028, 0.09, 0.106, -0.006, 0.022, -0.008, -0.009, 0.021, 0.203, -0.012, 0.237].
[🎃 0xe949] [11 May 20:30:00.298661] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}_{value}') in context='film':
    ('id', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> ('film_id', *).
    Positional penalty=0.010. Scores before penalty: [0.0, -0.001, -0.002, 0.026, 0.082, -0.005, -0.006, 0.024, -0.008, -0.009, -0.01, 0.989, -0.012, 0.058].
[🎃 0xe949] [11 May 20:30:00.298731] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Called non-mutating alias function value_fstring_alias(fstring='{context}', for_value='name') in context='film':
    ('id', ['last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext']) -> (*, *).
    Positional penalty=0.015. Scores before penalty: [0.0, -0.001, -0.002, -0.003, 0.096, -0.005, -0.006, 0.046, -0.008, -0.009, -0.01, 0.156, -0.012, -0.013].
[🎃 0xe949] [11 May 20:30:00.298828] ........ [DEBUG] [id_translation.mapping.HeuristicScore] Heuristics scores for value='id': ['last_update': 0.00 -> 0.00 (+0.00), 'title': -0.00 -> -0.00 (+0.00), 'special_features': -0.00 -> 0.01 (+0.01), 'description': -0.00 -> 0.02 (+0.03), 'language_id': 0.10 -> 0.10 (+0.00), 'rating': -0.01 -> 0.10 (+0.11), 'replacement_cost': -0.01 -> -0.01 (+0.00), 'original_language_id': 0.05 -> 0.05 (+0.00), 'rental_rate': -0.01 -> -0.01 (+0.00), 'release_year': -0.01 -> -0.01 (+0.00), 'rental_duration': -0.01 -> 0.02 (+0.03), 'film_id': 0.16 -> 0.98 (+0.82), 'length': -0.01 -> -0.01 (+0.00), 'fulltext': -0.01 -> 0.23 (+0.24)]
[🎃 0xe949] [11 May 20:30:00.300607] ........ [DEBUG] [id_translation.fetching.map] Computed 3x14 match scores in context='film' in 1 ms:
candidates  title  special_features  description  language_id  rating  replacement_cost  original_language_id  rental_rate  release_year  rental_duration  fulltext  film_id  length  last_update
values                                                                                                                                                                                           
last_name    0.04             -0.00        -0.00        -0.00   -0.01              0.06                 -0.01         0.10          0.07            -0.01     -0.01    -0.01    0.03         0.07
id          -0.00              0.01         0.02         0.10    0.10             -0.01                  0.05        -0.01         -0.01             0.02      0.23     0.98   -0.01         0.00
name          inf              -inf         -inf         -inf    -inf              -inf                  -inf         -inf          -inf             -inf      -inf     -inf    -inf         -inf
[🎃 0xe949] [11 May 20:30:00.300830] ........ [DEBUG] [id_translation.fetching.map] Accepted: 'name' -> 'title'; score=inf (short-circuit or override).
[🎃 0xe949] [11 May 20:30:00.300873] ........ [DEBUG] [id_translation.fetching.map] Accepted: 'id' -> 'film_id'; score=0.979 >= 0.9.
[🎃 0xe949] [11 May 20:30:00.300914] ........ [DEBUG] [id_translation.fetching.map] Could not map value='last_name'. Rejected matches:
    'last_name' -> 'rental_rate'; score=0.103 < 0.9 (below threshold).
    'last_name' -> 'release_year'; score=0.074 < 0.9 (below threshold).
    'last_name' -> 'last_update'; score=0.074 < 0.9 (below threshold).
    'last_name' -> 'replacement_cost'; score=0.056 < 0.9 (below threshold).
    'last_name' -> 'title'; score=0.039 < 0.9 (below threshold).
    'last_name' -> 'length'; score=0.030 < 0.9 (below threshold).
    'last_name' -> 'special_features'; score=-0.002 < 0.9 (below threshold).
    'last_name' -> 'description'; score=-0.003 < 0.9 (below threshold).
    'last_name' -> 'language_id'; score=-0.004 < 0.9 (below threshold).
    'last_name' -> 'rating'; score=-0.005 < 0.9 (below threshold).
    'last_name' -> 'original_language_id'; score=-0.007 < 0.9 (below threshold).
    'last_name' -> 'rental_duration'; score=-0.010 < 0.9 (below threshold).
    'last_name' -> 'film_id'; score=-0.011 < 0.9 (below threshold).
    'last_name' -> 'fulltext'; score=-0.013 < 0.9 (below threshold).
[🎃 0xe949] [11 May 20:30:00.301084] ........ [DEBUG] [id_translation.fetching.map] Could not map {'last_name'} in context='film' to any of candidates={'last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext'}.
[🎃 0xe949] [11 May 20:30:00.301139] ........ [DEBUG] [id_translation.fetching.map] Mapping with cardinality='ManyToOne' finished for ['last_name', 'id', 'name']x{'last_update', 'title', 'special_features', 'description', 'language_id', 'rating', 'replacement_cost', 'original_language_id', 'rental_rate', 'release_year', 'rental_duration', 'film_id', 'length', 'fulltext'} in 4 ms. Matches:
    'last_name' -> <no matches>
    'id' -> ('film_id',)
    'name' -> ('title',)
Matched 2/3 values with 2 different candidates.
[🎃 0xe949] [11 May 20:30:00.301200] ...... [DEBUG] [✅ SqlFetcher.map_placeholders] Finished placeholder mapping for source='film': {'name': 'title', 'id': 'film_id', 'last_name': None}.
[🎃 0xe949] [11 May 20:30:00.301249] ...... [DEBUG] [🚀 SqlFetcher.fetch_translations] Begin fetching 10 IDs from source='film'. Placeholders: ('film_id', 'title').
[🎃 0xe949] [11 May 20:30:00.301586] ........ [DEBUG] [id_translation.fetching] Full SELECT-query using 'postgresql+pg8000://postgres:***@localhost:5002/sakila':
SELECT film.film_id, film.title 
FROM film 
WHERE film.film_id IN (994, 773, 454, 487, 134, 7, 489, 767, 797, 479)
[🎃 0xe949] [11 May 20:30:00.303434] ...... [DEBUG] [✅ SqlFetcher.fetch_translations] Finished fetching 10 IDs from source='film' in 2 ms. Placeholders: ('film_id', 'title').
[🎃 0xe949] [11 May 20:30:00.303531] .... [INFO] [✅ SqlFetcher.fetch] Finished fetching from 3 sources in 19 ms: ['staff' x ('id', 'name', 'last_name') x 2/2 IDs], ['customer' x ('id', 'name', 'last_name') x 10/10 IDs], ['film' x ('id', 'name') x 10/10 IDs].
[🎃 0xe949] [11 May 20:30:00.303816] .. [DEBUG] [✅ MultiFetcher.fetch] Finished FETCH jobs for 4 sources using 2 different fetchers in 20 ms.
[🎃 0xe949] [11 May 20:30:00.306070] .. [DEBUG] [id_translation.Translator] Performance counters [ms]: {'map': 3.24, 'extract': 0.319, 'fetch': 20.514, 'verify': 0.331, 'insert': 1.787, 'overhead': 0.444}
[🎃 0xe949] [11 May 20:30:00.306157] [INFO] [✅ Translator.translate] Finished translation of 29 unique IDs (4 names) in 'DataFrame' in 27 ms.