summaryrefslogtreecommitdiff
path: root/lib/VNWeb/Discussions/Elm.pm
blob: 77944926990ac163c9210201d4475888170b4379 (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
34
35
36
37
38
39
40
41
42
43
44
45
package VNWeb::Discussions::Elm;

use VNWeb::Prelude;
use VNWeb::Discussions::Lib;

# Autocompletion search results for boards
elm_api Boards => undef, {
    search => {},
}, sub {
    return elm_Unauth if !auth->permBoard;
    my $q = shift->{search};
    my $qs = $q =~ s/[%_]//gr;

    my sub subq {
        my($prio, $where) = @_;
        sql 'SELECT', $prio, ' AS prio, btype, iid, CASE WHEN iid = 0 THEN NULL ELSE title END AS title
           FROM (',
              sql_join('UNION ALL',
                sql('SELECT btype, iid, title, original FROM', sql_boards(), 'a'),
                map sql('SELECT', \$_, '::board_type, 0,', \$BOARD_TYPE{$_}{txt}, q{, ''}),
                grep !$BOARD_TYPE{$_}{dbitem} && ($BOARD_TYPE{$_}{post_perm} eq 'board' || auth->permBoardmod),
                keys %BOARD_TYPE
              ),
           ') x WHERE', $where
    }

    # This query is SLOW :(
    elm_BoardResult tuwf->dbPagei({ results => 10, page => 1 },
        'SELECT btype, iid, title
           FROM (',
             sql_join('UNION ALL',
                 # ID match
                 $q =~ /^($BOARD_RE)$/ && $q =~ /^([a-z]+)([0-9]*)$/
                    ? subq(0, sql_and sql('btype =', \"$1"), $2 ? sql('iid =', \"$2") : ()) : (),
                 subq(
                     sql('1+LEAST(substr_score(lower(title),', \$qs, '), substr_score(lower(original),', \$qs, '))'),
                     sql('title ILIKE', \"%$qs%", ' OR original ILIKE', \"%$qs%")
                 )
             ), ') x
           GROUP BY btype, iid, title
           ORDER BY MIN(prio), btype, iid'
    )
};

1;