summaryrefslogtreecommitdiff
path: root/lib/VNDB
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2016-07-03 10:59:35 +0200
committerYorhel <git@yorhel.nl>2016-07-03 10:59:35 +0200
commit7da2edeaa0f6cf7794f4f8f68960497dc1be893c (patch)
treec59de08987be52187635cb7045fb537fb8e04d7d /lib/VNDB
parentd393bac3b28716ab6d5cb0b159e149ebf9920f51 (diff)
Various staff search improvements
- Exact match is now case-insensitive - Main staff search supports exact match with =-prefix - On VN edit dropdown: exact matches are sorted before other matches - VN edit dropdown now also displays original name
Diffstat (limited to 'lib/VNDB')
-rw-r--r--lib/VNDB/DB/Staff.pm5
-rw-r--r--lib/VNDB/Handler/Staff.pm35
-rw-r--r--lib/VNDB/Handler/VNEdit.pm4
3 files changed, 25 insertions, 19 deletions
diff --git a/lib/VNDB/DB/Staff.pm b/lib/VNDB/DB/Staff.pm
index eef01fd3..45e6df46 100644
--- a/lib/VNDB/DB/Staff.pm
+++ b/lib/VNDB/DB/Staff.pm
@@ -7,7 +7,7 @@ use Exporter 'import';
our @EXPORT = qw|dbStaffGet dbStaffGetRev dbStaffRevisionInsert dbStaffAliasIds|;
-# options: results, page, id, aid, search, exact, truename, role, gender
+# options: results, page, id, aid, search, exact, truename, role, gender, notid
# what: extended changes roles aliases
sub dbStaffGet {
my $self = shift;
@@ -35,6 +35,7 @@ sub dbStaffGet {
$o{id} ? ( ref $o{id} ? ('s.id IN(!l)' => [$o{id}]) : ('s.id = ?' => $o{id}) ) : (),
$o{aid} ? ( ref $o{aid} ? ('sa.aid IN(!l)' => [$o{aid}]) : ('sa.aid = ?' => $o{aid}) ) : (),
$o{id} || $o{truename} ? ( 's.aid = sa.aid' => 1 ) : (),
+ $o{notid} && @{$o{notid}} ? ('s.id NOT IN(!l)' => [$o{notid}]) : (),
defined $o{gender} ? ( 's.gender IN(!l)' => [ ref $o{gender} ? $o{gender} : [$o{gender}] ]) : (),
defined $o{lang} ? ( 's.lang IN(!l)' => [ ref $o{lang} ? $o{lang} : [$o{lang}] ]) : (),
defined $o{role} ? (
@@ -43,7 +44,7 @@ sub dbStaffGet {
$seiyuu ? ( 'EXISTS(SELECT 1 FROM vn_seiyuu vsy JOIN vn v ON v.id = vsy.id WHERE vsy.aid = sa.aid AND NOT v.hidden)' ) : ()
).')' => ( @roles ? [ \@roles ] : 1 ),
) : (),
- $o{exact} ? ( '(sa.name = ? OR sa.original = ?)' => [ ($o{exact}) x 2 ] ) : (),
+ $o{exact} ? ( '(lower(sa.name) = lower(?) OR lower(sa.original) = lower(?))' => [ ($o{exact}) x 2 ] ) : (),
$o{search} ?
$o{search} =~ /[\x{3000}-\x{9fff}\x{ff00}-\x{ff9f}]/ ?
# match against 'original' column only if search string contains any
diff --git a/lib/VNDB/Handler/Staff.pm b/lib/VNDB/Handler/Staff.pm
index e95a4ed5..24edf5ad 100644
--- a/lib/VNDB/Handler/Staff.pm
+++ b/lib/VNDB/Handler/Staff.pm
@@ -302,7 +302,7 @@ sub list {
my ($list, $np) = $self->filFetchDB(staff => $f->{fil}, {}, {
$char ne 'all' ? ( char => $char ) : (),
- $f->{q} ? ( search => $f->{q} ) : (),
+ $f->{q} ? ($f->{q} =~ /^=(.+)$/ ? (exact => $1) : (search => $f->{q})) : (),
results => 150,
page => $f->{p}
});
@@ -367,28 +367,33 @@ sub list {
sub staffxml {
my $self = shift;
- my $q = $self->formValidate(
- { get => 'a', required => 0, multi => 1, template => 'id' },
- { get => 's', required => 0, multi => 1, template => 'id' },
- { get => 'q', required => 0, maxlength => 500 },
- );
- return $self->resNotFound if $q->{_err} || !(@{$q->{s}} || @{$q->{a}} || $q->{q});
+ my $q = $self->formValidate({ get => 'q', required => 0, maxlength => 500 });
+ return $self->resNotFound if $q->{_err} || !$q->{q};
+
+ # Prefixing name with '=' forces exact matching, old behaviour, not very useful anymore.
+ my $exact = $q->{q} =~ s/^=//;
+ # Try exact match first, so exact match is always first result
my($list, $np) = $self->dbStaffGet(
- @{$q->{s}} ? (id => $q->{s}) :
- @{$q->{a}} ? (aid => $q->{a}) :
- $q->{q} =~ /^=(.+)/ ? (exact => $1) :
- $q->{q} =~ /^s([1-9]\d*)/ ? (id => $1) :
- (search => $q->{q}),
- results => 10,
- page => 1,
+ results => 10, page => 1,
+ $q->{q} =~ /^s([1-9]\d*)/ ? (id => $1) : (exact => $q->{q}),
);
+ # Append results of a substring match
+ if(!$np && !$exact) {
+ my($nlist, $nnp) = $self->dbStaffGet(
+ results => 10-@$list, page => 1, search => $q->{q},
+ notid => [ map $_->{id}, @$list ],
+ );
+ $np = $nnp;
+ $list = [ @$list, @$nlist ];
+ }
+
$self->resHeader('Content-type' => 'text/xml; charset=UTF-8');
xml;
tag 'staff', more => $np ? 'yes' : 'no';
for(@$list) {
- tag 'item', sid => $_->{id}, id => $_->{aid}, $_->{name};
+ tag 'item', sid => $_->{id}, id => $_->{aid}, orig => $_->{original}, $_->{name};
}
end;
}
diff --git a/lib/VNDB/Handler/VNEdit.pm b/lib/VNDB/Handler/VNEdit.pm
index 91217aa2..1c059e7a 100644
--- a/lib/VNDB/Handler/VNEdit.pm
+++ b/lib/VNDB/Handler/VNEdit.pm
@@ -331,7 +331,7 @@ sub _form {
h2 'Add staff';
table; Tr;
td class => 'tc_staff';
- input id => 'credit_input', type => 'text', class => 'text'; end;
+ input id => 'credit_input', type => 'text', class => 'text', style => 'width: 300px'; end;
td colspan => 3, '';
end; end;
}]],
@@ -370,7 +370,7 @@ sub _form {
txt ' voiced by';
end;
td class => 'tc_staff';
- input id => 'cast_input', type => 'text', class => 'text';
+ input id => 'cast_input', type => 'text', class => 'text', style => 'width: 300px';
end;
td colspan => 2, '';
end; end;