/[webpac2]/Webpacus/lib/Webpacus/Controller/Search.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /Webpacus/lib/Webpacus/Controller/Search.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 228 - (hide annotations)
Mon Dec 5 23:15:43 2005 UTC (18 years, 5 months ago) by dpavlin
File size: 4144 byte(s)
 r232@athlon:  dpavlin | 2005-12-06 00:19:54 +0100
 minor tweaks to make it work (actually, produce output)

1 dpavlin 109 package Webpacus::Controller::Search;
2    
3     use strict;
4     use warnings;
5     use base 'Catalyst::Controller';
6    
7 dpavlin 153 use Data::Dumper;
8    
9 dpavlin 109 use lib '/data/webpac2/lib';
10 dpavlin 159 use WebPAC::Search::Estraier 0.03;
11 dpavlin 109
12 dpavlin 153
13 dpavlin 109 =head1 NAME
14    
15 dpavlin 155 Webpacus::Controller::Search - Search WebPAC data
16 dpavlin 109
17     =head1 SYNOPSIS
18    
19 dpavlin 155 See L<WebPAC>, L<Webpacus>
20 dpavlin 109
21     =head1 DESCRIPTION
22    
23 dpavlin 155 Catalyst Controller for search fields Hyper Estraier
24 dpavlin 109
25     =head1 METHODS
26    
27     =over 4
28    
29     =item default
30    
31     =cut
32    
33     sub default : Private {
34     my ( $self, $c ) = @_;
35     $c->stash->{template} = 'search.tt';
36     }
37    
38     =item suggest
39    
40     Returns results for URLs like C<search/suggest/FieldName>
41    
42 dpavlin 155 It will return field from URL (C<FieldName> in example>) and use
43     same filed in paramerers (comming from form or URL) or if it doesn't
44     exist field named C<all>.
45    
46 dpavlin 109 =cut
47    
48     sub suggest : Regex('^search/suggest/*([^/]*)') {
49 dpavlin 143 my ( $self, $c ) = @_;
50 dpavlin 109
51 dpavlin 143 my $what = $c->request->snippets->[0];
52 dpavlin 109
53 dpavlin 143 my $log = $c->log;
54 dpavlin 109
55 dpavlin 155 my $webpac = $c->comp('Model::WebPAC');
56 dpavlin 109
57 dpavlin 143 my $q = $c->req->params->{$what} ||
58     $c->req->params->{all} || $c->res->output("no results");
59 dpavlin 109
60 dpavlin 143
61 dpavlin 109 $log->info("search for '$q' in $what\n");
62    
63 dpavlin 155 my $max = $c->config->{'hits_for_suggest'};
64 dpavlin 143 if (! $max) {
65     $log->info("hits_for_suggest isn't defined, defaulting to 10");
66     $c->config->{'hits_for_suggest'} = 10;
67     $max = 10;
68     }
69 dpavlin 109
70 dpavlin 155 my @hits = $webpac->search(
71     phrase => $q,
72     max => $max,
73     get_attr => [ $what ],
74     );
75 dpavlin 109
76 dpavlin 143 my $used;
77     my @suggestions;
78    
79     foreach my $res (@hits) {
80     my $v = $res->{ $what } || next;
81     next if ($used->{ $v }++);
82     push @suggestions, $v;
83     }
84    
85     $log->debug( ($#suggestions + 1) . " unique hits returned");
86    
87 dpavlin 228 $c->response->body( $c->prototype->auto_complete_result( \@suggestions ) );
88 dpavlin 109 }
89    
90 dpavlin 153
91     # specify all Hyper Estraier operators which should stop this module
92     # from splitting search query and joining it with default operator
93     my $hest_op_regex = qr/(:?\[(:?BW|EW|RX)\]|AND|OR|ANDNOT)/;
94    
95     =item results
96    
97 dpavlin 159 Method which uses C<Model::WebPAC> and returns results for search query
98 dpavlin 153
99     =cut
100    
101     sub results : Local {
102     my ( $self, $c ) = @_;
103    
104     my $webpac = $c->comp('Model::WebPAC');
105     my $params = $c->req->params;
106     my $log = $c->log;
107    
108     $log->debug("results got params: " . Dumper( $params ) );
109    
110 dpavlin 200 if (! $params->{_page} || $params->{_page} < 1) {
111 dpavlin 161 $params->{_page} = 1;
112     $log->warn("fixed _page parametar to 1");
113     }
114    
115 dpavlin 153 my @attr;
116     my @words;
117     # default operator to join fields/words
118     my $operator = 'AND';
119    
120     foreach my $f (keys %{ $params }) {
121    
122     next if ($f =~ m/^_/o);
123    
124     my $v = $params->{$f} || next;
125    
126     if (my $op = $params->{ '_' . $f}) {
127     if ($v =~ $hest_op_regex) {
128     # don't split words if there is Hyper Estraier
129     # operator in them
130     push @words, $v;
131     } else {
132     push @words, join(" $op ", split(/\s+/, $v) );
133     }
134     } else {
135     push @words, $v;
136     }
137    
138     next if ($f eq 'all'); # don't add_attr for magic field all
139    
140     if ($v !~ /\s/) {
141     push @attr, "$f ISTRINC $v";
142     } else {
143     map {
144     push @attr, "$f ISTRINC $_";
145     } grep { ! $hest_op_regex } split(/\s+/, $v);
146     }
147     }
148    
149     my $q = join(" $operator ", @words);
150    
151 dpavlin 155 my $template = $params->{'_template'} || $c->config->{webpac}->{template};
152    
153     $log->die("can't find _template or default from configuration!") unless ($template);
154    
155 dpavlin 160 my $hits_on_page = $c->config->{'hyperestraier'}->{'hits_on_page'} || 10;
156 dpavlin 153
157 dpavlin 160 $log->debug("using template $template to produce $hits_on_page results");
158    
159 dpavlin 153 $c->stash->{html_results} = sub {
160     my $res = $webpac->search(
161     phrase => $q,
162     template => $template,
163 dpavlin 155 add_attr => \@attr,
164     get_attr => [ '@uri' ],
165 dpavlin 160 max => $hits_on_page,
166 dpavlin 159 page => $params->{'_page'},
167 dpavlin 153 );
168 dpavlin 160 # $log->debug("controller got " . ( $#{$res} + 1 ) . " results for '$q' " . Dumper( $res ));
169 dpavlin 153 return $res;
170     };
171    
172     $c->stash->{phrase} = $q;
173     $c->stash->{attr} = \@attr;
174 dpavlin 160 $c->stash->{page} = $params->{'_page'};
175     $c->stash->{hits_on_page} = $hits_on_page;
176 dpavlin 153
177     $c->stash->{template} = 'results.tt';
178     }
179    
180 dpavlin 187 =item record
181    
182     forwarded to C</editor/record>
183    
184     =cut
185    
186     sub record : Local {
187     my ( $self, $c ) = @_;
188    
189     $c->forward( '/editor/record' );
190     }
191    
192 dpavlin 109 =back
193    
194     =head1 AUTHOR
195    
196 dpavlin 153 Dobrica Pavlinusic C<< <dpavlin@rot13.org> >>
197 dpavlin 109
198     =head1 LICENSE
199    
200     This library is free software, you can redistribute it and/or modify
201     it under the same terms as Perl itself.
202    
203     =cut
204    
205     1;

  ViewVC Help
Powered by ViewVC 1.1.26