/[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 684 by dpavlin, Sun Sep 24 15:53:54 2006 UTC
# Line 8  use lib './lib'; Line 8  use lib './lib';
8    
9  use WebPAC::Common 0.02;  use WebPAC::Common 0.02;
10  use WebPAC::Lookup 0.03;  use WebPAC::Lookup 0.03;
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 154  my $total_rows = 0; Line 178  my $total_rows = 0;
178  my $start_t = time();  my $start_t = time();
179    
180  my @links;  my @links;
 my $indexer;  
181    
182  if ($parallel) {  if ($parallel) {
183          $log->info("Using $parallel processes for speedup");          $log->info("Using $parallel processes for speedup");
184          Proc::Queue::size($parallel);          Proc::Queue::size($parallel);
185  }  }
186    
187  while (my ($database, $db_config) = each %{ $config->{databases} }) {  while (my ($database, $db_config) = each %{ $config->databases }) {
188    
189          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
190          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 198  while (my ($database, $db_config) = each
198                  }                  }
199          }          }
200    
201            my $indexer;
202          if ($use_indexer) {          if ($use_indexer) {
203                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");  
204                    my $cfg_name = $use_indexer;
205                    $cfg_name =~ s/\-.*$//;
206    
207                    my $indexer_config = $config->get( $cfg_name ) || $log->logdie("can't find '$cfg_name' part in confguration");
208                  $indexer_config->{database} = $database;                  $indexer_config->{database} = $database;
209                  $indexer_config->{clean} = $clean;                  $indexer_config->{clean} = $clean;
210                  $indexer_config->{label} = $db_config->{name};                  $indexer_config->{label} = $db_config->{name};
211    
212                    # force clean if database has links
213                    $indexer_config->{clean} = 1 if ($db_config->{links});
214    
215                  if ($use_indexer eq 'hyperestraier') {                  if ($use_indexer eq 'hyperestraier') {
216    
217                          # open Hyper Estraier database                          # open Hyper Estraier database
218                          use WebPAC::Output::Estraier '0.10';                          use WebPAC::Output::Estraier '0.10';
219                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
220                                    
221                    } elsif ($use_indexer eq 'hyperestraier-native') {
222    
223                            # open Hyper Estraier database
224                            use WebPAC::Output::EstraierNative;
225                            $indexer = new WebPAC::Output::EstraierNative( %{ $indexer_config } );
226    
227                  } elsif ($use_indexer eq 'kinosearch') {                  } elsif ($use_indexer eq 'kinosearch') {
228    
229                          # open KinoSearch                          # open KinoSearch
# Line 203  while (my ($database, $db_config) = each Line 240  while (my ($database, $db_config) = each
240    
241    
242          #          #
243            # store Hyper Estraier links to other databases
244            #
245            if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
246                    foreach my $link (@{ $db_config->{links} }) {
247                            if ($use_indexer eq 'hyperestraier') {
248                                    if ($merge) {
249                                            print $estcmd_fh 'sudo -u www-data estcmd merge ' . $database . ' ' . $link->{to},$/;
250                                    } else {
251                                            $log->info("saving link $database -> $link->{to} [$link->{credit}]");
252                                            push @links, sub {
253                                                    $log->info("adding link $database -> $link->{to} [$link->{credit}]");
254                                                    $indexer->add_link(
255                                                            from => $database,
256                                                            to => $link->{to},
257                                                            credit => $link->{credit},
258                                                    );
259                                            };
260                                    }
261                            } else {
262                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
263                            }
264                    }
265            }
266            next if ($only_links);
267    
268    
269            #
270          # now WebPAC::Store          # now WebPAC::Store
271          #          #
272          my $abs_path = abs_path($0);          my $abs_path = abs_path($0);
273          $abs_path =~ s#/[^/]*$#/#;          $abs_path =~ s#/[^/]*$#/#;
274    
275          my $db_path = $config->{webpac}->{db_path} . '/' . $database;          my $db_path = $config->get('webpac')->{db_path} . '/' . $database;
276    
277          if ($clean) {          if ($clean) {
278                  $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 301  while (my ($database, $db_config) = each
301                  $log->info("database $database doesn't have inputs defined");                  $log->info("database $database doesn't have inputs defined");
302          }          }
303    
         my @supported_inputs = keys %{ $config->{webpac}->{inputs} };  
   
304          foreach my $input (@inputs) {          foreach my $input (@inputs) {
305    
306                  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));
307    
308                  my $type = lc($input->{type});                  my $type = lc($input->{type});
309    
310                  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')));
311    
312                  my $lookup;                  my $lookup;
313                  if ($input->{lookup}) {                  if ($input->{lookup}) {
# Line 255  while (my ($database, $db_config) = each Line 317  while (my ($database, $db_config) = each
317                          delete( $input->{lookup} );                          delete( $input->{lookup} );
318                  }                  }
319    
320                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my $input_module = $config->webpac('inputs')->{$type};
321    
322                  $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",
323                          $input->{lookup} ? "lookup '$input->{lookup}'" : ""                          $input->{lookup} ? "lookup '$input->{lookup}'" : ""
324                  );                  );
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                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
333                          module => $input_module,                          module => $input_module,
334                          encoding => $config->{webpac}->{webpac_encoding},                          encoding => $config->webpac('webpac_encoding'),
335                          limit => $limit || $input->{limit},                          limit => $limit || $input->{limit},
336                          offset => $offset,                          offset => $offset,
337                          lookup_coderef => sub {                          lookup_coderef => sub {
# Line 273  while (my ($database, $db_config) = each Line 341  while (my ($database, $db_config) = each
341                          recode => $input->{recode},                          recode => $input->{recode},
342                          stats => $stats,                          stats => $stats,
343                          modify_records => $input->{modify_records},                          modify_records => $input->{modify_records},
344                            modify_file => $input->{modify_file},
345                  );                  );
346                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
347    
# Line 282  while (my ($database, $db_config) = each Line 351  while (my ($database, $db_config) = each
351                          %{ $input },                          %{ $input },
352                  );                  );
353    
354                    my $report_fh;
355                    if ($stats || $validate) {
356                            my $path = "out/report/" . $database . '-' . $input->{name} . '.txt';
357                            open($report_fh, '>', $path) || $log->logdie("can't open $path: $!");
358    
359                            print $report_fh "Report for database '$database' input '$input->{name}' records ",
360                                    $offset || 1, "-", $limit || $input->{limit} || $maxmfn, "\n\n";
361                            $log->info("Generating report file $path");
362                    }
363    
364                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?
365                          @{ $input->{normalize} } : ( $input->{normalize} );                          @{ $input->{normalize} } : ( $input->{normalize} );
366    
# Line 311  while (my ($database, $db_config) = each Line 390  while (my ($database, $db_config) = each
390                          # reset position in database                          # reset position in database
391                          $input_db->seek(1);                          $input_db->seek(1);
392    
393                            # generate name of config key for indexer (strip everything after -)
394                            my $indexer_config = $use_indexer;
395                            $indexer_config =~ s/^(\w+)-?.*$/$1/g if ($indexer_config);
396    
397                          foreach my $pos ( 0 ... $input_db->size ) {                          foreach my $pos ( 0 ... $input_db->size ) {
398    
399                                  my $row = $input_db->fetch || next;                                  my $row = $input_db->fetch || next;
# Line 325  while (my ($database, $db_config) = each Line 408  while (my ($database, $db_config) = each
408    
409    
410                                  if ($validate) {                                  if ($validate) {
411                                          my @errors = $validate->validate_errors( $row );                                          if ( my $errors = $validate->validate_errors( $row, $input_db->dump ) ) {
412                                          $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);                                                  $log->error( "MFN $mfn validation error:\n",
413                                                            $validate->report_error( $errors )
414                                                    );
415                                            }
416                                  }                                  }
417    
418                                  my $ds_config = dclone($db_config);                                  my $ds_config = dclone($db_config);
# Line 357  while (my ($database, $db_config) = each Line 443  while (my ($database, $db_config) = each
443                                  $indexer->add(                                  $indexer->add(
444                                          id => $input->{name} . "/" . $mfn,                                          id => $input->{name} . "/" . $mfn,
445                                          ds => $ds,                                          ds => $ds,
446                                          type => $config->{$use_indexer}->{type},                                          type => $config->get($indexer_config)->{type},
447                                  ) if ($indexer && $ds);                                  ) if ($indexer && $ds);
448    
449                                  if ($marc) {                                  if ($marc) {
# Line 379  while (my ($database, $db_config) = each Line 465  while (my ($database, $db_config) = each
465                                  $total_rows++;                                  $total_rows++;
466                          }                          }
467    
468                          $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);                          if ($validate) {
469                                    my $errors = $validate->report;
470                                    if ($errors) {
471                                            $log->info("validation errors:\n$errors\n" );
472                                            print $report_fh "$errors\n" if ($report_fh);
473                                    }
474                            }
475    
476                            if ($stats) {
477                                    my $s = $input_db->stats;
478                                    $log->info("statistics of fields usage:\n$s");
479                                    print $report_fh "Statistics of fields usage:\n$s" if ($report_fh);
480                            }
481    
482                          # close MARC file                          # close MARC file
483                          $marc->finish if ($marc);                          $marc->finish if ($marc);
484    
485                            # close report
486                            close($report_fh) if ($report_fh)
487                  }                  }
488    
489          }          }
# Line 397  while (my ($database, $db_config) = each Line 497  while (my ($database, $db_config) = each
497                  )                  )
498          );          );
499    
         #  
         # 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}]");  
                         }  
                 }  
         }  
500    
501          # end forked process          # end forked process
502          if ($parallel) {          if ($parallel) {
# Line 429  if ($parallel) { Line 512  if ($parallel) {
512          $log->info("all parallel processes finished");          $log->info("all parallel processes finished");
513  }  }
514    
515  foreach my $link (@links) {  #
516          $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");  # handle links or merge after indexing
517          $indexer->add_link( %{ $link } );  #
518    
519    if ($merge) {
520            print $estcmd_fh 'sudo /etc/init.d/hyperestraier start',$/;
521            close($estcmd_fh);
522            chmod 0700, $estcmd_path || $log->warn("can't chmod 0700 $estcmd_path: $!");
523            system $estcmd_path;
524    } else {
525            foreach my $link (@links) {
526                    $log->logdie("coderef in link ", Dumper($link), " is ", ref($link), " and not CODE") unless (ref($link) eq 'CODE');
527                    $link->();
528            }
529  }  }
   

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

  ViewVC Help
Powered by ViewVC 1.1.26