/[webpac2]/trunk/run.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/run.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 430 by dpavlin, Mon Apr 17 15:09:54 2006 UTC revision 558 by dpavlin, Sun Jul 2 10:27:06 2006 UTC
# Line 4  use strict; Line 4  use strict;
4    
5  use Cwd qw/abs_path/;  use Cwd qw/abs_path/;
6  use File::Temp qw/tempdir/;  use File::Temp qw/tempdir/;
 use Data::Dumper;  
7  use lib './lib';  use lib './lib';
8    
9  use WebPAC::Common 0.02;  use WebPAC::Common 0.02;
10  use WebPAC::Lookup;  use WebPAC::Lookup;
11  use WebPAC::Input 0.03;  use WebPAC::Input 0.03;
12  use WebPAC::Store 0.03;  use WebPAC::Store 0.03;
13  use WebPAC::Normalize::XML;  use WebPAC::Normalize;
14  use WebPAC::Output::TT;  use WebPAC::Output::TT;
15    use WebPAC::Validate;
16  use YAML qw/LoadFile/;  use YAML qw/LoadFile/;
17  use Getopt::Long;  use Getopt::Long;
18  use File::Path;  use File::Path;
19  use Time::HiRes qw/time/;  use Time::HiRes qw/time/;
20    use File::Slurp;
21    use MARC::Record 2.0;   # need 2.0 for utf-8 encoding see marcpm.sf.net
22    use MARC::Lint;
23    use Data::Dump qw/dump/;
24    
25  =head1 NAME  =head1 NAME
26    
# Line 40  limit loading to 100 records Line 44  limit loading to 100 records
44    
45  remove database and Hyper Estraier index before indexing  remove database and Hyper Estraier index before indexing
46    
47  =item --only=database_name  =item --only=database_name/input_filter
48    
49  reindex just single database (legacy name is --one)  reindex just single database (legacy name is --one)
50    
51    C</input_filter> is optional part which can be C<name>
52    or C<type> from input
53    
54  =item --config conf/config.yml  =item --config conf/config.yml
55    
56  path to YAML configuration file  path to YAML configuration file
57    
58    =item --stats
59    
60    disable indexing and dump statistics about field and subfield
61    usage for each input
62    
63    =item --validate path/to/validation_file
64    
65    turn on extra validation of imput records, see L<WebPAC::Validation>
66    
67    =item --marc-normalize conf/normalize/mapping.pl
68    
69    This option specifies normalisation file for MARC creation
70    
71    =item --marc-output out/marc/test.marc
72    
73    Optional path to output file
74    
75    =item --marc-lint
76    
77    By default turned on if C<--marc-normalize> is used. You can disable lint
78    messages with C<--no-marc-lint>.
79    
80  =back  =back
81    
82  =cut  =cut
# Line 58  my $limit; Line 87  my $limit;
87  my $clean = 0;  my $clean = 0;
88  my $config = 'conf/config.yml';  my $config = 'conf/config.yml';
89  my $debug = 0;  my $debug = 0;
90  my $only_db_name;  my $only_filter;
91    my $stats = 0;
92    my $validate_path;
93    my ($marc_normalize, $marc_output);
94    my $marc_lint = 1;
95    
96  GetOptions(  GetOptions(
97          "limit=i" => \$limit,          "limit=i" => \$limit,
98          "offset=i" => \$offset,          "offset=i" => \$offset,
99          "clean" => \$clean,          "clean" => \$clean,
100          "one=s" => \$only_db_name,          "one=s" => \$only_filter,
101          "only=s" => \$only_db_name,          "only=s" => \$only_filter,
102          "config" => \$config,          "config" => \$config,
103          "debug" => \$debug,          "debug" => \$debug,
104            "stats" => \$stats,
105            "validate=s" => \$validate_path,
106            "marc-normalize=s" => \$marc_normalize,
107            "marc-output=s" => \$marc_output,
108            "marc-lint!" => \$marc_lint,
109  );  );
110    
111  $config = LoadFile($config);  $config = LoadFile($config);
112    
113  print "config = ",Dumper($config) if ($debug);  print "config = ",dump($config) if ($debug);
114    
115  die "no databases in config file!\n" unless ($config->{databases});  die "no databases in config file!\n" unless ($config->{databases});
116    
117    my $log = _new WebPAC::Common()->_get_logger();
118    $log->info( "-" x 79 );
119    
120    my $validate;
121    $validate = new WebPAC::Validate(
122            path => $validate_path,
123    ) if ($validate_path);
124    
125  my $use_indexer = $config->{use_indexer} || 'hyperestraier';  my $use_indexer = $config->{use_indexer} || 'hyperestraier';
126    if ($stats) {
127            $log->debug("option --stats disables update of indexing engine...");
128            $use_indexer = undef;
129    } else {
130            $log->info("using $use_indexer indexing engine...");
131    }
132    
133    # disable indexing when creating marc
134    $use_indexer = undef if ($marc_normalize);
135    
136  my $total_rows = 0;  my $total_rows = 0;
137  my $start_t = time();  my $start_t = time();
138    
139  while (my ($database, $db_config) = each %{ $config->{databases} }) {  my @links;
140    my $indexer;
         next if ($only_db_name && $database !~ m/$only_db_name/i);  
141    
142          my $log = _new WebPAC::Common()->_get_logger();  my $lint = new MARC::Lint if ($marc_lint);
143    
144          my $indexer;  while (my ($database, $db_config) = each %{ $config->{databases} }) {
145    
146          if ($use_indexer eq 'hyperestraier') {          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
147            next if ($only_database && $database !~ m/$only_database/i);
148    
149                  #          if ($use_indexer) {
150                  # open Hyper Estraier database                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");
151                  #                  $indexer_config->{database} = $database;
152                    $indexer_config->{clean} = $clean;
153                    $indexer_config->{label} = $db_config->{name};
154    
155                    if ($use_indexer eq 'hyperestraier') {
156    
157                            # open Hyper Estraier database
158                            use WebPAC::Output::Estraier '0.10';
159                            $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
160                    
161                    } elsif ($use_indexer eq 'kinosearch') {
162    
163                            # open KinoSearch
164                            use WebPAC::Output::KinoSearch;
165                            $indexer_config->{clean} = 1 unless (-e $indexer_config->{index_path});
166                            $indexer = new WebPAC::Output::KinoSearch( %{ $indexer_config } );
167    
168                  use WebPAC::Output::Estraier '0.10';                  } else {
169                  my $est_config = $config->{hyperestraier} || $log->logdie("can't find 'hyperestraier' part in confguration");                          $log->logdie("unknown use_indexer: $use_indexer");
170                  $est_config->{database} = $database;                  }
                 $est_config->{clean} = $clean;  
                 $est_config->{label} = $db_config->{name};  
171    
172                  $indexer = new WebPAC::Output::Estraier( %{ $est_config } );                  $log->logide("can't continue without valid indexer") unless ($indexer);
         } else {  
                 $log->logdie("unknown use_indexer: $use_indexer");  
173          }          }
174    
         $log->logide("can't continue without valid indexer") unless ($indexer);  
175    
176          #          #
177          # now WebPAC::Store          # now WebPAC::Store
# Line 116  while (my ($database, $db_config) = each Line 182  while (my ($database, $db_config) = each
182          my $db_path = $config->{webpac}->{db_path} . '/' . $database;          my $db_path = $config->{webpac}->{db_path} . '/' . $database;
183    
184          if ($clean) {          if ($clean) {
185                  $log->info("creating new database $database in $db_path");                  $log->info("creating new database '$database' in $db_path");
186                  rmtree( $db_path ) || $log->warn("can't remove $db_path: $!");                  rmtree( $db_path ) || $log->warn("can't remove $db_path: $!");
187          } else {          } else {
188                  $log->debug("working on $database in $db_path");                  $log->info("working on database '$database' in $db_path");
189          }          }
190    
191          my $db = new WebPAC::Store(          my $db = new WebPAC::Store(
# Line 146  while (my ($database, $db_config) = each Line 212  while (my ($database, $db_config) = each
212    
213          foreach my $input (@inputs) {          foreach my $input (@inputs) {
214    
215                    next if ($only_input && ($input->{name} !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));
216    
217                  my $type = lc($input->{type});                  my $type = lc($input->{type});
218    
219                  die "I know only how to handle input types ", join(",", @supported_inputs), " not '$type'!\n" unless (grep(/$type/, @supported_inputs));                  die "I know only how to handle input types ", join(",", @supported_inputs), " not '$type'!\n" unless (grep(/$type/, @supported_inputs));
220    
221                  my $lookup = new WebPAC::Lookup(                  my $lookup = new WebPAC::Lookup(
222                          lookup_file => $input->{lookup},                          lookup_file => $input->{lookup},
223                  );                  ) if ($input->{lookup});
224    
225                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my $input_module = $config->{webpac}->{inputs}->{$type};
226    
227                  $log->info("working on input '$input->{path}' [$input->{type}] using $input_module lookup '$input->{lookup}'");                  $log->info("working on input '$input->{name}' in $input->{path} [type: $input->{type}] using $input_module",
228                            $input->{lookup} ? "lookup '$input->{lookup}'" : ""
229                    );
230    
231                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
232                          module => $input_module,                          module => $input_module,
# Line 165  while (my ($database, $db_config) = each Line 235  while (my ($database, $db_config) = each
235                          offset => $offset,                          offset => $offset,
236                          lookup => $lookup,                          lookup => $lookup,
237                          recode => $input->{recode},                          recode => $input->{recode},
238                            stats => $stats,
239                  );                  );
240                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
241    
242                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
243                          path => $input->{path},                          path => $input->{path},
244                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
245                            %{ $input },
246                  );                  );
247    
248                  my $n = new WebPAC::Normalize::XML(                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?
249                  #       filter => { 'foo' => sub { shift } },                          @{ $input->{normalize} } : ( $input->{normalize} );
                         db => $db,  
                         lookup_regex => $lookup->regex,  
                         lookup => $lookup,  
                         prefix => $input->{name},  
                 );  
   
                 my $normalize_path = $input->{normalize}->{path};  
250    
251                  if ($normalize_path =~ m/\.xml$/i) {                  if ($marc_normalize) {
252                          $n->open(                          @norm_array = ( {
253                                  tag => $input->{normalize}->{tag},                                  path => $marc_normalize,
254                                  xml_file => $input->{normalize}->{path},                                  output => $marc_output || 'out/marc/' . $database . '-' . $input->{name} . '.marc',
255                          );                          } );
                 } elsif ($normalize_path =~ m/\.(?:yml|yaml)$/i) {  
                         $n->open_yaml(  
                                 path => $normalize_path,  
                                 tag => $input->{normalize}->{tag},  
                         );  
256                  }                  }
257    
258                  foreach my $pos ( 0 ... $input_db->size ) {                  foreach my $normalize (@norm_array) {
259    
260                            my $normalize_path = $normalize->{path} || $log->logdie("can't find normalize path in config");
261    
262                            $log->logdie("Found '$normalize_path' as normalization file which isn't supported any more!") unless ( $normalize_path =~ m!\.pl$!i );
263    
264                            my $rules = read_file( $normalize_path ) or die "can't open $normalize_path: $!";
265    
266                            $log->info("Using $normalize_path for normalization...");
267    
268                            my $marc_fh;
269                            if (my $path = $normalize->{output}) {
270                                    open($marc_fh, '>', $path) ||
271                                            $log->logdie("can't open MARC output $path: $!");
272    
273                                    $log->info("Creating MARC export file $path", $marc_lint ? ' (with lint)' : '', "\n");
274                            }
275    
276                            # reset position in database
277                            $input_db->seek(1);
278    
279                            foreach my $pos ( 0 ... $input_db->size ) {
280    
281                                    my $row = $input_db->fetch || next;
282    
283                          my $row = $input_db->fetch || next;                                  my $mfn = $row->{'000'}->[0];
284    
285                          my $mfn = $row->{'000'}->[0];                                  if (! $mfn || $mfn !~ m#^\d+$#) {
286                                            $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");
287                                            $mfn = $pos;
288                                            push @{ $row->{'000'} }, $pos;
289                                    }
290    
291                          if (! $mfn || $mfn !~ m#^\d+$#) {  
292                                  $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");                                  if ($validate) {
293                                  $mfn = $pos;                                          my @errors = $validate->validate_errors( $row );
294                                  push @{ $row->{'000'} }, $pos;                                          $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);
295                                    }
296    
297                                            
298                                    my $ds = WebPAC::Normalize::data_structure(
299                                            row => $row,
300                                            rules => $rules,
301                                            lookup => $lookup ? $lookup->lookup_hash : undef,
302                                            marc_encoding => 'utf-8',
303                                    );
304    
305                                    $db->save_ds(
306                                            id => $mfn,
307                                            ds => $ds,
308                                            prefix => $input->{name},
309                                    ) if ($ds && !$stats);
310    
311                                    $indexer->add(
312                                            id => $input->{name} . "/" . $mfn,
313                                            ds => $ds,
314                                            type => $config->{$use_indexer}->{type},
315                                    ) if ($indexer && $ds);
316    
317                                    if ($marc_fh) {
318                                            my $marc = new MARC::Record;
319                                            $marc->encoding( 'utf-8' );
320                                            my @marc_fields = WebPAC::Normalize::_get_marc_fields();
321                                            if (! @marc_fields) {
322                                                    $log->warn("MARC record $mfn is empty, skipping");
323                                            } else {
324                                                    $marc->add_fields( @marc_fields );
325                                                    if ($marc_lint) {
326                                                            $lint->check_record( $marc );
327                                                            my $err = join( "\n", $lint->warnings );
328                                                            $log->error("MARC lint detected warning on MFN $mfn\n",
329                                                                    "Original imput row: ",dump($row), "\n",
330                                                                    "Normalized MARC row: ",dump(@marc_fields), "\n",
331                                                                    "MARC lint warnings: ",$err,"\n"
332                                                            ) if ($err);
333                                                    }
334                                                    print $marc_fh $marc->as_usmarc;
335                                            }
336                                    }
337    
338                                    $total_rows++;
339                          }                          }
340    
341                          my $ds = $n->data_structure($row);                          $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);
342    
343                          $indexer->add(                          # close MARC file
344                                  id => $input->{name} . "/" . $mfn,                          close($marc_fh) if ($marc_fh);
                                 ds => $ds,  
                                 type => $config->{$use_indexer}->{type},  
                         );  
