/[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 706 by dpavlin, Mon Sep 25 14:06: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.11;
12  use WebPAC::Store 0.03;  use WebPAC::Store 0.03;
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} }) {  while (my ($database, $db_config) = each %{ $config->databases }) {
192    
193          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
194          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 202  while (my ($database, $db_config) = each
202                  }                  }
203          }          }
204    
205            my $indexer;
206          if ($use_indexer) {          if ($use_indexer) {
207                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");  
208                    my $cfg_name = $use_indexer;
209                    $cfg_name =~ s/\-.*$//;
210    
211                    my $indexer_config = $config->get( $cfg_name ) || $log->logdie("can't find '$cfg_name' part in confguration");
212                  $indexer_config->{database} = $database;                  $indexer_config->{database} = $database;
213                  $indexer_config->{clean} = $clean;                  $indexer_config->{clean} = $clean;
214                  $indexer_config->{label} = $db_config->{name};                  $indexer_config->{label} = $db_config->{name};
215    
216                    # force clean if database has links
217                    $indexer_config->{clean} = 1 if ($db_config->{links});
218    
219                  if ($use_indexer eq 'hyperestraier') {                  if ($use_indexer eq 'hyperestraier') {
220    
221                          # open Hyper Estraier database                          # open Hyper Estraier database
222                          use WebPAC::Output::Estraier '0.10';                          use WebPAC::Output::Estraier '0.10';
223                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
224                                    
225                    } elsif ($use_indexer eq 'hyperestraier-native') {
226    
227                            # open Hyper Estraier database
228                            use WebPAC::Output::EstraierNative;
229                            $indexer = new WebPAC::Output::EstraierNative( %{ $indexer_config } );
230    
231                  } elsif ($use_indexer eq 'kinosearch') {                  } elsif ($use_indexer eq 'kinosearch') {
232    
233                          # open KinoSearch                          # open KinoSearch
# Line 203  while (my ($database, $db_config) = each Line 244  while (my ($database, $db_config) = each
244    
245    
246          #          #
247            # store Hyper Estraier links to other databases
248            #
249            if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
250                    foreach my $link (@{ $db_config->{links} }) {
251                            if ($use_indexer eq 'hyperestraier') {
252                                    if ($merge) {
253                                            print $estcmd_fh 'sudo -u www-data estcmd merge ' . $database . ' ' . $link->{to},$/;
254                                    } else {
255                                            $log->info("saving link $database -> $link->{to} [$link->{credit}]");
256                                            push @links, sub {
257                                                    $log->info("adding link $database -> $link->{to} [$link->{credit}]");
258                                                    $indexer->add_link(
259                                                            from => $database,
260                                                            to => $link->{to},
261                                                            credit => $link->{credit},
262                                                    );
263                                            };
264                                    }
265                            } else {
266                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
267                            }
268                    }
269            }
270            next if ($only_links);
271    
272    
273            #
274          # now WebPAC::Store          # now WebPAC::Store
275          #          #
276          my $abs_path = abs_path($0);          my $abs_path = abs_path($0);
277          $abs_path =~ s#/[^/]*$#/#;          $abs_path =~ s#/[^/]*$#/#;
278    
279          my $db_path = $config->{webpac}->{db_path} . '/' . $database;          my $db_path = $config->get('webpac')->{db_path} . '/' . $database;
280    
281          if ($clean) {          if ($clean) {
282                  $log->info("creating new database '$database' in $db_path");                  $log->info("creating new database '$database' in $db_path");
# Line 237  while (my ($database, $db_config) = each Line 305  while (my ($database, $db_config) = each
305                  $log->info("database $database doesn't have inputs defined");                  $log->info("database $database doesn't have inputs defined");
306          }          }
307    
         my @supported_inputs = keys %{ $config->{webpac}->{inputs} };  
   
308          foreach my $input (@inputs) {          foreach my $input (@inputs) {
309    
310                  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));
311    
312                  my $type = lc($input->{type});                  my $type = lc($input->{type});
313    
314                  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')));
315    
316                  my $lookup;                  my $input_module = $config->webpac('inputs')->{$type};
                 if ($input->{lookup}) {  
                         $lookup = new WebPAC::Lookup(  
                                 lookup_file => $input->{lookup},  
                         );  
                         delete( $input->{lookup} );  
                 }  
317    
318                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my @lookups = $parser->have_lookup_create($database, $input);
319    
320                  $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",
321                          $input->{lookup} ? "lookup '$input->{lookup}'" : ""                          @lookups ? "lookup ".join(", ", @lookups) : ""
322                  );                  );
323    
324    warn "lookups = ", dump( @lookups );
325    
326                    if ($stats) {
327                            # disable modification of records if --stats is in use
328                            delete($input->{modify_records});
329                            delete($input->{modify_file});
330                    }
331    
332                    warn "parser->depends = ", dump( $parser->{depends} );
333                    warn "depends on: ", dump( $parser->depends($database, $input->{name}) );
334                    warn "lookup_create_rules = ", dump( $parser->lookup_create_rules($database, $input->{name}) );
335                    warn "parser->_lookup_create = ", dump( $parser->{_lookup_create} );
336    
337                    my $lookup;
338    
339                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
340                          module => $input_module,                          module => $input_module,
341                          encoding => $config->{webpac}->{webpac_encoding},                          encoding => $config->webpac('webpac_encoding'),
342                          limit => $limit || $input->{limit},                          limit => $limit || $input->{limit},
343                          offset => $offset,                          offset => $offset,
344                          lookup_coderef => sub {                          lookup_coderef => sub {
# Line 273  while (my ($database, $db_config) = each Line 348  while (my ($database, $db_config) = each
348                          recode => $input->{recode},                          recode => $input->{recode},
349                          stats => $stats,                          stats => $stats,
350                          modify_records => $input->{modify_records},                          modify_records => $input->{modify_records},
351                            modify_file => $input->{modify_file},
352                  );                  );
353                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
354    
355                    if (defined( $input->{lookup} )) {
356                            $log->warn("$database/", $input->{name}, " has depriciated lookup definition, removing it...");
357                            delete( $input->{lookup} );
358                    }
359    
360                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
361                          path => $input->{path},                          path => $input->{path},
362                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
363                          %{ $input },                          %{ $input },
364                  );                  );
365    
366                    my $report_fh;
367                    if ($stats || $validate) {
368                            my $path = "out/report/" . $database . '-' . $input->{name} . '.txt';
369                            open($report_fh, '>', $path) || $log->logdie("can't open $path: $!");
370    
371                            print $report_fh "Report for database '$database' input '$input->{name}' records ",
372                                    $offset || 1, "-", $limit || $input->{limit} || $maxmfn, "\n\n";
373                            $log->info("Generating report file $path");
374                    }
375    
376                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?
377                          @{ $input->{normalize} } : ( $input->{normalize} );                          @{ $input->{normalize} } : ( $input->{normalize} );
378    
# Line 311  while (my ($database, $db_config) = each Line 402  while (my ($database, $db_config) = each
402                          # reset position in database                          # reset position in database
403                          $input_db->seek(1);                          $input_db->seek(1);
404    
405                            # generate name of config key for indexer (strip everything after -)
406                            my $indexer_config = $use_indexer;
407                            $indexer_config =~ s/^(\w+)-?.*$/$1/g if ($indexer_config);
408    
409                          foreach my $pos ( 0 ... $input_db->size ) {                          foreach my $pos ( 0 ... $input_db->size ) {
410    
411                                  my $row = $input_db->fetch || next;                                  my $row = $input_db->fetch || next;
# Line 325  while (my ($database, $db_config) = each Line 420  while (my ($database, $db_config) = each
420    
421    
422                                  if ($validate) {                                  if ($validate) {
423                                          my @errors = $validate->validate_errors( $row );                                          if ( my $errors = $validate->validate_errors( $row, $input_db->dump ) ) {
424                                          $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);                                                  $log->error( "MFN $mfn validation error:\n",
425                                                            $validate->report_error( $errors )
426                                                    );
427                                            }
428                                  }                                  }
429    
430                                  my $ds_config = dclone($db_config);                                  my $ds_config = dclone($db_config);
# Line 357  while (my ($database, $db_config) = each Line 455  while (my ($database, $db_config) = each
455                                  $indexer->add(                                  $indexer->add(
456                                          id => $input->{name} . "/" . $mfn,                                          id => $input->{name} . "/" . $mfn,
457                                          ds => $ds,                                          ds => $ds,
458                                          type => $config->{$use_indexer}->{type},                                          type => $config->get($indexer_config)->{type},
459                                  ) if ($indexer && $ds);                                  ) if ($indexer && $ds);
460    
461                                  if ($marc) {                                  if ($marc) {
# Line 379  while (my ($database, $db_config) = each Line 477  while (my ($database, $db_config) = each
477                                  $total_rows++;                                  $total_rows++;
478                          }                          }
479    
480                          $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);                          if ($validate) {
481                                    my $errors = $validate->report;
482                                    if ($errors) {
483                                            $log->info("validation errors:\n$errors\n" );
484                                            print $report_fh "$errors\n" if ($report_fh);
485                                    }
486                            }
487    
488                            if ($stats) {
489                                    my $s = $input_db->stats;
490                                    $log->info("statistics of fields usage:\n$s");
491                                    print $report_fh "Statistics of fields usage:\n$s" if ($report_fh);
492                            }
493    
494                          # close MARC file                          # close MARC file
495                          $marc->finish if ($marc);                          $marc->finish if ($marc);
496    
497                            # close report
498                            close($report_fh) if ($report_fh)
499                  }                  }
500    
501          }          }
# Line 397  while (my ($database, $db_config) = each Line 509  while (my ($database, $db_config) = each
509                  )                  )
510          );          );
511    
         #  
         # 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}]");  
                         }  
                 }  
         }  
512    
513          # end forked process          # end forked process
514          if ($parallel) {          if ($parallel) {
# Line 429  if ($parallel) { Line 524  if ($parallel) {
524          $log->info("all parallel processes finished");          $log->info("all parallel processes finished");
525  }  }
526    
527  foreach my $link (@links) {  #
528          $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");  # handle links or merge after indexing
529          $indexer->add_link( %{ $link } );  #
530    
531    if ($merge) {
532            print $estcmd_fh 'sudo /etc/init.d/hyperestraier start',$/;
533            close($estcmd_fh);
534            chmod 0700, $estcmd_path || $log->warn("can't chmod 0700 $estcmd_path: $!");
535            system $estcmd_path;
536    } else {
537            foreach my $link (@links) {
538                    $log->logdie("coderef in link ", Dumper($link), " is ", ref($link), " and not CODE") unless (ref($link) eq 'CODE');
539                    $link->();
540            }
541  }  }
   

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

  ViewVC Help
Powered by ViewVC 1.1.26