1 # $Id: Node.pm,v 1.1 2004-12-17 15:29:00 mike Exp $
3 package Net::Z3950::PQF::Node;
11 Net::Z3950::PQF::Node - Abstract class for nodes in a PQF parse tree
15 $node = new Net::Z3950::PQF::Term('unix');
16 $node->isa("Net::Z3950::PQF::Node") or die "oops";
20 This module implements the types for the nodes that make up a PQF
21 parse tree. Each such concrete type is a subclass of the abstract
24 and has a type whose name is of the form
25 C<Net::Z3950::PQF::>I<somethingNode>.
27 The following node types are defined:
33 Represents an actual query term such as
37 C<"Brian W. Kernighan">.
39 The term is accompanied by zero or more
41 each of which is a triple represented by a reference to a
42 three-element array. Each such array consists of an
43 I<attribute set identifier>
44 which may be either an OID or a short descriptive string,
49 which may be either an integer or a string.
53 Represents an AND node with two sub-nodes.
57 Represents an OR node with two sub-nodes.
61 Represents a NOT node with two sub-nodes. In the Z39.50 Type-1 query,
62 and hence in PQF, NOT is a binary AND-NOT operator rather than than a
63 unary negation operator.
67 Represents a proximity node with two subnodes and five parameters:
70 a boolean indicating whether the condition indicated by the other
71 parameters should be inverted.
74 an integer indicating the number of units that may separate the
75 fragments identified by the subnodes.
78 a boolean indicating whether the elements indicated by the subnodes
79 are constrained to be in the same order as the subnodes themselves.
82 indicates the relation required on the specified distance in order
83 for the condition to be satisfied.
86 a short string indicating the units of proximity (C<word>,
91 Except where noted, the methods described below are defined for all of
92 the concrete node types.
99 $term1 = new Net::Z3950::PQF::TermNode('brian', [ "bib-1", 1, 1003 ]);
100 $term2 = new Net::Z3950::PQF::TermNode('unix', [ "bib-1", 1, 4 ]);
101 $and = new Net::Z3950::PQF::AndNode($term1, $term2);
103 Creates a new node object of the appropriate type. It is not possible
104 to instantiate the abstract node type, C<Net::Z3950::PQF::Node>, only its
107 The parameters required are different for different node types:
113 The first parameter is the actual term, and the remainder are
114 attributes, each represented by a triple of
115 [ I<attribute-set>, I<type>, I<value> ].
117 =item C<AndNode>, C<OrNode>, C<NotNode>
119 The two parameters are nodes representing the subtrees.
123 The seven parameters are, in order: the two nodes representing the
124 subtrees, and the five parameters exclusion, distance, ordered,
133 die "can't create an abstract $class";
141 Renders the contents of the tree rooted at the specified node,
142 indented to a level indicated by the parameter. This output is in a
143 human-readable form that is useful for debugging but probably not much
150 die "can't render an abstract $class";
155 package Net::Z3950::PQF::TermNode;
159 my($term, @attrs) = @_;
171 die "render() called with no level" if !defined $level;
172 my $text = ("\t" x $level) . "term: " . $this->{term} . "\n";
173 foreach my $attr (@{ $this->{attrs} }) {
174 my($set, $type, $val) = @$attr;
175 $text .= ("\t" x ($level+1)) . "attr: $set $type=$val\n";
183 # PRIVATE class, used as base by AndNode, OrNode and NotNode
184 package Net::Z3950::PQF::BooleanNode;
199 die "render() called with no level" if !defined $level;
200 my $text = ("\t" x $level) . $this->_op() . "\n";
201 foreach my $sub (@{ $this->{sub} }) {
202 $text .= $sub->render($level+1);
210 package Net::Z3950::PQF::AndNode;
212 @ISA = qw(Net::Z3950::PQF::BooleanNode);
218 package Net::Z3950::PQF::OrNode;
220 @ISA = qw(Net::Z3950::PQF::BooleanNode);
226 package Net::Z3950::PQF::NotNode;
228 @ISA = qw(Net::Z3950::PQF::BooleanNode);
234 package Net::Z3950::PQF::ProxNode;
238 die "### class $class not yet implemented";
243 die "you shouldn't have been able to make $this";
251 This module is part of the Net::Z3950::PQF distribution. The
252 copyright, authorship and licence are all as for the distribution.