View | Details | Raw Unified | Return to bug 15996
Collapse All | Expand All

(-)a/C4/Biblio/Diff.pm (+52 lines)
Lines 21-26 use Modern::Perl; Link Here
21
use Scalar::Util qw(blessed);
21
use Scalar::Util qw(blessed);
22
use Try::Tiny;
22
use Try::Tiny;
23
23
24
use C4::Biblio::Diff::Change;
25
24
use Koha::Exception::BadParameter;
26
use Koha::Exception::BadParameter;
25
27
26
=head SYNOPSIS
28
=head SYNOPSIS
Lines 307-310 sub _valuesDiff { Link Here
307
    return 0;
309
    return 0;
308
}
310
}
309
311
312
=head2 grepChangedElements
313
314
@PARAM1 HASHMonster from diffRecords()
315
@PARAM2 ARRAYRef of HASHRefs, the MARC field-subfield tuples to search for,
316
            [
317
                {
318
                    f => '084',
319
                    sf => 'a'
320
                },
321
                ...
322
            ]
323
@RETURNS Arrayref of Arrayrefs,
324
            [
325
                [
326
                    '084', #Field
327
                    'a',   #Subfield
328
                    'YKL', #Old value
329
                    'AKT'  #New value
330
                ],
331
                ...
332
            ]
333
334
=cut
335
336
sub grepChangedElements {
337
    my ($diff, $selectors) = @_;
338
339
    my @changes;
340
341
    foreach my $n (@$selectors) { #$n as in the "needle in the haystack"
342
        if (int($n->{f}) < 10) { #Control fields
343
            my $fieldDiffs = $diff->{$n->{f}};
344
            push(@changes, C4::Biblio::Diff::Change->new($n->{f}, $n->{sf}, @$fieldDiffs));
345
        }
346
        else { #Data fields
347
            my $fieldReps = $diff->{$n->{f}}; #fieldReps as in Field Repetitons, not all Fields but the repetitions of a selected MARC Field
348
            next unless $fieldReps;
349
            foreach my $field (@$fieldReps) {
350
351
                my $subfieldReps = $field->{$n->{sf}};
352
                next unless $subfieldReps;
353
                foreach my $subfieldDiffs (@$subfieldReps) {
354
                    push(@changes, C4::Biblio::Diff::Change->new($n->{f}, $n->{sf}, @$subfieldDiffs));
355
                }
356
            }
357
        }
358
    }
359
    return \@changes;
360
}
361
310
1;
362
1;
(-)a/C4/Biblio/Diff/Change.pm (+45 lines)
Line 0 Link Here
1
package C4::Biblio::Diff::Change;
2
3
# Copyright KohaSuomi 2016
4
#
5
# This file is part of Koha.
6
#
7
8
use Modern::Perl;
9
10
=head SYNOPSIS
11
12
    Change is a single row of changes between two or more records
13
14
=cut
15
16
=head new
17
18
    my $change = C4::Biblio::Diff::Change->new($fieldCode, $subfieldCode, @diffedValues);
19
    my $change = C4::Biblio::Diff::Change->new('084', 'a', 'Text and subfield content', ... , 'Moar text');
20
21
=cut
22
23
sub new {
24
    my $class = shift @_;
25
    my $self = \@_;
26
    bless($self, $class);
27
    return $self;
28
}
29
30
sub getFieldCode {
31
    return shift->[0];
32
}
33
sub getSubfieldCode {
34
    return shift->[1];
35
}
36
sub getVal {
37
    my ($self, $i) = @_;
38
    return $self->[$i+2];
39
}
40
sub getVals {
41
    my ($self) = @_;
42
    return $self->[2..@$self];
43
}
44
45
1;
(-)a/t/db_dependent/Biblio/Diff/diff.t (-1 / +44 lines)
Lines 230-233 sub biblioDiffUndefIndexes { Link Here
230
    t::lib::TestObjects::ObjectFactory->tearDownTestContext($testContext);
230
    t::lib::TestObjects::ObjectFactory->tearDownTestContext($testContext);
231
}
231
}
232
232
233
234
235
subtest "Grep changes", \&grepChanges;
236
sub grepChanges {
237
    my $testContext = {};
238
    eval {
239
        my $records = t::db_dependent::Biblio::Diff::localRecords::create($testContext);
240
        my @recKeys = sort(keys(%$records));
241
242
        my $diff = C4::Biblio::Diff->new(
243
                        {excludedFields => ['999', '942', '952']},
244
                        $records->{ $recKeys[0] },
245
                        $records->{ $recKeys[1] },
246
                        $records->{ $recKeys[2] },
247
                    );
248
        my $d = $diff->diffRecords();
249
250
        my $changes = C4::Biblio::Diff::grepChangedElements($d, [{f=>'020', sf=>'a'},
251
                                                                 {f=>'041', sf=>'a'},
252
                                                                 {f=>'003'}]);
253
        is(@$changes, 5, "Got five separate changes");
254
        ok(blessed($changes->[0]) && $changes->[0]->isa('C4::Biblio::Diff::Change'), "Change is of correct type");
255
        is($changes->[0]->getFieldCode, '020', "Field");
256
        is($changes->[0]->getSubfieldCode, 'a', "Subfield");
257
        is($changes->[0]->getVal(0), '9510108303', "Val1");
258
        is($changes->[0]->getVal(1), '9510108304', "Val2");
259
        is($changes->[0]->getVal(2), '9510108305', "Val3");
260
        ok(blessed($changes->[4]) && $changes->[4]->isa('C4::Biblio::Diff::Change'), "Change is of correct type");
261
        is($changes->[4]->getFieldCode, '003', "Field");
262
        is($changes->[4]->getSubfieldCode, undef, "No subfield");
263
        is($changes->[4]->getVal(0), 'KYYTI', "Val1");
264
        is($changes->[4]->getVal(1), 'OUTI',  "Val2");
265
        is($changes->[4]->getVal(2), undef,   "Val3");
266
        
267
268
    };
269
    if ($@) {
270
        ok(0, $@);
271
    }
272
    t::lib::TestObjects::ObjectFactory->tearDownTestContext($testContext);
273
}
274
275
276
233
done_testing();
277
done_testing();
234
- 

Return to bug 15996