summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Net/Riak.pm19
-rw-r--r--lib/Net/Riak/Object.pm52
-rw-r--r--lib/Net/Riak/Role/REST.pm2
-rw-r--r--lib/Net/Riak/Role/REST/Object.pm20
-rw-r--r--lib/Net/Riak/Role/REST/Search.pm27
-rw-r--r--lib/Net/Riak/Search.pm20
6 files changed, 136 insertions, 4 deletions
diff --git a/lib/Net/Riak.pm b/lib/Net/Riak.pm
index d4f8ef9..1fd23a6 100644
--- a/lib/Net/Riak.pm
+++ b/lib/Net/Riak.pm
@@ -14,7 +14,7 @@ has client => (
     is       => 'rw',
     isa      => Client_T,
     required => 1,
-    handles  => [qw/is_alive all_buckets server_info stats search setup_indexing/]
+    handles  => [qw/is_alive all_buckets server_info stats search index setup_indexing/]
 );
 
 sub BUILDARGS {
@@ -66,6 +66,23 @@ sub bucket {
         q     => 'field:value'
     );
 
+	# Secondary index setup (REST interface)
+    my $obj3 = $bucket->new_object('foo3', {...});
+    $obj3->add_index('myindex_bin','myvalue' );
+    $obj3->add_index('number_int', 1001);
+    $obj3->store;
+
+	# Get all keys for a specific index/value pair
+	my @keys = $client->index('mybucket', 'myindex_bin', 'myvalue' );
+	
+	# Get all keys for a range of index value pairs
+	my @keys = $client->index('mybucket', 'number_int', 500, 1500);
+	
+	# Removing a secondary index (REST interface)
+	my $new_obj = $bucket->get('foo3');
+	$new_obj->remove_index('number_int', 1001);
+	$new_obj->store;
+	
 =head1 DESCRIPTION
 
 =head2 ATTRIBUTES
diff --git a/lib/Net/Riak/Object.pm b/lib/Net/Riak/Object.pm
index 7148d4f..aa8fbcd 100644
--- a/lib/Net/Riak/Object.pm
+++ b/lib/Net/Riak/Object.pm
@@ -5,6 +5,7 @@ package Net::Riak::Object;
 use Moose;
 use Scalar::Util;
 use Net::Riak::Link;
+use Data::Dumper;
 
 with 'Net::Riak::Role::Replica' => {keys => [qw/r w dw/]};
 with 'Net::Riak::Role::Base' => {classes =>
@@ -23,6 +24,9 @@ has vtag          => (is => 'rw', isa => 'Str');
 has content_type => (is => 'rw', isa => 'Str', default => 'application/json');
 has location     => ( is => 'rw', isa => 'Str' );
 has _jsonize     => (is => 'rw', isa => 'Bool', lazy => 1, default => 1);
+
+has i2indexes	=> ( is => 'rw', isa => 'HashRef' );
+
 has links => (
     traits     => ['Array'],
     is         => 'rw',
@@ -69,6 +73,54 @@ sub store {
     $self->client->store_object($w, $dw, $self);
 }
 
+sub add_index {
+	my($self, $index, $data) = @_;
+	
+	if ( defined($index) && defined($data) ) {
+		my $ref = undef;
+		if ( defined($self->i2indexes) ) { $ref = $self->i2indexes; }
+			
+		if ( length($index) > 4 && $index =~ /^.+_bin$/ && length($data) > 0 )
+		{
+			$ref->{$index} = $data;
+			
+		}
+		if ( length($index) > 4 && $index =~ /^.+_int$/ && $data =~ /^\d+$/ ) 
+		{
+			$ref->{$index} = $data;
+		}
+		$self->i2indexes($ref);
+	}
+	$self->i2indexes;
+}
+
+sub remove_index {
+	my($self, $index, $data) = @_;
+	if ( defined($index) && defined($data) ) {
+		if ( defined($self->i2indexes) ) { 
+			my $ref = $self->i2indexes;
+
+			if ( $index =~ /^.+_bin$/ ) {
+				if ( defined($ref->{$index}) && $ref->{$index} eq $data )
+				{
+					
+					delete(${$ref}{$index});
+				}
+				$self->i2indexes($ref);
+			}
+			if ( $index =~ /^.+_int$/ ) {
+				if ( defined($ref->{$index}) && $ref->{$index} == $data )
+				{
+					print "Deleting $index\n";
+					delete(${$ref}{$index});
+				}
+				$self->i2indexes($ref);
+			}
+			print Dumper($ref),"\n";
+		}
+	}
+}
+
 sub status {
     my ($self) = @_;
     warn "DEPRECATED: status method will be removed in the 0.17 release, please use ->client->status.";
diff --git a/lib/Net/Riak/Role/REST.pm b/lib/Net/Riak/Role/REST.pm
index 73b3c2a..11e6e0e 100644
--- a/lib/Net/Riak/Role/REST.pm
+++ b/lib/Net/Riak/Role/REST.pm
@@ -66,7 +66,7 @@ sub new_request {
 # makes a HTTP::Request returns and stores a HTTP::Response
 sub send_request {
     my ($self, $req) = @_;
-
+	
     $self->http_request($req);
 
     my $r = $self->useragent->request($req);
diff --git a/lib/Net/Riak/Role/REST/Object.pm b/lib/Net/Riak/Role/REST/Object.pm
index fc45f3c..545e4e0 100644
--- a/lib/Net/Riak/Role/REST/Object.pm
+++ b/lib/Net/Riak/Role/REST/Object.pm
@@ -1,6 +1,7 @@
 package Net::Riak::Role::REST::Object;
 
 use Moose::Role;
+use Data::Dumper;
 use JSON;
 
 sub store_object {
@@ -32,13 +33,20 @@ sub store_object {
         $request->header('link' => $self->_links_to_header($object));
     }
 
+	if ( $object->i2indexes) {
+		
+		foreach (keys %{$object->i2indexes}) {	
+			$request->header(':x-riak-index-' . lc($_) => $object->i2indexes->{$_});
+		}
+	}
+
     if (ref $object->data && $object->content_type eq 'application/json') {
         $request->content(JSON::encode_json($object->data));
     }
     else {
         $request->content($object->data);
     }
-
+   
     my $response = $self->send_request($request);
     $self->populate_object($object, $response, [200, 201, 204, 300]);
     return $object;
@@ -75,7 +83,8 @@ sub populate_object {
     $obj->exists(0);
 
     return if (!$http_response);
-
+	
+	
     my $status = $http_response->code;
 
     $obj->data($http_response->content)
@@ -91,6 +100,13 @@ sub populate_object {
           . (join(', ', @$expected))
           . ", received: ".$http_response->status_line
     }
+    
+    $HTTP::Headers::TRANSLATE_UNDERSCORE = 0;
+    foreach ( $http_response->header_field_names ) {
+    	next unless /^X-Riak-Index-(.+_bin)$/ || /^X-Riak-Index-(.+_int)$/;
+    	$obj->add_index(lc($1),  $http_response->header($_) )
+    }
+    $HTTP::Headers::TRANSLATE_UNDERSCORE = 1;
 
     if ($status == 404) {
         $obj->clear;
diff --git a/lib/Net/Riak/Role/REST/Search.pm b/lib/Net/Riak/Role/REST/Search.pm
index b83e3d4..f813578 100644
--- a/lib/Net/Riak/Role/REST/Search.pm
+++ b/lib/Net/Riak/Role/REST/Search.pm
@@ -1,6 +1,7 @@
 package Net::Riak::Role::REST::Search;
 use Moose::Role;
 use JSON;
+use Data::Dumper;
 
 #ABSTRACT: Search interface
 
@@ -73,4 +74,30 @@ sub setup_indexing {
     JSON::decode_json($http_response->content);
 }
 
+sub index {
+	my ($self, $bucket,$index,$first, $last) = @_;
+	
+	my $request;
+	my @req = ();
+	
+	my $org_prefix = $self->prefix;
+	if ( defined($bucket) && defined($index) && defined($first) )
+	{
+		@req = (
+			'buckets',
+				$bucket,
+				'index',
+				$index,
+				$first
+			);
+	
+		if ( defined($last) ) { push(@req, $last); }
+	} 
+	
+	$request = $self->new_request('GET', [ @req ] );
+	
+	my $http_response = $self->send_request($request);
+	JSON::decode_json($http_response->content)->{keys};
+}
+
 1;
diff --git a/lib/Net/Riak/Search.pm b/lib/Net/Riak/Search.pm
index ee2ed57..368b7e7 100644
--- a/lib/Net/Riak/Search.pm
+++ b/lib/Net/Riak/Search.pm
@@ -33,6 +33,13 @@ sub setup_indexing {
 
     $bucket->delete_object($key, 3); # optional w val
 
+    # Secondary index setup
+    my $obj3 = $bucket->new_object('foo3', {...});
+    $obj3->add_index('index', 'first');
+    $obj3->store;
+    
+    my @keys = $client->index('bucket', 'myindex_bin', 'first_value' [, 'last_value'] );
+    
 =head1 DESCRIPTION
 
 L<Net::Riak::Search> allows you to enable indexing documents for a given bucket and querying/searching the index.
@@ -80,6 +87,19 @@ is the default index you want to query, if no index is provided you have to add
 
 is the number of documents you want to be returned in the response
 
+=item add_index
+
+add secondary index to object
+
+= item remove_index
+
+remove secondary index from object
+
+=item index
+
+Find keys via secondary index.
+  
+
 =back
 
 More parameters are available, just check at L<http://wiki.basho.com/Riak-Search---Querying.html#Querying-via-the-Solr-Interface>