NAME

PICA::Patch - Implementation of PICA diff and patch

DESCRIPTION

This file contains the implementation of diff and patch algorithm for PICA+ records. See functions pica_diff and pica_patch (or object methods diff and patch) of PICA::Data for usage.

FORMAT

The difference between two records or the change to be applied to a record is referred to as diff, delta or patch. In any case the format must encode a set of modifications. PICA Patch format encodes modifications to PICA records in form of annotated PICA records. PICA fields can be annotated with:

+

To denote a field that should be added.

-

To denote a field that should be removed.

blank

To denote a field that should be kept as it is.

Modification of a field can be encoded by removal of the old version followed by addition of the new version.

EXAMPLE

Given a PICA record with two fields:

| 003@ $012345
| 021A $aA book

A diff to modify the second field could be this:

| - 021A $aA book
| + 021A $aAn interesting book

The diff could be extended with the first field to make sure it can only applied if the first field exists in the record:

|   003@ $012345
| - 021A $aA book
| + 021A $aAn interesting book

APPLICATION

Records are always sorted before application of diff or patch. It is not recommended to diff or patch records that subsumes multiple sub-records on level 1 or level 2.

Fields are not added with a patch if the records already contains a fully identical field.

FUNCTIONS

pica_diff( $before, $after )

Return the difference between two records as annotated record.

pica_patch( $record, $diff )

Apply a difference given as annotated PICA and return the result as new record. This function may die with an error method if the diff cannot be applied.