summaryrefslogtreecommitdiff
path: root/lib/VNWeb/Producers/Elm.pm
blob: a41f831c22482386cfe07e0681fd829fbce56b12 (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::Producers::Elm;

use VNWeb::Prelude;

elm_api Producers => 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_ProducerResult tuwf->dbPagei({ results => 15, page => 1 },
        'SELECT p.id, p.name, p.original, p.hidden
           FROM (',
			sql_join('UNION ALL', map {
                my $qs = s/[%_]//gr;
                (
                    /^$RE{pid}$/ ? sql('SELECT 1, id FROM producers WHERE id =', \"$+{id}") : (),
                    sql('SELECT  1+substr_score(lower(name),'    , \$qs, '), id FROM producers WHERE name     ILIKE', \"%$qs%"),
                    sql('SELECT 10+substr_score(lower(original),', \$qs, "), id FROM producers WHERE translate(original,' ','') ILIKE", \("%$qs%" =~ s/ //gr)),
                    sql('SELECT 100, id FROM producers WHERE alias ILIKE', \"%$qs%"),
                )
            } @q),
            ') x(prio, id)
           JOIN producers p ON p.id = x.id
          WHERE', sql_and($data->{hidden} ? () : 'NOT p.hidden'), '
          GROUP BY p.id, p.name, p.original, p.hidden
          ORDER BY MIN(x.prio), p.name
    ');
};

1;