summaryrefslogtreecommitdiff
path: root/lib/VNWeb/VN/Elm.pm
blob: 3aded8e2bcac0e745db1668b55a97a9449877b08 (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
25
26
27
28
29
30
31
32
33
package VNWeb::VN::Elm;

use VNWeb::Prelude;

elm_api VN => undef, {
    search => { type => 'array', values => { required => 0, default => '' } },
    hidden => { anybool => 1 },
}, sub {
    my($data) = @_;
    my @q = grep length $_, $data->{search}->@*;
    die "No query" if !@q;

    elm_VNResult tuwf->dbPagei({ results => $data->{hidden}?50:15, page => 1 },
        'SELECT v.id, v.title, v.original, v.hidden
           FROM (',
			sql_join('UNION ALL', map {
                my $qs = s/[%_]//gr;
                my @qs = normalize_query $_;
                (
                    /^$RE{vid}$/ ? sql('SELECT 1, id FROM vn WHERE id =', \"$+{id}") : (),
                    sql('SELECT 1+substr_score(lower(title),', \$qs, '), id FROM vn WHERE title ILIKE', \"$qs%"),
                    @qs ? (sql 'SELECT 10, id FROM vn WHERE', sql_and map sql('c_search ILIKE', \"%$_%"), @qs) : ()
                )
            } @q),
            ') x(prio, id)
           JOIN vn v ON v.id = x.id
          WHERE', sql_and($data->{hidden} ? () : 'NOT v.hidden'), '
          GROUP BY v.id, v.title, v.original, v.hidden
          ORDER BY MIN(x.prio), v.title
    ');
};

1;