Alvis-QueryFilter
view release on metacpan or search on metacpan
lib/Alvis/QueryFilter.pm view on Meta::CPAN
return undef;
}
my $onto_expanded=$self->_apply_onto($typing_expanded);
if (!defined($onto_expanded))
{
$self->_set_err_state($ERR_APPLYING_ONTO);
return undef;
}
# print STDERR "FINAL: " . Dumper($onto_expanded) . "\n";
return $onto_expanded;
}
# extract query from SRU
sub UI2Query
{
my $self=shift;
my $SRU=shift;
if ( /&query=([^\&]*)/ ) {
return $1;
}
return "";
}
#
# UI ---> Zebra middle man
#
sub UI2Zebra
{
my $self=shift;
my $SRU=shift;
my @expanded_SRU=();
# extract the query
my $query;
my @p=split(/\&/,$SRU,-1);
for my $p (@p)
{
if ($p=~/^query=(.*)$/)
{
$query=$1;
}
else
{
push(@expanded_SRU,$p); # so we can reconstruct
}
}
if (!defined($query))
{
$self->_set_err_state($ERR_NO_QUERY,"SRU:\"$SRU\"");
return undef;
}
$self->{queryForm} = $query;
$self->{queryForm} =~ s/\&/\&/g;
$self->{queryForm} =~ s/</\</g;
$self->{queryForm} =~ s/>/\>/g;
$self->{finalForm} = "";
# decode percentage notation
my $query_copy=$query;
$query_copy=uri_unescape($query_copy);
# parse the CQL
my $parse_tree;
eval
{
$parse_tree=$self->{CQLParser}->parse($query_copy);
};
if ($@)
{
chomp($query);
$@=~s/(.*) at .* line [0-9]+\n/$1/o;
$self->_set_err_state($ERR_CQL_PARSE,"Query:\"$query\".");
return undef;
}
# Get a list of all possible text query word sequences (so this is
# implicitly an OR of them)
#
my $t_qwords=[[]]; # help variable used in the recursion
my $seq_list=
$self->_get_text_qwords($parse_tree,$t_qwords);
if (!defined($seq_list))
{
$self->_set_err_state($ERR_CREATING_SEQ_LIST);
return undef;
}
# Get the categorising tail anded to the end
#
my $cats=&get_categories($parse_tree);
if (!defined($cats))
{
$self->_set_err_state($ERR_CREATING_CAT_LIST);
return undef;
}
# Important! Used in the following Zebra2UI, 'cause the
# SRU response has nothing about the query.
# So...if used out of sync/with more than one client...kaboom!
# Not my problem.
$self->{currSeqList}=$seq_list;
# print STDERR "Term elements: " . Dumper($seq_list) . "\n";
#
# Ok, create the 'tail' i.e. what we AND to the original query
# as an OR of possible expansions
#
my $CQL_tail=$self->_data_struct2CQLtail($seq_list);
if (!defined($CQL_tail))
{
$self->_set_err_state($ERR_CREATING_CQL_TAIL);
return undef;
}
# print STDERR "QQ##$query##$cats##$CQL_tail\n";
#$query='%28' . $query . '%29%20and%20' $CQL_tail;
( run in 2.891 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )