Skip to content

Commit 312400d

Browse files
authored
Merge pull request metabrainz#2005 from reosarevok/MBS-11451
MBS-11451: Support ratings for places
2 parents f5b7c27 + 3c169a0 commit 312400d

36 files changed

+232
-5
lines changed

admin/sql/CreateFKConstraints.sql

+16
Original file line numberDiff line numberDiff line change
@@ -2616,6 +2616,22 @@ ALTER TABLE place_gid_redirect
26162616
FOREIGN KEY (new_id)
26172617
REFERENCES place(id);
26182618

2619+
ALTER TABLE place_meta
2620+
ADD CONSTRAINT place_meta_fk_id
2621+
FOREIGN KEY (id)
2622+
REFERENCES place(id)
2623+
ON DELETE CASCADE;
2624+
2625+
ALTER TABLE place_rating_raw
2626+
ADD CONSTRAINT place_rating_raw_fk_place
2627+
FOREIGN KEY (place)
2628+
REFERENCES place(id);
2629+
2630+
ALTER TABLE place_rating_raw
2631+
ADD CONSTRAINT place_rating_raw_fk_editor
2632+
FOREIGN KEY (editor)
2633+
REFERENCES editor(id);
2634+
26192635
ALTER TABLE place_tag
26202636
ADD CONSTRAINT place_tag_fk_place
26212637
FOREIGN KEY (place)

admin/sql/CreateFunctions.sql

+8
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,14 @@ $$ LANGUAGE 'plpgsql';
346346
-- place triggers
347347
-----------------------------------------------------------------------
348348

349+
CREATE OR REPLACE FUNCTION a_ins_place() RETURNS trigger AS $$
350+
BEGIN
351+
-- add a new entry to the place_meta table
352+
INSERT INTO place_meta (id) VALUES (NEW.id);
353+
RETURN NULL;
354+
END;
355+
$$ LANGUAGE 'plpgsql';
356+
349357
-- Ensure attribute type allows free text if free text is added
350358
CREATE OR REPLACE FUNCTION ensure_place_attribute_type_allows_text()
351359
RETURNS trigger AS $$

admin/sql/CreateIndexes.sql

+2
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,8 @@ CREATE UNIQUE INDEX place_attribute_type_allowed_value_idx_gid ON place_attribut
453453

454454
CREATE UNIQUE INDEX place_alias_type_idx_gid ON place_alias_type (gid);
455455

456+
CREATE INDEX place_rating_raw_idx_editor ON place_rating_raw (editor);
457+
456458
CREATE INDEX place_tag_idx_tag ON place_tag (tag);
457459

458460
CREATE INDEX place_tag_raw_idx_tag ON place_tag_raw (tag);

admin/sql/CreatePrimaryKeys.sql

+2
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ ALTER TABLE place_attribute ADD CONSTRAINT place_attribute_pkey PRIMARY KEY (id)
242242
ALTER TABLE place_attribute_type ADD CONSTRAINT place_attribute_type_pkey PRIMARY KEY (id);
243243
ALTER TABLE place_attribute_type_allowed_value ADD CONSTRAINT place_attribute_type_allowed_value_pkey PRIMARY KEY (id);
244244
ALTER TABLE place_gid_redirect ADD CONSTRAINT place_gid_redirect_pkey PRIMARY KEY (gid);
245+
ALTER TABLE place_meta ADD CONSTRAINT place_meta_pkey PRIMARY KEY (id);
246+
ALTER TABLE place_rating_raw ADD CONSTRAINT place_rating_raw_pkey PRIMARY KEY (place, editor);
245247
ALTER TABLE place_tag ADD CONSTRAINT place_tag_pkey PRIMARY KEY (place, tag);
246248
ALTER TABLE place_tag_raw ADD CONSTRAINT place_tag_raw_pkey PRIMARY KEY (place, editor, tag);
247249
ALTER TABLE place_type ADD CONSTRAINT place_type_pkey PRIMARY KEY (id);

admin/sql/CreateReplicationTriggers.sql

