summary refs log tree commit diff
diff options
context:
space:
mode:
authorMainframe2008 <thg.bot@gmail.com>2013-02-26 08:44:28 +0100
committerMainframe2008 <thg.bot@gmail.com>2013-02-26 08:44:28 +0100
commit1b442767f0bc92b98c3a398dde02dae6212ecd1c (patch)
tree103131ad787226886342fa39d44317ce9438c5e1
parentAdd documentation for secondary indexes (diff)
downloadnet-riak-1b442767f0bc92b98c3a398dde02dae6212ecd1c.tar.gz
*Added secondary index support using method names from the riak python
client.
* Added tests for secondary indexes
* Added documentation
-rw-r--r--lib/Net/Riak.pm16
-rw-r--r--lib/Net/Riak/Object.pm51
-rw-r--r--lib/Net/Riak/Role/REST/Object.pm4
-rw-r--r--lib/Net/Riak/Role/REST/Search.pm28
-rw-r--r--lib/Net/Riak/Search.pm12
-rw-r--r--t/25-2index.t17
6 files changed, 94 insertions, 34 deletions
diff --git a/lib/Net/Riak.pm b/lib/Net/Riak.pm
index 4f2bfe5..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 i2search setup_indexing/]
+    handles  => [qw/is_alive all_buckets server_info stats search index setup_indexing/]
 );
 
 sub BUILDARGS {
@@ -68,10 +68,20 @@ sub bucket {
 
 	# Secondary index setup (REST interface)
     my $obj3 = $bucket->new_object('foo3', {...});
-    $obj3->i2index({ myindex_bin => 'myvalue' });
+    $obj3->add_index('myindex_bin','myvalue' );
+    $obj3->add_index('number_int', 1001);
     $obj3->store;
 
-	my @keys = $client->i2search(bucket => 'foo', index => 'myindex_bin', key => 'myvalue' );
+	# 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
 
diff --git a/lib/Net/Riak/Object.pm b/lib/Net/Riak/Object.pm
index 8e48dcb..aa8fbcd 100644
--- a/lib/Net/Riak/Object.pm
+++ b/lib/Net/Riak/Object.pm
@@ -73,31 +73,54 @@ sub store {
     $self->client->store_object($w, $dw, $self);
 }
 
-sub i2index {
-	my($self, $args) = @_;
+sub add_index {
+	my($self, $index, $data) = @_;
 	
-	if ( defined($args) ) {
-		my %args = %{$args};
+	if ( defined($index) && defined($data) ) {
 		my $ref = undef;
 		if ( defined($self->i2indexes) ) { $ref = $self->i2indexes; }
-		foreach my $i (keys %args)
+			
+		if ( length($index) > 4 && $index =~ /^.+_bin$/ && length($data) > 0 )
 		{
+			$ref->{$index} = $data;
 			
-			#$i = lc($i);
-			print $i,"\n";
-			if ( defined($args{$i}) && length($args{$i}) > 0 )
-			{
-				$ref->{$i} = $args{$i};
-				
-			} else {
-				delete $ref->{$i};
-			}
+		}
+		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/Object.pm b/lib/Net/Riak/Role/REST/Object.pm
index 859e06b..545e4e0 100644
--- a/lib/Net/Riak/Role/REST/Object.pm
+++ b/lib/Net/Riak/Role/REST/Object.pm
@@ -103,8 +103,8 @@ sub populate_object {
     
     $HTTP::Headers::TRANSLATE_UNDERSCORE = 0;
     foreach ( $http_response->header_field_names ) {
-    	next unless /^X-Riak-Index-(.+_bin)/;
-    	$obj->i2index({ lc($1) => $http_response->header($_) })
+    	next unless /^X-Riak-Index-(.+_bin)$/ || /^X-Riak-Index-(.+_int)$/;
+    	$obj->add_index(lc($1),  $http_response->header($_) )
     }
     $HTTP::Headers::TRANSLATE_UNDERSCORE = 1;
 
diff --git a/lib/Net/Riak/Role/REST/Search.pm b/lib/Net/Riak/Role/REST/Search.pm
index 7e74af5..f813578 100644
--- a/lib/Net/Riak/Role/REST/Search.pm
+++ b/lib/Net/Riak/Role/REST/Search.pm
@@ -74,21 +74,27 @@ sub setup_indexing {
     JSON::decode_json($http_response->content);
 }
 
-sub i2search {
-	my $self = shift;
-	my %params = @_;
+sub index {
+	my ($self, $bucket,$index,$first, $last) = @_;
+	
 	my $request;
+	my @req = ();
 	
 	my $org_prefix = $self->prefix;
-	
-	$request = $self->new_request('GET', [
+	if ( defined($bucket) && defined($index) && defined($first) )
+	{
+		@req = (
 			'buckets',
-			$params{bucket},
-			'index',
-			$params{index},
-			$params{key}
-			]
-	);
+				$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};
diff --git a/lib/Net/Riak/Search.pm b/lib/Net/Riak/Search.pm
index 646d4d3..368b7e7 100644
--- a/lib/Net/Riak/Search.pm
+++ b/lib/Net/Riak/Search.pm
@@ -35,10 +35,10 @@ sub setup_indexing {
 
     # Secondary index setup
     my $obj3 = $bucket->new_object('foo3', {...});
-    $obj3->i2index({ myindex_bin => 'myvalue' });
+    $obj3->add_index('index', 'first');
     $obj3->store;
     
-    my @keys = $client->i2search(bucket => 'foo', index => 'myindex_bin', key => 'myvalue' );
+    my @keys = $client->index('bucket', 'myindex_bin', 'first_value' [, 'last_value'] );
     
 =head1 DESCRIPTION
 
@@ -87,11 +87,15 @@ 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 i2index
+=item add_index
 
 add secondary index to object
 
-=item i2search
+= item remove_index
+
+remove secondary index from object
+
+=item index
 
 Find keys via secondary index.
   
diff --git a/t/25-2index.t b/t/25-2index.t
new file mode 100644
index 0000000..c6d420c
--- /dev/null
+++ b/t/25-2index.t
@@ -0,0 +1,17 @@
+use lib 't/lib';
+use Test::More;
+use Test::Riak;
+
+test_riak_rest {
+	my ($client, $bucket_name) = @_;
+	my $content = { field => "2index" };
+	ok my $bucket = $client->bucket($bucket_name), 'got bucket test';
+	ok my $obj = $bucket->new_object('2ikey', $content), 
+		'created a new riak object for seconday index';
+	ok $obj->add_index('myindex_bin', 'value'), 'Secondary index created';
+	
+	ok $obj->store, 'Object with secondary index stored';
+	ok my $newobj->get('2ikey'), 'Object with secondary index retrieved';
+	ok $newobj->remove_index('myindex_bin', 'value'), 'Secondary index removed';
+	ok $newobj->store, "Object without secondary index saved";
+}
\ No newline at end of file