/[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 307 by dpavlin, Tue Dec 20 00:03:04 2005 UTC revision 539 by dpavlin, Thu Jun 29 15:29:32 2006 UTC
# Line 11  use WebPAC::Common 0.02; Line 11  use WebPAC::Common 0.02;
11  use WebPAC::Lookup;  use WebPAC::Lookup;
12  use WebPAC::Input 0.03;  use WebPAC::Input 0.03;
13  use WebPAC::Store 0.03;  use WebPAC::Store 0.03;
14  use WebPAC::Normalize::XML;  use WebPAC::Normalize;
15  use WebPAC::Output::TT;  use WebPAC::Output::TT;
16  use WebPAC::Output::Estraier 0.08;  use WebPAC::Validate;
17  use YAML qw/LoadFile/;  use YAML qw/LoadFile/;
18  use Getopt::Long;  use Getopt::Long;
19  use File::Path;  use File::Path;
20    use Time::HiRes qw/time/;
21    use File::Slurp;
22    
23  =head1 NAME  =head1 NAME
24    
# Line 40  limit loading to 100 records Line 42  limit loading to 100 records
42    
43  remove database and Hyper Estraier index before indexing  remove database and Hyper Estraier index before indexing
44    
45    =item --only=database_name/input_filter
46    
47    reindex just single database (legacy name is --one)
48    
49    C</input_filter> is optional part which can be C<name>
50    or C<type> from input
51    
52  =item --config conf/config.yml  =item --config conf/config.yml
53    
54  path to YAML configuration file  path to YAML configuration file
55    
56    =item --stats
57    
58    disable indexing and dump statistics about field and subfield
59    usage for each input
60    
61    =item --validate path/to/validation_file
62    
63    turn on extra validation of imput records, see L<WebPAC::Validation>
64    
65  =back  =back
66    
67  =cut  =cut
# Line 54  my $limit; Line 72  my $limit;
72  my $clean = 0;  my $clean = 0;
73  my $config = 'conf/config.yml';  my $config = 'conf/config.yml';
74  my $debug = 0;  my $debug = 0;
75    my $only_filter;
76    my $stats = 0;
77    my $validate_path;
78    
79  GetOptions(  GetOptions(
80          "limit=i" => \$limit,          "limit=i" => \$limit,
81          "offset=i" => \$offset,          "offset=i" => \$offset,
82          "clean" => \$clean,          "clean" => \$clean,
83            "one=s" => \$only_filter,
84            "only=s" => \$only_filter,
85          "config" => \$config,          "config" => \$config,
86          "debug" => \$debug,          "debug" => \$debug,
87            "stats" => \$stats,
88            "validate=s" => \$validate_path,
89  );  );
90    
91  $config = LoadFile($config);  $config = LoadFile($config);
# Line 69  print "config = ",Dumper($config) if ($d Line 94  print "config = ",Dumper($config) if ($d
94    
95  die "no databases in config file!\n" unless ($config->{databases});  die "no databases in config file!\n" unless ($config->{databases});
96    
97    my $log = _new WebPAC::Common()->_get_logger();
98    $log->info( "-" x 79 );
99    
100    my $validate;
101    $validate = new WebPAC::Validate(
102            path => $validate_path,
103    ) if ($validate_path);
104    
105    my $use_indexer = $config->{use_indexer} || 'hyperestraier';
106    if ($stats) {
107            $log->debug("option --stats disables update of indexing engine...");
108            $use_indexer = undef;
109    } else {
110            $log->info("using $use_indexer indexing engine...");
111    }
112    
113  my $total_rows = 0;  my $total_rows = 0;
114    my $start_t = time();
115    
116    my @links;
117    my $indexer;
118    
119  while (my ($database, $db_config) = each %{ $config->{databases} }) {  while (my ($database, $db_config) = each %{ $config->{databases} }) {
120    
121          my $log = _new WebPAC::Common()->_get_logger();          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
122            next if ($only_database && $database !~ m/$only_database/i);
123    
124          #          if ($use_indexer) {
125          # open Hyper Estraier database                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");
126          #                  $indexer_config->{database} = $database;
127                    $indexer_config->{clean} = $clean;
128                    $indexer_config->{label} = $db_config->{name};
129    
130                    if ($use_indexer eq 'hyperestraier') {
131    
132                            # open Hyper Estraier database
133                            use WebPAC::Output::Estraier '0.10';
134                            $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
135                    
136                    } elsif ($use_indexer eq 'kinosearch') {
137    
138                            # open KinoSearch
139                            use WebPAC::Output::KinoSearch;
140                            $indexer_config->{clean} = 1 unless (-e $indexer_config->{index_path});
141                            $indexer = new WebPAC::Output::KinoSearch( %{ $indexer_config } );
142    
143          my $est_config = $config->{hyperestraier} || $log->logdie("can't find 'hyperestraier' part in confguration");                  } else {
144          $est_config->{database} = $database;                          $log->logdie("unknown use_indexer: $use_indexer");
145          $est_config->{clean} = $clean;                  }
146    
147                    $log->logide("can't continue without valid indexer") unless ($indexer);
148            }
149    
         my $est = new WebPAC::Output::Estraier( %{ $est_config } );  
150    
151          #          #
152          # now WebPAC::Store          # now WebPAC::Store
# Line 94  while (my ($database, $db_config) = each Line 157  while (my ($database, $db_config) = each
157          my $db_path = $config->{webpac}->{db_path} . '/' . $database;          my $db_path = $config->{webpac}->{db_path} . '/' . $database;
158    
159          if ($clean) {          if ($clean) {
160                  $log->info("creating new database $database in $db_path");                  $log->info("creating new database '$database' in $db_path");
161                  rmtree( $db_path ) || $log->warn("can't remove $db_path: $!");                  rmtree( $db_path ) || $log->warn("can't remove $db_path: $!");
162          } else {          } else {
163                  $log->info("working on $database in $db_path");                  $log->info("working on database '$database' in $db_path");
164          }          }
165    
166          my $db = new WebPAC::Store(          my $db = new WebPAC::Store(
# Line 124  while (my ($database, $db_config) = each Line 187  while (my ($database, $db_config) = each
187    
188          foreach my $input (@inputs) {          foreach my $input (@inputs) {
189    
190                    next if ($only_input && ($input->{name} !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));
191    
192                  my $type = lc($input->{type});                  my $type = lc($input->{type});
193    
194                  die "I know only how to handle input types ", join(",", @supported_inputs), " not '$type'!\n" unless (grep(/$type/, @supported_inputs));                  die "I know only how to handle input types ", join(",", @supported_inputs), " not '$type'!\n" unless (grep(/$type/, @supported_inputs));
195    
196                  my $lookup = new WebPAC::Lookup(                  my $lookup = new WebPAC::Lookup(
197                          lookup_file => $input->{lookup},                          lookup_file => $input->{lookup},
198                  );                  ) if ($input->{lookup});
199    
200                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my $input_module = $config->{webpac}->{inputs}->{$type};
201    
202                  $log->info("working on input $input->{path} [$input->{type}] using $input_module");                  $log->info("working on input '$input->{name}' in $input->{path} [type: $input->{type}] using $input_module",
203                            $input->{lookup} ? "lookup '$input->{lookup}'" : ""
204                    );
205    
206                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
207                          module => $input_module,                          module => $input_module,
# Line 142  while (my ($database, $db_config) = each Line 209  while (my ($database, $db_config) = each
209                          limit => $limit || $input->{limit},                          limit => $limit || $input->{limit},
210                          offset => $offset,                          offset => $offset,
211                          lookup => $lookup,                          lookup => $lookup,
212                            recode => $input->{recode},
213                            stats => $stats,
214                  );                  );
215                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
216    
217                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
218                          path => $input->{path},                          path => $input->{path},
219                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
220                            %{ $input },
221                  );                  );
222    
223                  my $n = new WebPAC::Normalize::XML(                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?
224                  #       filter => { 'foo' => sub { shift } },                          @{ $input->{normalize} } : ( $input->{normalize} );
                         db => $db,  
                         lookup_regex => $lookup->regex,  
                         lookup => $lookup,  
                         prefix => $input->{name},  
                 );  
225    
226                  my $normalize_path = $input->{normalize}->{path};                  foreach my $normalize (@norm_array) {
227    
228                  if ($normalize_path =~ m/\.xml$/i) {                          my $rules;
229                          $n->open(                          my $normalize_path = $normalize->{path} || $log->logdie("can't find normalize path in config");
230                                  tag => $input->{normalize}->{tag},  
231                                  xml_file => $input->{normalize}->{path},                          $log->logdie("Found '$normalize_path' as normalization file which isn't supported any more!") unless ( $normalize_path =~ m!\.pl$!i );
232                          );  
233                  } elsif ($normalize_path =~ m/\.(?:yml|yaml)$/i) {                          my $rules = read_file( $normalize_path ) or die "can't open $normalize_path: $!";
234                          $n->open_yaml(  
235                                  path => $normalize_path,                          $log->info("Using $normalize_path for normalization...");
236                                  tag => $input->{normalize}->{tag},  
237                          );                          # reset position in database
238                  }                          $input_db->seek(1);
239    
240                            foreach my $pos ( 0 ... $input_db->size ) {
241    
242                                    my $row = $input_db->fetch || next;
243    
244                  foreach my $pos ( 0 ... $input_db->size ) {                                  my $mfn = $row->{'000'}->[0];
245    
246                          my $row = $input_db->fetch || next;                                  if (! $mfn || $mfn !~ m#^\d+$#) {
247                                            $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");
248                                            $mfn = $pos;
249                                            push @{ $row->{'000'} }, $pos;
250                                    }
251    
                         my $mfn = $row->{'000'}->[0];  
252    
253                          if (! $mfn || $mfn !~ m#^\d+$#) {                                  if ($validate) {
254                                  $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");                                          my @errors = $validate->validate_errors( $row );
255                                  $mfn = $pos;                                          $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);
256                                  push @{ $row->{'000'} }, $pos;                                  }
257    
258                                            
259                                    my $ds = WebPAC::Normalize::data_structure(
260                                            row => $row,
261                                            rules => $rules,
262                                            lookup => $lookup ? $lookup->lookup_hash : undef,
263                                    );
264    
265                                    $db->save_ds(
266                                            id => $mfn,
267                                            ds => $ds,
268                                            prefix => $input->{name},
269                                    ) if ($ds && !$stats);
270    
271                                    $indexer->add(
272                                            id => $input->{name} . "/" . $mfn,
273                                            ds => $ds,
274                                            type => $config->{$use_indexer}->{type},
275                                    ) if ($indexer);
276    
277                                    $total_rows++;
278                          }                          }
279    
280                          my $ds = $n->data_structure($row);                          $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);
281    
282                          $est->add(                  };
                                 id => $input->{name} . "/" . $mfn,  
                                 ds => $ds,  
                                 type => $config->{hyperestraier}->{type},  
                         );  