345    
                         $total_rows++;  
346                  }                  }
347    
348          };          }
349    
350            eval { $indexer->finish } if ($indexer && $indexer->can('finish'));
351    
352          my $dt = time() - $start_t;          my $dt = time() - $start_t;
353          $log->info("$total_rows records indexed in " .          $log->info("$total_rows records ", $indexer ? "indexed " : "",
354                  sprintf("%.2f sec [%.2f rec/sec]",                  sprintf("in %.2f sec [%.2f rec/sec]",
355                          $dt, ($total_rows / $dt)                          $dt, ($total_rows / $dt)
356                  )                  )
357          );          );
358    
359          if ($use_indexer eq 'hyperestraier') {          #
360                  #          # add Hyper Estraier links to other databases
361                  # add Hyper Estraier links to other databases          #
362                  #          if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
363                  if (ref($db_config->{links}) eq 'ARRAY') {                  foreach my $link (@{ $db_config->{links} }) {
364                          foreach my $link (@{ $db_config->{links} }) {                          if ($use_indexer eq 'hyperestraier') {
365                                  $log->info("adding link $database -> $link->{to} [$link->{credit}]");                                  $log->info("saving link $database -> $link->{to} [$link->{credit}]");
366                                  $indexer->add_link(                                  push @links, {
367                                          from => $database,                                          from => $database,
368                                          to => $link->{to},                                          to => $link->{to},
369                                          credit => $link->{credit},                                          credit => $link->{credit},
370                                  );                                  };
371                            } else {
372                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
373                          }                          }
374                  }                  }
         } else {  
                 $log->warn("links not implemented for $use_indexer");  
375          }          }
376    
377  }  }
378    
379    foreach my $link (@links) {
380            $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");
381            $indexer->add_link( %{ $link } );
382    }

Legend:
Removed from v.430  
changed lines
  Added in v.558

  ViewVC Help
Powered by ViewVC 1.1.26