/[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 493 by dpavlin, Sun May 14 13:42:48 2006 UTC revision 536 by dpavlin, Mon Jun 26 16:39:51 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;
 use WebPAC::Normalize::Set;  
15  use WebPAC::Output::TT;  use WebPAC::Output::TT;
16    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;
# Line 42  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  =item --only=database_name/input_filter
46    
47  reindex just single database (legacy name is --one)  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 --force-set  =item --stats
57    
58    disable indexing and dump statistics about field and subfield
59    usage for each input
60    
61  force conversion C<normalize->path> in C<config.yml> from  =item --validate path/to/validation_file
62  C<.xml> to C<.pl>  
63    turn on extra validation of imput records, see L<WebPAC::Validation>
64    
65  =back  =back
66    
# Line 65  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_db_name;  my $only_filter;
76  my $force_set = 0;  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_db_name,          "one=s" => \$only_filter,
84          "only=s" => \$only_db_name,          "only=s" => \$only_filter,
85          "config" => \$config,          "config" => \$config,
86          "debug" => \$debug,          "debug" => \$debug,
87          "force-set" => \$force_set,          "stats" => \$stats,
88            "validate=s" => \$validate_path,
89  );  );
90    
91  $config = LoadFile($config);  $config = LoadFile($config);
# Line 86  print "config = ",Dumper($config) if ($d Line 95  print "config = ",Dumper($config) if ($d
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();  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';  my $use_indexer = $config->{use_indexer} || 'hyperestraier';
106  $log->info("using $use_indexer indexing engine...");  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();  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          next if ($only_db_name && $database !~ m/$only_db_name/i);          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
122            next if ($only_database && $database !~ m/$only_database/i);
123    
124          my $indexer;          if ($use_indexer) {
125                    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 $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");                  } else {
144          $indexer_config->{database} = $database;                          $log->logdie("unknown use_indexer: $use_indexer");
145          $indexer_config->{clean} = $clean;                  }
         $indexer_config->{label} = $db_config->{name};  
   
         # important: clean database just once!  
         $clean = 0;  
   
         if ($use_indexer eq 'hyperestraier') {  
   
                 # open Hyper Estraier database  
                 use WebPAC::Output::Estraier '0.10';  
                 $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );  
           
         } elsif ($use_indexer eq 'kinosearch') {  
   
                 # open KinoSearch  
                 use WebPAC::Output::KinoSearch;  
                 $indexer_config->{clean} = 1 unless (-e $indexer_config->{index_path});  
                 $indexer = new WebPAC::Output::KinoSearch( %{ $indexer_config } );  
146    
147          } else {                  $log->logide("can't continue without valid indexer") unless ($indexer);
                 $log->logdie("unknown use_indexer: $use_indexer");  
148          }          }
149    
         $log->logide("can't continue without valid indexer") unless ($indexer);  
150    
151          #          #
152          # now WebPAC::Store          # now WebPAC::Store
# Line 135  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->debug("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 165  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 lookup '$input->{lookup}'");                  $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 184  while (my ($database, $db_config) = each Line 210  while (my ($database, $db_config) = each
210                          offset => $offset,                          offset => $offset,
211                          lookup => $lookup,                          lookup => $lookup,
212                          recode => $input->{recode},                          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 },
   
                 my $n = new WebPAC::Normalize::XML(  
                 #       filter => { 'foo' => sub { shift } },  
                         db => $db,  
                         lookup_regex => $lookup->regex,  
                         lookup => $lookup,  
                         prefix => $input->{name},  
221                  );                  );
222    
223                  my $rules;                  my $rules;
224                  my $normalize_path = $input->{normalize}->{path};                  my $normalize_path = $input->{normalize}->{path};
225    
226                  if ($force_set) {                  $log->logdie("Found '$normalize_path' as normalization file which isn't supported any more!") unless ( $normalize_path =~ m!\.pl$!i );
                         my $new_norm_path = $normalize_path;  
                         $new_norm_path =~ s/\.xml$/.pl/;  
                         if (-e $new_norm_path) {  
                                 $log->debug("--force-set replaced $normalize_path with $new_norm_path");  
                                 $normalize_path = $new_norm_path;  
                         } else {  
                                 $log->debug("--force-set failed on $new_norm_path, fallback to $normalize_path");  
                         }  
                 }  
