/[webpac2]/Webpacus2/lib/Webpacus/Action/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 /Webpacus2/lib/Webpacus/Action/Search.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 999 - (hide annotations)
Sun Nov 4 17:03:55 2007 UTC (16 years, 6 months ago) by dpavlin
File size: 4300 byte(s)
 r1538@llin:  dpavlin | 2007-11-04 18:03:57 +0100
 add database selection

1 dpavlin 930 use strict;
2     use warnings;
3    
4     =head1 NAME
5    
6     Webpacus::Action::Search
7    
8     =cut
9    
10     package Webpacus::Action::Search;
11     use base qw/Webpacus::Action Jifty::Action/;
12    
13     use Data::Dump qw/dump/;
14 dpavlin 945 # enables start witout this file which is created by WebPAC later
15     eval { require Webpacus::Webpac };
16 dpavlin 934 use KinoSearch::Simple;
17 dpavlin 930
18     use Jifty::Param::Schema;
19     use Jifty::Action schema {
20    
21 dpavlin 931 param field =>
22 dpavlin 930 label is _("Field name"),
23     available are defer {
24     my $coll = Webpacus::Model::SearchCollection->new;
25     $coll->unlimit;
26     [ '', {
27     display_from => 'name',
28     value_from => 'id',
29     collection => $coll,
30     }];
31     },
32     render as 'Select';
33    
34 dpavlin 999 param database =>
35     label is _("From database"),
36     available are defer {
37     my $coll = Webpacus::Model::SearchCollection->new;
38     $coll->group_by( column => 'from_database' );
39     $coll->unlimit;
40     [{
41     display_from => 'from_database',
42     value_from => 'from_database',
43     collection => $coll,
44     }];
45     },
46     render as 'Select';
47    
48 dpavlin 931 param query =>
49 dpavlin 930 label is _("Search for"),
50     is mandatory;
51    
52    
53     };
54    
55     sub sticky_on_success { 1 }
56     sub sticky_on_failure { 1 }
57    
58     =head2 take_action
59    
60 dpavlin 963 Create C<results> which can be accessed from L<Template::Declare> like this:
61    
62     my $results = $search->result->content('results');
63    
64 dpavlin 930 =cut
65    
66     sub take_action {
67     my $self = shift;
68    
69 dpavlin 931 my $search = Webpacus::Model::Search->load( $self->argument_value( 'field' ) );
70 dpavlin 934 my $query = $self->argument_value( 'query' );
71 dpavlin 999 my $database = $self->argument_value( 'database' );
72 dpavlin 930
73     warn "## search = ",dump( $search );
74    
75 dpavlin 934 my $index_path = Webpacus::Webpac->index_path;
76 dpavlin 999 $index_path .= '/' . $database;
77 dpavlin 934
78     warn "## index_path = $index_path";
79    
80     my $index = KinoSearch::Simple->new(
81     path => $index_path,
82     language => 'en',
83     );
84    
85     my $total_hits = $index->search(
86     query => $query,
87     offset => 0,
88     num_wanted => 100,
89     );
90    
91 dpavlin 931 my $message =
92 dpavlin 934 _('Found') . " $total_hits " .
93 dpavlin 940 _('results for') . " '$query'";
94    
95 dpavlin 954 $message .= " " . _('on field') . ' ' . $search->name if $search;
96 dpavlin 930
97 dpavlin 935 $self->result->content(
98     results => Webpacus::Search::Results->new({
99     count => $total_hits,
100     index => $index,
101     }),
102     );
103 dpavlin 934
104 dpavlin 930 $self->result->message( $message );
105    
106     return 1;
107     }
108    
109 dpavlin 935 package Webpacus::Search::Results;
110    
111     use strict;
112     use warnings;
113     use base qw( Class::Accessor );
114     __PACKAGE__->mk_accessors( qw(
115     count
116     index
117     ) );
118    
119 dpavlin 943 use lib '/data/webpac2/lib';
120     use WebPAC::Store;
121    
122 dpavlin 935 use Data::Dump qw/dump/;
123    
124 dpavlin 943 my $debug = 1;
125    
126     my $store;
127    
128 dpavlin 963 =head2 count
129    
130     Returns number of records in results
131    
132     my $nr_records = $results->count;
133    
134     =head2 next
135    
136     Fetch next result and return C<Webpacus::Search::DS> object
137    
138     while ( my $ds = $results->next ) {
139     # do something with $ds object
140     }
141    
142     =cut
143    
144 dpavlin 935 sub next {
145     my $self = shift;
146    
147 dpavlin 943 if ( ! $store ) {
148     $store = WebPAC::Store->new({
149     debug => $debug,
150     });
151     warn "## create WebPAC::Store\n";
152     }
153 dpavlin 935
154 dpavlin 943 my $hit = $self->index->fetch_hit_hashref;
155    
156     return unless $hit;
157    
158     warn "## next hit = ", dump( $hit ) if $debug;
159    
160     my $ds = $store->load_ds(
161     database => $hit->{database},
162     input => $hit->{input},
163     id => $hit->{id},
164     );
165    
166     if ( ! $ds ) {
167     warn "can't find ds for hit ", dump( $hit ), $/ unless $ds;
168     return;
169     }
170    
171 dpavlin 963 # add permanent fields
172     $ds->{$_} ||= { display => $hit->{$_} } foreach ( qw/database input id/ );
173 dpavlin 943
174 dpavlin 963 return Webpacus::Action::DS->new( $ds );
175 dpavlin 943
176 dpavlin 963 }
177 dpavlin 943
178 dpavlin 963 package Webpacus::Action::DS;
179 dpavlin 943
180 dpavlin 963 use warnings;
181     use strict;
182 dpavlin 943
183 dpavlin 963 use Data::Dump qw/dump/;
184     use Carp qw/confess/;
185    
186     sub new {
187     my $class = shift;
188    
189     my ( $ds ) = @_;
190    
191     my $self = {
192     ds => $ds,
193     };
194     bless ($self, $class);
195    
196     return $self;
197    
198     }
199    
200     sub _row {
201     my ( $self, $type, $field, $delimiter ) = @_;
202    
203     confess "no type?" unless $type;
204     confess "no field?" unless $field;
205     confess "no ds?" unless $self->{ds};
206    
207     $delimiter ||= '[x]';
208    
209     my $ds = $self->{ds};
210    
211     warn "### ds = ",dump( $ds ) if $debug;
212    
213     return unless defined $ds->{$field}->{$type};
214    
215     if ( my $v = $ds->{$field}->{$type} ) {
216    
217     if ( ref($v) eq 'ARRAY' ) {
218     warn "is array ", wantarray ? 'wantarray' : 'scalar', " $field $type" if $debug;
219     return @$v if wantarray;
220     return join( $delimiter, @$v );
221     } else {
222     warn "not array ", wantarray ? 'wantarray' : 'scalar', " $field $type" if $debug;
223     return $v;
224 dpavlin 954 }
225 dpavlin 963
226     } else {
227 dpavlin 954 return;
228     }
229 dpavlin 963
230 dpavlin 935 }
231    
232 dpavlin 963 =head2 display
233    
234     $ds->display( 'TitleProper' );
235    
236     =cut
237    
238     sub display {
239     my $self = shift;
240     warn "## display(",dump(@_),")\n";
241     return $self->_row('display',@_);
242     }
243    
244 dpavlin 930 1;
245    

  ViewVC Help
Powered by ViewVC 1.1.26