1 package OpenILS::Application::Storage::Publisher::metabib;
2 use base qw/OpenILS::Application::Storage/;
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;
10 my $log = 'OpenSRF::Utils::Logger';
21 my ($fts_col) = metabib::full_rec->columns('FTS');
22 my $table = metabib::full_rec->table;
24 my $fts = OpenILS::Application::Storage::FTS->compile($term, 'value','index_vector');
26 my $fts_where = $fts->sql_where_clause();
27 my @fts_ranks = $fts->fts_rank;
29 my $rank = join(' + ', @fts_ranks);
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);
38 my $where = join(' OR ', @wheres);
40 my $select = "SELECT record, sum($rank) FROM $table WHERE $where GROUP BY 1 ORDER BY 2 DESC;";
42 $log->debug("Search SQL :: [$select]",DEBUG);
44 my $recs = metabib::full_rec->db_Main->selectall_arrayref($select, {}, @binds);
45 $log->debug("Search yielded ".scalar(@$recs)." results.",DEBUG);
49 __PACKAGE__->register_method(
50 api_name => 'open-ils.storage.direct.metabib.full_rec.search_fts.value',
51 method => 'search_full_rec',
55 __PACKAGE__->register_method(
56 api_name => 'open-ils.storage.direct.metabib.full_rec.search_fts.index_vector',
57 method => 'search_full_rec',
62 sub search_class_fts {
69 my $descendants = defined($ou_type) ?
70 "actor.org_unit_descendants($ou, $ou_type)" :
71 "actor.org_unit_descendants($ou)";
74 my $class = $self->{cdbi};
75 my $table = $class->table;
77 my $fts = OpenILS::Application::Storage::FTS->compile($term, 'value','index_vector');
79 my $fts_where = $fts->sql_where_clause;
80 my @fts_ranks = $fts->fts_rank;
82 my $rank = join(' + ', @fts_ranks);
84 # XXX test an "EXISTS version of descendant checking...
85 my $select = <<" SQL";
86 SELECT m.metarecord, sum($rank)/count(distinct m.source)
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)
96 $log->debug("Field Search SQL :: [$select]",DEBUG);
98 my $recs = $class->db_Main->selectall_arrayref($select);
100 $log->debug("Search yielded ".scalar(@$recs)." results.",DEBUG);
105 __PACKAGE__->register_method(
106 api_name => 'open-ils.storage.metabib.title.search_fts.metarecord',
107 method => 'search_class_fts',
110 cdbi => 'metabib::title_field_entry',
112 __PACKAGE__->register_method(
113 api_name => 'open-ils.storage.metabib.author.search_fts.metarecord',
114 method => 'search_class_fts',
117 cdbi => 'metabib::author_field_entry',
119 __PACKAGE__->register_method(
120 api_name => 'open-ils.storage.metabib.subject.search_fts.metarecord',
121 method => 'search_class_fts',
124 cdbi => 'metabib::subject_field_entry',
126 __PACKAGE__->register_method(
127 api_name => 'open-ils.storage.metabib.keyword.search_fts.metarecord',
128 method => 'search_class_fts',
131 cdbi => 'metabib::keyword_field_entry',
134 sub search_class_fts_count {
141 my $descendants = defined($ou_type) ?
142 "actor.org_unit_descendants($ou, $ou_type)" :
143 "actor.org_unit_descendants($ou)";
146 my $class = $self->{cdbi};
147 my $table = $class->table;
149 my $fts = OpenILS::Application::Storage::FTS->compile($term, 'value','index_vector');
151 my $fts_where = $fts->sql_where_clause;
153 # XXX test an "EXISTS version of descendant checking...
154 my $select = <<" SQL";
155 SELECT count(distinct m.metarecord)
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)
163 $log->debug("Field Search Count SQL :: [$select]",DEBUG);
165 my $recs = $class->db_Main->selectrow_arrayref($select)->[0];
167 $log->debug("Count Search yielded $recs results.",DEBUG);
172 __PACKAGE__->register_method(
173 api_name => 'open-ils.storage.metabib.title.search_fts.metarecord_count',
174 method => 'search_class_fts_count',
177 cdbi => 'metabib::title_field_entry',
179 __PACKAGE__->register_method(
180 api_name => 'open-ils.storage.metabib.author.search_fts.metarecord_count',
181 method => 'search_class_fts_count',
184 cdbi => 'metabib::author_field_entry',
186 __PACKAGE__->register_method(
187 api_name => 'open-ils.storage.metabib.subject.search_fts.metarecord_count',
188 method => 'search_class_fts_count',
191 cdbi => 'metabib::subject_field_entry',
193 __PACKAGE__->register_method(
194 api_name => 'open-ils.storage.metabib.keyword.search_fts.metarecord_count',
195 method => 'search_class_fts_count',
198 cdbi => 'metabib::keyword_field_entry',