| Lines 290-308
          sub AddOAISet {
      
      
        Link Here | 
        
          | 290 | GetOAISetsMappings returns mappings for all OAI Sets. | 290 | GetOAISetsMappings returns mappings for all OAI Sets. | 
        
          | 291 |  | 291 |  | 
        
          | 292 | Mappings define how biblios are categorized in sets. | 292 | Mappings define how biblios are categorized in sets. | 
          
            
              | 293 | A mapping is defined by four properties: | 293 | A mapping is defined by six properties: | 
        
          | 294 |  | 294 |  | 
        
          | 295 |     { | 295 |     { | 
          
            
              | 296 |         marcfield => 'XXX',     # the MARC field to check | 296 |         marcfield => 'XXX',              # the MARC field to check | 
            
              | 297 |         marcsubfield => 'Y',    # the MARC subfield to check | 297 |         marcsubfield => 'Y',             # the MARC subfield to check | 
            
              | 298 |         operator => 'A',        # the operator 'equal' or 'notequal'; 'equal' if '' | 298 |         operator => 'A',                 # the operator 'equal' or 'notequal'; 'equal' if '' | 
            
              | 299 |         marcvalue => 'zzzz',    # the value to check | 299 |         marcvalue => 'zzzz',             # the value to check | 
            
              |  |  | 300 |         rule_operator => 'and|or|undef', # the operator between the rules | 
            
              | 301 |         rule_order    => 'n'             # the order of the rule for the mapping | 
        
          | 300 |     } | 302 |     } | 
        
          | 301 |  | 303 |  | 
        
          | 302 | If defined in a set mapping, a biblio which have at least one 'Y' subfield of | 304 | If defined in a set mapping, a biblio which have at least one 'Y' subfield of | 
        
          | 303 | one 'XXX' field equal to 'zzzz' will belong to this set. | 305 | one 'XXX' field equal to 'zzzz' will belong to this set. | 
            
              | 304 | If multiple mappings are defined in a set, the biblio will belong to this set |  |  | 
            
              | 305 | if at least one condition is matched. | 
        
          | 306 |  | 306 |  | 
        
          | 307 | GetOAISetsMappings returns a hashref of arrayrefs of hashrefs. | 307 | GetOAISetsMappings returns a hashref of arrayrefs of hashrefs. | 
        
          | 308 | The first hashref keys are the sets IDs, so it looks like this: | 308 | The first hashref keys are the sets IDs, so it looks like this: | 
  
    | Lines 313-319
          The first hashref keys are the sets IDs, so it looks like this:
      
      
        Link Here | 
        
          | 313 |                 marcfield => 'XXX', | 313 |                 marcfield => 'XXX', | 
        
          | 314 |                 marcsubfield => 'Y', | 314 |                 marcsubfield => 'Y', | 
        
          | 315 |                 operator => 'A', | 315 |                 operator => 'A', | 
          
            
              | 316 |                 marcvalue => 'zzzz' | 316 |                 marcvalue => 'zzzz', | 
            
              |  |  | 317 |                 rule_operator => 'and|or|undef', | 
            
              | 318 |                 rule_order => 'n' | 
        
          | 317 |             }, | 319 |             }, | 
        
          | 318 |             { | 320 |             { | 
        
          | 319 |                 ... | 321 |                 ... | 
  
    | Lines 329-335
          The first hashref keys are the sets IDs, so it looks like this:
      
      
        Link Here | 
        
          | 329 | sub GetOAISetsMappings { | 331 | sub GetOAISetsMappings { | 
        
          | 330 |     my $dbh = C4::Context->dbh; | 332 |     my $dbh = C4::Context->dbh; | 
        
          | 331 |     my $query = qq{ | 333 |     my $query = qq{ | 
          
            
              | 332 |         SELECT * FROM oai_sets_mappings | 334 |         SELECT * FROM oai_sets_mappings ORDER BY set_id, rule_order | 
        
          | 333 |     }; | 335 |     }; | 
        
          | 334 |     my $sth = $dbh->prepare($query); | 336 |     my $sth = $dbh->prepare($query); | 
        
          | 335 |     $sth->execute; | 337 |     $sth->execute; | 
  
    | Lines 340-346
          sub GetOAISetsMappings {
      
      
        Link Here | 
        
          | 340 |             marcfield => $result->{'marcfield'}, | 342 |             marcfield => $result->{'marcfield'}, | 
        
          | 341 |             marcsubfield => $result->{'marcsubfield'}, | 343 |             marcsubfield => $result->{'marcsubfield'}, | 
        
          | 342 |             operator => $result->{'operator'}, | 344 |             operator => $result->{'operator'}, | 
          
            
              | 343 |             marcvalue => $result->{'marcvalue'} | 345 |             marcvalue => $result->{'marcvalue'}, | 
            
              |  |  | 346 |             rule_operator => $result->{'rule_operator'}, | 
            
              | 347 |             rule_order => $result->{'rule_order'} | 
        
          | 344 |         }; | 348 |         }; | 
        
          | 345 |     } | 349 |     } | 
        
          | 346 |  | 350 |  | 
  
    | Lines 365-370
          sub GetOAISetMappings {
      
      
        Link Here | 
        
          | 365 |         SELECT * | 369 |         SELECT * | 
        
          | 366 |         FROM oai_sets_mappings | 370 |         FROM oai_sets_mappings | 
        
          | 367 |         WHERE set_id = ? | 371 |         WHERE set_id = ? | 
            
              |  |  | 372 |         ORDER BY rule_order | 
        
          | 368 |     }; | 373 |     }; | 
        
          | 369 |     my $sth = $dbh->prepare($query); | 374 |     my $sth = $dbh->prepare($query); | 
        
          | 370 |     $sth->execute($set_id); | 375 |     $sth->execute($set_id); | 
  
    | Lines 375-381
          sub GetOAISetMappings {
      
      
        Link Here | 
        
          | 375 |             marcfield => $result->{'marcfield'}, | 380 |             marcfield => $result->{'marcfield'}, | 
        
          | 376 |             marcsubfield => $result->{'marcsubfield'}, | 381 |             marcsubfield => $result->{'marcsubfield'}, | 
        
          | 377 |             operator => $result->{'operator'}, | 382 |             operator => $result->{'operator'}, | 
          
            
              | 378 |             marcvalue => $result->{'marcvalue'} | 383 |             marcvalue => $result->{'marcvalue'}, | 
            
              |  |  | 384 |             rule_operator => $result->{'rule_operator'}, | 
            
              | 385 |             rule_order => $result->{'rule_order'} | 
        
          | 379 |         }; | 386 |         }; | 
        
          | 380 |     } | 387 |     } | 
        
          | 381 |  | 388 |  | 
  
    | Lines 411-425
          sub ModOAISetMappings {
      
      
        Link Here | 
        
          | 411 |     }; | 418 |     }; | 
        
          | 412 |     my $sth = $dbh->prepare($query); | 419 |     my $sth = $dbh->prepare($query); | 
        
          | 413 |     $sth->execute($set_id); | 420 |     $sth->execute($set_id); | 
            
              | 414 |  |  |  | 
        
          | 415 |     if(scalar @$mappings > 0) { | 421 |     if(scalar @$mappings > 0) { | 
        
          | 416 |         $query = qq{ | 422 |         $query = qq{ | 
          
            
              | 417 |             INSERT INTO oai_sets_mappings (set_id, marcfield, marcsubfield, operator, marcvalue) | 423 |             INSERT INTO oai_sets_mappings (set_id, marcfield, marcsubfield, operator, marcvalue, rule_operator, rule_order) | 
            
              | 418 |             VALUES (?,?,?,?,?) | 424 |             VALUES (?,?,?,?,?,?,?) | 
        
          | 419 |         }; | 425 |         }; | 
        
          | 420 |         $sth = $dbh->prepare($query); | 426 |         $sth = $dbh->prepare($query); | 
        
          | 421 |         foreach (@$mappings) { | 427 |         foreach (@$mappings) { | 
          
            
              | 422 |             $sth->execute($set_id, $_->{'marcfield'}, $_->{'marcsubfield'}, $_->{'operator'}, $_->{'marcvalue'}); | 428 |             $sth->execute($set_id, $_->{'marcfield'}, $_->{'marcsubfield'}, $_->{'operator'}, $_->{'marcvalue'}, $_->{'rule_operator'}, $_->{'rule_order'}); | 
        
          | 423 |         } | 429 |         } | 
        
          | 424 |     } | 430 |     } | 
        
          | 425 | } | 431 | } | 
  
    | Lines 492-521
          sub CalcOAISetsBiblio {
      
      
        Link Here | 
        
          | 492 |  | 498 |  | 
        
          | 493 |     my @biblio_sets; | 499 |     my @biblio_sets; | 
        
          | 494 |     foreach my $set_id (keys %$oai_sets_mappings) { | 500 |     foreach my $set_id (keys %$oai_sets_mappings) { | 
            
              |  |  | 501 |  | 
            
              | 502 |         my $rules = []; | 
        
          | 495 |         foreach my $mapping (@{ $oai_sets_mappings->{$set_id} }) { | 503 |         foreach my $mapping (@{ $oai_sets_mappings->{$set_id} }) { | 
        
          | 496 |             next if not $mapping; | 504 |             next if not $mapping; | 
          
            
              | 497 |             my $field = $mapping->{'marcfield'}; | 505 |             my $rule_operator = $mapping->{'rule_operator'}; | 
            
              | 498 |             my $subfield = $mapping->{'marcsubfield'}; | 506 |             my $result = _evalRule($record, $mapping); | 
            
              | 499 |             my $operator = $mapping->{'operator'}; | 507 |  | 
            
              | 500 |             my $value = $mapping->{'marcvalue'}; | 508 |             # First rule or 'or' rule is always pushed | 
            
              | 501 |             my @subfield_values = $record->subfield($field, $subfield); | 509 |             if (!@$rules || $rule_operator eq 'or') { | 
            
              | 502 |             if ($operator eq 'notequal') { | 510 |                 push @$rules, [$result]; | 
            
              | 503 |                 if(0 == grep /^$value$/, @subfield_values) { | 511 |                 next; | 
            
              | 504 |                     push @biblio_sets, $set_id; |  |  | 
            
              | 505 |                     last; | 
            
              | 506 |                 } | 
        
          | 507 |             } | 512 |             } | 
          
            
              | 508 |             else { | 513 |  | 
            
              | 509 |                 if(0 < grep /^$value$/, @subfield_values) { | 514 |             # 'and' rule is pushed in the last 'or' rule | 
            
              | 510 |                     push @biblio_sets, $set_id; | 515 |             push @{$rules->[-1]}, $result; | 
            
              | 511 |                     last; | 516 |         } | 
            
              | 512 |                 } | 517 |  | 
            
              |  |  | 518 |         my @evaluated_and; | 
            
              | 519 |         foreach my $ruleset (@$rules) { | 
            
              | 520 |            if (0 < grep /0/, @{$ruleset}) { | 
            
              | 521 |                 push @evaluated_and, 0; | 
            
              | 522 |             } else { | 
            
              | 523 |                 push @evaluated_and, 1; | 
        
          | 513 |             } | 524 |             } | 
        
          | 514 |         } | 525 |         } | 
            
              |  |  | 526 |  | 
            
              | 527 |         if (grep /1/, @evaluated_and) { | 
            
              | 528 |             push @biblio_sets, $set_id; | 
            
              | 529 |         } | 
            
              | 530 |  | 
        
          | 515 |     } | 531 |     } | 
        
          | 516 |     return @biblio_sets; | 532 |     return @biblio_sets; | 
        
          | 517 | } | 533 | } | 
        
          | 518 |  | 534 |  | 
            
              |  |  | 535 | # Does the record match a given mapping rule? | 
            
              | 536 | sub _evalRule { | 
            
              | 537 |     my $record = shift; | 
            
              | 538 |     my $mapping = shift; | 
            
              | 539 |  | 
            
              | 540 |     my $field = $mapping->{'marcfield'}; | 
            
              | 541 |     my $subfield = $mapping->{'marcsubfield'}; | 
            
              | 542 |     my $operator = $mapping->{'operator'}; | 
            
              | 543 |     my $value = $mapping->{'marcvalue'}; | 
            
              | 544 |     my @subfield_values = $record->subfield($field, $subfield); | 
            
              | 545 |     if ($operator eq 'notequal') { | 
            
              | 546 |         if(0 == grep /^$value$/, @subfield_values) { | 
            
              | 547 |             return 1; | 
            
              | 548 |         } | 
            
              | 549 |     } | 
            
              | 550 |     else { | 
            
              | 551 |         if(0 < grep /^$value$/, @subfield_values) { | 
            
              | 552 |             return 1; | 
            
              | 553 |         } | 
            
              | 554 |     } | 
            
              | 555 |     return 0; | 
            
              | 556 | } | 
            
              | 557 |  | 
            
              | 558 |  | 
        
          | 519 | =head2 ModOAISetsBiblios | 559 | =head2 ModOAISetsBiblios | 
        
          | 520 |  | 560 |  | 
        
          | 521 |     my $oai_sets_biblios = { | 561 |     my $oai_sets_biblios = { |