source: main/tags/2.41/gsdl/perllib/classify/AZCompactSectionList.pm@ 25339

Last change on this file since 25339 was 5725, checked in by kjdon, 21 years ago

added in stuff for the xml usage output

  • Property svn:keywords set to Author Date Id Revision
File size: 5.4 KB
Line 
1###########################################################################
2#
3# AZCompactSectionList.pm --
4#
5# Experimental AZCompactList with fixes to handle section-level metadata
6#
7###########################################################################
8
9package AZCompactSectionList;
10
11use AZCompactList;
12
13sub BEGIN {
14 @ISA = ('AZCompactList');
15}
16
17my $options =
18{ 'name' => "AZCompactSectionList",
19 'desc' => "{AZCompactSectionList.desc}",
20 'inherits' => "Yes",
21 'args' => $arguments };
22
23sub new {
24 my $class = shift (@_);
25 my $self = new AZCompactList($class, @_);
26
27 # 14-05-02 To allow for proper inheritance of arguments - John Thompson
28 my $option_list = $self->{'option_list'};
29 push( @{$option_list}, $options );
30
31 return bless $self, $class;
32}
33
34#
35# override reinit() & reclassify() to demonstrate possible bug fixes
36# (search for SECTIONFIX? to see lines changed from AZCompactList.pm)
37#
38sub reinit
39{
40 my ($self,$classlist_ref) = @_;
41
42 my %mtfreq = ();
43 my @single_classlist = ();
44 my @multiple_classlist = ();
45
46 # find out how often each metavalue occurs
47 map
48 {
49 my $mv;
50 foreach $mv (@{$self->{'listmetavalue'}->{$_}} )
51 {
52 $mtfreq{$mv}++;
53 }
54 } @$classlist_ref;
55
56 # use this information to split the list: single metavalue/repeated value
57 map
58 {
59 my $i = 1;
60 my $metavalue;
61 foreach $metavalue (@{$self->{'listmetavalue'}->{$_}})
62 {
63 if ($mtfreq{$metavalue} >= $self->{'mingroup'})
64 {
65 push(@multiple_classlist,[$_,$i,$metavalue]);
66 }
67 else
68 {
69 push(@single_classlist,[$_,$metavalue]);
70 $metavalue =~ tr/[A-Z]/[a-z]/;
71 $self->{'reclassifylist'}->{"Metavalue_$i.$_"} = $metavalue;
72 }
73 $i++;
74 }
75 } @$classlist_ref;
76
77
78 # Setup sub-classifiers for multiple list
79
80 $self->{'classifiers'} = {};
81
82 my $pm;
83 foreach $pm ("List", "SectionList")
84 {
85 my $listname
86 = &util::filename_cat($ENV{'GSDLHOME'},"perllib/classify/$pm.pm");
87 if (-e $listname) { require $listname; }
88 else
89 {
90 my $outhandle = $self->{'outhandle'};
91 print $outhandle "AZCompactList ERROR - couldn't find classifier \"$listname\"\n";
92 die "\n";
93 }
94 }
95
96 # Create classifiers objects for each entry >= mingroup
97 my $metavalue;
98 foreach $metavalue (keys %mtfreq)
99 {
100 if ($mtfreq{$metavalue} >= $self->{'mingroup'})
101 {
102 my $listclassobj;
103 my $doclevel = $self->{'doclevel'};
104 my $metaname = $self->{'metaname'};
105 my @metaname_list = split('/',$metaname);
106 $metaname = shift(@metaname_list);
107 if (@metaname_list==0)
108 {
109 my @args;
110 push @args, ("-metadata", "$metaname");
111# buttonname is also used for the node's title
112 push @args, ("-buttonname", "$metavalue");
113 push @args, ("-sort", "Date");
114
115 if ($doclevel =~ m/^top(level)?/i)
116 {
117 eval ("\$listclassobj = new List(\@args)"); warn $@ if $@;
118 }
119 else
120 {
121 # SECTIONFIX?
122 #eval ("\$listclassobj = new SectionList($args)");
123 eval ("\$listclassobj = new SectionList(\@args)");
124 }
125 }
126 else
127 {
128 $metaname = join('/',@metaname_list);
129
130 my @args;
131 push @args, ("-metadata", "$metaname");
132# buttonname is also used for the node's title
133 push @args, ("-buttonname", "$metavalue");
134 push @args, ("-doclevel", "$doclevel");
135 push @args, "-recopt";
136
137 # SECTIONFIX?
138 #eval ("\$listclassobj = new AZCompactList($args)");
139 eval ("\$listclassobj = new AZCompactList(\@args)");
140 }
141 if ($@) {
142 my $outhandle = $self->{'outhandle'};
143 print $outhandle "$@";
144 die "\n";
145 }
146
147 $listclassobj->init();
148
149 if (defined $metavalue && $metavalue =~ /\w/)
150 {
151 my $formatted_node = $metavalue;
152 if ($self->{'metaname'} =~ m/^Creator(:.*)?$/)
153 {
154 &sorttools::format_string_name_english(\$formatted_node);
155 }
156 else
157 {
158 &sorttools::format_string_english(\$formatted_node);
159 }
160
161 $self->{'classifiers'}->{$metavalue}
162 = { 'classifyobj' => $listclassobj,
163 'formattednode' => $formatted_node };
164 }
165 }
166 }
167
168
169 return (\@single_classlist,\@multiple_classlist);
170}
171
172
173sub reclassify
174{
175 my ($self,$multiple_cl_ref) = @_;
176
177 # Entries in the current classify list that are "book nodes"
178 # should be recursively classified.
179 #--
180 foreach $dm_pair (@$multiple_cl_ref)
181 {
182 my ($doc_OID,$mdoffset,$metavalue) = @$dm_pair;
183 my $listclassobj;
184
185 # find metavalue in list of sub-classifiers
186 my $found = 0;
187 my $node_name;
188 foreach $node_name (keys %{$self->{'classifiers'}})
189 {
190 $resafe_node_name = $node_name;
191 $resafe_node_name =~ s/(\(|\)|\[|\]|\{|\}|\^|\$|\.|\+|\*|\?|\|)/\\$1/g;
192 if ($metavalue =~ m/^$resafe_node_name$/i)
193 {
194 my ($doc_obj,$date) = @{$self->{'reclassify'}->{$doc_OID}};
195
196 ## date appears to not be used in classifier call ####
197
198 # SECTIONFIX? section must include multiple levels, e.g. '1.12'
199 #if ($doc_OID =~ m/^.*\.(\d+)$/)
200 if ($doc_OID =~ m/^[^\.]*\.([\d\.]+)$/)
201 {
202 $self->{'classifiers'}->{$node_name}->{'classifyobj'}
203 # SECTIONFIX? classify can't handle multi-level section
204 #->classify($doc_obj, "Section=$1");
205 ->classify_section($1, $doc_obj, $date);
206 }
207 else
208 {
209 $self->{'classifiers'}->{$node_name}->{'classifyobj'}
210 ->classify($doc_obj);
211 }
212
213 $found = 1;
214 last;
215 }
216 }
217
218 if (!$found)
219 {
220 print $outhandle "Warning: AZCompactList::reclassify ";
221 print $outhandle "could not find sub-node for $metavalue with doc_OID $doc_OID\n";
222 }
223 }
224}
225
2261;
Note: See TracBrowser for help on using the repository browser.