Esempio n. 1
0
    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])
Esempio n. 2
0
    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])