OSDN Git Service

* Model::Tags: add is_reserved_name() and select_for_items()
authorhylom <hylom@users.sourceforge.jp>
Thu, 28 Sep 2017 10:05:25 +0000 (19:05 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 28 Sep 2017 10:05:25 +0000 (19:05 +0900)
src/newslash_web/lib/Newslash/Model/Tags.pm

index a21c8a6..a6f8b91 100644 (file)
@@ -1,7 +1,77 @@
 package Newslash::Model::Tags;
 #use Newslash::Model::Base -base;
 use base Newslash::Model::LegacyDB;
+use Data::Dumper;
+use List::Util;
+
+use constant RESERVED_TAG_NAMES => [qw(metanix
+                                       metanod
+                                       nix
+                                       nod
+                                       poll
+                                       おもしろおかしい
+                                       すばらしい洞察
+                                       オフトピック
+                                       フレームのもと
+                                       不当プラスモデ
+                                       不当マイナスモデ
+                                       余計なもの
+                                       参考になる
+                                       既出
+                                       興味深い
+                                       荒し
+                                       荒らし
+                                       story
+                                       journal
+                                       comment
+                                       submission
+                                     )];
+
+sub is_reserved_name {
+    my ($self, $tag_name) = @_;
+    return any { $tag_name eq $_ } RESERVED_TAG_NAMES;
+}
+
+sub select_for_items {
+    my ($self, $type, $primary_key, $items) = @_;
+    return if !$items;
+
+    if (ref($items) ne "ARRAY") {
+        $items = [$items];
+    }
+    return if !@$items;
+
+    my @target_ids = map { $_->{$primary_key} } @$items;
+    my @placeholders = map { "?" } @target_ids;
+    my $placeholder = join(", ", @placeholders);
+
+    my $globjs = $self->new_instance_of("Globjs");
+    my $gtid = $globjs->get_gtid($type);
+    return if !$gtid;
+
+    my $sql = <<"EOSQL";
+SELECT * FROM globjs
+  JOIN tags ON globjs.globjid = tags.globjid
+  JOIN tagnames ON tags.tagnameid = tagnames.tagnameid
+  WHERE globjs.gtid = ? AND globjs.target_id IN ($placeholder)
+EOSQL
 
+    my $dbh = $self->connect_db;
+    my $sth = $dbh->prepare($sql);
+    $sth->execute($gtid, @target_ids);
+    my $rs = $sth->fetchall_arrayref({});
+    $self->disconnect_db;
+
+    return if !$rs;
+
+    my $tags_of = {};
+    for my $tag (@$rs) {
+        my $id = $tag->{target_id};
+        $tags_of->{$id} = [] if !$tags_of->{$id};
+        push @{$tags_of->{$id}}, $tag;
+    }
+    return $tags_of;
+}
 
 sub get_topics {
     my ($self, ) = @_;