From 46689df668f7c074e3a5ad661bac9b50bc52a0b5 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Mon, 30 May 2022 16:30:41 +0200 Subject: [PATCH] custom comparison for SpecialPhrase Duplicate elemination only works when a custom hash/equal function is implemented that is based on the members. --- nominatim/tools/special_phrases/special_phrase.py | 14 +++++++++++++- test/python/tools/test_import_special_phrases.py | 5 ----- test/python/tools/test_sp_csv_loader.py | 13 ++++--------- test/testdata/sp_csv_test.csv | 1 + 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/nominatim/tools/special_phrases/special_phrase.py b/nominatim/tools/special_phrases/special_phrase.py index d9bf9e58..16935ccf 100644 --- a/nominatim/tools/special_phrases/special_phrase.py +++ b/nominatim/tools/special_phrases/special_phrase.py @@ -10,7 +10,7 @@ This class is a model used to transfer a special phrase through the process of load and importation. """ -class SpecialPhrase(): +class SpecialPhrase: """ Model representing a special phrase. """ @@ -22,3 +22,15 @@ class SpecialPhrase(): # Needed if some operator in the wiki are not written in english p_operator = p_operator.strip().lower() self.p_operator = '-' if p_operator not in ('near', 'in') else p_operator + + def __eq__(self, other): + if not isinstance(other, SpecialPhrase): + return False + + return self.p_label == other.p_label \ + and self.p_class == other.p_class \ + and self.p_type == other.p_type \ + and self.p_operator == other.p_operator + + def __hash__(self): + return hash((self.p_label, self.p_class, self.p_type, self.p_operator)) diff --git a/test/python/tools/test_import_special_phrases.py b/test/python/tools/test_import_special_phrases.py index 7026a549..0dcf549c 100644 --- a/test/python/tools/test_import_special_phrases.py +++ b/test/python/tools/test_import_special_phrases.py @@ -17,11 +17,6 @@ from nominatim.errors import UsageError from cursor import CursorForTesting -@pytest.fixture -def testfile_dir(src_dir): - return src_dir / 'test' / 'testfiles' - - @pytest.fixture def sp_importer(temp_db_conn, def_config, monkeypatch): """ diff --git a/test/python/tools/test_sp_csv_loader.py b/test/python/tools/test_sp_csv_loader.py index b5069a52..49d5a853 100644 --- a/test/python/tools/test_sp_csv_loader.py +++ b/test/python/tools/test_sp_csv_loader.py @@ -11,6 +11,7 @@ import pytest from nominatim.errors import UsageError from nominatim.tools.special_phrases.sp_csv_loader import SPCsvLoader +from nominatim.tools.special_phrases.special_phrase import SpecialPhrase @pytest.fixture def sp_csv_loader(src_dir): @@ -29,17 +30,11 @@ def test_generate_phrases(sp_csv_loader): """ phrases = list(sp_csv_loader.generate_phrases()) - assert len(phrases) == 41 + assert len(phrases) == 42 assert len(set(phrases)) == 41 - assert any(p.p_label == 'Billboard' - and p.p_class == 'advertising' - and p.p_type == 'billboard' - and p.p_operator == '-' for p in phrases) - assert any(p.p_label == 'Zip Lines' - and p.p_class == 'aerialway' - and p.p_type == 'zip_line' - and p.p_operator == '-' for p in phrases) + assert SpecialPhrase('Billboard', 'advertising', 'billboard', '-') in phrases + assert SpecialPhrase('Zip Lines', 'aerialway', 'zip_line', '-') in phrases def test_invalid_cvs_file(): diff --git a/test/testdata/sp_csv_test.csv b/test/testdata/sp_csv_test.csv index 3dab967b..147526de 100644 --- a/test/testdata/sp_csv_test.csv +++ b/test/testdata/sp_csv_test.csv @@ -18,6 +18,7 @@ Zipline near,aerialway,zip_line,near,N Ziplines near,aerialway,zip_line,near,Y Zipwire,aerialway,zip_line,-,N Zipwires,aerialway,zip_line,-,Y +Zipwires,aerialway,zip_line,name,Y Zipwire in,aerialway,zip_line,in,N Zipwires in,aerialway,zip_line,in,Y Zipwire near,aerialway,zip_line,near,N