Nicolas Steenlant
and 4 contributors

NAME

Dancer::Plugin::Catmandu::SRU - SRU server backed by a searchable Catmandu::Store

SYNOPSIS

    #!/usr/bin/env perl
     
    use Dancer;
    use Catmandu;
    use Dancer::Plugin::Catmandu::SRU;
     
    Catmandu->load;
    Catmandu->config;
     
    my $options = {};

    sru_provider '/sru', %$options;
     
    dance;

DESCRIPTION

Dancer::Plugin::Catmandu::SRU is a Dancer plugin to provide SRU services for Catmandu::Store-s that support CQL (such as Catmandu::Store::ElasticSearch). Follow the installation steps below to setup your own SRU server.

REQUIREMENTS

In the examples below an ElasticSearch 1.7.2 https://www.elastic.co/downloads/past-releases/elasticsearch-1-7-2 server will be used:

    $ cpanm Dancer Catmandu::SRU Catmandu::Store::ElasticSearch

    $ wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.zip
    $ unzip elasticsearch-1.7.2.zip
    $ cd elasticsearch-1.7.2
    $ bin/elasticsearch

RECORDS

Records stored in the Catmandu::Store can be in any format. Preferably the format should be easy to convert into an XML format. At a minimum each record contains an identifier '_id'. In the examples below we'll configure the SRU to serve Dublin Core records:

    $ cat sample.yml
    ---
    _id: 1
    creator:
     - Musterman, Max
     - Jansen, Jan
     - Svenson, Sven
    title:
     - Test record
    ...

CATMANDU CONFIGURATION

ElasticSearch requires a configuration file to map record fields to CQL terms. Below is a minimal configuration required to query for '_id' and 'title' and 'creator' in the ElasticSearch collection:

    $ cat catmandu.yml
    ---
    store:
      sru:
        package: ElasticSearch
        options:
          index_name: sru
          bags:
            data:
              cql_mapping:
                default_index: basic
                indexes:
                  _id:
                    op:
                      'any': true
                      'all': true
                      '=': true
                      'exact': true
                    field: '_id'
                  creator:
                    op:
                      'any': true
                      'all': true
                      '=': true
                      'exact': true
                    field: 'creator'
                  title:
                    op:
                      'any': true
                      'all': true
                      '=': true
                      'exact': true
                    field: 'title'

IMPORT RECORDS

With the Catmandu configuration files in place records can be imported with the catmandu command:

    # Drop the existing ElasticSearch 'sru' collection
    $ catmandu drop sru

    # Import the sample record
    $ catmandu import YAML to sru < sample.yml

    # Test if the records are available in the 'sru' collection
    $ catmandu export sru

DANCER CONFIGURATION

The Dancer configuration file 'config.yml' contains basic information for the OAI-PMH plugin to work:

    * store - In which Catmandu::Store are the metadata records stored
    * bag   - In which Catmandu::Bag are the records of this 'store' (use: 'data' as default)
    * cql_filter -  A CQL query to find all records in the database that should be made available to SRU
    * default_record_schema - The metadataSchema to present records in 
    * limit - The maximum number of records to be returned in each SRU request
    * maximum_limit - The maximum number of search results to return
    * record_schemas - An array of all supported record schemas
        * identifier - The SRU identifier for the schema (see L<http://www.loc.gov/standards/sru/recordSchemas/>)
        * name - A short descriptive name for the schema
        * fix - Optionally an array of fixes to apply to the records before they are transformed into XML
        * template - The path to a Template Toolkit file to transform your records into this format

Below is a sample minimal configuration for the 'sample.yml' demo above:

    charset: "UTF-8"
    plugins:
        'Catmandu::SRU':
            store: sru
            bag: data
            default_record_schema: dc
            limit: 200
            maximum_limit: 500
            record_schemas:
                -
                    identifier: "info:srw/schema/1/dc-v1.1"
                    name: dc
                    template: dc.tt

METADATA FORMAT TEMPLATE

For each metadata format a Template Toolkit file needs to exist which translate Catmandu::Store records into XML records. The example below contains an example file to transform 'sample.yml' type records into SRU DC:

    $ cat dc.tt
    <srw_dc:dc xmlns:srw_dc="info:srw/schema/1/dc-schema"
               xmlns:dc="http://purl.org/dc/elements/1.1/"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="info:srw/schema/1/dc-schema http://www.loc.gov/standards/sru/recordSchemas/dc-schema.xsd">
    [%- FOREACH var IN ['title' 'creator' 'subject' 'description' 'publisher' 'contributor' 'date' 'type' 'format' 'identifier' 'source' 'language' 'relation' 'coverage' 'rights'] %]
        [%- FOREACH val IN $var %]
        <dc:[% var %]>[% val | html %]</dc:[% var %]>
        [%- END %]
    [%- END %]
    </srw_dc:dc>

START DANCER

If all the required files are available, then a Dancer application can be started. See the 'demo' directory of this distribution for a complete example:

    $ ls 
    app.pl  catmandu.yml  config.yml  dc.tt
    $ cat app.pl
    #!/usr/bin/env perl
     
    use Dancer;
    use Catmandu;
    use Dancer::Plugin::Catmandu::SRU;
     
    Catmandu->load;
    Catmandu->config;
     
    my $options = {};

    sru_provider '/sru', %$options;
     
    dance;

    # Start Dancer
    $ perl ./app.pl
  
    # Test queries:
    $ curl "http://localhost:3000/sru"
    $ curl "http://localhost:3000/sru?version=1.1&operation=searchRetrieve&query=(_id+%3d+1)"
    $ catmandu convert SRU --base 'http://localhost:3000/sru' --query '(_id = 1)'

AUTHOR

Nicolas Steenlant, <nicolas.steenlant at ugent.be>

CONTRIBUTOR

Vitali Peil, <vitali.peil at uni-bielefeld.de>

Patrick Hochstenbach, <patrick.hochstenbach at ugent.be>

SEE ALSO

SRU, Catmandu, Catmandu::Store::ElasticSearch , Catmandu::SRU

LICENSE

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.