227    
228                  if ($normalize_path =~ m/\.xml$/i) {                  my $rules = read_file( $normalize_path ) or die "can't open $normalize_path: $!";
                         $n->open(  
                                 tag => $input->{normalize}->{tag},  
                                 xml_file => $normalize_path,  
                         );  
                 } elsif ($normalize_path =~ m/\.(?:yml|yaml)$/i) {  
                         $n->open_yaml(  
                                 path => $normalize_path,  
                                 tag => $input->{normalize}->{tag},  
                         );  
                 } elsif ($normalize_path =~ m/\.(?:pl)$/i) {  
                         $n = undef;  
                         $log->info("using WebPAC::Normalize::Set to process $normalize_path");  
                         $rules = read_file( $normalize_path ) or die "can't open $normalize_path: $!";  
                 }  
229    
230                  foreach my $pos ( 0 ... $input_db->size ) {                  foreach my $pos ( 0 ... $input_db->size ) {
231    
# Line 242  while (my ($database, $db_config) = each Line 239  while (my ($database, $db_config) = each
239                                  push @{ $row->{'000'} }, $pos;                                  push @{ $row->{'000'} }, $pos;
240                          }                          }
241    
242                          my $ds = $n ? $n->data_structure($row) :  
243                                  WebPAC::Normalize::Set::data_structure(                          if ($validate) {
244                                          row => $row,                                  my @errors = $validate->validate_errors( $row );
245                                          rules => $rules,                                  $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);
246                                          lookup => $lookup->lookup_hash,                          }
247                                  );  
248                                    
249                            my $ds = WebPAC::Normalize::data_structure(
250                                    row => $row,
251                                    rules => $rules,
252                                    lookup => $lookup ? $lookup->lookup_hash : undef,
253                            );
254    
255                            $db->save_ds(
256                                    id => $mfn,
257                                    ds => $ds,
258                                    prefix => $input->{name},
259                            ) if ($ds && !$stats);
260    
261                          $indexer->add(                          $indexer->add(
262                                  id => $input->{name} . "/" . $mfn,                                  id => $input->{name} . "/" . $mfn,
263                                  ds => $ds,                                  ds => $ds,
264                                  type => $config->{$use_indexer}->{type},                                  type => $config->{$use_indexer}->{type},
265                          );                          ) if ($indexer);
266    
267                          $total_rows++;                          $total_rows++;
268                  }                  }
269    
270                    $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);
271    
272          };          };
273    
274          eval { $indexer->finish } if ($indexer->can('finish'));          eval { $indexer->finish } if ($indexer && $indexer->can('finish'));
275    
276          my $dt = time() - $start_t;          my $dt = time() - $start_t;
277          $log->info("$total_rows records indexed in " .          $log->info("$total_rows records ", $indexer ? "indexed " : "",
278                  sprintf("%.2f sec [%.2f rec/sec]",                  sprintf("in %.2f sec [%.2f rec/sec]",
279                          $dt, ($total_rows / $dt)                          $dt, ($total_rows / $dt)
280                  )                  )
281          );          );
# Line 275  while (my ($database, $db_config) = each Line 286  while (my ($database, $db_config) = each
286          if (ref($db_config->{links}) eq 'ARRAY') {          if (ref($db_config->{links}) eq 'ARRAY') {
287                  foreach my $link (@{ $db_config->{links} }) {                  foreach my $link (@{ $db_config->{links} }) {
288                          if ($use_indexer eq 'hyperestraier') {                          if ($use_indexer eq 'hyperestraier') {
289                                  $log->info("adding link $database -> $link->{to} [$link->{credit}]");                                  $log->info("saving link $database -> $link->{to} [$link->{credit}]");
290                                  $indexer->add_link(                                  push @links, {
291                                          from => $database,                                          from => $database,
292                                          to => $link->{to},                                          to => $link->{to},
293                                          credit => $link->{credit},                                          credit => $link->{credit},
294                                  );                                  };
295                          } else {                          } else {
296                                  $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");                                  $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
297                          }                          }
# Line 289  while (my ($database, $db_config) = each Line 300  while (my ($database, $db_config) = each
300    
301  }  }
302    
303    foreach my $link (@links) {
304            $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");
305            $indexer->add_link( %{ $link } );
306    }

Legend:
Removed from v.493  
changed lines
  Added in v.536

  ViewVC Help
Powered by ViewVC 1.1.26