+4
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,10 @@ CREATE TRIGGER "reptg_place_gid_redirect"
735735
AFTER INSERT OR DELETE OR UPDATE ON "place_gid_redirect"
736736
FOR EACH ROW EXECUTE PROCEDURE "recordchange" ('verbose');
737737

738+
CREATE TRIGGER "reptg_place_meta"
739+
AFTER INSERT OR DELETE OR UPDATE ON "place_meta"
740+
FOR EACH ROW EXECUTE PROCEDURE "recordchange" ();
741+
738742
CREATE TRIGGER "reptg_place_tag"
739743
AFTER INSERT OR DELETE OR UPDATE ON "place_tag"
740744
FOR EACH ROW EXECUTE PROCEDURE "recordchange" ('verbose');

admin/sql/CreateTables.sql

+13
Original file line numberDiff line numberDiff line change
@@ -2655,6 +2655,19 @@ CREATE TABLE place_gid_redirect ( -- replicate (verbose)
26552655
created TIMESTAMP WITH TIME ZONE DEFAULT NOW()
26562656
);
26572657

2658+
CREATE TABLE place_meta ( -- replicate
2659+
id INTEGER NOT NULL, -- PK, references place.id CASCADE
2660+
rating SMALLINT CHECK (rating >= 0 AND rating <= 100),
2661+
rating_count INTEGER
2662+
);
2663+
2664+
CREATE TABLE place_rating_raw
2665+
(
2666+
place INTEGER NOT NULL, -- PK, references place.id
2667+
editor INTEGER NOT NULL, -- PK, references editor.id
2668+
rating SMALLINT NOT NULL CHECK (rating >= 0 AND rating <= 100)
2669+
);
2670+
26582671
CREATE TABLE place_tag ( -- replicate (verbose)
26592672
place INTEGER NOT NULL, -- PK, references place.id
26602673
tag INTEGER NOT NULL, -- PK, references tag.id

admin/sql/CreateTriggers.sql

+3
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ CREATE TRIGGER b_upd_medium BEFORE UPDATE ON medium
373373
CREATE TRIGGER b_upd_medium_cdtoc BEFORE UPDATE ON medium_cdtoc
374374
FOR EACH ROW EXECUTE PROCEDURE b_upd_last_updated_table();
375375

376+
CREATE TRIGGER a_ins_place AFTER INSERT ON place
377+
FOR EACH ROW EXECUTE PROCEDURE a_ins_place();
378+
376379
CREATE TRIGGER b_upd_place BEFORE UPDATE ON place
377380
FOR EACH ROW EXECUTE PROCEDURE b_upd_last_updated_table();
378381

admin/sql/DropFKConstraints.sql

+3
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,9 @@ ALTER TABLE place_attribute_type DROP CONSTRAINT IF EXISTS place_attribute_type_
519519
ALTER TABLE place_attribute_type_allowed_value DROP CONSTRAINT IF EXISTS place_attribute_type_allowed_value_fk_place_attribute_type;
520520
ALTER TABLE place_attribute_type_allowed_value DROP CONSTRAINT IF EXISTS place_attribute_type_allowed_value_fk_parent;
521521
ALTER TABLE place_gid_redirect DROP CONSTRAINT IF EXISTS place_gid_redirect_fk_new_id;
522+
ALTER TABLE place_meta DROP CONSTRAINT IF EXISTS place_meta_fk_id;
523+
ALTER TABLE place_rating_raw DROP CONSTRAINT IF EXISTS place_rating_raw_fk_place;
524+
ALTER TABLE place_rating_raw DROP CONSTRAINT IF EXISTS place_rating_raw_fk_editor;
522525
ALTER TABLE place_tag DROP CONSTRAINT IF EXISTS place_tag_fk_place;
523526
ALTER TABLE place_tag DROP CONSTRAINT IF EXISTS place_tag_fk_tag;
524527
ALTER TABLE place_tag_raw DROP CONSTRAINT IF EXISTS place_tag_raw_fk_place;

admin/sql/DropFunctions.sql

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ DROP FUNCTION a_ins_editor();
1818
DROP FUNCTION a_ins_event();
1919
DROP FUNCTION a_ins_instrument();
2020
DROP FUNCTION a_ins_label();
21+
DROP FUNCTION a_ins_place();
2122
DROP FUNCTION a_ins_recording();
2223
DROP FUNCTION a_ins_release();
2324
DROP FUNCTION a_ins_release_event();

admin/sql/DropIndexes.sql

+1
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ DROP INDEX place_idx_geo;
352352
DROP INDEX place_idx_gid;
353353
DROP INDEX place_idx_lower_unaccent_name_comment;
354354
DROP INDEX place_idx_name;
355+
DROP INDEX place_rating_raw_idx_editor;
355356
DROP INDEX place_tag_idx_tag;
356357
DROP INDEX place_tag_raw_idx_editor;
357358
DROP INDEX place_tag_raw_idx_tag;

admin/sql/DropPrimaryKeys.sql

+2
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ ALTER TABLE place_attribute DROP CONSTRAINT IF EXISTS place_attribute_pkey;
242242
ALTER TABLE place_attribute_type DROP CONSTRAINT IF EXISTS place_attribute_type_pkey;
243243
ALTER TABLE place_attribute_type_allowed_value DROP CONSTRAINT IF EXISTS place_attribute_type_allowed_value_pkey;
244244
ALTER TABLE place_gid_redirect DROP CONSTRAINT IF EXISTS place_gid_redirect_pkey;
245+
ALTER TABLE place_meta DROP CONSTRAINT IF EXISTS place_meta_pkey;
246+
ALTER TABLE place_rating_raw DROP CONSTRAINT IF EXISTS place_rating_raw_pkey;
245247
ALTER TABLE place_tag DROP CONSTRAINT IF EXISTS place_tag_pkey;
246248
ALTER TABLE place_tag_raw DROP CONSTRAINT IF EXISTS place_tag_raw_pkey;
247249
ALTER TABLE place_type DROP CONSTRAINT IF EXISTS place_type_pkey;

admin/sql/DropReplicationTriggers.sql

+1
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ DROP TRIGGER reptg_place_attribute ON place_attribute;
184184
DROP TRIGGER reptg_place_attribute_type ON place_attribute_type;
185185
DROP TRIGGER reptg_place_attribute_type_allowed_value ON place_attribute_type_allowed_value;
186186
DROP TRIGGER reptg_place_gid_redirect ON place_gid_redirect;
187+
DROP TRIGGER reptg_place_meta ON place_meta;
187188
DROP TRIGGER reptg_place_tag ON place_tag;
188189
DROP TRIGGER reptg_place_type ON place_type;
189190
DROP TRIGGER reptg_recording ON recording;

admin/sql/DropTables.sql

+2
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ DROP TABLE place_attribute;
243243
DROP TABLE place_attribute_type;
244244
DROP TABLE place_attribute_type_allowed_value;
245245
DROP TABLE place_gid_redirect;
246+
DROP TABLE place_meta;
247+
DROP TABLE place_rating_raw;
246248
DROP TABLE place_tag;
247249
DROP TABLE place_tag_raw;
248250
DROP TABLE place_type;

admin/sql/DropTriggers.sql

+1
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ DROP TRIGGER b_upd_link_type ON link_type;
125125
DROP TRIGGER b_upd_link_type_attribute_type ON link_type_attribute_type;
126126
DROP TRIGGER b_upd_medium ON medium;
127127
DROP TRIGGER b_upd_medium_cdtoc ON medium_cdtoc;
128+
DROP TRIGGER a_ins_place ON place;
128129
DROP TRIGGER b_upd_place ON place;
129130
DROP TRIGGER end_date_implies_ended ON place;
130131
DROP TRIGGER end_date_implies_ended ON place_alias;

admin/sql/TruncateTables.sql

+2
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ TRUNCATE TABLE place_attribute RESTART IDENTITY CASCADE;
243243
TRUNCATE TABLE place_attribute_type RESTART IDENTITY CASCADE;
244244
TRUNCATE TABLE place_attribute_type_allowed_value RESTART IDENTITY CASCADE;
245245
TRUNCATE TABLE place_gid_redirect RESTART IDENTITY CASCADE;
246+
TRUNCATE TABLE place_meta RESTART IDENTITY CASCADE;
247+
TRUNCATE TABLE place_rating_raw RESTART IDENTITY CASCADE;
246248
TRUNCATE TABLE place_tag RESTART IDENTITY CASCADE;
247249
TRUNCATE TABLE place_tag_raw RESTART IDENTITY CASCADE;
248250
TRUNCATE TABLE place_type RESTART IDENTITY CASCADE;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
\set ON_ERROR_STOP 1
2+
BEGIN;
3+
4+
DROP TRIGGER IF EXISTS a_ins_place ON place;
5+
6+
CREATE TRIGGER a_ins_place AFTER INSERT ON place
7+
FOR EACH ROW EXECUTE PROCEDURE a_ins_place();
8+
9+
COMMIT;
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
\set ON_ERROR_STOP 1
2+
BEGIN;
3+
4+
CREATE TABLE place_meta ( -- replicate
5+
id INTEGER NOT NULL, -- PK, references place.id CASCADE
6+
rating SMALLINT CHECK (rating >= 0 AND rating <= 100),
7+
rating_count INTEGER
8+
);
9+
10+
CREATE TABLE place_rating_raw
11+
(
12+
place INTEGER NOT NULL, -- PK, references place.id
13+
editor INTEGER NOT NULL, -- PK, references editor.id
14+
rating SMALLINT NOT NULL CHECK (rating >= 0 AND rating <= 100)
15+
);
16+
17+
ALTER TABLE place_meta ADD CONSTRAINT place_meta_pkey PRIMARY KEY (id);
18+
ALTER TABLE place_rating_raw ADD CONSTRAINT place_rating_raw_pkey PRIMARY KEY (place, editor);
19+
20+
CREATE OR REPLACE FUNCTION a_ins_place() RETURNS trigger AS $$
21+
BEGIN
22+
INSERT INTO place_meta (id) VALUES (NEW.id);
23+
RETURN NULL;
24+
END;
25+
$$ LANGUAGE 'plpgsql';
26+
27+
INSERT INTO place_meta (id)
28+
(SELECT id FROM place);
29+
30+
CREATE INDEX place_rating_raw_idx_editor ON place_rating_raw (editor);
31+
32+
COMMIT;

admin/sql/updates/schema-change/26.slave.sql

+32
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
-- 20201028-mbs-1424.sql
55
-- 20210215-mbs-11268.sql
66
-- 20210309-mbs-11431.sql
7+
-- 20210319-mbs-11451.sql
78
-- 20210319-mbs-11453.sql
89
-- 20210319-mbs-11464.sql
910
-- 20210319-mbs-11466.sql
@@ -386,6 +387,37 @@ CREATE INDEX IF NOT EXISTS series_alias_idx_lower_unaccent_name ON series_alias
386387
DROP INDEX IF EXISTS artist_idx_lower_name;
387388
DROP INDEX IF EXISTS label_idx_lower_name;
388389

390+
--------------------------------------------------------------------------------
391+
SELECT '20210319-mbs-11451.sql';
392+
393+
CREATE TABLE place_meta ( -- replicate
394+
id INTEGER NOT NULL, -- PK, references place.id CASCADE
395+
rating SMALLINT CHECK (rating >= 0 AND rating <= 100),
396+
rating_count INTEGER
397+
);
398+
399+
CREATE TABLE place_rating_raw
400+
(
401+
place INTEGER NOT NULL, -- PK, references place.id
402+
editor INTEGER NOT NULL, -- PK, references editor.id
403+
rating SMALLINT NOT NULL CHECK (rating >= 0 AND rating <= 100)
404+
);
405+
406+
ALTER TABLE place_meta ADD CONSTRAINT place_meta_pkey PRIMARY KEY (id);
407+
ALTER TABLE place_rating_raw ADD CONSTRAINT place_rating_raw_pkey PRIMARY KEY (place, editor);
408+
409+
CREATE OR REPLACE FUNCTION a_ins_place() RETURNS trigger AS $$
410+
BEGIN
411+
INSERT INTO place_meta (id) VALUES (NEW.id);
412+
RETURN NULL;
413+
END;
414+
$$ LANGUAGE 'plpgsql';
415+
416+
INSERT INTO place_meta (id)
417+
(SELECT id FROM place);
418+
419+
CREATE INDEX place_rating_raw_idx_editor ON place_rating_raw (editor);
420+
389421
--------------------------------------------------------------------------------
390422
SELECT '20210319-mbs-11453.sql';
391423

admin/sql/updates/schema-change/26.standalone.sql

+9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
-- Generated by CompileSchemaScripts.pl from:
22
-- 20201028-mbs-1424-fks.sql
33
-- 20210319-mbs-10647.sql
4+
-- 20210319-mbs-11451-standalone.sql
45
\set ON_ERROR_STOP 1
56
BEGIN;
67
SET search_path = musicbrainz, public;
@@ -29,4 +30,12 @@ DROP TRIGGER IF EXISTS b_del_label_special ON label;
2930
CREATE TRIGGER b_del_label_special BEFORE DELETE ON label
3031
FOR EACH ROW WHEN (OLD.id IN (1, 3267)) EXECUTE PROCEDURE deny_special_purpose_deletion();
3132

33+
--------------------------------------------------------------------------------
34+
SELECT '20210319-mbs-11451-standalone.sql';
35+
36+
DROP TRIGGER IF EXISTS a_ins_place ON place;
37+
38+
CREATE TRIGGER a_ins_place AFTER INSERT ON place
39+
FOR EACH ROW EXECUTE PROCEDURE a_ins_place();
40+
3241
COMMIT;

entities.json

+1
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@
430430
"model": "Place",
431431
"plural": "places",
432432
"plural_url": "places",
433+
"ratings": true,
433434
"removal": {
434435
"automatic": {}
435436
},

lib/MusicBrainz/Server/Constants.pm

+2
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,7 @@ Readonly our @DERIVED_TABLE_LIST => qw(
700700
label_tag
701701
medium_index
702702
place_annotation
703+
place_meta
703704
place_tag
704705
recording_annotation
705706
recording_meta
@@ -787,6 +788,7 @@ Readonly our @PRIVATE_TABLE_LIST => qw(
787788
label_rating_raw
788789
label_tag_raw
789790
old_editor_name
791+
place_rating_raw
790792
place_tag_raw
791793
recording_rating_raw
792794
recording_tag_raw

lib/MusicBrainz/Server/Controller/Area.pm

+2
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ sub places : Chained('load')
249249
$c->model('PlaceType')->load(@$places);
250250
$c->model('Area')->load(@$places);
251251
$c->model('Area')->load_containment(map { $_->area } @$places);
252+
$c->model('Place')->load_meta(@$places);
253+
$c->model('Place')->rating->load_user_ratings($c->user->id, @$places) if $c->user_exists;
252254

253255
my %props = (
254256
area => $c->stash->{area}->TO_JSON,

lib/MusicBrainz/Server/Controller/Place.pm

+11-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ with 'MusicBrainz::Server::Controller::Role::Alias';
2020
with 'MusicBrainz::Server::Controller::Role::Cleanup';
2121
with 'MusicBrainz::Server::Controller::Role::Details';
2222
with 'MusicBrainz::Server::Controller::Role::EditListing';
23+
with 'MusicBrainz::Server::Controller::Role::Rating';
2324
with 'MusicBrainz::Server::Controller::Role::Tag';
2425
with 'MusicBrainz::Server::Controller::Role::WikipediaExtract';
2526
with 'MusicBrainz::Server::Controller::Role::CommonsImage';
@@ -74,6 +75,15 @@ after 'load' => sub {
7475
my ($self, $c) = @_;
7576

7677
my $place = $c->stash->{place};
78+
my $returning_jsonld = $self->should_return_jsonld($c);
79+
80+
unless ($returning_jsonld) {
81+
$c->model('Place')->load_meta($place);
82+
83+
if ($c->user_exists) {
84+
$c->model('Place')->rating->load_user_ratings($c->user->id, $place);
85+
}
86+
}
7787

7888
$c->model('PlaceType')->load($place);
7989
$c->model('Area')->load($place);
@@ -178,7 +188,7 @@ sub map : Chained('load') {
178188

179189
}
180190

181-
after [qw( show collections details tags aliases events performances map )] => sub {
191+
after [qw( show collections details tags ratings aliases events performances map )] => sub {
182192
my ($self, $c) = @_;
183193
$self->_stash_collections($c);
184194
};

lib/MusicBrainz/Server/Controller/WS/2/Place.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ my $ws_defs = Data::OptList::mkopt([
1616
method => 'GET',
1717
linked => [ qw(area collection) ],
1818
inc => [ qw(aliases annotation
19-
_relations tags user-tags genres user-genres) ],
19+
_relations tags user-tags genres user-genres ratings user-ratings) ],
2020
optional => [ qw(fmt limit offset) ],
2121
},
2222
place => {
2323
action => '/ws/2/place/lookup',
2424
method => 'GET',
2525
inc => [ qw(aliases annotation
26-
_relations tags user-tags genres user-genres) ],
26+
_relations tags user-tags genres user-genres ratings user-ratings) ],
2727
optional => [ qw(fmt) ],
2828
}
2929
]);

lib/MusicBrainz/Server/Data/Place.pm

+13
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ with 'MusicBrainz::Server::Data::Role::Alias' => { type => 'place' };
2828
with 'MusicBrainz::Server::Data::Role::CoreEntityCache';
2929
with 'MusicBrainz::Server::Data::Role::DeleteAndLog' => { type => 'place' };
3030
with 'MusicBrainz::Server::Data::Role::Editable' => { table => 'place' };
31+
with 'MusicBrainz::Server::Data::Role::Rating' => { type => 'place' };
3132
with 'MusicBrainz::Server::Data::Role::Tag' => { type => 'place' };
3233
with 'MusicBrainz::Server::Data::Role::LinksToEdit' => { table => 'place' };
3334
with 'MusicBrainz::Server::Data::Role::Merge';
@@ -100,6 +101,7 @@ sub delete
100101
$self->c->model('Relationship')->delete_entities('place', @place_ids);
101102
$self->annotation->delete(@place_ids);
102103
$self->alias->delete_entities(@place_ids);
104+
$self->rating->delete(@place_ids);
103105
$self->tags->delete(@place_ids);
104106
$self->remove_gid_redirects(@place_ids);
105107
$self->delete_returning_gids(@place_ids);
@@ -112,6 +114,7 @@ sub _merge_impl
112114

113115
$self->alias->merge($new_id, @old_ids);
114116
$self->tags->merge($new_id, @old_ids);
117+
$self->rating->merge($new_id, @old_ids);
115118
$self->annotation->merge($new_id, @old_ids);
116119
$self->c->model('Edit')->merge_entities('place', $new_id, @old_ids);
117120
$self->c->model('Collection')->merge_entities('place', $new_id, @old_ids);
@@ -149,6 +152,16 @@ sub _hash_to_row
149152
return $row;
150153
}
151154

155+
sub load_meta
156+
{
157+
my $self = shift;
158+
MusicBrainz::Server::Data::Utils::load_meta($self->c, "place_meta", sub {
159+
my ($obj, $row) = @_;
160+
$obj->rating($row->{rating}) if defined $row->{rating};
161+
$obj->rating_count($row->{rating_count}) if defined $row->{rating_count};
162+
}, @_);
163+
}
164+
152165
sub is_empty {
153166
my ($self, $place_id) = @_;
154167

0 commit comments

Comments
 (0)