#!/usr/bin/perl use strict; { package Address; use Moose; has street => (is => 'rw'); has city => (is => 'rw'); has state => (is => 'rw'); has zip => (is => 'rw'); sub dump { my $self = shift; print $self->street, "\n"; print $self->city, ", "; print $self->state, " "; print $self->zip, "\n"; } } { package Person; use Moose; has name => (is => 'rw'); has addresses => (is => 'rw', isa => 'ArrayRef', default => sub {[]}); } { package AddressBook; use Moose; has people => (is => 'rw', isa => 'ArrayRef[Person]', default => sub {[]}); sub dump { my $self = shift; foreach my $person (@{$self->people}) { print "Entry: " . $person->name . "\n"; foreach my $address (@{$person->addresses}) { $address->dump; } } } } my $a1 = Address->new( street => '2130 P Street', city => 'Washington', state => 'DC', zip => '20037', ); my $p1 = Person->new( name => 'Joe', addresses => [ $a1 ] ); my $addressbook = AddressBook->new( people => [ $p1 ] ); use KiokuDB; use KiokuDB::Backend::BDB::GIN; use Search::GIN::Extract::Class; use Search::GIN::Extract::Callback; my $extractor = Search::GIN::Extract::Callback->new(extract => sub { my ($obj, $gin, %args) = @_; if($obj->isa("Address")) { return { zip => $obj->zip }; } return; }); my $d = KiokuDB->new( backend => KiokuDB::Backend::BDB::GIN->new( #dir => "data", extract => $extractor, root_only => 0, manager => { home => 'data', create => 1 } ), ); my $scope = $d->new_scope; # takes a snapshot of $some_object if(@ARGV) { $d->store($addressbook); print "Stored!\n"; exit; } # print "UUID: $uuid\n"; my ($book) = $d->root_set->all; print "book:\n"; $book->dump; $book->dump; $d->store($book); use Search::GIN::Query::Manual; my $query = Search::GIN::Query::Manual->new( values => { zip => 20037 } ); my @addresses = $d->search($query)->all; foreach my $address (@addresses) { print "Found address: " . $address->dump . "\n"; }