/[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 510 by dpavlin, Mon May 15 17:38:22 2006 UTC revision 560 by dpavlin, Sun Jul 2 14:40:32 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;
 use WebPAC::Normalize::Set;  
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;  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 53  or C<type> from input Line 55  or C<type> from input
55    
56  path to YAML configuration file  path to YAML configuration file
57    
 =item --force-set  
   
 force conversion C<< normalize->path >> in C<config.yml> from  
 C<.xml> to C<.pl>  
   
58  =item --stats  =item --stats
59    
60  disable indexing and dump statistics about field and subfield  disable indexing and dump statistics about field and subfield
61  usage for each input  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    =item --marc-dump
81    
82    Force dump or input and marc record for debugging.
83    
84  =back  =back
85    
86  =cut  =cut
# Line 74  my $clean = 0; Line 92  my $clean = 0;
92  my $config = 'conf/config.yml';  my $config = 'conf/config.yml';
93  my $debug = 0;  my $debug = 0;
94  my $only_filter;  my $only_filter;
 my $force_set = 0;  
95  my $stats = 0;  my $stats = 0;
96    my $validate_path;
97    my ($marc_normalize, $marc_output);
98    my $marc_lint = 1;
99    my $marc_dump = 0;
100    
101  GetOptions(  GetOptions(
102          "limit=i" => \$limit,          "limit=i" => \$limit,
# Line 84  GetOptions( Line 105  GetOptions(
105          "one=s" => \$only_filter,          "one=s" => \$only_filter,
106          "only=s" => \$only_filter,          "only=s" => \$only_filter,
107          "config" => \$config,          "config" => \$config,
108          "debug" => \$debug,          "debug+" => \$debug,
         "force-set" => \$force_set,  
109          "stats" => \$stats,          "stats" => \$stats,
110            "validate=s" => \$validate_path,
111            "marc-normalize=s" => \$marc_normalize,
112            "marc-output=s" => \$marc_output,
113            "marc-lint!" => \$marc_lint,
114            "marc-dump!" => \$marc_dump,
115  );  );
116    
117  $config = LoadFile($config);  $config = LoadFile($config);
118    
119  print "config = ",Dumper($config) if ($debug);  print "config = ",dump($config) if ($debug);
120    
121  die "no databases in config file!\n" unless ($config->{databases});  die "no databases in config file!\n" unless ($config->{databases});
122    
123  my $log = _new WebPAC::Common()->_get_logger();  my $log = _new WebPAC::Common()->_get_logger();
124  $log->info( "-" x 79 );  $log->info( "-" x 79 );
125    
126    my $validate;
127    $validate = new WebPAC::Validate(
128            path => $validate_path,
129    ) if ($validate_path);
130    
131  my $use_indexer = $config->{use_indexer} || 'hyperestraier';  my $use_indexer = $config->{use_indexer} || 'hyperestraier';
132  if ($stats) {  if ($stats) {
133          $log->debug("option --stats disables update of indexing engine...");          $log->debug("option --stats disables update of indexing engine...");
# Line 106  if ($stats) { Line 136  if ($stats) {
136          $log->info("using $use_indexer indexing engine...");          $log->info("using $use_indexer indexing engine...");
137  }  }
138    
139    # disable indexing when creating marc
140    $use_indexer = undef if ($marc_normalize);
141    
142  my $total_rows = 0;  my $total_rows = 0;
143  my $start_t = time();  my $start_t = time();
144    
145    my @links;
146    my $indexer;
147    
148    my $lint = new MARC::Lint if ($marc_lint);
149    
150  while (my ($database, $db_config) = each %{ $config->{databases} }) {  while (my ($database, $db_config) = each %{ $config->{databases} }) {
151    
152          my ($only_database,$only_input) = split(m#/#, $only_filter);          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
153          next if ($only_database && $database !~ m/$only_database/i);          next if ($only_database && $database !~ m/$only_database/i);
154    
         my $indexer;  
   
155          if ($use_indexer) {          if ($use_indexer) {
156                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");
157                  $indexer_config->{database} = $database;                  $indexer_config->{database} = $database;
# Line 152  while (my ($database, $db_config) = each Line 188  while (my ($database, $db_config) = each
188          my $db_path = $config->{webpac}->{db_path} . '/' . $database;          my $db_path = $config->{webpac}->{db_path} . '/' . $database;
189    
190          if ($clean) {          if ($clean) {
191                  $log->info("creating new database $database in $db_path");                  $log->info("creating new database '$database' in $db_path");
192                  rmtree( $db_path ) || $log->warn("can't remove $db_path: $!");                  rmtree( $db_path ) || $log->warn("can't remove $db_path: $!");
193          } else {          } else {
194                  $log->debug("working on $database in $db_path");                  $log->info("working on database '$database' in $db_path");
195          }          }
196    
197          my $db = new WebPAC::Store(          my $db = new WebPAC::Store(
# Line 182  while (my ($database, $db_config) = each Line 218  while (my ($database, $db_config) = each
218    
219          foreach my $input (@inputs) {          foreach my $input (@inputs) {
220    
221                  next if ($only_input && $input->{name} =~ m#$only_input#i || $input->{type} =~ m#$only_input#i);                  next if ($only_input && ($input->{name} !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));
222    
223                  my $type = lc($input->{type});                  my $type = lc($input->{type});
224    
# Line 190  while (my ($database, $db_config) = each Line 226  while (my ($database, $db_config) = each
226    
227                  my $lookup = new WebPAC::Lookup(                  my $lookup = new WebPAC::Lookup(
228                          lookup_file => $input->{lookup},                          lookup_file => $input->{lookup},
229                  );                  ) if ($input->{lookup});
230    
231                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my $input_module = $config->{webpac}->{inputs}->{$type};
232    
233                  $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",
234                            $input->{lookup} ? "lookup '$input->{lookup}'" : ""
235                    );
236    
237                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
238                          module => $input_module,                          module => $input_module,
# Line 210  while (my ($database, $db_config) = each Line 248  while (my ($database, $db_config) = each
248                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
249                          path => $input->{path},                          path => $input->{path},
250                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
251                            %{ $input },
252                  );                  );
253    
254                  my $n = new WebPAC::Normalize::XML(                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?
255                  #       filter => { 'foo' => sub { shift } },                          @{ $input->{normalize} } : ( $input->{normalize} );
                         db => $db,  
                         lookup_regex => $lookup->regex,  
                         lookup => $lookup,  
                         prefix => $input->{name},  
                 );  
   
                 my $rules;  
                 my $normalize_path = $input->{normalize}->{path};  
256    
257                  if ($force_set) {                  if ($marc_normalize) {
258                          my $new_norm_path = $normalize_path;                          @norm_array = ( {
259                          $new_norm_path =~ s/\.xml$/.pl/;                                  path => $marc_normalize,
260                          if (-e $new_norm_path) {                                  output => $marc_output || 'out/marc/' . $database . '-' . $input->{name} . '.marc',
261                                  $log->debug("--force-set replaced $normalize_path with $new_norm_path");                          } );
                                 $normalize_path = $new_norm_path;  
                         } else {  
                                 $log->debug("--force-set failed on $new_norm_path, fallback to $normalize_path");  
                         }  
262                  }                  }
263    
264                  if ($normalize_path =~ m/\.xml$/i) {                  foreach my $normalize (@norm_array) {
                         $n->open(  
                                 tag => $input->{normalize}->{tag},  
                                 xml_file => $normalize_path,  
                         );  
                 } elsif ($normalize_path =~ m/\.(?:yml|yaml)$/i) {  
                         $n->open_yaml(  
                                 path => $normalize_path,  
                                 tag => $input->{normalize}->{tag},  
                         );  
                 } elsif ($normalize_path =~ m/\.(?:pl)$/i) {  
                         $n = undef;  
                         $log->info("using WebPAC::Normalize::Set to process $normalize_path");  
                         $rules = read_file( $normalize_path ) or die "can't open $normalize_path: $!";  
                 }  
265    
266                  foreach my $pos ( 0 ... $input_db->size ) {                          my $normalize_path = $normalize->{path} || $log->logdie("can't find normalize path in config");
267    
268                          my $row = $input_db->fetch || next;                          $log->logdie("Found '$normalize_path' as normalization file which isn't supported any more!") unless ( $normalize_path =~ m!\.pl$!i );
269    
270                          my $mfn = $row->{'000'}->[0];                          my $rules = read_file( $normalize_path ) or die "can't open $normalize_path: $!";
271    
272                          if (! $mfn || $mfn !~ m#^\d+$#) {                          $log->info("Using $normalize_path for normalization...");
273                                  $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");  
274                                  $mfn = $pos;                          my $marc_fh;
275                                  push @{ $row->{'000'} }, $pos;                          if (my $path = $normalize->{output}) {
276                                    open($marc_fh, '>', $path) ||
277                                            $log->logdie("can't open MARC output $path: $!");
278    
279                                    $log->info("Creating MARC export file $path", $marc_lint ? ' (with lint)' : '', "\n");
280                          }                          }
281    
282                                                            # reset position in database
283                          my $ds;                          $input_db->seek(1);
284                          if ($n) {  
285                                  $ds = $n->data_structure($row);                          foreach my $pos ( 0 ... $input_db->size ) {
286                          } else {  
287                                  $ds = WebPAC::Normalize::Set::data_structure(                                  my $row = $input_db->fetch || next;
288    
289                                    my $mfn = $row->{'000'}->[0];
290    
291                                    if (! $mfn || $mfn !~ m#^\d+$#) {
292                                            $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");
293                                            $mfn = $pos;
294                                            push @{ $row->{'000'} }, $pos;
295                                    }
296    
297    
298                                    if ($validate) {
299                                            my @errors = $validate->validate_errors( $row );
300                                            $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);
301                                    }
302    
303                                    my $ds = WebPAC::Normalize::data_structure(
304                                          row => $row,                                          row => $row,
305                                          rules => $rules,                                          rules => $rules,
306                                          lookup => $lookup->lookup_hash,                                          lookup => $lookup ? $lookup->lookup_hash : undef,
307                                            marc_encoding => 'utf-8',
308                                  );                                  );
309    
310                                  $db->save_ds(                                  $db->save_ds(
# Line 278  while (my ($database, $db_config) = each Line 312  while (my ($database, $db_config) = each
312                                          ds => $ds,                                          ds => $ds,
313                                          prefix => $input->{name},                                          prefix => $input->{name},
314                                  ) if ($ds && !$stats);                                  ) if ($ds && !$stats);
315    
316                                    $indexer->add(
317                                            id => $input->{name} . "/" . $mfn,
318                                            ds => $ds,
319                                            type => $config->{$use_indexer}->{type},
320                                    ) if ($indexer && $ds);
321    
322                                    if ($marc_fh) {
323                                            my $marc = new MARC::Record;
324                                            $marc->encoding( 'utf-8' );
325                                            my @marc_fields = WebPAC::Normalize::_get_marc_fields();
326                                            if (! @marc_fields) {
327                                                    $log->warn("MARC record $mfn is empty, skipping");
328                                            } else {
329                                                    $marc->add_fields( @marc_fields );
330    
331                                                    if ($marc_lint) {
332                                                            $lint->check_record( $marc );
333                                                            my $err = join( "\n", $lint->warnings );
334                                                            $log->error("MARC lint detected warning on MFN $mfn\n",
335                                                                    "Original imput row: ",dump($row), "\n",
336                                                                    "Normalized MARC row: ",dump(@marc_fields), "\n",
337                                                                    "MARC lint warnings: ",$err,"\n"
338                                                            ) if ($err);
339                                                    }
340    
341                                                    if ($marc_dump) {
342                                                            $log->info("MARC record on MFN $mfn\n",
343                                                                    "Original imput row: ",dump($row), "\n",
344                                                                    "Normalized MARC row: ",dump(@marc_fields), "\n",
345                                                            );
346                                                    }
347    
348                                                    print $marc_fh $marc->as_usmarc;
349                                            }
350                                    }
351    
352                                    $total_rows++;
353                          }                          }
354    
355                          $indexer->add(                          $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);
                                 id => $input->{name} . "/" . $mfn,  
                                 ds => $ds,  
                                 type => $config->{$use_indexer}->{type},  
                         ) if ($indexer);  
356    
357                          $total_rows++;                          # close MARC file
358                  }                          close($marc_fh) if ($marc_fh);
359    
360                  $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);                  }
361    
362          };          }
363    
364          eval { $indexer->finish } if ($indexer && $indexer->can('finish'));          eval { $indexer->finish } if ($indexer && $indexer->can('finish'));
365    
366          my $dt = time() - $start_t;          my $dt = time() - $start_t;
367          $log->info("$total_rows records indexed in " .          $log->info("$total_rows records ", $indexer ? "indexed " : "",
368                  sprintf("%.2f sec [%.2f rec/sec]",                  sprintf("in %.2f sec [%.2f rec/sec]",
369                          $dt, ($total_rows / $dt)                          $dt, ($total_rows / $dt)
370                  )                  )
371          );          );
# Line 305  while (my ($database, $db_config) = each Line 373  while (my ($database, $db_config) = each
373          #          #
374          # add Hyper Estraier links to other databases          # add Hyper Estraier links to other databases
375          #          #
376          if (ref($db_config->{links}) eq 'ARRAY') {          if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
377                  foreach my $link (@{ $db_config->{links} }) {                  foreach my $link (@{ $db_config->{links} }) {
378                          if ($use_indexer eq 'hyperestraier') {                          if ($use_indexer eq 'hyperestraier') {
379                                  $log->info("adding link $database -> $link->{to} [$link->{credit}]");                                  $log->info("saving link $database -> $link->{to} [$link->{credit}]");
380                                  $indexer->add_link(                                  push @links, {
381                                          from => $database,                                          from => $database,
382                                          to => $link->{to},                                          to => $link->{to},
383                                          credit => $link->{credit},                                          credit => $link->{credit},
384                                  );                                  };
385                          } else {                          } else {
386                                  $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");                                  $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
387                          }                          }
# Line 322  while (my ($database, $db_config) = each Line 390  while (my ($database, $db_config) = each
390    
391  }  }
392    
393    foreach my $link (@links) {
394            $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");
395            $indexer->add_link( %{ $link } );
396    }

Legend:
Removed from v.510  
changed lines
  Added in v.560

  ViewVC Help
Powered by ViewVC 1.1.26