summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2021-01-09 16:44:13 +0100
committerYorhel <git@yorhel.nl>2021-01-09 16:44:13 +0100
commit5d275ce2ceb1112c1e02bbe9134b22ac478975fc (patch)
tree11d3fb560bee52af8f4ab7c2cac73bce6f04799c
parent1ec958ba9d2e40c65246bd29f28b2b50364b2a5a (diff)
AdvSearch: Apply new saved default queries to listings instead of old filters
-rw-r--r--lib/VNWeb/AdvSearch.pm14
-rw-r--r--lib/VNWeb/Misc/HomePage.pm25
-rw-r--r--lib/VNWeb/Misc/Redirects.pm8
-rw-r--r--lib/VNWeb/Releases/List.pm5
-rw-r--r--lib/VNWeb/TT/TagPage.pm5
-rw-r--r--lib/VNWeb/VN/List.pm5
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(),