[interchange-cvs] interchange - racke modified lib/Vend/Swish2.pm
interchange-cvs at icdevgroup.org
interchange-cvs at icdevgroup.org
Fri Jun 23 08:31:41 EDT 2006
User: racke
Date: 2006-06-23 12:31:41 GMT
Modified: lib/Vend Swish2.pm
Log:
get rid of futile Windows newlines
Revision Changes Path
1.3 +316 -316 interchange/lib/Vend/Swish2.pm
rev 1.3, prev_rev 1.2
Index: Swish2.pm
===================================================================
RCS file: /var/cvs/interchange/lib/Vend/Swish2.pm,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Swish2.pm 23 Jun 2006 12:20:46 -0000 1.2
+++ Swish2.pm 23 Jun 2006 12:31:41 -0000 1.3
@@ -1,316 +1,316 @@
-# Vend::Swish2 - Search indexes with Swish-e's new SWISH::API
-#
-# $Id: Swish2.pm,v 1.2 2006/06/23 12:20:46 racke Exp $
-#
-# Adapted from Vend::Swish by Brian Miller <brian at endpoint.com>
-#
-# Copyright (C) 2005-2006 Interchange Development Group
-# Copyright (C) 2002 Mike Heins <mikeh at perusion.net>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with this program; if not, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-# MA 02111-1307 USA.
-
-package Vend::Swish2;
-require Vend::Search;
- at ISA = qw(Vend::Search);
-
-$VERSION = substr(q$Revision: 1.2 $, 10);
-use strict;
-
-use lib qw( /usr/local/lib/swish-e/perl );
-use SWISH::API;
-use SWISH::ParseQuery;
-use SWISH::PhraseHighlight;
-
-# singleton to hold initialization object,
-# search objects are then retrieved through it
-# this should improve performance through caching
-my $_swish = {};
-my $_swish_highlighters = {};
-
-my %Default = (
- matches => 0,
- mv_head_skip => 0,
- mv_index_delim => "\t",
- mv_record_delim => "\n",
- mv_matchlimit => 50,
- mv_max_matches => 2000,
- mv_min_string => 1,
-);
-
-my %fmap = ( code => 'swishreccount',
- score => 'swishrank',
- url => 'swishdocpath',
- title => 'swishtitle',
- filesize => 'swishdocsize',
- mod_date => 'swishlastmodified',
- description => 'swishdescription',
- );
-my %highlight_settings = ( show_words => 8,
- occurrences => 5,
- max_words => 100,
- highlight_on => '<span class="highlight">',
- highlight_off => '</span>',
- );
-
-sub array {
- my ($s, $opt) = @_;
- $s->{mv_list_only} = 1; # makes perform_search only return results array
- return Vend::Scan::perform_search($opt, undef, $s);
-}
-
-sub hash {
- my ($s, $opt) = @_;
- $s->{mv_return_reference} = 'HASH';
- $s->{mv_list_only} = 1; # makes perform_search only return results array
- return Vend::Scan::perform_search($opt, undef, $s);
-}
-
-sub list {
- my ($s, $opt) = @_;
- $s->{mv_return_reference} = 'LIST';
- $s->{mv_list_only} = 1; # makes perform_search only return results array
- return Vend::Scan::perform_search($opt, undef, $s);
-}
-
-sub init {
- my ($s, $options) = @_;
-
- #::logDebug("initing Swish search, Swish=" . Vend::Util::uneval($Vend::Cfg->{Swish2}));
- $Vend::Cfg->{Swish2} ||= {};
-
- @{$s}{keys %Default} = (values %Default);
-
- $s->{mv_base_directory} = $Vend::Cfg->{VendRoot},
- $s->{mv_begin_string} = [];
- $s->{mv_all_chars} = [1];
- $s->{mv_case} = [];
- $s->{mv_column_op} = [];
- $s->{mv_negate} = [];
- $s->{mv_numeric} = [];
- $s->{mv_orsearch} = [];
- $s->{mv_searchspec} = [];
- $s->{mv_search_group} = [];
- $s->{mv_search_field} = [];
- $s->{mv_search_file} = [];
- push @{$s->{mv_search_file}}, $Vend::Cfg->{Swish2}{index}
- if $Vend::Cfg->{Swish2}{index};
- $s->{mv_searchspec} = [];
- $s->{mv_sort_option} = [];
- $s->{mv_substring_match} = [];
- $s->{mv_field_names} = [qw/code score url title filesize mod_date description/];
- $s->{mv_return_fields} = [qw/code score url title filesize mod_date description/];
-
- for (keys %$options) {
- $s->{$_} = $options->{$_};
- }
-
- # can create the base Swish object once and run
- # multiple queries off of it
- my @searchfiles = @{$s->{mv_search_file}};
- for (@searchfiles) {
- $_ = Vend::Util::catfile($s->{mv_base_directory}, $_)
- unless Vend::Util::file_name_is_absolute($_);
- }
- my $from_index = join ' ', @searchfiles;
- $s->{'swish_index'} = $from_index;
-
- unless ($_swish->{$from_index}) {
- $_swish->{$from_index} = new SWISH::API ( $from_index );
- if ($_swish->{$from_index}->Error) {
- die "Can't create swish engine: " . $_swish->{$from_index}->ErrorString;
- }
- }
-
- if ($Vend::Cfg->{Swish2}{highlight_context}) {
- push @{ $s->{mv_field_names} }, 'context';
- push @{ $s->{mv_return_fields} }, 'context';
- $fmap{'context'} = 'swishdescription';
-
- foreach my $index (@{ $s->{'mv_search_file'} }) {
- my $swish = $_swish->{$from_index};
- my %headers = map { lc $_ => ($swish->HeaderValue( $index, $_ ) || '') } $swish->HeaderNames;
-
- $_swish_highlighters->{$index} = new SWISH::PhraseHighlight ( \%highlight_settings, \%headers, { swish => $swish } );
- }
- }
-
- return;
-}
-
-sub new {
- my ($class, %options) = @_;
- my $s = new Vend::Search;
- bless $s, $class;
- $s->init(\%options);
- return $s;
-}
-
-sub search {
- my ($s, %options) = @_;
-
- while (my ($key,$val) = each %options) {
- $s->{$key} = $val;
- }
- $s->{mv_return_delim} = $s->{mv_index_delim}
- unless defined $s->{mv_return_delim};
-
- my @specs = @{$s->{mv_searchspec}};
- my @pats = $s->spec_check(@specs);
-
- $s->save_specs();
-
- my $search_string = join ' ', @pats;
- if (length $search_string < $s->{mv_min_string}) {
- my $msg = ::errmsg(
- "Swish search string less than minimum %s characters: %s",
- $s->{mv_min_string},
- $search_string,
- );
- return $s->search_error($msg);
- }
-
- my $engine = $_swish->{ $s->{'swish_index'} };
-
- my $results = $engine->Query( $search_string );
- if ($engine->Error) {
- $s->{matches} = -1;
- return $s->search_error("Can't run swish query: " . $engine->ErrorString);
- }
-
- # no matches, can return now
- unless ($results->Hits) {
- $s->{matches} = 0;
- return;
- }
-
- my @out;
- while (my $result = $results->NextResult) {
- my $out_ref = [ map { $result->Property( $fmap{$_} ) } @{ $s->{'mv_field_names'} } ];
-
- my $out_ref = [];
- foreach my $field (@{ $s->{'mv_field_names'} }) {
- if ($field =~ /context/) {
- my $text = $result->Property( $fmap{$field} );
- if ($Vend::Cfg->{'Swish2'}{'highlight_context'} and defined $text and $text ne '') {
- my $index = $result->Property('swishdbfile');
-
- my $parsed_query = parse_query( join ' ', $results->ParsedWords( $index ) );
- #::logDebug("parsed query: " . Vend::Util::uneval($parsed_query));
-
- $_swish_highlighters->{$index}->highlight( \$text, $parsed_query->{'swishdefault'}, undef, $result );
- }
- push @$out_ref, $text;
- }
- else {
- push @$out_ref, $result->Property( $fmap{$field} );
- }
- }
-
- push @out, $out_ref;
- }
-
- {
- my $field_names = join "\t", @{$s->{mv_field_names}};
- $field_names =~ s/^\s+//;
- my @laundry = (qw/mv_search_field mv_range_look mv_return_fields/);
- $s->hash_fields(
- [ split /\Q$s->{mv_index_delim}/, $field_names ],
- @laundry,
- );
- }
-
- if ($s->{mv_unique}) {
- my %seen;
- @out = grep ! $seen{$_->[0]}++, @out;
- }
-
- if ($s->{mv_sort_field} and @{$s->{mv_sort_field}}) {
- $s->hash_fields( $s->{mv_field_names}, qw/mv_sort_field/ );
- @out = $s->sort_search_return(\@out);
- }
-
- $s->{matches} = @out;
-
- if ($s->{matches} > $s->{mv_matchlimit} and $s->{mv_matchlimit} > 0) {
- $s->save_more(\@out)
- or ::logError("Error saving matches: $!");
-
- if ($s->{mv_first_match}) {
- splice @out, 0, $s->{mv_first_match};
- $s->{mv_next_pointer} = $s->{mv_first_match} + $s->{mv_matchlimit};
- $s->{mv_next_pointer} = 0
- if $s->{mv_next_pointer} > $s->{matches};
- }
- $#out = $s->{mv_matchlimit} - 1;
- }
-
- if (! $s->{mv_return_reference}) {
- $s->{mv_results} = \@out;
- #::logDebug("returning search: " . Vend::Util::uneval($s));
- return $s;
- }
- elsif ($s->{mv_return_reference} eq 'LIST') {
- my $col = @{ $s->{mv_return_fields} };
- @out = map { join $s->{mv_return_delim}, @$_ } @out;
- $s->{mv_results} = join $s->{mv_record_delim}, @out;
- }
- else {
- my $col = @{ $s->{mv_return_fields} };
-
- my @names = @{ $s->{mv_field_names} };
- $names[0] eq '0' and $names[0] = 'code';
-
- my %hash;
- for (@out) {
- my @col = split /$s->{mv_return_delim}/, $_, $col;
-
- $hash{ $col[0] } = {};
- @{ $hash{$col[0]} } {@names} = @col;
- }
- $s->{mv_results} = \%hash;
- }
-
- #::logDebug("returning search: " . Vend::Util::uneval($s));
- return $s;
-}
-
-# Unfortunate hack need for Safe searches
-*escape = \&Vend::Search::escape;
-*spec_check = \&Vend::Search::spec_check;
-*get_scalar = \&Vend::Search::get_scalar;
-*more_matches = \&Vend::Search::more_matches;
-*get_return = \&Vend::Search::get_return;
-*map_ops = \&Vend::Search::map_ops;
-*get_limit = \&Vend::Search::get_limit;
-*saved_params = \&Vend::Search::saved_params;
-*range_check = \&Vend::Search::range_check;
-*create_search_and = \&Vend::Search::create_search_and;
-*create_search_or = \&Vend::Search::create_search_or;
-*save_context = \&Vend::Search::save_context;
-*dump_options = \&Vend::Search::dump_options;
-*save_more = \&Vend::Search::save_more;
-*sort_search_return = \&Vend::Search::sort_search_return;
-*get_scalar = \&Vend::Search::get_scalar;
-*hash_fields = \&Vend::Search::hash_fields;
-*save_specs = \&Vend::Search::save_specs;
-*restore_specs = \&Vend::Search::restore_specs;
-*splice_specs = \&Vend::Search::splice_specs;
-*search_error = \&Vend::Search::search_error;
-*save_more = \&Vend::Search::save_more;
-*sort_search_return = \&Vend::Search::sort_search_return;
-
-1;
-__END__
+# Vend::Swish2 - Search indexes with Swish-e's new SWISH::API
+#
+# $Id: Swish2.pm,v 1.3 2006/06/23 12:31:41 racke Exp $
+#
+# Adapted from Vend::Swish by Brian Miller <brian at endpoint.com>
+#
+# Copyright (C) 2005-2006 Interchange Development Group
+# Copyright (C) 2002 Mike Heins <mikeh at perusion.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA.
+
+package Vend::Swish2;
+require Vend::Search;
+ at ISA = qw(Vend::Search);
+
+$VERSION = substr(q$Revision: 1.3 $, 10);
+use strict;
+
+use lib qw( /usr/local/lib/swish-e/perl );
+use SWISH::API;
+use SWISH::ParseQuery;
+use SWISH::PhraseHighlight;
+
+# singleton to hold initialization object,
+# search objects are then retrieved through it
+# this should improve performance through caching
+my $_swish = {};
+my $_swish_highlighters = {};
+
+my %Default = (
+ matches => 0,
+ mv_head_skip => 0,
+ mv_index_delim => "\t",
+ mv_record_delim => "\n",
+ mv_matchlimit => 50,
+ mv_max_matches => 2000,
+ mv_min_string => 1,
+);
+
+my %fmap = ( code => 'swishreccount',
+ score => 'swishrank',
+ url => 'swishdocpath',
+ title => 'swishtitle',
+ filesize => 'swishdocsize',
+ mod_date => 'swishlastmodified',
+ description => 'swishdescription',
+ );
+my %highlight_settings = ( show_words => 8,
+ occurrences => 5,
+ max_words => 100,
+ highlight_on => '<span class="highlight">',
+ highlight_off => '</span>',
+ );
+
+sub array {
+ my ($s, $opt) = @_;
+ $s->{mv_list_only} = 1; # makes perform_search only return results array
+ return Vend::Scan::perform_search($opt, undef, $s);
+}
+
+sub hash {
+ my ($s, $opt) = @_;
+ $s->{mv_return_reference} = 'HASH';
+ $s->{mv_list_only} = 1; # makes perform_search only return results array
+ return Vend::Scan::perform_search($opt, undef, $s);
+}
+
+sub list {
+ my ($s, $opt) = @_;
+ $s->{mv_return_reference} = 'LIST';
+ $s->{mv_list_only} = 1; # makes perform_search only return results array
+ return Vend::Scan::perform_search($opt, undef, $s);
+}
+
+sub init {
+ my ($s, $options) = @_;
+
+ #::logDebug("initing Swish search, Swish=" . Vend::Util::uneval($Vend::Cfg->{Swish2}));
+ $Vend::Cfg->{Swish2} ||= {};
+
+ @{$s}{keys %Default} = (values %Default);
+
+ $s->{mv_base_directory} = $Vend::Cfg->{VendRoot},
+ $s->{mv_begin_string} = [];
+ $s->{mv_all_chars} = [1];
+ $s->{mv_case} = [];
+ $s->{mv_column_op} = [];
+ $s->{mv_negate} = [];
+ $s->{mv_numeric} = [];
+ $s->{mv_orsearch} = [];
+ $s->{mv_searchspec} = [];
+ $s->{mv_search_group} = [];
+ $s->{mv_search_field} = [];
+ $s->{mv_search_file} = [];
+ push @{$s->{mv_search_file}}, $Vend::Cfg->{Swish2}{index}
+ if $Vend::Cfg->{Swish2}{index};
+ $s->{mv_searchspec} = [];
+ $s->{mv_sort_option} = [];
+ $s->{mv_substring_match} = [];
+ $s->{mv_field_names} = [qw/code score url title filesize mod_date description/];
+ $s->{mv_return_fields} = [qw/code score url title filesize mod_date description/];
+
+ for (keys %$options) {
+ $s->{$_} = $options->{$_};
+ }
+
+ # can create the base Swish object once and run
+ # multiple queries off of it
+ my @searchfiles = @{$s->{mv_search_file}};
+ for (@searchfiles) {
+ $_ = Vend::Util::catfile($s->{mv_base_directory}, $_)
+ unless Vend::Util::file_name_is_absolute($_);
+ }
+ my $from_index = join ' ', @searchfiles;
+ $s->{'swish_index'} = $from_index;
+
+ unless ($_swish->{$from_index}) {
+ $_swish->{$from_index} = new SWISH::API ( $from_index );
+ if ($_swish->{$from_index}->Error) {
+ die "Can't create swish engine: " . $_swish->{$from_index}->ErrorString;
+ }
+ }
+
+ if ($Vend::Cfg->{Swish2}{highlight_context}) {
+ push @{ $s->{mv_field_names} }, 'context';
+ push @{ $s->{mv_return_fields} }, 'context';
+ $fmap{'context'} = 'swishdescription';
+
+ foreach my $index (@{ $s->{'mv_search_file'} }) {
+ my $swish = $_swish->{$from_index};
+ my %headers = map { lc $_ => ($swish->HeaderValue( $index, $_ ) || '') } $swish->HeaderNames;
+
+ $_swish_highlighters->{$index} = new SWISH::PhraseHighlight ( \%highlight_settings, \%headers, { swish => $swish } );
+ }
+ }
+
+ return;
+}
+
+sub new {
+ my ($class, %options) = @_;
+ my $s = new Vend::Search;
+ bless $s, $class;
+ $s->init(\%options);
+ return $s;
+}
+
+sub search {
+ my ($s, %options) = @_;
+
+ while (my ($key,$val) = each %options) {
+ $s->{$key} = $val;
+ }
+ $s->{mv_return_delim} = $s->{mv_index_delim}
+ unless defined $s->{mv_return_delim};
+
+ my @specs = @{$s->{mv_searchspec}};
+ my @pats = $s->spec_check(@specs);
+
+ $s->save_specs();
+
+ my $search_string = join ' ', @pats;
+ if (length $search_string < $s->{mv_min_string}) {
+ my $msg = ::errmsg(
+ "Swish search string less than minimum %s characters: %s",
+ $s->{mv_min_string},
+ $search_string,
+ );
+ return $s->search_error($msg);
+ }
+
+ my $engine = $_swish->{ $s->{'swish_index'} };
+
+ my $results = $engine->Query( $search_string );
+ if ($engine->Error) {
+ $s->{matches} = -1;
+ return $s->search_error("Can't run swish query: " . $engine->ErrorString);
+ }
+
+ # no matches, can return now
+ unless ($results->Hits) {
+ $s->{matches} = 0;
+ return;
+ }
+
+ my @out;
+ while (my $result = $results->NextResult) {
+ my $out_ref = [ map { $result->Property( $fmap{$_} ) } @{ $s->{'mv_field_names'} } ];
+
+ my $out_ref = [];
+ foreach my $field (@{ $s->{'mv_field_names'} }) {
+ if ($field =~ /context/) {
+ my $text = $result->Property( $fmap{$field} );
+ if ($Vend::Cfg->{'Swish2'}{'highlight_context'} and defined $text and $text ne '') {
+ my $index = $result->Property('swishdbfile');
+
+ my $parsed_query = parse_query( join ' ', $results->ParsedWords( $index ) );
+ #::logDebug("parsed query: " . Vend::Util::uneval($parsed_query));
+
+ $_swish_highlighters->{$index}->highlight( \$text, $parsed_query->{'swishdefault'}, undef, $result );
+ }
+ push @$out_ref, $text;
+ }
+ else {
+ push @$out_ref, $result->Property( $fmap{$field} );
+ }
+ }
+
+ push @out, $out_ref;
+ }
+
+ {
+ my $field_names = join "\t", @{$s->{mv_field_names}};
+ $field_names =~ s/^\s+//;
+ my @laundry = (qw/mv_search_field mv_range_look mv_return_fields/);
+ $s->hash_fields(
+ [ split /\Q$s->{mv_index_delim}/, $field_names ],
+ @laundry,
+ );
+ }
+
+ if ($s->{mv_unique}) {
+ my %seen;
+ @out = grep ! $seen{$_->[0]}++, @out;
+ }
+
+ if ($s->{mv_sort_field} and @{$s->{mv_sort_field}}) {
+ $s->hash_fields( $s->{mv_field_names}, qw/mv_sort_field/ );
+ @out = $s->sort_search_return(\@out);
+ }
+
+ $s->{matches} = @out;
+
+ if ($s->{matches} > $s->{mv_matchlimit} and $s->{mv_matchlimit} > 0) {
+ $s->save_more(\@out)
+ or ::logError("Error saving matches: $!");
+
+ if ($s->{mv_first_match}) {
+ splice @out, 0, $s->{mv_first_match};
+ $s->{mv_next_pointer} = $s->{mv_first_match} + $s->{mv_matchlimit};
+ $s->{mv_next_pointer} = 0
+ if $s->{mv_next_pointer} > $s->{matches};
+ }
+ $#out = $s->{mv_matchlimit} - 1;
+ }
+
+ if (! $s->{mv_return_reference}) {
+ $s->{mv_results} = \@out;
+ #::logDebug("returning search: " . Vend::Util::uneval($s));
+ return $s;
+ }
+ elsif ($s->{mv_return_reference} eq 'LIST') {
+ my $col = @{ $s->{mv_return_fields} };
+ @out = map { join $s->{mv_return_delim}, @$_ } @out;
+ $s->{mv_results} = join $s->{mv_record_delim}, @out;
+ }
+ else {
+ my $col = @{ $s->{mv_return_fields} };
+
+ my @names = @{ $s->{mv_field_names} };
+ $names[0] eq '0' and $names[0] = 'code';
+
+ my %hash;
+ for (@out) {
+ my @col = split /$s->{mv_return_delim}/, $_, $col;
+
+ $hash{ $col[0] } = {};
+ @{ $hash{$col[0]} } {@names} = @col;
+ }
+ $s->{mv_results} = \%hash;
+ }
+
+ #::logDebug("returning search: " . Vend::Util::uneval($s));
+ return $s;
+}
+
+# Unfortunate hack need for Safe searches
+*escape = \&Vend::Search::escape;
+*spec_check = \&Vend::Search::spec_check;
+*get_scalar = \&Vend::Search::get_scalar;
+*more_matches = \&Vend::Search::more_matches;
+*get_return = \&Vend::Search::get_return;
+*map_ops = \&Vend::Search::map_ops;
+*get_limit = \&Vend::Search::get_limit;
+*saved_params = \&Vend::Search::saved_params;
+*range_check = \&Vend::Search::range_check;
+*create_search_and = \&Vend::Search::create_search_and;
+*create_search_or = \&Vend::Search::create_search_or;
+*save_context = \&Vend::Search::save_context;
+*dump_options = \&Vend::Search::dump_options;
+*save_more = \&Vend::Search::save_more;
+*sort_search_return = \&Vend::Search::sort_search_return;
+*get_scalar = \&Vend::Search::get_scalar;
+*hash_fields = \&Vend::Search::hash_fields;
+*save_specs = \&Vend::Search::save_specs;
+*restore_specs = \&Vend::Search::restore_specs;
+*splice_specs = \&Vend::Search::splice_specs;
+*search_error = \&Vend::Search::search_error;
+*save_more = \&Vend::Search::save_more;
+*sort_search_return = \&Vend::Search::sort_search_return;
+
+1;
+__END__
More information about the interchange-cvs
mailing list