/lib/Algorithm/SpatialIndex/Storage.pm
Perl | 171 lines | 114 code | 57 blank | 0 comment | 10 complexity | e769c615f95b46e9ea2b6ed91d422417 MD5 | raw file
- package Algorithm::SpatialIndex::Storage;
- use 5.008001;
- use strict;
- use warnings;
- use Carp qw(croak);
- require Algorithm::SpatialIndex::Strategy;
- use Scalar::Util 'weaken';
- use Class::XSAccessor {
- getters => [qw(
- index
- no_of_subnodes
- bucket_class
- )],
- };
- sub new {
- my $class = shift;
- my %opt = @_;
- my $ext_opt = $opt{opt}||{};
- my $self = bless {
- bucket_class => defined($ext_opt->{bucket_class}) ? $ext_opt->{bucket_class} : 'Algorithm::SpatialIndex::Bucket',
- %opt,
- } => $class;
- weaken($self->{index});
- my $bucket_class = $self->bucket_class;
- if (not $bucket_class =~ /::/) {
- $bucket_class = "Algorithm::SpatialIndex::Bucket::$bucket_class";
- $self->{bucket_class} = $bucket_class;
- }
- eval "require $bucket_class; 1;" or do {
- my $err = $@ || "Zombie error";
- die "Could not load bucket implementation '$bucket_class': $err"
- };
- my $strategy = $self->index->strategy;
- $self->{no_of_subnodes} = $strategy->no_of_subnodes;
- $self->init() if $self->can('init');
- return $self;
- }
- sub fetch_node {
- croak("Not implemented in base class");
- }
- sub store_node {
- croak("Not implemented in base class");
- }
- sub fetch_bucket {
- croak("Not implemented in base class");
- }
- sub delete_bucket {
- croak("Not implemented in base class");
- }
- sub store_bucket {
- croak("Not implemented in base class");
- }
- sub get_option {
- croak("Not implemented in base class");
- }
- sub set_option {
- croak("Not implemented in base class");
- }
- 1;
- __END__
- =head1 NAME
- Algorithm::SpatialIndex::Storage - Base class for storage backends
- =head1 SYNOPSIS
- use Algorithm::SpatialIndex;
- my $idx = Algorithm::SpatialIndex->new(
- storage => 'Memory', # or others
- );
- =head1 DESCRIPTION
- =head1 METHODS
- =head2 new
- Constructor. Called by the L<Algorithm::SpatialIndex>
- constructor. You probably do not need to call or implement this.
- Calls your C<init> method if available.
- =head2 init
- If your subcass implements this, it will be called on the
- fresh object in the constructor.
- =head2 fetch_node
- Fetch a node from storage by node id.
- Has to be implemented in a subclass.
- =head2 store_node
- Store the provided node. Assigns a new ID to it if it has none.
- Returns the (potentially new) node id.
- Note that general id handling is the task of the storage backend.
- Users or strategies should not set node ids.
- Has to be implemented in a subclass.
- =head2 set_option
- Takes a key/value pair for a tree property/option to be
- stored.
- Has to be implemented in a subclass.
- =head2 get_option
- Takes a key for a tree property/option to be
- fetched from storage.
- Has to be implemented in a subclass.
- =head2 fetch_bucket
- Takes a node id as argument and returns the bucket for this
- node (or undef on failure).
- Has to be implemented in a subclass.
- =head2 store_bucket
- Takes a bucket object (with assigned node id)
- and stores the bucket
- as the bucket for this node id.
- Has to be implemented in a subclass.
- =head2 delete_bucket
- Removes the given bucket (or bucket/node id) from the
- storage.
- Has to be implemented in a subclass.
- =head1 AUTHOR
- Steffen Mueller, E<lt>smueller@cpan.orgE<gt>
- =head1 COPYRIGHT AND LICENSE
- Copyright (C) 2010, 2011 by Steffen Mueller
- This library is free software; you can redistribute it and/or modify
- it under the same terms as Perl itself, either Perl version 5.10.1 or,
- at your option, any later version of Perl 5 you may have available.
- =cut