hbasegate 0.1.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/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'http://rubygems.org'
2
+
3
+ group :development do
4
+ gem 'minitest-reporters', '>= 0.5.0'
5
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,21 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ ansi (1.4.3)
5
+ builder (3.2.0)
6
+ hashie (2.0.3)
7
+ minitest (4.7.1)
8
+ minitest-reporters (0.14.16)
9
+ ansi
10
+ builder
11
+ minitest (>= 2.12, < 5.0)
12
+ powerbar
13
+ powerbar (1.0.11)
14
+ ansi (~> 1.4.0)
15
+ hashie (>= 1.1.0)
16
+
17
+ PLATFORMS
18
+ java
19
+
20
+ DEPENDENCIES
21
+ minitest-reporters (>= 0.5.0)
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ hbasegate
2
+ =========
3
+
4
+ JRuby gem wrapping Java API for HBase
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'hbasegate'
11
+
12
+ And then execute:
13
+
14
+ $ bundle install
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install hbasegate
19
+
20
+ ## Usage
21
+
22
+ Require the gem
23
+
24
+ $ require 'hbasegate'
25
+
26
+ Create your configuration. This is optional since you can also define the config in a hbase-site.xml file as
27
+ shown in <a href"http://hbase.apache.org/book/config.files.html#client_dependencies">the hbase book</a>. The
28
+ minimal configuration is the specification of one or more ZooKeeper servers. This is used to find the HBase
29
+ API.
30
+
31
+ $ config = HBaseGate::HBaseConfiguration.create
32
+ $ config['hbase.zookeeper.quorum'] = 'zk1.test.com, zk2.test.com'
33
+
34
+ Get a handle to the table:
35
+
36
+ $ table = HBaseGate::HTable.new(config, 'test_db')
37
+
38
+ And use it:
39
+
40
+ $ r = table.get('me')
41
+ $ puts r
42
+
43
+ You specify column families, columns and values in an array of arrays. Each element of the inner array specifies on
44
+ item.
45
+
46
+ $ r = table.get('me', [['family']])
47
+ $ r = table.get('me', [['family', 'column']])
48
+ $ r = table.get('me', [['family1', 'column1'], ['family2', 'column2']])
49
+ $ r = table.put('me', [['family1', 'column1', 'value1'], ['family2', 'column2', 'value2']])
50
+ $ r = table.delete('me')
51
+ $ r = table.delete('me', [['family']])
52
+ $ r = table.delete('me', [['family', 'column']])
53
+
54
+
55
+
56
+ ## Contributing
57
+
58
+ 1. Fork it
59
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
60
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
61
+ 4. Push to the branch (`git push origin my-new-feature`)
62
+ 5. Create new Pull Request
data/hbasegate.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hbasegate/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "hbasegate"
8
+ spec.version = HBaseGate::VERSION
9
+ spec.authors = ["Knut O. Hellan"]
10
+ spec.email = ["knut.hellan@gmail.com"]
11
+ spec.description = %q{JRuby gem wrapping Java API for HBase}
12
+ spec.summary = %q{More ruby friendly API than using Java directly}
13
+ spec.homepage = "http://github.com/khellan/hbasegate"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ end
@@ -0,0 +1,16 @@
1
+ module HBaseGate
2
+ java_import 'org.apache.hadoop.conf.Configuration'
3
+ java_import 'org.apache.hadoop.hbase.HBaseConfiguration'
4
+
5
+ class Configuration
6
+ # Retrieve the value stored for name.
7
+ def [](name)
8
+ get(name)
9
+ end
10
+
11
+ # Store value for name.
12
+ def []=(name, value)
13
+ set(name, value)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,48 @@
1
+ module HBaseGate
2
+ java_import 'org.apache.hadoop.hbase.client.Delete'
3
+ java_import 'org.apache.hadoop.hbase.client.Get'
4
+ java_import 'org.apache.hadoop.hbase.client.HTable'
5
+ java_import 'org.apache.hadoop.hbase.client.Put'
6
+
7
+ class HTable
8
+ alias_method :original_delete, :delete
9
+ alias_method :original_get, :get
10
+ alias_method :original_put, :put
11
+
12
+ # Read row key with an array of family, column arrays.
13
+ def get(key, entries = nil)
14
+ get = Get.new(key.to_java_bytes)
15
+ augment_action(entries, get.method(:add_family), get.method(:add_column))
16
+ original_get(get).to_h
17
+ end
18
+
19
+ # Store row key with an array of family, column, value arrays.
20
+ def put(key, entries = nil)
21
+ put = Put.new(key.to_java_bytes)
22
+ (entries || []).each.each do |family, qualifier, value|
23
+ put.add(family.to_java_bytes, qualifier.to_java_bytes, value.to_java_bytes)
24
+ end
25
+ original_put(put)
26
+ end
27
+
28
+ # Delete row key with an array of family, column arrays.
29
+ def delete(key, entries = nil)
30
+ delete = Delete.new(key.to_java_bytes)
31
+ augment_action(entries, delete.method(:delete_family), delete.method(:delete_column))
32
+ original_delete(delete)
33
+ end
34
+
35
+ private
36
+ # Iterate over the entries and use the given functions on them.
37
+ def augment_action(entries, family_do, qualifier_do)
38
+ (entries || []).each do |family, qualifier|
39
+ case
40
+ when qualifier
41
+ qualifier_do.call(family.to_java_bytes, qualifier.to_java_bytes)
42
+ when family
43
+ family_do.call(family.to_java_bytes)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,16 @@
1
+ module HBaseGate
2
+ java_import 'org.apache.hadoop.hbase.client.Result'
3
+
4
+ class Result
5
+ # Return a nested hash of the result.
6
+ def to_h
7
+ get_no_version_map.entry_set.reduce({}) do |families, family_entries|
8
+ columns = family_entries.get_value.entry_set.reduce({}) do |columns, column_entry|
9
+ columns.update(
10
+ String.from_java_bytes(column_entry.get_key) => String.from_java_bytes(column_entry.get_value))
11
+ end
12
+ families.update(String.from_java_bytes(family_entries.get_key) => columns)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module HBaseGate
2
+ VERSION = '0.1.0'
3
+ end
data/lib/hbasegate.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'java'
2
+
3
+ $: << File.dirname(__FILE__)
4
+
5
+ require 'commons-configuration-1.6'
6
+ require 'commons-lang-2.5'
7
+ require 'commons-logging-1.1.1'
8
+ require 'guava-11.0.2'
9
+ require 'hadoop-auth'
10
+ require 'hadoop-common'
11
+ require 'hbase'
12
+ require 'slf4j-api-1.6.1.jar'
13
+ require 'zookeeper-3.4.5'
14
+
15
+ require 'hbasegate/hbase_configuration'
16
+ require 'hbasegate/htable'
17
+ require 'hbasegate/result'
18
+ require 'hbasegate/version'
19
+
20
+ $:.pop
@@ -0,0 +1,102 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/spec'
3
+
4
+ require_relative '../lib/hbasegate'
5
+
6
+ class HBaseGate::Get
7
+ def to_h
8
+ self
9
+ end
10
+ end
11
+
12
+ describe HBaseGate::HTable do
13
+ table = HBaseGate::HTable.new(nil, 't')
14
+ table.set_write_buffer_size(2097152)
15
+
16
+ describe '#get_write_buffer_size' do
17
+ it 'has default value' do
18
+ table.get_write_buffer_size.must_equal 2097152
19
+ end
20
+ end
21
+
22
+ describe '#original_put' do
23
+ it 'responds to original put' do
24
+ table.respond_to?(:original_put).must_equal true
25
+ end
26
+ end
27
+
28
+ describe '#put' do
29
+ it 'writes to the table' do
30
+ table.put('a', [['b', 'c', 'd']])
31
+ expected = HBaseGate::Put.new('a'.to_java_bytes)
32
+ expected.add('b'.to_java_bytes, 'c'.to_java_bytes, 'd'.to_java_bytes)
33
+ result = table.get_write_buffer
34
+ result.get(0).must_equal expected
35
+ result.size.must_equal 1
36
+ end
37
+ end
38
+
39
+ describe '#original_get' do
40
+ it 'responds to original get' do
41
+ table.respond_to?(:original_get).must_equal true
42
+ end
43
+ end
44
+
45
+ describe '#get' do
46
+ my_table = table.dup
47
+ def my_table.original_get(get)
48
+ get
49
+ end
50
+ it 'reads a full row' do
51
+ expected = HBaseGate::Get.new('a'.to_java_bytes)
52
+ my_table.get('a').must_equal expected
53
+ end
54
+
55
+ it 'reads a specific column' do
56
+ expected = HBaseGate::Get.new('a'.to_java_bytes)
57
+ expected.add_column('b'.to_java_bytes, 'c'.to_java_bytes)
58
+ my_table.get('a', [['b', 'c']]).must_equal expected
59
+ end
60
+
61
+ it 'reads a complete column family' do
62
+ expected = HBaseGate::Get.new('a'.to_java_bytes)
63
+ expected.add_family('b'.to_java_bytes)
64
+ my_table.get('a', [['b']]).must_equal expected
65
+ end
66
+ end
67
+
68
+ describe '#original_delete' do
69
+ it 'responds to original delete' do
70
+ table.respond_to?(:original_delete).must_equal true
71
+ end
72
+ end
73
+
74
+ describe '#delete' do
75
+ my_table = table.dup
76
+ def my_table.original_delete(delete)
77
+ @action = delete
78
+ end
79
+ def my_table.action
80
+ @action
81
+ end
82
+ it 'deletes a full row' do
83
+ expected = HBaseGate::Delete.new('a'.to_java_bytes)
84
+ my_table.delete('a')
85
+ my_table.action.must_equal expected
86
+ end
87
+
88
+ it 'deletes a specific column' do
89
+ expected = HBaseGate::Delete.new('a'.to_java_bytes)
90
+ expected.delete_column('b'.to_java_bytes, 'c'.to_java_bytes)
91
+ my_table.delete('a', [['b', 'c']])
92
+ my_table.action.must_equal expected
93
+ end
94
+
95
+ it 'deletes a complete column family' do
96
+ expected = HBaseGate::Delete.new('a'.to_java_bytes)
97
+ expected.delete_family('b'.to_java_bytes)
98
+ my_table.delete('a', [['b']])
99
+ my_table.action.must_equal expected
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,41 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/spec'
3
+
4
+ require_relative '../lib/hbasegate'
5
+
6
+ java_import 'org.apache.hadoop.hbase.KeyValue'
7
+
8
+ describe HBaseGate::Result do
9
+ describe '#to_h' do
10
+ result = HBaseGate::Result.new(
11
+ [
12
+ KeyValue.new('a'.to_java_bytes, 'b'.to_java_bytes, 'c'.to_java_bytes, 'd'.to_java_bytes),
13
+ KeyValue.new('a'.to_java_bytes, 'b'.to_java_bytes, 'e'.to_java_bytes, 'f'.to_java_bytes)
14
+ ])
15
+ actual = result.to_h
16
+ it 'returns a hash' do
17
+ actual.class.must_equal Hash
18
+ end
19
+
20
+ it 'has family b' do
21
+ actual.has_key?('b').must_equal true
22
+ end
23
+
24
+ it 'has a column c in the family b' do
25
+ actual['b'].has_key?('c').must_equal true
26
+ end
27
+
28
+ it 'has a column e in the family b' do
29
+ actual['b'].has_key?('e').must_equal true
30
+ end
31
+
32
+ it 'has a value d for column c in family b' do
33
+ actual['b']['c'].must_equal 'd'
34
+ end
35
+
36
+ it 'has a value f for column e in family b' do
37
+ actual['b']['e'].must_equal 'f'
38
+ end
39
+ end
40
+ end
41
+
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hbasegate
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Knut O. Hellan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.3'
21
+ none: false
22
+ requirement: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ none: false
28
+ prerelease: false
29
+ type: :development
30
+ description: JRuby gem wrapping Java API for HBase
31
+ email:
32
+ - knut.hellan@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - .gitignore
38
+ - Gemfile
39
+ - Gemfile.lock
40
+ - README.md
41
+ - hbasegate.gemspec
42
+ - lib/hbasegate.rb
43
+ - lib/hbasegate/hbase_configuration.rb
44
+ - lib/hbasegate/htable.rb
45
+ - lib/hbasegate/result.rb
46
+ - lib/hbasegate/version.rb
47
+ - test/htable_spec.rb
48
+ - test/result_spec.rb
49
+ homepage: http://github.com/khellan/hbasegate
50
+ licenses:
51
+ - MIT
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ none: false
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ none: false
68
+ requirements: []
69
+ rubyforge_project:
70
+ rubygems_version: 1.8.24
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: More ruby friendly API than using Java directly
74
+ test_files:
75
+ - test/htable_spec.rb
76
+ - test/result_spec.rb
77
+ ...