/[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 606 by dpavlin, Tue Aug 1 13:59:47 2006 UTC revision 713 by dpavlin, Tue Sep 26 12:42:49 2006 UTC
# Line 7  use File::Temp qw/tempdir/; Line 7  use File::Temp qw/tempdir/;
7  use lib './lib';  use lib './lib';
8    
9  use WebPAC::Common 0.02;  use WebPAC::Common 0.02;
10  use WebPAC::Lookup 0.03;  use WebPAC::Parser 0.04;
11  use WebPAC::Input 0.07;  use WebPAC::Input 0.13;
12  use WebPAC::Store 0.03;  use WebPAC::Store 0.11;
13  use WebPAC::Normalize 0.11;  use WebPAC::Normalize 0.11;
14  use WebPAC::Output::TT;  use WebPAC::Output::TT;
15  use WebPAC::Validate;  use WebPAC::Validate 0.06;
16  use WebPAC::Output::MARC;  use WebPAC::Output::MARC;
17  use YAML qw/LoadFile/;  use WebPAC::Config;
18  use Getopt::Long;  use Getopt::Long;
19  use File::Path;  use File::Path;
20  use Time::HiRes qw/time/;  use Time::HiRes qw/time/;
# Line 60  path to YAML configuration file Line 60  path to YAML configuration file
60    
61  =item --stats  =item --stats
62    
63  disable indexing and dump statistics about field and subfield  disable indexing, modify_* in configuration and dump statistics about field
64  usage for each input  and subfield usage for each input
65    
66  =item --validate path/to/validation_file  =item --validate path/to/validation_file
67    
# Line 89  Force dump or input and marc record for Line 89  Force dump or input and marc record for
89  Run databases in parallel (aproximatly same as number of processors in  Run databases in parallel (aproximatly same as number of processors in
90  machine if you want to use full load)  machine if you want to use full load)
91    
92    =item --only-links
93    
94    Create just links
95    
96    =item --merge
97    
98    Create merged index of databases which have links
99    
100  =back  =back
101    
102  =cut  =cut
# Line 97  my $offset; Line 105  my $offset;
105  my $limit;  my $limit;
106    
107  my $clean = 0;  my $clean = 0;
108  my $config = 'conf/config.yml';  my $config_path;
109  my $debug = 0;  my $debug = 0;
110  my $only_filter;  my $only_filter;
111  my $stats = 0;  my $stats = 0;
# Line 105  my $validate_path; Line 113  my $validate_path;
113  my ($marc_normalize, $marc_output);  my ($marc_normalize, $marc_output);
114  my $marc_lint = 1;  my $marc_lint = 1;
115  my $marc_dump = 0;  my $marc_dump = 0;
   
116  my $parallel = 0;  my $parallel = 0;
117    my $only_links = 0;
118    my $merge = 0;
119    
120    my $log = _new WebPAC::Common()->_get_logger();
121    
122  GetOptions(  GetOptions(
123          "limit=i" => \$limit,          "limit=i" => \$limit,
# Line 114  GetOptions( Line 125  GetOptions(
125          "clean" => \$clean,          "clean" => \$clean,
126          "one=s" => \$only_filter,          "one=s" => \$only_filter,
127          "only=s" => \$only_filter,          "only=s" => \$only_filter,
128          "config" => \$config,          "config" => \$config_path,
129          "debug+" => \$debug,          "debug+" => \$debug,
130          "stats" => \$stats,          "stats" => \$stats,
131          "validate=s" => \$validate_path,          "validate=s" => \$validate_path,
# Line 123  GetOptions( Line 134  GetOptions(
134          "marc-lint!" => \$marc_lint,          "marc-lint!" => \$marc_lint,
135          "marc-dump!" => \$marc_dump,          "marc-dump!" => \$marc_dump,
136          "parallel=i" => \$parallel,          "parallel=i" => \$parallel,
137            "only-links!" => \$only_links,
138            "merge" => \$merge,
139  );  );
140    
141  $config = LoadFile($config);  my $config = new WebPAC::Config( path => $config_path );
142    
143  print "config = ",dump($config) if ($debug);  #print "config = ",dump($config) if ($debug);
144    
145  die "no databases in config file!\n" unless ($config->{databases});  die "no databases in config file!\n" unless ($config->databases);
146    
 my $log = _new WebPAC::Common()->_get_logger();  
147  $log->info( "-" x 79 );  $log->info( "-" x 79 );
148    
149    
150    my $estcmd_fh;
151    my $estcmd_path = './estcmd-merge.sh';
152    if ($merge) {
153            open($estcmd_fh, '>', $estcmd_path) || $log->logdie("can't open $estcmd_path: $!");
154            print $estcmd_fh 'cd /data/estraier/_node/ || exit 1',$/;
155            print $estcmd_fh 'sudo /etc/init.d/hyperestraier stop',$/;
156            $log->info("created merge batch file $estcmd_path");
157    }
158    
159    
160  my $validate;  my $validate;
161  $validate = new WebPAC::Validate(  $validate = new WebPAC::Validate(
162          path => $validate_path,          path => $validate_path,
163  ) if ($validate_path);  ) if ($validate_path);
164    
165  my $use_indexer = $config->{use_indexer} || 'hyperestraier';  
166    my $use_indexer = $config->use_indexer;
167  if ($stats) {  if ($stats) {
168          $log->debug("option --stats disables update of indexing engine...");          $log->debug("option --stats disables update of indexing engine...");
169          $use_indexer = undef;          $use_indexer = undef;
# Line 150  if ($stats) { Line 174  if ($stats) {
174  # disable indexing when creating marc  # disable indexing when creating marc
175  $use_indexer = undef if ($marc_normalize);  $use_indexer = undef if ($marc_normalize);
176    
177    # parse normalize files and create source files for lookup and normalization
178    
179    my $parser = new WebPAC::Parser( config => $config );
180    
181  my $total_rows = 0;  my $total_rows = 0;
182  my $start_t = time();  my $start_t = time();
183    
184  my @links;  my @links;
 my $indexer;  
185    
186  if ($parallel) {  if ($parallel) {
187          $log->info("Using $parallel processes for speedup");          $log->info("Using $parallel processes for speedup");
188          Proc::Queue::size($parallel);          Proc::Queue::size($parallel);
189  }  }
190    
191  while (my ($database, $db_config) = each %{ $config->{databases} }) {  sub create_ds_config {
192            my ($db_config, $database, $input, $mfn) = @_;
193            my $c = dclone( $db_config );
194            $c->{_} = $database || $log->logconfess("need database");
195            $c->{_mfn} = $mfn || $log->logconfess("need mfn");
196            $c->{input} = $input || $log->logconfess("need input");
197            return $c;
198    }
199    
200    while (my ($database, $db_config) = each %{ $config->databases }) {
201    
202          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
203          next if ($only_database && $database !~ m/$only_database/i);          next if ($only_database && $database !~ m/$only_database/i);
# Line 175  while (my ($database, $db_config) = each Line 211  while (my ($database, $db_config) = each
211                  }                  }
212          }          }
213    
214            my $indexer;
215          if ($use_indexer) {          if ($use_indexer) {
216                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");  
217                    my $cfg_name = $use_indexer;
218                    $cfg_name =~ s/\-.*$//;
219    
220                    my $indexer_config = $config->get( $cfg_name ) || $log->logdie("can't find '$cfg_name' part in confguration");
221                  $indexer_config->{database} = $database;                  $indexer_config->{database} = $database;
222                  $indexer_config->{clean} = $clean;                  $indexer_config->{clean} = $clean;
223                  $indexer_config->{label} = $db_config->{name};                  $indexer_config->{label} = $db_config->{name};
224    
225                    # force clean if database has links
226                    $indexer_config->{clean} = 1 if ($db_config->{links});
227    
228                  if ($use_indexer eq 'hyperestraier') {                  if ($use_indexer eq 'hyperestraier') {
229    
230                          # open Hyper Estraier database                          # open Hyper Estraier database
231                          use WebPAC::Output::Estraier '0.10';                          use WebPAC::Output::Estraier '0.10';
232                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
233                                    
234                    } elsif ($use_indexer eq 'hyperestraier-native') {
235    
236                            # open Hyper Estraier database
237                            use WebPAC::Output::EstraierNative;
238                            $indexer = new WebPAC::Output::EstraierNative( %{ $indexer_config } );
239    
240                  } elsif ($use_indexer eq 'kinosearch') {                  } elsif ($use_indexer eq 'kinosearch') {
241    
242                          # open KinoSearch                          # open KinoSearch
# Line 203  while (my ($database, $db_config) = each Line 253  while (my ($database, $db_config) = each
253    
254    
255          #          #
256            # store Hyper Estraier links to other databases
257            #
258            if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
259                    foreach my $link (@{ $db_config->{links} }) {
260                            if ($use_indexer eq 'hyperestraier') {
261                                    if ($merge) {
262                                            print $estcmd_fh 'sudo -u www-data estcmd merge ' . $database . ' ' . $link->{to},$/;
263                                    } else {
264                                            $log->info("saving link $database -> $link->{to} [$link->{credit}]");
265                                            push @links, sub {
266                                                    $log->info("adding link $database -> $link->{to} [$link->{credit}]");
267                                                    $indexer->add_link(
268                                                            from => $database,
269                                                            to => $link->{to},
270                                                            credit => $link->{credit},
271                                                    );
272                                            };
273                                    }
274                            } else {
275                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
276                            }
277                    }
278            }
279            next if ($only_links);
280    
281    
282            #
283          # now WebPAC::Store          # now WebPAC::Store
284          #          #
285          my $abs_path = abs_path($0);          my $abs_path = abs_path($0);
286          $abs_path =~ s#/[^/]*$#/#;          $abs_path =~ s#/[^/]*$#/#;
287    
288          my $db_path = $config->{webpac}->{db_path} . '/' . $database;          my $db_path = $config->webpac('db_path');
289    
290          if ($clean) {          if ($clean) {
291                  $log->info("creating new database '$database' in $db_path");                  $log->info("creating new database '$database' in $db_path");
# Line 217  while (my ($database, $db_config) = each Line 294  while (my ($database, $db_config) = each
294                  $log->info("working on database '$database' in $db_path");                  $log->info("working on database '$database' in $db_path");
295          }          }
296    
297          my $db = new WebPAC::Store(          my $store = new WebPAC::Store(
298                  path => $db_path,                  path => $db_path,
                 database => $database,  
299                  debug => $debug,                  debug => $debug,
300          );          );
301    
# Line 237  while (my ($database, $db_config) = each Line 313  while (my ($database, $db_config) = each
313                  $log->info("database $database doesn't have inputs defined");                  $log->info("database $database doesn't have inputs defined");
314          }          }
315    
         my @supported_inputs = keys %{ $config->{webpac}->{inputs} };  
   
316          foreach my $input (@inputs) {          foreach my $input (@inputs) {
317    
318                  next if ($only_input && ($input->{name} !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));                  my $input_name = $input->{name} || $log->logdie("input without a name isn't valid: ",dump($input));
319    
320                    next if ($only_input && ($input_name !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));
321    
322                  my $type = lc($input->{type});                  my $type = lc($input->{type});
323    
324                  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(",", $config->webpac('inputs') ), " not '$type'!\n" unless (grep(/$type/, $config->webpac('inputs')));
325    
326                  my $lookup;                  my $input_module = $config->webpac('inputs')->{$type};
                 if ($input->{lookup}) {  
                         $lookup = new WebPAC::Lookup(  
                                 lookup_file => $input->{lookup},  
                         );  
                         delete( $input->{lookup} );  
                 }  
327    
328                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my @lookups = $parser->have_lookup_create($database, $input);
329    
330                  $log->info("working on input '$input->{name}' in $input->{path} [type: $input->{type}] using $input_module",                  $log->info("working on input '$input_name' in $input->{path} [type: $input->{type}] using $input_module",
331                          $input->{lookup} ? "lookup '$input->{lookup}'" : ""                          @lookups ? " creating lookups: ".join(", ", @lookups) : ""
332                  );                  );
333    
334                    if ($stats) {
335                            # disable modification of records if --stats is in use
336                            delete($input->{modify_records});
337                            delete($input->{modify_file});
338                    }
339    
340                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
341                          module => $input_module,                          module => $input_module,
342                          encoding => $config->{webpac}->{webpac_encoding},                          encoding => $config->webpac('webpac_encoding'),
343                          limit => $limit || $input->{limit},                          limit => $limit || $input->{limit},
344                          offset => $offset,                          offset => $offset,
                         lookup_coderef => sub {  
                                 my $rec = shift || return;  
                                 $lookup->add( $rec );  
                         },  
345                          recode => $input->{recode},                          recode => $input->{recode},
346                          stats => $stats,                          stats => $stats,
347                          modify_records => $input->{modify_records},                          modify_records => $input->{modify_records},
348                            modify_file => $input->{modify_file},
349                  );                  );
350                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
351    
352                    if (defined( $input->{lookup} )) {
353                            $log->warn("$database/$input_name has depriciated lookup definition, removing it...");
354                            delete( $input->{lookup} );
355                    }
356    
357                    my $lookup;
358                    my $lookup_coderef;
359    
360                    if (@lookups) {
361    
362                            my $rules = $parser->lookup_create_rules($database, $input) || $log->logdie("no rules found for $database/$input");
363    
364                            $lookup_coderef = sub {
365                                    my $rec = shift || die "need rec!";
366                                    my $mfn = $rec->{'000'}->[0] || die "need mfn in 000";
367    
368                                    WebPAC::Normalize::data_structure(
369                                            row => $rec,
370                                            rules => $rules,
371                                            lookup => $lookup,
372                                            config => create_ds_config( $db_config, $database, $input, $mfn ),
373                                    );
374    
375                                    warn "current lookup = ", dump($lookup) if ($lookup);
376                            };
377    
378                            WebPAC::Normalize::_set_lookup( undef );
379    
380                            $log->debug("created lookup_coderef using:\n$rules");
381    
382                    };
383    
384                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
385                          path => $input->{path},                          path => $input->{path},
386                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
387                            lookup_coderef => $lookup_coderef,
388                          %{ $input },                          %{ $input },
389                  );                  );
390    
391                    my $lookup_data = WebPAC::Normalize::_get_lookup();
392    
393                    if (defined( $lookup_data->{$database}->{$input_name} )) {
394                            $log->debug("created following lookups: ", dump( $lookup_data ));
395    
396                            foreach my $key (keys %{ $lookup_data->{$database}->{$input_name} }) {
397                                    $store->save_lookup(
398                                            database => $database,
399                                            input => $input_name,
400                                            key => $key,
401                                            data => $lookup_data->{$database}->{$input_name}->{$key},
402                                    );
403                            }
404                    }
405    
406                    my $report_fh;
407                    if ($stats || $validate) {
408                            my $path = "out/report/${database}-${input_name}.txt";
409                            open($report_fh, '>', $path) || $log->logdie("can't open $path: $!");
410    
411                            print $report_fh "Report for database '$database' input '$input_name' records ",
412                                    $offset || 1, "-", $limit || $input->{limit} || $maxmfn, "\n\n";
413                            $log->info("Generating report file $path");
414                    }
415    
416                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?
417                          @{ $input->{normalize} } : ( $input->{normalize} );                          @{ $input->{normalize} } : ( $input->{normalize} );
418    
419                  if ($marc_normalize) {                  if ($marc_normalize) {
420                          @norm_array = ( {                          @norm_array = ( {
421                                  path => $marc_normalize,                                  path => $marc_normalize,
422                                  output => $marc_output || 'out/marc/' . $database . '-' . $input->{name} . '.marc',                                  output => $marc_output || "out/marc/${database}-${input_name}.marc",
423                          } );                          } );
424                  }                  }
425    
# Line 311  while (my ($database, $db_config) = each Line 442  while (my ($database, $db_config) = each
442                          # reset position in database                          # reset position in database
443                          $input_db->seek(1);                          $input_db->seek(1);
444    
445                            # generate name of config key for indexer (strip everything after -)
446                            my $indexer_config = $use_indexer;
447                            $indexer_config =~ s/^(\w+)-?.*$/$1/g if ($indexer_config);
448    
449                          foreach my $pos ( 0 ... $input_db->size ) {                          foreach my $pos ( 0 ... $input_db->size ) {
450    
451                                  my $row = $input_db->fetch || next;                                  my $row = $input_db->fetch || next;
# Line 325  while (my ($database, $db_config) = each Line 460  while (my ($database, $db_config) = each
460    
461    
462                                  if ($validate) {                                  if ($validate) {
463                                          my @errors = $validate->validate_errors( $row );                                          if ( my $errors = $validate->validate_errors( $row, $input_db->dump ) ) {
464                                          $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);                                                  $log->error( "MFN $mfn validation error:\n",
465                                                            $validate->report_error( $errors )
466                                                    );
467                                            }
468                                  }                                  }
469    
                                 my $ds_config = dclone($db_config);  
   
                                 # default values -> database key  
                                 $ds_config->{_} = $database;  
   
                                 # current mfn  
                                 $ds_config->{_mfn} = $mfn;  
   
                                 # attach current input  
                                 $ds_config->{input} = $input;  
   
470                                  my $ds = WebPAC::Normalize::data_structure(                                  my $ds = WebPAC::Normalize::data_structure(
471                                          row => $row,                                          row => $row,
472                                          rules => $rules,                                          rules => $rules,
473                                          lookup => $lookup ? $lookup->lookup_hash : undef,                                          lookup => $lookup ? $lookup->lookup_hash : undef,
474                                          config => $ds_config,                                          config => create_ds_config( $db_config, $database, $input, $mfn ),
475                                          marc_encoding => 'utf-8',                                          marc_encoding => 'utf-8',
476                                  );                                  );
477    
478                                  $db->save_ds(                                  $store->save_ds(
479                                            database => $database,
480                                            input => $input_name,
481                                          id => $mfn,                                          id => $mfn,
482                                          ds => $ds,                                          ds => $ds,
                                         prefix => $input->{name},  
483                                  ) if ($ds && !$stats);                                  ) if ($ds && !$stats);
484    
485                                  $indexer->add(                                  $indexer->add(
486                                          id => $input->{name} . "/" . $mfn,                                          id => "${input_name}/${mfn}",
487                                          ds => $ds,                                          ds => $ds,
488                                          type => $config->{$use_indexer}->{type},                                          type => $config->get($indexer_config)->{type},
489                                  ) if ($indexer && $ds);                                  ) if ($indexer && $ds);
490    
491                                  if ($marc) {                                  if ($marc) {
# Line 379  while (my ($database, $db_config) = each Line 507  while (my ($database, $db_config) = each
507                                  $total_rows++;                                  $total_rows++;
508                          }                          }
509    
510                          $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);                          if ($validate) {
511                                    my $errors = $validate->report;
512                                    if ($errors) {
513                                            $log->info("validation errors:\n$errors\n" );
514                                            print $report_fh "$errors\n" if ($report_fh);
515                                    }
516                            }
517    
518                            if ($stats) {
519                                    my $s = $input_db->stats;
520                                    $log->info("statistics of fields usage:\n$s");
521                                    print $report_fh "Statistics of fields usage:\n$s" if ($report_fh);
522                            }
523    
524                          # close MARC file                          # close MARC file
525                          $marc->finish if ($marc);                          $marc->finish if ($marc);
526    
527                            # close report
528                            close($report_fh) if ($report_fh)
529                  }                  }
530    
531          }          }
# Line 397  while (my ($database, $db_config) = each Line 539  while (my ($database, $db_config) = each
539                  )                  )
540          );          );
541    
         #  
         # add Hyper Estraier links to other databases  
         #  
         if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {  
                 foreach my $link (@{ $db_config->{links} }) {  
                         if ($use_indexer eq 'hyperestraier') {  
                                 $log->info("saving link $database -> $link->{to} [$link->{credit}]");  
                                 push @links, {  
                                         from => $database,  
                                         to => $link->{to},  
                                         credit => $link->{credit},  
                                 };  
                         } else {  
                                 $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");  
                         }  
                 }  
         }  
542    
543          # end forked process          # end forked process
544          if ($parallel) {          if ($parallel) {
# Line 429  if ($parallel) { Line 554  if ($parallel) {
554          $log->info("all parallel processes finished");          $log->info("all parallel processes finished");
555  }  }
556    
557  foreach my $link (@links) {  #
558          $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");  # handle links or merge after indexing
559          $indexer->add_link( %{ $link } );  #
560    
561    if ($merge) {
562            print $estcmd_fh 'sudo /etc/init.d/hyperestraier start',$/;
563            close($estcmd_fh);
564            chmod 0700, $estcmd_path || $log->warn("can't chmod 0700 $estcmd_path: $!");
565            system $estcmd_path;
566    } else {
567            foreach my $link (@links) {
568                    $log->logdie("coderef in link ", Dumper($link), " is ", ref($link), " and not CODE") unless (ref($link) eq 'CODE');
569                    $link->();
570            }
571  }  }
   

Legend:
Removed from v.606  
changed lines
  Added in v.713

  ViewVC Help
Powered by ViewVC 1.1.26