Skip to content

Commit 4492dbc

Browse files
committed
SEARCH-680: Index genre annotations
1 parent 42cf804 commit 4492dbc

File tree

9 files changed

+128
-12
lines changed

9 files changed

+128
-12
lines changed

sir/schema/__init__.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,24 @@
4040
SearchAnnotation = E(modelext.CustomAnnotation, [
4141
F("id", "id"),
4242
F("entity", ["areas.area.gid", "artists.artist.gid", "events.event.gid",
43-
"instruments.instrument.gid", "labels.label.gid",
44-
"places.place.gid", "recordings.recording.gid",
45-
"releases.release.gid", "release_groups.release_group.gid",
43+
"genres.genre.gid", "instruments.instrument.gid",
44+
"labels.label.gid", "places.place.gid",
45+
"recordings.recording.gid", "releases.release.gid",
46+
"release_groups.release_group.gid",
4647
"series.series.gid", "works.work.gid"]),
4748
F("name", ["areas.area.name", "artists.artist.name", "events.event.name",
48-
"instruments.instrument.name", "labels.label.name",
49-
"places.place.name", "recordings.recording.name",
50-
"releases.release.name", "release_groups.release_group.name",
49+
"genres.genre.name", "instruments.instrument.name",
50+
"labels.label.name", "places.place.name",
51+
"recordings.recording.name", "releases.release.name",
52+
"release_groups.release_group.name",
5153
"series.series.name", "works.work.name"]),
5254
F("text", "text"),
5355
F("type", ["areas.__tablename__", "artists.__tablename__",
54-
"events.__tablename__", "instruments.__tablename__",
55-
"labels.__tablename__", "places.__tablename__",
56-
"recordings.__tablename__", "releases.__tablename__",
57-
"release_groups.__tablename__", "series.__tablename__",
58-
"works.__tablename__"],
56+
"events.__tablename__", "genres.__tablename__",
57+
"instruments.__tablename__", "labels.__tablename__",
58+
"places.__tablename__", "recordings.__tablename__",
59+
"releases.__tablename__", "release_groups.__tablename__",
60+
"series.__tablename__", "works.__tablename__"],
5961
transformfunc=tfs.annotation_type)
6062
],
6163
1.5,

sir/schema/modelext.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class CustomAnnotation(Annotation):
1818
areas = relationship("AreaAnnotation", viewonly=True)
1919
artists = relationship("ArtistAnnotation", viewonly=True)
2020
events = relationship("EventAnnotation", viewonly=True)
21+
genres = relationship("GenreAnnotation", viewonly=True)
2122
instruments = relationship("InstrumentAnnotation", viewonly=True)
2223
labels = relationship("LabelAnnotation", viewonly=True)
2324
places = relationship("PlaceAnnotation", viewonly=True)

sir/schema/queryext.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
# Copyright (c) 2015 Wieland Hoffmann
44
# License: MIT, see LICENSE for details
55
from mbdata.models import (Annotation, AreaAnnotation, ArtistAnnotation,
6-
EventAnnotation, InstrumentAnnotation, LabelAnnotation,
6+
EventAnnotation, GenreAnnotation,
7+
InstrumentAnnotation, LabelAnnotation,
78
PlaceAnnotation, RecordingAnnotation, ReleaseAnnotation,
89
ReleaseGroupAnnotation, SeriesAnnotation, WorkAnnotation)
910
from sqlalchemy import func
@@ -13,6 +14,7 @@
1314
AreaAnnotation,
1415
ArtistAnnotation,
1516
EventAnnotation,
17+
GenreAnnotation,
1618
InstrumentAnnotation,
1719
LabelAnnotation,
1820
PlaceAnnotation,

sir/schema/transformfuncs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"area_annotation": "area",
1010
"artist_annotation": "artist",
1111
"event_annotation": "event",
12+
"genre_annotation": "genre",
1213
"instrument_annotation": "instrument",
1314
"label_annotation": "label",
1415
"place_annotation": "place",

sir/wscompat/convert.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,8 @@ def convert_annotation(obj):
761761
l.append(convert_one_annotation(obj, 'artist', a.artist))
762762
for a in obj.events:
763763
l.append(convert_one_annotation(obj, 'event', a.event))
764+
for a in obj.genres:
765+
l.append(convert_one_annotation(obj, 'genre', a.genre))
764766
for a in obj.instruments:
765767
l.append(convert_one_annotation(obj, 'instrument', a.instrument))
766768
for a in obj.labels:

