]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/metabib.pm
class-based searching
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Storage / Publisher / metabib.pm
1 package OpenILS::Application::Storage::Publisher::metabib;
2 use base qw/OpenILS::Application::Storage/;
3 use vars qw/$VERSION/;
4 use OpenSRF::EX qw/:try/;
5 use OpenILS::Application::Storage::CDBI::metabib;
6 use OpenILS::Application::Storage::FTS;
7 use OpenILS::Utils::Fieldmapper;
8 use OpenSRF::Utils::Logger;
9
10 my $log = 'OpenSRF::Utils::Logger';
11
12 $VERSION = 1;
13
14
15 sub search_full_rec {
16         my $self = shift;
17         my $client = shift;
18         my $limiters = shift;
19         my $term = shift;
20
21         my ($fts_col) = metabib::full_rec->columns('FTS');
22         my $table = metabib::full_rec->table;
23
24         my $fts = OpenILS::Application::Storage::FTS->compile($term, 'value','index_vector');
25
26         my $fts_where = $fts->sql_where_clause();
27         my @fts_ranks = $fts->fts_rank;
28
29         my $rank = join(' + ', @fts_ranks);
30
31         my @binds;
32         my @wheres;
33         for my $limit (@$limiters) {
34                 push @wheres, "( tag = ? AND subfield LIKE ? AND $fts_where )";
35                 push @binds, $$limit{tag}, $$limit{subfield};
36                 $log->debug("Limiting query using { tag => $$limit{tag}, subfield => $$limit{subfield} }", DEBUG);
37         }
38         my $where = join(' OR ', @wheres);
39
40         my $select = "SELECT record, sum($rank) FROM $table WHERE $where GROUP BY 1 ORDER BY 2 DESC;";
41
42         $log->debug("Search SQL :: [$select]",DEBUG);
43
44         my $recs = metabib::full_rec->db_Main->selectall_arrayref($select, {}, @binds);
45         $log->debug("Search yielded ".scalar(@$recs)." results.",DEBUG);
46         return $recs;
47
48 }
49 __PACKAGE__->register_method(
50         api_name        => 'open-ils.storage.direct.metabib.full_rec.search_fts.value',
51         method          => 'search_full_rec',
52         api_level       => 1,
53         stream          => 1,
54 );
55 __PACKAGE__->register_method(
56         api_name        => 'open-ils.storage.direct.metabib.full_rec.search_fts.index_vector',
57         method          => 'search_full_rec',
58         api_level       => 1,
59         stream          => 1,
60 );
61
62 sub search_class_fts {
63         my $self = shift;
64         my $client = shift;
65         my $term = shift;
66         my $ou = shift;
67         my $ou_type = shift;
68
69         my $descendants = defined($ou_type) ?
70                                 "actor.org_unit_descendants($ou, $ou_type)" :
71                                 "actor.org_unit_descendants($ou)";
72                 
73
74         my $class = $self->{cdbi};
75         my $table = $class->table;
76
77         my $fts = OpenILS::Application::Storage::FTS->compile($term, 'value','index_vector');
78
79         my $fts_where = $fts->sql_where_clause;
80         my @fts_ranks = $fts->fts_rank;
81
82         my $rank = join(' + ', @fts_ranks);
83
84         # XXX test an "EXISTS version of descendant checking...
85         my $select = <<"        SQL";
86                 SELECT  m.metarecord, sum($rank)/count(distinct m.source)
87                   FROM  $table f
88                         JOIN metabib.metarecord_source_map m ON (m.source = f.source)
89                         JOIN asset.call_number cn ON (cn.record = m.source)
90                         JOIN $descendants d ON (cn.owning_lib = d.id)
91                   WHERE $fts_where
92                   GROUP BY 1
93                   ORDER BY 2 DESC;
94         SQL
95
96         $log->debug("Field Search SQL :: [$select]",DEBUG);
97
98         my $recs = $class->db_Main->selectall_arrayref($select);
99         
100         $log->debug("Search yielded ".scalar(@$recs)." results.",DEBUG);
101
102         return $recs;
103
104 }
105 __PACKAGE__->register_method(
106         api_name        => 'open-ils.storage.metabib.title.search_fts.metarecord',
107         method          => 'search_class_fts',
108         api_level       => 1,
109         stream          => 1,
110         cdbi            => 'metabib::title_field_entry',
111 );
112 __PACKAGE__->register_method(
113         api_name        => 'open-ils.storage.metabib.author.search_fts.metarecord',
114         method          => 'search_class_fts',
115         api_level       => 1,
116         stream          => 1,
117         cdbi            => 'metabib::author_field_entry',
118 );
119 __PACKAGE__->register_method(
120         api_name        => 'open-ils.storage.metabib.subject.search_fts.metarecord',
121         method          => 'search_class_fts',
122         api_level       => 1,
123         stream          => 1,
124         cdbi            => 'metabib::subject_field_entry',
125 );
126 __PACKAGE__->register_method(
127         api_name        => 'open-ils.storage.metabib.keyword.search_fts.metarecord',
128         method          => 'search_class_fts',
129         api_level       => 1,
130         stream          => 1,
131         cdbi            => 'metabib::keyword_field_entry',
132 );
133
134 sub search_class_fts_count {
135         my $self = shift;
136         my $client = shift;
137         my $term = shift;
138         my $ou = shift;
139         my $ou_type = shift;
140
141         my $descendants = defined($ou_type) ?
142                                 "actor.org_unit_descendants($ou, $ou_type)" :
143                                 "actor.org_unit_descendants($ou)";
144                 
145
146         my $class = $self->{cdbi};
147         my $table = $class->table;
148
149         my $fts = OpenILS::Application::Storage::FTS->compile($term, 'value','index_vector');
150
151         my $fts_where = $fts->sql_where_clause;
152
153         # XXX test an "EXISTS version of descendant checking...
154         my $select = <<"        SQL";
155                 SELECT  count(distinct  m.metarecord)
156                   FROM  $table f
157                         JOIN metabib.metarecord_source_map m ON (m.source = f.source)
158                         JOIN asset.call_number cn ON (cn.record = m.source)
159                         JOIN $descendants d ON (cn.owning_lib = d.id)
160                   WHERE $fts_where;
161         SQL
162
163         $log->debug("Field Search Count SQL :: [$select]",DEBUG);
164
165         my $recs = $class->db_Main->selectrow_arrayref($select)->[0];
166         
167         $log->debug("Count Search yielded $recs results.",DEBUG);
168
169         return $recs;
170
171 }
172 __PACKAGE__->register_method(
173         api_name        => 'open-ils.storage.metabib.title.search_fts.metarecord_count',
174         method          => 'search_class_fts_count',
175         api_level       => 1,
176         stream          => 1,
177         cdbi            => 'metabib::title_field_entry',
178 );
179 __PACKAGE__->register_method(
180         api_name        => 'open-ils.storage.metabib.author.search_fts.metarecord_count',
181         method          => 'search_class_fts_count',
182         api_level       => 1,
183         stream          => 1,
184         cdbi            => 'metabib::author_field_entry',
185 );
186 __PACKAGE__->register_method(
187         api_name        => 'open-ils.storage.metabib.subject.search_fts.metarecord_count',
188         method          => 'search_class_fts_count',
189         api_level       => 1,
190         stream          => 1,
191         cdbi            => 'metabib::subject_field_entry',
192 );
193 __PACKAGE__->register_method(
194         api_name        => 'open-ils.storage.metabib.keyword.search_fts.metarecord_count',
195         method          => 'search_class_fts_count',
196         api_level       => 1,
197         stream          => 1,
198         cdbi            => 'metabib::keyword_field_entry',
199 );
200
201 1;