diff options
author | Yorhel <git@yorhel.nl> | 2016-07-03 10:59:35 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2016-07-03 10:59:35 +0200 |
commit | 7da2edeaa0f6cf7794f4f8f68960497dc1be893c (patch) | |
tree | c59de08987be52187635cb7045fb537fb8e04d7d /lib/VNDB | |
parent | d393bac3b28716ab6d5cb0b159e149ebf9920f51 (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.pm | 5 | ||||
-rw-r--r-- | lib/VNDB/Handler/Staff.pm | 35 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNEdit.pm | 4 |
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; |