sql/CreateFunctions.sql

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,78 @@ BEGIN
254254
END;
255255
$$ LANGUAGE plpgsql;
256256

257+
CREATE OR REPLACE FUNCTION search_genre_annotation_insert() RETURNS trigger
258+
AS $$
259+
BEGIN
260+
PERFORM amqp.publish(2, 'search', 'index', (
261+
WITH keys(annotation, genre) AS (SELECT NEW.annotation, NEW.genre)
262+
SELECT jsonb_set(jsonb_set(to_jsonb(keys), '{_table}', '"genre_annotation"'),
263+
'{_operation}', '"insert"')::text FROM keys
264+
));
265+
RETURN NEW;
266+
END;
267+
$$ LANGUAGE plpgsql;
268+
269+
CREATE OR REPLACE FUNCTION search_genre_annotation_update() RETURNS trigger
270+
AS $$
271+
BEGIN
272+
PERFORM amqp.publish(2, 'search', 'update', (
273+
WITH keys(annotation, genre) AS (SELECT NEW.annotation, NEW.genre)
274+
SELECT jsonb_set(jsonb_set(to_jsonb(keys), '{_table}', '"genre_annotation"'),
275+
'{_operation}', '"update"')::text FROM keys
276+
));
277+
RETURN NEW;
278+
END;
279+
$$ LANGUAGE plpgsql;
280+
281+
CREATE OR REPLACE FUNCTION search_genre_annotation_delete() RETURNS trigger
282+
AS $$
283+
BEGIN
284+
PERFORM amqp.publish(2, 'search', 'update', (
285+
WITH keys(annotation, genre) AS (SELECT OLD.annotation, OLD.genre)
286+
SELECT jsonb_set(jsonb_set(to_jsonb(keys), '{_table}', '"genre_annotation"'),
287+
'{_operation}', '"delete"')::text FROM keys
288+
));
289+
RETURN OLD;
290+
END;
291+
$$ LANGUAGE plpgsql;
292+
293+
CREATE OR REPLACE FUNCTION search_genre_insert() RETURNS trigger
294+
AS $$
295+
BEGIN
296+
PERFORM amqp.publish(2, 'search', 'index', (
297+
WITH keys(id) AS (SELECT NEW.id)
298+
SELECT jsonb_set(jsonb_set(to_jsonb(keys), '{_table}', '"genre"'),
299+
'{_operation}', '"insert"')::text FROM keys
300+
));
301+
RETURN NEW;
302+
END;
303+
$$ LANGUAGE plpgsql;
304+
305+
CREATE OR REPLACE FUNCTION search_genre_update() RETURNS trigger
306+
AS $$
307+
BEGIN
308+
PERFORM amqp.publish(2, 'search', 'update', (
309+
WITH keys(id) AS (SELECT NEW.id)
310+
SELECT jsonb_set(jsonb_set(to_jsonb(keys), '{_table}', '"genre"'),
311+
'{_operation}', '"update"')::text FROM keys
312+
));
313+
RETURN NEW;
314+
END;
315+
$$ LANGUAGE plpgsql;
316+
317+
CREATE OR REPLACE FUNCTION search_genre_delete() RETURNS trigger
318+
AS $$
319+
BEGIN
320+
PERFORM amqp.publish(2, 'search', 'update', (
321+
WITH keys(id) AS (SELECT OLD.id)
322+
SELECT jsonb_set(jsonb_set(to_jsonb(keys), '{_table}', '"genre"'),
323+
'{_operation}', '"delete"')::text FROM keys
324+
));
325+
RETURN OLD;
326+
END;
327+
$$ LANGUAGE plpgsql;
328+
257329
CREATE OR REPLACE FUNCTION search_instrument_annotation_insert() RETURNS trigger
258330
AS $$
259331
BEGIN

sql/CreateTriggers.sql

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,28 @@ CREATE TRIGGER search_event_update AFTER UPDATE OF begin_date_day, begin_date_mo
7979
CREATE TRIGGER search_event_delete BEFORE DELETE ON musicbrainz.event
8080
FOR EACH ROW EXECUTE PROCEDURE search_event_delete();
8181

