hbase-stargate 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +20 -0
- data/README.textile +79 -0
- data/Rakefile +27 -0
- data/VERSION +1 -0
- data/lib/stargate.rb +7 -0
- data/lib/stargate/client.rb +93 -0
- data/lib/stargate/exception.rb +21 -0
- data/lib/stargate/model.rb +19 -0
- data/lib/stargate/model/column.rb +9 -0
- data/lib/stargate/model/column_descriptor.rb +32 -0
- data/lib/stargate/model/region_descriptor.rb +9 -0
- data/lib/stargate/model/row.rb +18 -0
- data/lib/stargate/model/scanner.rb +16 -0
- data/lib/stargate/model/table_descriptor.rb +8 -0
- data/lib/stargate/operation/meta_operation.rb +20 -0
- data/lib/stargate/operation/row_operation.rb +86 -0
- data/lib/stargate/operation/scanner_operation.rb +90 -0
- data/lib/stargate/operation/table_operation.rb +95 -0
- data/lib/stargate/request.rb +7 -0
- data/lib/stargate/request/basic_request.rb +27 -0
- data/lib/stargate/request/meta_request.rb +25 -0
- data/lib/stargate/request/row_request.rb +34 -0
- data/lib/stargate/request/scanner_request.rb +25 -0
- data/lib/stargate/request/table_request.rb +43 -0
- data/lib/stargate/response.rb +7 -0
- data/lib/stargate/response/basic_response.rb +25 -0
- data/lib/stargate/response/meta_response.rb +35 -0
- data/lib/stargate/response/row_response.rb +47 -0
- data/lib/stargate/response/scanner_response.rb +41 -0
- data/lib/stargate/response/table_response.rb +26 -0
- data/spec/hbase-stargate/model/column_descriptor_spec.rb +23 -0
- data/spec/hbase-stargate/model/column_spec.rb +12 -0
- data/spec/hbase-stargate/model/region_descriptor_spec.rb +4 -0
- data/spec/hbase-stargate/model/row_spec.rb +12 -0
- data/spec/hbase-stargate/model/scanner.rb +5 -0
- data/spec/hbase-stargate/model/table_descriptor_spec.rb +12 -0
- data/spec/hbase-stargate/operation/meta_operation_spec.rb +18 -0
- data/spec/hbase-stargate/operation/row_operation_spec.rb +75 -0
- data/spec/hbase-stargate/operation/scanner_operation_spec.rb +103 -0
- data/spec/hbase-stargate/operation/table_operation_spec.rb +43 -0
- data/spec/hbase-stargate/record_spec.rb +20 -0
- data/spec/hbase-stargate/request/meta_request_spec.rb +10 -0
- data/spec/hbase-stargate/request/row_request_spec.rb +4 -0
- data/spec/hbase-stargate/request/scanner_request_spec.rb +4 -0
- data/spec/hbase-stargate/request/table_request_spec.rb +4 -0
- data/spec/hbase-stargate/response/meta_response_spec.rb +4 -0
- data/spec/hbase-stargate/response/row_response_spec.rb +4 -0
- data/spec/hbase-stargate/response/scanner_response_spec.rb +4 -0
- data/spec/hbase-stargate/response/table_response_spec.rb +4 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +3 -0
- metadata +144 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
module Stargate
|
2
|
+
module Response
|
3
|
+
class ScannerResponse < BasicResponse
|
4
|
+
attr_reader :method
|
5
|
+
|
6
|
+
def initialize(raw_data, method)
|
7
|
+
@method = method
|
8
|
+
super(raw_data)
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse_content(raw_data)
|
12
|
+
case @method
|
13
|
+
when :open_scanner
|
14
|
+
case raw_data
|
15
|
+
when Net::HTTPCreated
|
16
|
+
Stargate::Model::Scanner.new(:scanner_url => raw_data["Location"])
|
17
|
+
else
|
18
|
+
if raw_data.message.include?("TableNotFoundException")
|
19
|
+
raise TableNotFoundError, "Table #{table_name} Not Found!"
|
20
|
+
else
|
21
|
+
raise StandardError, "Unable to open scanner. Received the following message: #{raw_data.message}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
when :get_rows
|
25
|
+
# Dispatch it to RowResponse, since that method is made
|
26
|
+
# to deal with rows already.
|
27
|
+
RowResponse.new(raw_data, :show_row).parse
|
28
|
+
when :close_scanner
|
29
|
+
case raw_data
|
30
|
+
when Net::HTTPOK
|
31
|
+
return true
|
32
|
+
else
|
33
|
+
raise StandardError, "Unable to close scanner. Received the following message: #{raw_data.message}"
|
34
|
+
end
|
35
|
+
else
|
36
|
+
puts "method '#{@method}' not supported yet"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Stargate
|
2
|
+
module Response
|
3
|
+
class TableResponse < BasicResponse
|
4
|
+
def parse_content(raw_data)
|
5
|
+
table = JSON.parse(raw_data)
|
6
|
+
name = table["name"].strip
|
7
|
+
|
8
|
+
column_families = []
|
9
|
+
table["ColumnSchema"].each do |columnfamily|
|
10
|
+
colname = columnfamily["name"].strip
|
11
|
+
compression = columnfamily["COMPRESSION"].strip
|
12
|
+
bloomfilter = (columnfamily["BLOOMFILTER"].strip =~ /^true$/i ? true : false)
|
13
|
+
max_versions = columnfamily["VERSIONS"].strip.to_i
|
14
|
+
|
15
|
+
column_descriptor = Model::ColumnDescriptor.new(:name => colname,
|
16
|
+
:compression => Model::CompressionType.to_compression_type(compression),
|
17
|
+
:bloomfilter => bloomfilter,
|
18
|
+
:max_versions => max_versions)
|
19
|
+
column_families << column_descriptor
|
20
|
+
end
|
21
|
+
|
22
|
+
Model::TableDescriptor.new(:name => name, :column_families => column_families)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Model::CompressionType do
|
4
|
+
|
5
|
+
it "should be return the correct type" do
|
6
|
+
Stargate::Model::CompressionType.to_compression_type("RECORD").should == "RECORD"
|
7
|
+
Stargate::Model::CompressionType.to_compression_type("BLOCK").should == "BLOCK"
|
8
|
+
Stargate::Model::CompressionType.to_compression_type("NONE").should == "NONE"
|
9
|
+
Stargate::Model::CompressionType.to_compression_type("OTHER").should == "NONE"
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
describe Stargate::Model::ColumnDescriptor do
|
15
|
+
|
16
|
+
it "should be have such attributes" do
|
17
|
+
column = Stargate::Model::ColumnDescriptor.new({})
|
18
|
+
%w{name compression bloomfilter maximum_cell_size max_versions}.each do |method|
|
19
|
+
column.should respond_to(method)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Model::Column do
|
4
|
+
|
5
|
+
it "should be have such attributes" do
|
6
|
+
column = Stargate::Model::Column.new({})
|
7
|
+
%w{name value timestamp}.each do |method|
|
8
|
+
column.should respond_to(method)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Model::Row do
|
4
|
+
|
5
|
+
it "should be have such attributes" do
|
6
|
+
obj = Stargate::Model::Row.new({})
|
7
|
+
%w{name table_name columns}.each do |method|
|
8
|
+
obj.should respond_to(method)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Model::TableDescriptor do
|
4
|
+
|
5
|
+
it "should be have such attributes" do
|
6
|
+
obj = Stargate::Model::TableDescriptor.new({})
|
7
|
+
%w{name column_families}.each do |method|
|
8
|
+
obj.should respond_to(method)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Operation::MetaOperation do
|
4
|
+
|
5
|
+
before do
|
6
|
+
url = ENV["STARGATE_URL"].nil? ? "http://localhost:8080" : ENV["STARGATE_URL"]
|
7
|
+
@client = Stargate::Client.new(url)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should return tables" do
|
11
|
+
tables = @client.list_tables
|
12
|
+
tables.should respond_to(:size)
|
13
|
+
tables.each do |table|
|
14
|
+
table.should.is_a? Stargate::Model::TableDescriptor
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Operation::RowOperation do
|
4
|
+
before :all do
|
5
|
+
url = ENV["STARGATE_URL"].nil? ? "http://localhost:8080" : ENV["STARGATE_URL"]
|
6
|
+
@client = Stargate::Client.new(url)
|
7
|
+
|
8
|
+
table = @client.create_table("test-hbase-stargate", "col1")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should create a row called 'row1'" do
|
12
|
+
lambda {
|
13
|
+
@client.create_row("test-hbase-stargate", "row1", nil, { :name => "col1:", :value => "row1-col1" }).should be_true
|
14
|
+
}.should_not raise_error
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should create a row named 'row2' with timestamp value" do
|
18
|
+
timestamp = (Time.now - (5*60)).to_i
|
19
|
+
lambda {
|
20
|
+
@client.create_row("test-hbase-stargate", "row2", timestamp, { :name => "col1:cell1", :value => "row2-col1-cell1" }).should be_true
|
21
|
+
}.should_not raise_error
|
22
|
+
|
23
|
+
row = @client.show_row("test-hbase-stargate", "row2")
|
24
|
+
row.should be_a_kind_of(Stargate::Model::Row)
|
25
|
+
row.name.should == "row2"
|
26
|
+
|
27
|
+
columns = row.columns
|
28
|
+
columns.size.should == 1
|
29
|
+
columns.first.name.should == "col1:cell1"
|
30
|
+
columns.first.value.should == "row2-col1-cell1"
|
31
|
+
columns.first.timestamp.should == timestamp
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should show the rows 'row1'" do
|
35
|
+
row = @client.show_row("test-hbase-stargate", "row1")
|
36
|
+
row.should.is_a? Stargate::Model::Row
|
37
|
+
row.table_name.should == "test-hbase-stargate"
|
38
|
+
row.name.should == "row1"
|
39
|
+
row.columns.size.should == 1
|
40
|
+
row.columns.each do |col|
|
41
|
+
col.should.is_a? Stargate::Model::Column
|
42
|
+
col.name.should == "col1:"
|
43
|
+
col.value.should == "row1-col1"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should delete rows when timestamps are defined" do
|
48
|
+
row1 = @client.show_row("test-hbase-stargate", "row1")
|
49
|
+
timestamp = row1.columns.map(&:timestamp).uniq.first
|
50
|
+
|
51
|
+
lambda {
|
52
|
+
@client.delete_row('test-hbase-stargate', 'row1', timestamp).should be_true
|
53
|
+
}.should_not raise_error
|
54
|
+
|
55
|
+
lambda {
|
56
|
+
@client.show_row('test-hbase-stargate', 'row1')
|
57
|
+
}.should raise_error
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should delete rows without a timestamp provided" do
|
61
|
+
row2 = @client.show_row("test-hbase-stargate", "row2")
|
62
|
+
|
63
|
+
lambda {
|
64
|
+
@client.delete_row('test-hbase-stargate', 'row2').should be_true
|
65
|
+
}.should_not raise_error
|
66
|
+
|
67
|
+
lambda {
|
68
|
+
@client.show_row('test-hbase-stargate', 'row2')
|
69
|
+
}.should raise_error
|
70
|
+
end
|
71
|
+
|
72
|
+
after :all do
|
73
|
+
table = @client.destroy_table("test-hbase-stargate")
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Operation::ScannerOperation do
|
4
|
+
before :all do
|
5
|
+
url = ENV["STARGATE_URL"].nil? ? "http://localhost:8080" : ENV["STARGATE_URL"]
|
6
|
+
@client = Stargate::Client.new(url)
|
7
|
+
|
8
|
+
table = @client.create_table("test-hbase-stargate", "col1")
|
9
|
+
|
10
|
+
@client.create_row('test-hbase-stargate', 'row1', nil, {:name => 'col1:', :value => "row1-col1"})
|
11
|
+
@client.create_row('test-hbase-stargate', 'row2', nil, {:name => 'col1:', :value => "row2-col1"})
|
12
|
+
@client.create_row('test-hbase-stargate', 'row3', nil, {:name => 'col1:', :value => "row3-col1"})
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should throw TableNotFoundError if a scanner is requested for an non-existant table" do
|
16
|
+
lambda {
|
17
|
+
scanner = @client.open_scanner("test-nonexistant-table")
|
18
|
+
}.should raise_error
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should open a scanner and close it successfully" do
|
22
|
+
scanner = @client.open_scanner("test-hbase-stargate")
|
23
|
+
scanner.should.is_a? Stargate::Model::Scanner
|
24
|
+
|
25
|
+
lambda {
|
26
|
+
URI.parse("scanner.scanner_url")
|
27
|
+
}.should_not raise_error
|
28
|
+
|
29
|
+
lambda {
|
30
|
+
@client.close_scanner(scanner).should be_true
|
31
|
+
}.should_not raise_error
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should scan the whole table when given no options and no limit" do
|
35
|
+
scanner = @client.open_scanner("test-hbase-stargate")
|
36
|
+
|
37
|
+
rows = @client.get_rows(scanner)
|
38
|
+
rows.size.should == 3
|
39
|
+
rows.each do |row|
|
40
|
+
row.should be_an_instance_of Stargate::Model::Row
|
41
|
+
["row1", "row2", "row3"].should include(row.name)
|
42
|
+
end
|
43
|
+
|
44
|
+
@client.close_scanner(scanner).should be_true
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should scan the whole table but limit the results when given a limit" do
|
48
|
+
scanner = @client.open_scanner("test-hbase-stargate")
|
49
|
+
|
50
|
+
rows = @client.get_rows(scanner, 2)
|
51
|
+
rows.size.should == 2
|
52
|
+
rows.each do |row|
|
53
|
+
row.should be_an_instance_of Stargate::Model::Row
|
54
|
+
["row1", "row2"].should include(row.name)
|
55
|
+
end
|
56
|
+
|
57
|
+
@client.close_scanner(scanner).should be_true
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should return all rows when given a batch size larger than the number of rows" do
|
61
|
+
scanner = @client.open_scanner("test-hbase-stargate", {:batch => 5})
|
62
|
+
|
63
|
+
rows = @client.get_rows(scanner)
|
64
|
+
rows.size.should == 3
|
65
|
+
rows.each do |row|
|
66
|
+
row.should be_an_instance_of Stargate::Model::Row
|
67
|
+
["row1", "row2", "row3"].should include(row.name)
|
68
|
+
end
|
69
|
+
|
70
|
+
@client.close_scanner(scanner).should be_true
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should scan the correct row when given a start_row" do
|
74
|
+
scanner = @client.open_scanner("test-hbase-stargate", {:start_row => "row2", :batch => 5})
|
75
|
+
|
76
|
+
rows = @client.get_rows(scanner)
|
77
|
+
rows.size.should == 2
|
78
|
+
rows.each do |row|
|
79
|
+
row.should be_an_instance_of Stargate::Model::Row
|
80
|
+
["row2", "row3"].should include(row.name)
|
81
|
+
end
|
82
|
+
|
83
|
+
@client.close_scanner(scanner).should be_true
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should scan the correct row when given an end_row" do
|
87
|
+
# The end_row defined is exclusive, i.e. end_row does not get returned in scanner
|
88
|
+
scanner = @client.open_scanner("test-hbase-stargate", {:end_row => "row3", :batch => 5})
|
89
|
+
|
90
|
+
rows = @client.get_rows(scanner)
|
91
|
+
rows.size.should == 2
|
92
|
+
rows.each do |row|
|
93
|
+
row.should be_an_instance_of Stargate::Model::Row
|
94
|
+
["row1", "row2"].should include(row.name)
|
95
|
+
end
|
96
|
+
|
97
|
+
@client.close_scanner(scanner).should be_true
|
98
|
+
end
|
99
|
+
|
100
|
+
after :all do
|
101
|
+
@client.destroy_table("test-hbase-stargate")
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Operation::TableOperation do
|
4
|
+
before :all do
|
5
|
+
url = ENV["STARGATE_URL"].nil? ? "http://localhost:8080" : ENV["STARGATE_URL"]
|
6
|
+
@client = Stargate::Client.new(url)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should create a table called test-hbase-stargate" do
|
10
|
+
table = @client.create_table('test-hbase-stargate', { :name => 'habbit',
|
11
|
+
:max_version => 3,
|
12
|
+
:compression => Stargate::Model::CompressionType::NONE,
|
13
|
+
:in_memory => false,
|
14
|
+
:block_cache => false,
|
15
|
+
:ttl => -1,
|
16
|
+
:max_cell_size => 2147483647,
|
17
|
+
:bloomfilter => false
|
18
|
+
})
|
19
|
+
table.should.is_a? Stargate::Model::TableDescriptor
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should show the table info of 'test-hbase-stargate'" do
|
23
|
+
table = @client.show_table('test-hbase-stargate')
|
24
|
+
table.should.is_a? Stargate::Model::TableDescriptor
|
25
|
+
table.name.should == "test-hbase-stargate"
|
26
|
+
table.column_families.should respond_to(:each)
|
27
|
+
table.column_families.map(&:name).should include("habbit")
|
28
|
+
table.column_families.each do |cf|
|
29
|
+
cf.should.is_a? Stargate::Model::ColumnDescriptor
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should delete the table 'test-hbase-stargate'" do
|
34
|
+
lambda {
|
35
|
+
table = @client.destroy_table("test-hbase-stargate")
|
36
|
+
}.should_not raise_error
|
37
|
+
|
38
|
+
lambda {
|
39
|
+
table = @client.show_table("test-hbase-stargate")
|
40
|
+
}.should raise_error(Stargate::TableNotFoundError)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Model::Record do
|
4
|
+
|
5
|
+
describe "Init" do
|
6
|
+
|
7
|
+
it "should be successfuly when has the such instance variable" do
|
8
|
+
class Stargate::Model::Record ; attr_accessor :a ; end
|
9
|
+
record = Stargate::Model::Record.new({:a => 1})
|
10
|
+
record.a.should == 1
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be not set the attribute when no such instance variable" do
|
14
|
+
record = Stargate::Model::Record.new({:a => 1})
|
15
|
+
lambda{record.sent(:a)}.should raise_error NoMethodError
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
2
|
+
|
3
|
+
describe Stargate::Request::MetaRequest do
|
4
|
+
|
5
|
+
it "should get create_table path correctly" do
|
6
|
+
mr = Stargate::Request::MetaRequest.new
|
7
|
+
mr.create_table.should == "/tables"
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|