summaryrefslogtreecommitdiff
path: root/util/updates/2021-01-21-update-saved-queries.pl
blob: f93d4643659f0ce7d6e21a7533b9df1ad08580c5 (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/perl

# This script checks and updates all queries in the saved_queries table.

use v5.24;
use warnings;
use Cwd 'abs_path';
use TUWF;

my $ROOT;
BEGIN { ($ROOT = abs_path $0) =~ s{/util/saved-queries\.pl$}{}; }

use lib $ROOT.'/lib';
use VNDB::Config;

TUWF::set %{ config->{tuwf} };

require VNWeb::AdvSearch;


my($total, $updated, $err) = (0,0,0);

for my $r (tuwf->dbAlli('SELECT uid, qtype, name, query FROM saved_queries')->@*) {
    $total++;
    my $q = eval { tuwf->compile({advsearch => $r->{qtype}})->validate($r->{query})->data };
    if(!$q) {
        $err++;
        warn "Invalid query: $r->{uid}, $r->{qtype}, \"$r->{name}\": $r->{query}\n";
        next;
    }

    # The old filter->advsearch conversion had a bug that caused length filters to get AND'ed together, which doesn't make sense.
    if($r->{qtype} eq 'v' && !$r->{name} && $q->{query}[0] eq 'and') {
        my @lengths = grep ref $_ && $_->[0] eq 'length', $q->{query}->@*;
        $q->{query} = [ grep(!ref $_ || $_->[0] ne 'length', $q->{query}->@*), [ 'or', @lengths ] ] if @lengths > 1;
        warn "Converted 'AND length' to 'OR length' for $r->{uid}\n" if @lengths > 1;
    }

    # "Unlabeled && !Unlabeled" used to mean "on my list" and was what the old filter conversions used.
    # That meaning has changed and we now have a better on-list filter.
    if($r->{qtype} eq 'v' && $q->{query}[0] eq 'and') {
        my sub isonlist {
            my $q = $_;
            ref $q && $q->[0] eq 'or' && @$q == 3
                && $q->[1][0] eq 'label' && $q->[1][1] eq  '=' && ref $q->[1][2] && $q->[1][2][0] eq $r->{uid} && $q->[1][2][1] eq 0
                && $q->[2][0] eq 'label' && $q->[2][1] eq '!=' && ref $q->[2][2] && $q->[2][2][0] eq $r->{uid} && $q->[2][2][1] eq 0
        }
        my $e=0;
        $q->{query} = [ map isonlist($_) ? do { $e=1; [ 'on-list', '=', 1 ] } : $_, $q->{query}->@* ];
        warn "Converted Unlabaled hack to on-list for $r->{uid}\n" if $e;
    }

    my $qs = $q->query_encode;
    if(!$qs) {
        warn "Empty query: $r->{uid}, $r->{qtype}, \"$r->{name}\": $r->{query}\n";
        next;
    }
    if($qs ne $r->{query}) {
        $updated++;
        tuwf->dbExeci('UPDATE saved_queries SET query =', \$qs, 'WHERE', { uid => $r->{uid}, qtype => $r->{qtype}, name => $r->{name} });
    }
}

tuwf->dbCommit;

printf "Updated %d/%d saved queries, %d errors.\n", $updated, $total, $err;