82+
CREATE TRIGGER search_genre_annotation_insert AFTER INSERT ON musicbrainz.genre_annotation
83+
FOR EACH ROW EXECUTE PROCEDURE search_genre_annotation_insert();
84+
85+
CREATE TRIGGER search_genre_annotation_update AFTER UPDATE OF annotation, genre ON musicbrainz.genre_annotation
86+
FOR EACH ROW
87+
WHEN ((OLD.annotation, OLD.genre) IS DISTINCT FROM (NEW.annotation, NEW.genre))
88+
EXECUTE PROCEDURE search_genre_annotation_update();
89+
90+
CREATE TRIGGER search_genre_annotation_delete BEFORE DELETE ON musicbrainz.genre_annotation
91+
FOR EACH ROW EXECUTE PROCEDURE search_genre_annotation_delete();
92+
93+
CREATE TRIGGER search_genre_insert AFTER INSERT ON musicbrainz.genre
94+
FOR EACH ROW EXECUTE PROCEDURE search_genre_insert();
95+
96+
CREATE TRIGGER search_genre_update AFTER UPDATE OF gid, name ON musicbrainz.genre
97+
FOR EACH ROW
98+
WHEN ((OLD.gid, OLD.name) IS DISTINCT FROM (NEW.gid, NEW.name))
99+
EXECUTE PROCEDURE search_genre_update();
100+
101+
CREATE TRIGGER search_genre_delete BEFORE DELETE ON musicbrainz.genre
102+
FOR EACH ROW EXECUTE PROCEDURE search_genre_delete();
103+
82104
CREATE TRIGGER search_instrument_annotation_insert AFTER INSERT ON musicbrainz.instrument_annotation
83105
FOR EACH ROW EXECUTE PROCEDURE search_instrument_annotation_insert();
84106

test/sql/annotation.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,19 @@ INSERT INTO artist (id, gid, name, sort_name) VALUES
2525
(5, 'dc19b13a-5ca5-44f5-8f0e-0c37a8ab1958', 'Annotated Artist A', 'Annotated Artist A'),
2626
(6, 'ca4c2228-227c-4904-932a-dff442c091ea', 'Annotated Artist B', 'Annotated Artist B');
2727

28+
INSERT INTO genre (id, gid, name) VALUES
29+
(1, '1b50083b-1afa-4778-82c8-548b309af783', 'dubstep');
30+
2831
UPDATE artist_meta SET rating=70, rating_count=4 WHERE id=3;
2932

3033
INSERT INTO annotation (id, editor, text) VALUES (1, 1, 'Test annotation 1');
3134
INSERT INTO annotation (id, editor, text) VALUES (2, 1, 'Test annotation 2');
3235
INSERT INTO annotation (id, editor, text) VALUES (3, 1, 'Duplicate annotation');
3336
INSERT INTO annotation (id, editor, text) VALUES (4, 1, 'Duplicate annotation');
37+
INSERT INTO annotation (id, editor, text) VALUES (5, 1, 'Genre annotation');
3438

3539
INSERT INTO artist_annotation (artist, annotation) VALUES (3, 1), (4, 2), (5, 3), (6, 4);
3640

41+
INSERT INTO genre_annotation (genre, annotation) VALUES (1, 5);
42+
3743
INSERT INTO artist_gid_redirect VALUES ('a4ef1d08-962e-4dd6-ae14-e42a6a97fc11', 3);

test/test_indexing_real_data.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,14 @@ def test_index_cdstub(self):
670670

671671
def test_index_annotation(self):
672672
expected = [
673+
{
674+
'_store': '<ns0:annotation xmlns:ns0="http://musicbrainz.org/ns/mmd-2.0#" type="genre"><ns0:entity>1b50083b-1afa-4778-82c8-548b309af783</ns0:entity><ns0:name>dubstep</ns0:name><ns0:text>Genre annotation</ns0:text></ns0:annotation>',
675+
'name': u'dubstep',
676+
'text': u'Genre annotation',
677+
'entity': '1b50083b-1afa-4778-82c8-548b309af783',
678+
'type': 'genre',
679+
'id': 1
680+
},
673681
{
674682
'_store': '<ns0:annotation xmlns:ns0="http://musicbrainz.org/ns/mmd-2.0#" type="artist"><ns0:entity>745c079d-374e-4436-9448-da92dedef3ce</ns0:entity><ns0:name>Test Artist</ns0:name><ns0:text>Test annotation 1</ns0:text></ns0:annotation>',
675683
'name': u'Test Artist',

0 commit comments

Comments
 (0)