diff options
author | Yorhel <git@yorhel.nl> | 2021-01-09 16:44:13 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2021-01-09 16:44:13 +0100 |
commit | 5d275ce2ceb1112c1e02bbe9134b22ac478975fc (patch) | |
tree | 11d3fb560bee52af8f4ab7c2cac73bce6f04799c | |
parent | 1ec958ba9d2e40c65246bd29f28b2b50364b2a5a (diff) |
AdvSearch: Apply new saved default queries to listings instead of old filters
-rw-r--r-- | lib/VNWeb/AdvSearch.pm | 14 | ||||
-rw-r--r-- | lib/VNWeb/Misc/HomePage.pm | 25 | ||||
-rw-r--r-- | lib/VNWeb/Misc/Redirects.pm | 8 | ||||
-rw-r--r-- | lib/VNWeb/Releases/List.pm | 5 | ||||
-rw-r--r-- | lib/VNWeb/TT/TagPage.pm | 5 | ||||
-rw-r--r-- | lib/VNWeb/VN/List.pm | 5 |
6 files changed, 36 insertions, 26 deletions
diff --git a/lib/VNWeb/AdvSearch.pm b/lib/VNWeb/AdvSearch.pm index 9637670a..66b45172 100644 --- a/lib/VNWeb/AdvSearch.pm +++ b/lib/VNWeb/AdvSearch.pm @@ -20,6 +20,9 @@ use VNWeb::DB; use VNWeb::Validation; use VNWeb::HTML (); use VNDB::Types; +use Exporter 'import'; +our @EXPORT = qw/advsearch_default/; + # Search queries should be seen as some kind of low-level assembly for @@ -739,4 +742,15 @@ sub query_encode { $self->{query_encode}; } + +# Returns the saved default query for the current user, or an empty query if none has been set. +sub advsearch_default { + my($t) = @_; + if(auth) { + my $def = tuwf->dbVali('SELECT query FROM saved_queries WHERE qtype =', \$t, 'AND name = \'\' AND uid =', \auth->uid); + return tuwf->compile({ advsearch => $t })->validate($def)->data if $def; + } + bless {type=>$t}, __PACKAGE__; +} + 1; diff --git a/lib/VNWeb/Misc/HomePage.pm b/lib/VNWeb/Misc/HomePage.pm index d1ad1c31..5d4164a9 100644 --- a/lib/VNWeb/Misc/HomePage.pm +++ b/lib/VNWeb/Misc/HomePage.pm @@ -1,7 +1,7 @@ package VNWeb::Misc::HomePage; use VNWeb::Prelude; -use VNWeb::Filters; +use VNWeb::AdvSearch; use VNWeb::Discussions::Lib 'enrich_boards'; @@ -10,13 +10,13 @@ sub screens_ { state $stats ||= tuwf->dbRowi('SELECT count(*) as total, count(*) filter(where', $where, ') as subset from images i'); state $sample ||= 100*min 1, (200 / $stats->{subset}) * ($stats->{total} / $stats->{subset}); - my $filt = auth->pref('filter_vn') && eval { filter_parse v => auth->pref('filter_vn') }; - my $lst = $filt ? tuwf->dbAlli( + my $filt = advsearch_default 'v'; + my $lst = $filt->{query} ? tuwf->dbAlli( # Assumption: If we randomly select 30 matching VNs, there'll be at least 4 VNs with qualified screenshots # (As of Sep 2020, over half of the VNs in the database have screenshots, so that assumption usually works) 'SELECT * FROM ( SELECT DISTINCT ON (v.id) i.id, i.width, i,height, v.id AS vid, v.title - FROM (SELECT id, title FROM vn v WHERE NOT v.hidden AND ', filter_vn_query($filt), ' ORDER BY random() LIMIT', \30, ') v + FROM (SELECT id, title FROM vn v WHERE NOT v.hidden AND ', $filt->sql_where(), ' ORDER BY random() LIMIT', \30, ') v JOIN vn_screenshots vs ON v.id = vs.id JOIN images i ON i.id = vs.scr WHERE ', $where, ' @@ -161,23 +161,28 @@ sub recent_vn_posts_ { sub releases_ { my($released) = @_; - my $filt = auth->pref('filter_release') && eval { filter_parse r => auth->pref('filter_release') }; - $filt = { $filt ? %$filt : (), date_before => undef, date_after => undef, released => $released?1:0 }; + my $filt = advsearch_default 'r'; + + # Drop any top-level date filters + $filt->{query} = [ grep !(ref $_ eq 'ARRAY' && $_->[0] eq 'released'), $filt->{query}->@* ] if $filt->{query}; + delete $filt->{query} if $filt->{query} && $filt->{query}[0] eq 'released'; + + # Add the release date as filter, we need to construct a filter for the header link anyway + $filt->{query} = [ 'and', [ released => $released ? '<=' : '>', 1 ], $filt->{query} || () ]; # XXX This query is kinda slow, an index on releases.released would probably help. my $lst = tuwf->dbAlli(' SELECT id, title, original, released FROM releases r - WHERE NOT hidden AND released', $released ? '<=' : '>', \strftime('%Y%m%d', gmtime), ' - AND ', filter_release_query($filt), ' + WHERE NOT hidden AND ', $filt->sql_where(), ' ORDER BY released', $released ? 'DESC' : '', ', id LIMIT 10' ); enrich_flatten plat => id => id => 'SELECT id, platform FROM releases_platforms WHERE id IN', $lst; enrich_flatten lang => id => id => 'SELECT id, lang FROM releases_lang WHERE id IN', $lst; h1_ sub { - a_ href => '/r?fil='.VNDB::Func::fil_serialize($filt).';o=a;s=released', 'Upcoming Releases' if !$released; - a_ href => '/r?fil='.VNDB::Func::fil_serialize($filt).';o=d;s=released', 'Just Released' if $released; + a_ href => '/r?f='.$filt->query_encode().';o=a;s=released', 'Upcoming Releases' if !$released; + a_ href => '/r?f='.$filt->query_encode().';o=d;s=released', 'Just Released' if $released; }; ul_ sub { li_ sub { diff --git a/lib/VNWeb/Misc/Redirects.pm b/lib/VNWeb/Misc/Redirects.pm index 964c4e24..4a84150b 100644 --- a/lib/VNWeb/Misc/Redirects.pm +++ b/lib/VNWeb/Misc/Redirects.pm @@ -1,7 +1,7 @@ package VNWeb::Misc::Redirects; use VNWeb::Prelude; -use VNWeb::Filters; +use VNWeb::AdvSearch; # VNDB URLs don't have a trailing /, redirect if we get one. @@ -28,11 +28,11 @@ TUWF::get qr{/v/rand}, sub { state $stats ||= tuwf->dbRowi('SELECT COUNT(*) AS total, COUNT(*) FILTER(WHERE NOT hidden) AS subset FROM vn'); state $sample ||= 100*min 1, (100 / $stats->{subset}) * ($stats->{total} / $stats->{subset}); - my $filt = auth->pref('filter_vn') && eval { filter_parse v => auth->pref('filter_vn') }; + my $filt = advsearch_default 'v'; my $vn = tuwf->dbVali(' SELECT id - FROM vn v', $filt ? '' : ('TABLESAMPLE SYSTEM (', \$sample, ')'), ' - WHERE NOT hidden AND', filter_vn_query($filt||{}), ' + FROM vn v', $filt->{query} ? '' : ('TABLESAMPLE SYSTEM (', \$sample, ')'), ' + WHERE NOT hidden AND', $filt->sql_where(), ' ORDER BY random() LIMIT 1' ); return tuwf->resNotFound if !$vn; diff --git a/lib/VNWeb/Releases/List.pm b/lib/VNWeb/Releases/List.pm index 89332200..c9ac1eff 100644 --- a/lib/VNWeb/Releases/List.pm +++ b/lib/VNWeb/Releases/List.pm @@ -52,10 +52,7 @@ TUWF::get qr{/experimental/r}, sub { } } - if(auth && !$opt->{f}{query} && !defined tuwf->reqGet('f')) { - my $def = tuwf->dbVali('SELECT query FROM saved_queries WHERE qtype = \'r\' AND name = \'\' AND uid =', \auth->uid); - $opt->{f} = tuwf->compile({ advsearch => 'r' })->validate($def)->data if $def; - } + $opt->{f} = advsearch_default 'r' if !$opt->{f}{query} && !defined tuwf->reqGet('f'); my @search = map { my $l = '%'.sql_like($_).'%'; diff --git a/lib/VNWeb/TT/TagPage.pm b/lib/VNWeb/TT/TagPage.pm index 80b14d8d..bd545c98 100644 --- a/lib/VNWeb/TT/TagPage.pm +++ b/lib/VNWeb/TT/TagPage.pm @@ -117,10 +117,7 @@ sub vns_ { } } - if(auth && !$opt->{f}{query} && !defined tuwf->reqGet('f')) { - my $def = tuwf->dbVali('SELECT query FROM saved_queries WHERE qtype = \'v\' AND name = \'\' AND uid =', \auth->uid); - $opt->{f} = tuwf->compile({ advsearch => 'v' })->validate($def)->data if $def; - } + $opt->{f} = advsearch_default 'v' if !$opt->{f}{query} && !defined tuwf->reqGet('f'); my $where = sql 'tvi.tag =', \$t->{id}, 'AND NOT v.hidden AND tvi.spoiler <=', \$opt->{m}, 'AND', $opt->{f}->sql_where(); diff --git a/lib/VNWeb/VN/List.pm b/lib/VNWeb/VN/List.pm index 57acdb6d..76ca2051 100644 --- a/lib/VNWeb/VN/List.pm +++ b/lib/VNWeb/VN/List.pm @@ -113,10 +113,7 @@ TUWF::get qr{/experimental/v(?:/(?<char>all|[a-z0]))?}, sub { } } - if(auth && !$opt->{f}{query} && !defined tuwf->reqGet('f')) { - my $def = tuwf->dbVali('SELECT query FROM saved_queries WHERE qtype = \'v\' AND name = \'\' AND uid =', \auth->uid); - $opt->{f} = tuwf->compile({ advsearch => 'v' })->validate($def)->data if $def; - } + $opt->{f} = advsearch_default 'v' if !$opt->{f}{query} && !defined tuwf->reqGet('f'); my $where = sql_and 'NOT v.hidden', $opt->{f}->sql_where(), |