summaryrefslogtreecommitdiff
path: root/lib/VNWeb/Tags/Elm.pm
blob: 0f816badb1b9c74a1c0a3151f0183a86e6c8f6cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package VNWeb::Tags::Elm;

use VNWeb::Prelude;

elm_api Tags => undef, { search => {} }, sub {
    my $q = shift->{search};
    my $qs = $q =~ s/[%_]//gr;

    elm_TagResult tuwf->dbPagei({ results => 15, page => 1 },
        'SELECT t.id, t.name, t.searchable, t.applicable, t.state
           FROM (',
             sql_join('UNION ALL',
                 $q =~ /^$RE{gid}$/ ? sql('SELECT 1, id FROM tags WHERE id =', \"$+{id}") : (),
                 sql('SELECT  1+substr_score(lower(name),',  \$qs, '), id  FROM tags         WHERE name  ILIKE', \"%$qs%"),
                 sql('SELECT 10+substr_score(lower(alias),', \$qs, '), tag FROM tags_aliases WHERE alias ILIKE', \"%$qs%"),
             ), ') x (prio, id)
           JOIN tags t ON t.id = x.id
          WHERE t.state <> 1
          GROUP BY t.id, t.name, t.searchable, t.applicable, t.state
          ORDER BY MIN(x.prio), t.name
    ')
};

1;