class DatabaseTests(unittest.TestCase): def setUp(self): self._session = Session('session_test', { 'genre': (None, None, 0.2), 'artist': (None, None, 0.3) }) def test_modify(self): from munin.distance.rating import RatingDistance session = Session('session_test_modify', { 'rating': (None, RatingDistance(), 1), }) with session.transaction(): for i in range(0, 6): session.add({'rating': i}) self.assertAlmostEqual(session[5].distance_get(session[0]).distance, 0.5) self.assertAlmostEqual(session[5]['rating'], (5, )) with session.fix_graph(): session.modify(5, {'rating': 0}) self.assertAlmostEqual(session[5].distance_get(session[0]).distance, 0.0) self.assertAlmostEqual(session[5]['rating'], (0, )) def test_basics(self): with self._session.transaction(): N = 20 for i in range(N): self._session.database.add({ 'genre': i / N, 'artist': i / N }) def test_no_match(self): with self.assertRaisesRegex(KeyError, '.*mask.*'): self._session.database.add({ 'not_in_session': 42 }) def test_insert_remove_song(self): songs = [] with self._session.transaction(): for idx, v in enumerate(['l', 'r', 't', 'd']): songs.append(self._session.add({'genre': [0], 'artist': [0]})) # self._session.database.plot(250, 250) with self._session.fix_graph(): self._session.insert({'genre': [0], 'artist': [0]}) # self._session.database.plot(250, 250) for song in self._session.database: for other in self._session.database: if self is not other: self.assertAlmostEqual(song.distance_get(other).distance, 0.0) self._session.remove(4) # self._session.database.plot(250, 250) with self._session.fix_graph(): self._session.insert({'genre': [0], 'artist': [0]}) # self._session.database.plot(250, 250) def test_find_matching_attributes_numeric(self): from munin.provider import GenreTreeProvider from munin.distance import GenreTreeDistance from munin.helper import pairup session = Session('session_find_test', { 'x': pairup(None, None, 1), 'y': pairup(None, None, 1) }) a = session[session.add({ 'x': 21, 'y': 42, })] b = session[session.add({ 'x': 0, 'y': 100, })] session[session.add({ 'x': 51, 'y': 50, })] self.assertEqual(list(session.database.find_matching_attributes_numeric( {'x': 10}, 20 )), [a, b] ) self.assertEqual(list(session.database.find_matching_attributes_numeric( {'y': 100}, 0 )), [b] ) self.assertEqual(list(session.database.find_matching_attributes_numeric( {'x': 10, 'y': 40}, 20 )), [a] ) self.assertEqual(list(session.database.find_matching_attributes_numeric( {'x': 10, 'y': 10}, 0, )), [] ) def test_find_matching_attributes_generic(self): from munin.provider import GenreTreeProvider from munin.distance import GenreTreeDistance from munin.helper import pairup session = Session('session_find_test', { 'genre': pairup(GenreTreeProvider(), GenreTreeDistance(), 5), 'artist': pairup(None, None, 1) }) session.add({ 'artist': 'Berta', 'genre': 'death metal' }) session.add({ 'artist': 'Hans', 'genre': 'metal' }) session.add({ 'artist': 'Berta', 'genre': 'pop' }) found = list(session.find_matching_attributes({'genre': 'metal'})) self.assertEqual(len(found), 1) self.assertEqual(found[0], session[1]) found = list(session.find_matching_attributes( {'genre': 'metal', 'artist': 'Berta'} )) self.assertEqual(len(found), 0) found = list(session.find_matching_attributes( {'genre': 'metal', 'artist': 'Hans'} )) self.assertEqual(len(found), 1) self.assertEqual(found[0], session[1]) found = list(session.find_matching_attributes( {'genre': 'pop', 'artist': 'Berta'} )) self.assertEqual(len(found), 1) self.assertEqual(found[0], session[2]) found = list(session.find_matching_attributes({'artist': 'Berta'})) self.assertEqual(len(found), 2) self.assertEqual(found[0], session[0]) self.assertEqual(found[1], session[2])
class DatabaseTests(unittest.TestCase): def setUp(self): self._session = Session('session_test', { 'genre': (None, None, 0.2), 'artist': (None, None, 0.3) }) def test_modify(self): from munin.distance.rating import RatingDistance session = Session('session_test_modify', { 'rating': (None, RatingDistance(), 1), }) with session.transaction(): for i in range(0, 6): session.add({'rating': i}) self.assertAlmostEqual( session[5].distance_get(session[0]).distance, 0.5) self.assertAlmostEqual(session[5]['rating'], (5, )) with session.fix_graph(): session.modify(5, {'rating': 0}) self.assertAlmostEqual( session[5].distance_get(session[0]).distance, 0.0) self.assertAlmostEqual(session[5]['rating'], (0, )) def test_basics(self): with self._session.transaction(): N = 20 for i in range(N): self._session.database.add({ 'genre': i / N, 'artist': i / N }) def test_no_match(self): with self.assertRaisesRegex(KeyError, '.*mask.*'): self._session.database.add({'not_in_session': 42}) def test_insert_remove_song(self): songs = [] with self._session.transaction(): for idx, v in enumerate(['l', 'r', 't', 'd']): songs.append( self._session.add({ 'genre': [0], 'artist': [0] })) # self._session.database.plot(250, 250) with self._session.fix_graph(): self._session.insert({'genre': [0], 'artist': [0]}) # self._session.database.plot(250, 250) for song in self._session.database: for other in self._session.database: if self is not other: self.assertAlmostEqual( song.distance_get(other).distance, 0.0) self._session.remove(4) # self._session.database.plot(250, 250) with self._session.fix_graph(): self._session.insert({'genre': [0], 'artist': [0]}) # self._session.database.plot(250, 250) def test_find_matching_attributes_numeric(self): from munin.provider import GenreTreeProvider from munin.distance import GenreTreeDistance from munin.helper import pairup session = Session('session_find_test', { 'x': pairup(None, None, 1), 'y': pairup(None, None, 1) }) a = session[session.add({ 'x': 21, 'y': 42, })] b = session[session.add({ 'x': 0, 'y': 100, })] session[session.add({ 'x': 51, 'y': 50, })] self.assertEqual( list( session.database.find_matching_attributes_numeric( {'x': 10}, 20)), [a, b]) self.assertEqual( list( session.database.find_matching_attributes_numeric( {'y': 100}, 0)), [b]) self.assertEqual( list( session.database.find_matching_attributes_numeric( { 'x': 10, 'y': 40 }, 20)), [a]) self.assertEqual( list( session.database.find_matching_attributes_numeric( { 'x': 10, 'y': 10 }, 0, )), []) def test_find_matching_attributes_generic(self): from munin.provider import GenreTreeProvider from munin.distance import GenreTreeDistance from munin.helper import pairup session = Session( 'session_find_test', { 'genre': pairup(GenreTreeProvider(), GenreTreeDistance(), 5), 'artist': pairup(None, None, 1) }) session.add({'artist': 'Berta', 'genre': 'death metal'}) session.add({'artist': 'Hans', 'genre': 'metal'}) session.add({'artist': 'Berta', 'genre': 'pop'}) found = list(session.find_matching_attributes({'genre': 'metal'})) self.assertEqual(len(found), 1) self.assertEqual(found[0], session[1]) found = list( session.find_matching_attributes({ 'genre': 'metal', 'artist': 'Berta' })) self.assertEqual(len(found), 0) found = list( session.find_matching_attributes({ 'genre': 'metal', 'artist': 'Hans' })) self.assertEqual(len(found), 1) self.assertEqual(found[0], session[1]) found = list( session.find_matching_attributes({ 'genre': 'pop', 'artist': 'Berta' })) self.assertEqual(len(found), 1) self.assertEqual(found[0], session[2]) found = list(session.find_matching_attributes({'artist': 'Berta'})) self.assertEqual(len(found), 2) self.assertEqual(found[0], session[0]) self.assertEqual(found[1], session[2])