283    
284                          $total_rows++;          }
                 }  
285    
286          };          eval { $indexer->finish } if ($indexer && $indexer->can('finish'));
287    
288          $log->info("$total_rows records indexed");          my $dt = time() - $start_t;
289            $log->info("$total_rows records ", $indexer ? "indexed " : "",
290                    sprintf("in %.2f sec [%.2f rec/sec]",
291                            $dt, ($total_rows / $dt)
292                    )
293            );
294    
295          #          #
296          # add Hyper Estraier links to other databases          # add Hyper Estraier links to other databases
297          #          #
298          if (ref($db_config->{links}) eq 'ARRAY') {          if (ref($db_config->{links}) eq 'ARRAY') {
299                  foreach my $link (@{ $db_config->{links} }) {                  foreach my $link (@{ $db_config->{links} }) {
300                          $log->info("adding link $database -> $link->{to} [$link->{credit}]");                          if ($use_indexer eq 'hyperestraier') {
301                          $est->add_link(                                  $log->info("saving link $database -> $link->{to} [$link->{credit}]");
302                                  from => $database,                                  push @links, {
303                                  to => $link->{to},                                          from => $database,
304                                  credit => $link->{credit},                                          to => $link->{to},
305                          );                                          credit => $link->{credit},
306                                    };
307                            } else {
308                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
309                            }
310                  }                  }
311          }          }
312    
313  }  }
314    
315    foreach my $link (@links) {
316            $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");
317            $indexer->add_link( %{ $link } );
318    }

Legend:
Removed from v.307  
changed lines
  Added in v.539

  ViewVC Help
Powered by ViewVC 1.1.26