hbase-jruby 0.4.4-java → 0.4.5-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -1
- data/README.md +34 -29
- data/lib/hbase-jruby/cell.rb +3 -1
- data/lib/hbase-jruby/dependency.rb +4 -3
- data/lib/hbase-jruby/hbase.rb +6 -1
- data/lib/hbase-jruby/pom/pom.xml.erb +4 -4
- data/lib/hbase-jruby/row.rb +66 -92
- data/lib/hbase-jruby/scoped.rb +6 -13
- data/lib/hbase-jruby/table.rb +2 -1
- data/lib/hbase-jruby/table/admin.rb +34 -3
- data/lib/hbase-jruby/table/inspection.rb +12 -3
- data/lib/hbase-jruby/table/mutation.rb +5 -1
- data/lib/hbase-jruby/util.rb +2 -0
- data/lib/hbase-jruby/version.rb +1 -1
- data/test/helper.rb +4 -3
- data/test/test_aggregation.rb +3 -0
- data/test/test_schema.rb +42 -16
- data/test/test_table.rb +38 -22
- data/test/test_table_admin.rb +51 -24
- data/test/test_util.rb +4 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 317e3299f449c9c5f847ae8118c631d22ff91872
|
4
|
+
data.tar.gz: 092879ce25e3448c5a777310782c7fffab0ba586
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3454275b00e7636a6d1bedf6b4172ad75f74da839f7bbdb91ac8882604c2e128cef248289abbb276629ed78d4da17834d59844c8fe949cf24bd5d180d3e42433
|
7
|
+
data.tar.gz: 1bb37e732100751e1861605af88f0cf0e1aef988a396a95478bc10af5966c8223bcc9f03bf31529c44846b6cc7b47aa64d2796e5852964e40528ac0a851bba43
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
0.4.5
|
5
|
+
-----
|
6
|
+
- Fixed HBase 0.96 compatibily issues and tested on HBase 0.96 and 0.98
|
7
|
+
- Added `:split_policy` table property
|
8
|
+
- `Table#properties` and `Table#families` now include previously unknown
|
9
|
+
properties as String-String pairs
|
10
|
+
- Added `Row#byte_array` which returns an instance of `HBase::ByteArray`
|
11
|
+
- Equivalent to `HBase::ByteArray[row.raw(col)]`
|
12
|
+
|
13
|
+
|
4
14
|
0.4.4
|
5
15
|
-----
|
6
|
-
- Fixed HBase::Table#raw_families/raw_properties on HBase shell
|
16
|
+
- Fixed `HBase::Table#raw_families/raw_properties` on HBase shell
|
7
17
|
|
8
18
|
0.4.3
|
9
19
|
-----
|
data/README.md
CHANGED
@@ -58,15 +58,16 @@ hbase.schema = {
|
|
58
58
|
book: {
|
59
59
|
# Columns in cf1 family
|
60
60
|
cf1: {
|
61
|
-
title:
|
62
|
-
author:
|
63
|
-
category:
|
64
|
-
year:
|
65
|
-
pages:
|
66
|
-
price:
|
67
|
-
weight:
|
68
|
-
in_print:
|
69
|
-
image:
|
61
|
+
title: :string, # String (UTF-8)
|
62
|
+
author: :string,
|
63
|
+
category: :string,
|
64
|
+
year: :short, # Short integer (2-byte)
|
65
|
+
pages: :int, # Integer (4-byte)
|
66
|
+
price: :bigdecimal, # BigDecimal
|
67
|
+
weight: :float, # Double-precision floating-point number
|
68
|
+
in_print: :boolean, # Boolean (true | false)
|
69
|
+
image: :raw # Java byte array; no automatic type conversion
|
70
|
+
thumbnail: :byte_array # HBase::ByteArray
|
70
71
|
},
|
71
72
|
# Columns in cf2 family
|
72
73
|
cf2: {
|
@@ -151,21 +152,23 @@ or by `require`ing relevant JAR files after launching JRuby.
|
|
151
152
|
Well, there's an easier way.
|
152
153
|
Call `HBase.resolve_dependency!` helper method passing one of the arguments listed below.
|
153
154
|
|
154
|
-
| Argument | Dependency | Default version
|
155
|
-
| ---------- | ------------------------ | ---------------
|
156
|
-
| cdh4.5[.*] | Cloudera CDH4.5 | cdh4.5.0
|
157
|
-
| cdh4.4[.*] | Cloudera CDH4.4 | cdh4.4.0
|
158
|
-
| cdh4.3[.*] | Cloudera CDH4.3 | cdh4.3.2
|
159
|
-
| cdh4.2[.*] | Cloudera CDH4.2 | cdh4.2.2
|
160
|
-
| cdh4.1[.*] | Cloudera CDH4.1 | cdh4.1.5
|
161
|
-
| cdh3[u*] | Cloudera CDH3 | cdh3u6
|
162
|
-
| 0.
|
163
|
-
| 0.
|
164
|
-
|
|
165
|
-
|
|
155
|
+
| Argument | Dependency | Default version | Required executable |
|
156
|
+
| ---------- | ------------------------ | --------------- | ------------------- |
|
157
|
+
| cdh4.5[.*] | Cloudera CDH4.5 | cdh4.5.0 | mvn |
|
158
|
+
| cdh4.4[.*] | Cloudera CDH4.4 | cdh4.4.0 | mvn |
|
159
|
+
| cdh4.3[.*] | Cloudera CDH4.3 | cdh4.3.2 | mvn |
|
160
|
+
| cdh4.2[.*] | Cloudera CDH4.2 | cdh4.2.2 | mvn |
|
161
|
+
| cdh4.1[.*] | Cloudera CDH4.1 | cdh4.1.5 | mvn |
|
162
|
+
| cdh3[u*] | Cloudera CDH3 | cdh3u6 | mvn |
|
163
|
+
| 0.98[.*] | Apache HBase 0.98 | 0.98.0-hadoop2 | mvn |
|
164
|
+
| 0.96[.*] | Apache HBase 0.96 | 0.96.1.1-hadoop2 | mvn |
|
165
|
+
| 0.94[.*] | Apache HBase 0.94 | 0.94.16 | mvn |
|
166
|
+
| 0.92[.*] | Apache HBase 0.92 | 0.92.2 | mvn |
|
167
|
+
| *POM PATH* | Custom Maven POM file | - | mvn |
|
168
|
+
| `:local` | Local HBase installation | - | hbase |
|
166
169
|
|
167
170
|
(Default version is used when an argument prefix is given without specific patch version.
|
168
|
-
e.g. `cdh4.2` defaults to `cdh4.2.
|
171
|
+
e.g. `cdh4.2` defaults to `cdh4.2.2`)
|
169
172
|
|
170
173
|
#### Examples
|
171
174
|
|
@@ -1016,13 +1019,15 @@ Some of the properties are only available on recent versions of HBase.
|
|
1016
1019
|
|
1017
1020
|
http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/HTableDescriptor.html
|
1018
1021
|
|
1019
|
-
| Property | Type
|
1020
|
-
|
1021
|
-
| `:max_filesize` | Fixnum
|
1022
|
-
| `:readonly` | Boolean
|
1023
|
-
| `:memstore_flushsize` | Fixnum
|
1024
|
-
| `:deferred_log_flush` | Boolean
|
1025
|
-
| `:
|
1022
|
+
| Property | Type | Description |
|
1023
|
+
| --------------------- | ------------- | --------------------------------------------------------------------------------------------------------- |
|
1024
|
+
| `:max_filesize` | Fixnum | The maximum size upto which a region can grow to after which a region split is triggered |
|
1025
|
+
| `:readonly` | Boolean | If the table is read-only |
|
1026
|
+
| `:memstore_flushsize` | Fixnum | The maximum size of the memstore after which the contents of the memstore are flushed to the filesystem |
|
1027
|
+
| `:deferred_log_flush` | Boolean | Defer the log edits syncing to the file system (deprecated in 0.96) |
|
1028
|
+
| `:durability` | Symbol/String | Durability setting of the table |
|
1029
|
+
| `:split_policy` | String/Class | Region split policy |
|
1030
|
+
| `:splits` | Array | Region split points |
|
1026
1031
|
|
1027
1032
|
### Managing column families
|
1028
1033
|
|
data/lib/hbase-jruby/cell.rb
CHANGED
@@ -119,7 +119,9 @@ class Cell
|
|
119
119
|
# @param [Cell] other
|
120
120
|
# @return [Fixnum] -1, 0, or 1
|
121
121
|
def <=> other
|
122
|
-
|
122
|
+
(@comparator ||=
|
123
|
+
KeyValue.const_defined?(:COMPARATOR) ?
|
124
|
+
KeyValue::COMPARATOR : KeyValue.COMPARATOR).compare(@java, other.java)
|
123
125
|
end
|
124
126
|
|
125
127
|
# Checks if the cells are the same
|
@@ -18,9 +18,10 @@ class HBase
|
|
18
18
|
'cdh4.2' => 'cdh4.2.2',
|
19
19
|
'cdh4.1' => 'cdh4.1.5',
|
20
20
|
'cdh3' => 'cdh3u6',
|
21
|
+
'0.98' => '0.98.0-hadoop2',
|
21
22
|
'0.96' => '0.96.1.1-hadoop2',
|
22
23
|
'0.95' => '0.95.2-hadoop2',
|
23
|
-
'0.94' => '0.94.
|
24
|
+
'0.94' => '0.94.16',
|
24
25
|
'0.92' => '0.92.2',
|
25
26
|
}
|
26
27
|
|
@@ -173,8 +174,8 @@ class HBase
|
|
173
174
|
org.apache.hadoop.hbase.client.Put
|
174
175
|
org.apache.hadoop.hbase.client.RowMutations
|
175
176
|
org.apache.hadoop.hbase.io.hfile.Compression
|
176
|
-
org.apache.hadoop.hbase.
|
177
|
-
],
|
177
|
+
org.apache.hadoop.hbase.io.compress.Compression
|
178
|
+
], # hfile.Compression <= 0.94
|
178
179
|
HBase::Scoped => %w[
|
179
180
|
org.apache.hadoop.hbase.client.Get
|
180
181
|
org.apache.hadoop.hbase.client.Scan
|
data/lib/hbase-jruby/hbase.rb
CHANGED
@@ -89,7 +89,12 @@ class HBase
|
|
89
89
|
unless @closed
|
90
90
|
@closed = true
|
91
91
|
close_table_pool
|
92
|
-
|
92
|
+
begin
|
93
|
+
HConnectionManager.deleteConnection(@config)
|
94
|
+
rescue ArgumentError
|
95
|
+
# HBase 0.92 or below
|
96
|
+
HConnectionManager.deleteConnection(@config, true)
|
97
|
+
end
|
93
98
|
end
|
94
99
|
end
|
95
100
|
end
|
@@ -154,7 +154,7 @@
|
|
154
154
|
</dependencies>
|
155
155
|
</profile>
|
156
156
|
|
157
|
-
<% %w[0.95 0.96].each do |version| %>
|
157
|
+
<% %w[0.95 0.96 0.98].each do |version| %>
|
158
158
|
<profile>
|
159
159
|
<id><%= version %></id>
|
160
160
|
<properties>
|
@@ -170,14 +170,14 @@
|
|
170
170
|
<version>2.2.0</version>
|
171
171
|
<% else %>
|
172
172
|
<artifactId>hadoop-core</artifactId>
|
173
|
-
<version>1.1
|
173
|
+
<version>1.2.1</version>
|
174
174
|
<% end %>
|
175
175
|
<scope>compile</scope>
|
176
176
|
</dependency>
|
177
177
|
|
178
178
|
<dependency>
|
179
179
|
<groupId>org.apache.hbase</groupId>
|
180
|
-
<artifactId>hbase</artifactId>
|
180
|
+
<artifactId>hbase-client</artifactId>
|
181
181
|
<version>${hbase.version}</version>
|
182
182
|
<scope>compile</scope>
|
183
183
|
</dependency>
|
@@ -190,7 +190,7 @@
|
|
190
190
|
<id><%= version %></id>
|
191
191
|
<properties>
|
192
192
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
193
|
-
<hadoop.version>1.1
|
193
|
+
<hadoop.version>1.2.1</hadoop.version>
|
194
194
|
<hbase.version><%= profiles[version] %></hbase.version>
|
195
195
|
</properties>
|
196
196
|
|
data/lib/hbase-jruby/row.rb
CHANGED
@@ -80,191 +80,165 @@ class Row
|
|
80
80
|
end
|
81
81
|
alias to_hash_with_versions to_H
|
82
82
|
|
83
|
-
# Returns column
|
84
|
-
# @
|
85
|
-
#
|
86
|
-
# @param [String, Array] col Column name as String or 2-element Array of family and qualifier
|
87
|
-
# @return [byte[]] Byte array representation of the latest value
|
83
|
+
# Returns the latest column value as a Java byte array
|
84
|
+
# @param [String, Array] col Column name as String or 2-element Array of family and qualifier
|
85
|
+
# @return [byte[]] Byte array representation of the latest value
|
88
86
|
def raw col
|
89
87
|
get_value col
|
90
88
|
end
|
91
89
|
|
92
|
-
# Returns all versions of column values as byte arrays in a Hash indexed by their timestamps
|
93
|
-
# @
|
94
|
-
#
|
95
|
-
# @param [String, Array] col Column name as String or 2-element Array of family and qualifier
|
96
|
-
# @return [Hash<Fixnum, byte[]>]
|
90
|
+
# Returns all versions of column values as Java byte arrays in a Hash indexed by their timestamps
|
91
|
+
# @param [String, Array] col Column name as String or 2-element Array of family and qualifier
|
92
|
+
# @return [Hash<Fixnum, byte[]>]
|
97
93
|
def raws col
|
98
94
|
get_value col, true
|
99
95
|
end
|
100
96
|
|
101
|
-
# Returns column
|
102
|
-
# @
|
103
|
-
#
|
104
|
-
|
105
|
-
|
97
|
+
# Returns the latest column value as a HBase::ByteArray instance
|
98
|
+
# @param [String, Array] col Column name as String or 2-element Array of family and qualifier
|
99
|
+
# @return [byte[]] Byte array representation of the latest value
|
100
|
+
def byte_array col
|
101
|
+
decode_value :byte_array, col
|
102
|
+
end
|
103
|
+
|
104
|
+
# Returns all versions of column values as HBase::ByteArray instances in a Hash indexed by their timestamps
|
105
|
+
# @param [String, Array] col Column name as String or 2-element Array of family and qualifier
|
106
|
+
# @return [byte[]] Byte array representation of the latest value
|
107
|
+
def byte_arrays col
|
108
|
+
decode_value :byte_array, col, true
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns the latest column value as a String
|
112
|
+
# @param [String, Array] col Column name as String or 2-element Array of family and qualifier
|
113
|
+
# @return [String]
|
106
114
|
def string col
|
107
115
|
decode_value :string, col
|
108
116
|
end
|
109
117
|
alias str string
|
110
118
|
|
111
119
|
# Returns all versions of column values as Strings in a Hash indexed by their timestamps
|
112
|
-
# @
|
113
|
-
#
|
114
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
115
|
-
# @return [Hash<Fixnum, String>]
|
120
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
121
|
+
# @return [Hash<Fixnum, String>]
|
116
122
|
def strings col
|
117
123
|
decode_value :string, col, true
|
118
124
|
end
|
119
125
|
alias strs strings
|
120
126
|
|
121
|
-
# Returns column
|
122
|
-
# @
|
123
|
-
#
|
124
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
125
|
-
# @return [Symbol]
|
127
|
+
# Returns the latest column value as a Symbol
|
128
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
129
|
+
# @return [Symbol]
|
126
130
|
def symbol col
|
127
131
|
decode_value :symbol, col
|
128
132
|
end
|
129
133
|
alias sym symbol
|
130
134
|
|
131
135
|
# Returns all versions of column values as Symbols in a Hash indexed by their timestamps
|
132
|
-
# @
|
133
|
-
#
|
134
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
135
|
-
# @return [Hash<Fixnum, Symbol>]
|
136
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
137
|
+
# @return [Hash<Fixnum, Symbol>]
|
136
138
|
def symbols col
|
137
139
|
decode_value :symbol, col, true
|
138
140
|
end
|
139
141
|
alias syms symbols
|
140
142
|
|
141
|
-
# Returns 1-byte column
|
142
|
-
# @
|
143
|
-
#
|
144
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
145
|
-
# @return [Fixnum]
|
143
|
+
# Returns the latest 1-byte column value as a Fixnum
|
144
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
145
|
+
# @return [Fixnum]
|
146
146
|
def byte col
|
147
147
|
decode_value :byte, col
|
148
148
|
end
|
149
149
|
|
150
150
|
# Returns all versions of 1-byte column values as Fixnums in a Hash indexed by their timestamps
|
151
|
-
# @
|
152
|
-
#
|
153
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
154
|
-
# @return [Hash<Fixnum, Fixnum>]
|
151
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
152
|
+
# @return [Hash<Fixnum, Fixnum>]
|
155
153
|
def bytes col
|
156
154
|
decode_value :byte, col, true
|
157
155
|
end
|
158
156
|
|
159
|
-
# Returns 2-byte column
|
160
|
-
# @
|
161
|
-
#
|
162
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
163
|
-
# @return [Fixnum]
|
157
|
+
# Returns the latest 2-byte column value as a Fixnum
|
158
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
159
|
+
# @return [Fixnum]
|
164
160
|
def short col
|
165
161
|
decode_value :short, col
|
166
162
|
end
|
167
163
|
|
168
164
|
# Returns all versions of 2-byte column values as Fixnums in a Hash indexed by their timestamps
|
169
|
-
# @
|
170
|
-
#
|
171
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
172
|
-
# @return [Hash<Fixnum, Fixnum>]
|
165
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
166
|
+
# @return [Hash<Fixnum, Fixnum>]
|
173
167
|
def shorts col
|
174
168
|
decode_value :short, col, true
|
175
169
|
end
|
176
170
|
|
177
|
-
# Returns 4-byte column
|
178
|
-
# @
|
179
|
-
#
|
180
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
181
|
-
# @return [Fixnum]
|
171
|
+
# Returns the latest 4-byte column value as a Fixnum
|
172
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
173
|
+
# @return [Fixnum]
|
182
174
|
def int col
|
183
175
|
decode_value :int, col
|
184
176
|
end
|
185
177
|
|
186
178
|
# Returns all versions of 4-byte column values as Fixnums in a Hash indexed by their timestamps
|
187
|
-
# @
|
188
|
-
#
|
189
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
190
|
-
# @return [Hash<Fixnum, Fixnum>]
|
179
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
180
|
+
# @return [Hash<Fixnum, Fixnum>]
|
191
181
|
def ints col
|
192
182
|
decode_value :int, col, true
|
193
183
|
end
|
194
184
|
|
195
|
-
# Returns 8-byte column
|
196
|
-
# @
|
197
|
-
#
|
198
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
199
|
-
# @return [Fixnum]
|
185
|
+
# Returns the latest 8-byte column value as a Fixnum
|
186
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
187
|
+
# @return [Fixnum]
|
200
188
|
def fixnum col
|
201
189
|
decode_value :fixnum, col
|
202
190
|
end
|
203
191
|
alias long fixnum
|
204
192
|
|
205
193
|
# Returns all versions of 8-byte column values as Fixnums in a Hash indexed by their timestamps
|
206
|
-
# @
|
207
|
-
#
|
208
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
209
|
-
# @return [Hash<Fixnum, Fixnum>]
|
194
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
195
|
+
# @return [Hash<Fixnum, Fixnum>]
|
210
196
|
def fixnums col
|
211
197
|
decode_value :fixnum, col, true
|
212
198
|
end
|
213
199
|
alias longs fixnums
|
214
200
|
|
215
|
-
# Returns column
|
216
|
-
# @
|
217
|
-
#
|
218
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
219
|
-
# @return [BigDecimal]
|
201
|
+
# Returns the latest column value as a BigDecimal
|
202
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
203
|
+
# @return [BigDecimal]
|
220
204
|
def bigdecimal col
|
221
205
|
decode_value :bigdecimal, col
|
222
206
|
end
|
223
207
|
|
224
208
|
# Returns all versions of column values as BigDecimals in a Hash indexed by their timestamps
|
225
|
-
# @
|
226
|
-
#
|
227
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
228
|
-
# @return [Hash<Fixnum, BigDecimal>]
|
209
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
210
|
+
# @return [Hash<Fixnum, BigDecimal>]
|
229
211
|
def bigdecimals col
|
230
212
|
decode_value :bigdecimal, col, true
|
231
213
|
end
|
232
214
|
|
233
|
-
# Returns column
|
234
|
-
# @
|
235
|
-
#
|
236
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
237
|
-
# @return [Float]
|
215
|
+
# Returns the latest column value as a Float
|
216
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
217
|
+
# @return [Float]
|
238
218
|
def float col
|
239
219
|
decode_value :float, col
|
240
220
|
end
|
241
221
|
alias double float
|
242
222
|
|
243
223
|
# Returns all versions of column values as Floats in a Hash indexed by their timestamps
|
244
|
-
# @
|
245
|
-
#
|
246
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
247
|
-
# @return [Hash<Fixnum, Float>]
|
224
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
225
|
+
# @return [Hash<Fixnum, Float>]
|
248
226
|
def floats col
|
249
227
|
decode_value :float, col, true
|
250
228
|
end
|
251
229
|
alias doubles floats
|
252
230
|
|
253
|
-
# Returns column
|
254
|
-
# @
|
255
|
-
#
|
256
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
257
|
-
# @return [true, false]
|
231
|
+
# Returns the latest column value as a boolean value
|
232
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
233
|
+
# @return [true, false]
|
258
234
|
def boolean col
|
259
235
|
decode_value :boolean, col
|
260
236
|
end
|
261
237
|
alias bool boolean
|
262
238
|
|
263
|
-
# Returns all versions of column values as
|
264
|
-
# @
|
265
|
-
#
|
266
|
-
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
267
|
-
# @return [Hash<Fixnum, true|false>]
|
239
|
+
# Returns all versions of column values as boolean values in a Hash indexed by their timestamps
|
240
|
+
# @param [String, Array] column Column name as String or 2-element Array of family and qualifier
|
241
|
+
# @return [Hash<Fixnum, true|false>]
|
268
242
|
def booleans col
|
269
243
|
decode_value :boolean, col, true
|
270
244
|
end
|
data/lib/hbase-jruby/scoped.rb
CHANGED
@@ -28,7 +28,7 @@ class Scoped
|
|
28
28
|
|
29
29
|
scan = block_given? ? filtered_scan : filtered_scan_minimum
|
30
30
|
scan.cache_blocks = options[:cache_blocks]
|
31
|
-
if options[:caching] && (@
|
31
|
+
if options[:caching] && (@limit.nil? || options[:caching] < @limit)
|
32
32
|
scan.caching = options[:caching]
|
33
33
|
end
|
34
34
|
|
@@ -166,7 +166,7 @@ class Scoped
|
|
166
166
|
unless (rows.is_a?(Fixnum) && rows >= 0) || rows.nil?
|
167
167
|
raise ArgumentError, "Invalid limit. Must be a non-negative integer or nil."
|
168
168
|
end
|
169
|
-
spawn :@limit, rows
|
169
|
+
spawn :@limit, rows
|
170
170
|
end
|
171
171
|
|
172
172
|
# Returns an HBase::Scoped object with the specified time range
|
@@ -264,7 +264,6 @@ private
|
|
264
264
|
@dcaching = default_caching
|
265
265
|
@caching = nil
|
266
266
|
@limit = nil
|
267
|
-
@mlimit = nil
|
268
267
|
@trange = nil
|
269
268
|
@scan_cbs = []
|
270
269
|
@get_cbs = []
|
@@ -529,14 +528,8 @@ private
|
|
529
528
|
|
530
529
|
# Limit
|
531
530
|
if @limit
|
532
|
-
|
533
|
-
|
534
|
-
scan.setMaxResultSize(@limit)
|
535
|
-
else
|
536
|
-
@mlimit = @limit
|
537
|
-
if [@caching, @dcaching].compact.all? { |c| @mlimit < c }
|
538
|
-
scan.caching = @mlimit
|
539
|
-
end
|
531
|
+
if [@caching, @dcaching].compact.all? { |c| @limit < c }
|
532
|
+
scan.caching = @limit
|
540
533
|
end
|
541
534
|
end
|
542
535
|
|
@@ -649,10 +642,10 @@ private
|
|
649
642
|
|
650
643
|
def iterate scan
|
651
644
|
scanner = htable.getScanner(scan)
|
652
|
-
if @
|
645
|
+
if @limit
|
653
646
|
scanner.each_with_index do |result, idx|
|
654
647
|
yield result
|
655
|
-
break if idx == @
|
648
|
+
break if idx == @limit - 1
|
656
649
|
end
|
657
650
|
else
|
658
651
|
scanner.each do |result|
|
data/lib/hbase-jruby/table.rb
CHANGED
@@ -281,6 +281,29 @@ private
|
|
281
281
|
:readonly => { :get => :isReadOnly, :set => :setReadOnly },
|
282
282
|
:memstore_flushsize => { :get => :getMemStoreFlushSize, :set => :setMemStoreFlushSize },
|
283
283
|
:deferred_log_flush => { :get => :isDeferredLogFlush, :set => :setDeferredLogFlush },
|
284
|
+
:split_policy => { :get => :getRegionSplitPolicyClassName,
|
285
|
+
:set => proc { |htd, v|
|
286
|
+
htd.setValue HTableDescriptor::SPLIT_POLICY,
|
287
|
+
case v
|
288
|
+
when String
|
289
|
+
v
|
290
|
+
when Class
|
291
|
+
v.java_class.name
|
292
|
+
when Java::JavaClass
|
293
|
+
v.name
|
294
|
+
else
|
295
|
+
raise ArgumentError, "Invalid type for region split policy"
|
296
|
+
end
|
297
|
+
}
|
298
|
+
},
|
299
|
+
:durability => { :get => :getDurability,
|
300
|
+
:set => proc { |htd, v|
|
301
|
+
const = const_shortcut(
|
302
|
+
org.apache.hadoop.hbase.client.Durability, v,
|
303
|
+
"Invalid durability setting")
|
304
|
+
htd.setDurability const
|
305
|
+
}
|
306
|
+
}
|
284
307
|
}
|
285
308
|
|
286
309
|
MAX_SPLIT_WAIT = 30
|
@@ -330,7 +353,7 @@ private
|
|
330
353
|
end
|
331
354
|
end
|
332
355
|
|
333
|
-
def const_shortcut base, v, message
|
356
|
+
def self.const_shortcut base, v, message
|
334
357
|
# Match by constant value
|
335
358
|
# - const_get doesn't work with symbols in 1.8 compatibility mode
|
336
359
|
if base.constants.map { |c| base.const_get c }.any? { |cv| v == cv }
|
@@ -343,12 +366,20 @@ private
|
|
343
366
|
end
|
344
367
|
end
|
345
368
|
|
369
|
+
def const_shortcut *args
|
370
|
+
Table.const_shortcut(*args)
|
371
|
+
end
|
372
|
+
|
346
373
|
def patch_table_descriptor! htd, props
|
347
374
|
props.each do |key, value|
|
348
375
|
next if key == :splits
|
349
376
|
|
350
377
|
if method = TABLE_PROPERTIES[key] && TABLE_PROPERTIES[key][:set]
|
351
|
-
|
378
|
+
if method.is_a? Symbol
|
379
|
+
htd.send method, value
|
380
|
+
else
|
381
|
+
method.call htd, value
|
382
|
+
end
|
352
383
|
elsif key.is_a?(String)
|
353
384
|
htd.setValue key, value.to_s
|
354
385
|
else
|
@@ -359,7 +390,7 @@ private
|
|
359
390
|
end
|
360
391
|
|
361
392
|
def _alter props, bang, &block
|
362
|
-
raise ArgumentError, ":
|
393
|
+
raise ArgumentError, ":splits not supported" if props[:splits]
|
363
394
|
with_admin do |admin|
|
364
395
|
htd = admin.get_table_descriptor(@name.to_java_bytes)
|
365
396
|
patch_table_descriptor! htd, props
|
@@ -10,13 +10,19 @@ class Table
|
|
10
10
|
# @return [Hash]
|
11
11
|
def properties
|
12
12
|
desc = descriptor
|
13
|
-
|
13
|
+
parse_raw_map(descriptor.values).tap { |props|
|
14
14
|
TABLE_PROPERTIES.each do |prop, gs|
|
15
15
|
get = gs[:get]
|
16
16
|
if get && desc.respond_to?(get)
|
17
|
+
props.delete(prop.to_s.upcase)
|
17
18
|
props[prop] = parse_property desc.send get
|
18
19
|
end
|
19
20
|
end
|
21
|
+
|
22
|
+
# deferred_log_flush is deprecated in 0.96
|
23
|
+
if props.has_key?(:durability) && props.has_key?(:deferred_log_flush)
|
24
|
+
props.delete :deferred_log_flush
|
25
|
+
end
|
20
26
|
}
|
21
27
|
end
|
22
28
|
|
@@ -33,10 +39,11 @@ class Table
|
|
33
39
|
descriptor.families.each do |family|
|
34
40
|
name = family.name_as_string
|
35
41
|
ret[name] =
|
36
|
-
|
42
|
+
parse_raw_map(family.values).tap { |props|
|
37
43
|
COLUMN_PROPERTIES.each do |prop, gs|
|
38
44
|
get = gs[:get]
|
39
45
|
if get && family.respond_to?(get)
|
46
|
+
props.delete(prop.to_s.upcase)
|
40
47
|
props[prop] = parse_property family.send get
|
41
48
|
end
|
42
49
|
end
|
@@ -83,7 +90,9 @@ private
|
|
83
90
|
r[:id] = ri.region_id
|
84
91
|
r[:start_key] = nil_if_empty ri.start_key
|
85
92
|
r[:end_key] = nil_if_empty ri.end_key
|
86
|
-
|
93
|
+
if ri.respond_to?(:is_root_region)
|
94
|
+
r[:root] = ri.is_root_region
|
95
|
+
end
|
87
96
|
r[:meta] = ri.is_meta_region
|
88
97
|
r[:online] = !ri.is_offline
|
89
98
|
}
|
@@ -102,12 +102,16 @@ class Mutation
|
|
102
102
|
rm.mutations.each do |action|
|
103
103
|
m.add action
|
104
104
|
end
|
105
|
-
}
|
105
|
+
} unless rm.empty?
|
106
106
|
end
|
107
107
|
|
108
108
|
class Mutator
|
109
109
|
attr_reader :mutations
|
110
110
|
|
111
|
+
def empty?
|
112
|
+
@mutations.empty?
|
113
|
+
end
|
114
|
+
|
111
115
|
def initialize mutation, rowkey
|
112
116
|
@mutation = mutation
|
113
117
|
@rowkey = rowkey
|
data/lib/hbase-jruby/util.rb
CHANGED
data/lib/hbase-jruby/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -33,19 +33,20 @@ class TestHBaseJRubyBase < Test::Unit::TestCase
|
|
33
33
|
|
34
34
|
def connect
|
35
35
|
HBase.new('hbase.zookeeper.quorum' => ZK,
|
36
|
-
'hbase.client.retries.number' =>
|
36
|
+
'hbase.client.retries.number' => 5,
|
37
37
|
'hbase.client.scanner.caching' => 100)
|
38
38
|
end
|
39
39
|
|
40
40
|
def setup
|
41
41
|
@hbase = connect
|
42
42
|
@table = @hbase.table(TABLE)
|
43
|
+
@aggregation = defined?(org.apache.hadoop.hbase.client.coprocessor.AggregationClient)
|
43
44
|
|
44
45
|
# Drop & Create
|
45
46
|
@table.drop! if RECREATE && @table.exists?
|
46
47
|
@table.create!(
|
47
|
-
:cf1 => { :compression => :none, :bloomfilter => :row },
|
48
|
-
:cf2 => { :bloomfilter => :rowcol },
|
48
|
+
:cf1 => { :compression => :none, :bloomfilter => :row, :versions => 3 },
|
49
|
+
:cf2 => { :bloomfilter => :rowcol, :versions => 3 },
|
49
50
|
:cf3 => { :versions => 1, :bloomfilter => :rowcol }
|
50
51
|
) unless @table.exists?
|
51
52
|
@table.enable! if @table.disabled?
|
data/test/test_aggregation.rb
CHANGED
data/test/test_schema.rb
CHANGED
@@ -279,11 +279,13 @@ class TestSchema < TestHBaseJRubyBase
|
|
279
279
|
assert_equal data[:stars] + 5, inc2[:stars]
|
280
280
|
|
281
281
|
# Coprocessor
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
282
|
+
if @aggregation
|
283
|
+
table.enable_aggregation!
|
284
|
+
table.put next_rowkey, :reviews => 100, :stars => 500
|
285
|
+
assert_equal data[:reviews] + 1 + data[:stars] + 5 + 100 + 500,
|
286
|
+
table.project(:reviews, :stars).aggregate(:sum)
|
287
|
+
#table.disable_aggregation!
|
288
|
+
end
|
287
289
|
|
288
290
|
# Undefined columns
|
289
291
|
table.put rk, 'cf1:x' => 1000
|
@@ -330,24 +332,48 @@ class TestSchema < TestHBaseJRubyBase
|
|
330
332
|
assert_equal 'great', table.get(rk)[:comment4]
|
331
333
|
|
332
334
|
# Batch
|
335
|
+
# FIXME: Mutation in batch hangs on 0.96, temporarily using @aggregation
|
336
|
+
# here to see if the version if 0.96 (no AggregationClient) or not
|
337
|
+
mutation_in_batch = @aggregation
|
333
338
|
ret = table.batch do |b|
|
334
339
|
b.put rk, :comment5 => 'gnarly'
|
335
340
|
b.delete rk, :comment4
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
+
|
342
|
+
# https://issues.apache.org/jira/browse/HBASE-10384
|
343
|
+
# Due to the bug introduced in 0.96 we have to order the columns
|
344
|
+
# b.increment rk, :stars => 100, :reviews => 200
|
345
|
+
b.increment rk, :reviews => 200, :stars => 100
|
341
346
|
b.append rk, :category => '/Etc'
|
342
347
|
b.get rk
|
348
|
+
|
349
|
+
if mutation_in_batch
|
350
|
+
b.mutate(rk) do |m|
|
351
|
+
m.put :comment6 => 'rad'
|
352
|
+
m.delete :image
|
353
|
+
end
|
354
|
+
else
|
355
|
+
table.mutate(rk) do |m|
|
356
|
+
m.put :comment6 => 'rad'
|
357
|
+
m.delete :image
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
if mutation_in_batch
|
363
|
+
assert_equal 6, ret.length
|
364
|
+
assert_equal [true] * 3, ret.values_at(0, 1, 5).map { |r| r[:result] }
|
365
|
+
else
|
366
|
+
assert_equal 5, ret.length
|
367
|
+
assert_equal [true] * 2, ret.values_at(0, 1).map { |r| r[:result] }
|
343
368
|
end
|
344
|
-
|
345
|
-
assert_equal [
|
346
|
-
assert_equal data[:stars] + 5 + 100, ret[2][:result][:stars]
|
369
|
+
|
370
|
+
assert_equal data[:stars] + 5 + 100, ret[2][:result][:stars]
|
347
371
|
assert_equal data[:reviews] + 1 + 200, ret[2][:result][:reviews]
|
348
|
-
assert_equal data[:category] + '/Etc', ret[
|
349
|
-
assert_instance_of HBase::Row, ret[
|
350
|
-
assert_equal 1890, ret[
|
372
|
+
assert_equal data[:category] + '/Etc', ret[3][:result][:category]
|
373
|
+
assert_instance_of HBase::Row, ret[4][:result]
|
374
|
+
assert_equal 1890, ret[4][:result][:year]
|
375
|
+
assert_equal nil, table.get(rk)[:image]
|
376
|
+
assert_equal 'rad', table.get(rk)[:comment6]
|
351
377
|
|
352
378
|
# Delete :title column of book 1
|
353
379
|
table.delete rk, :title
|
data/test/test_table.rb
CHANGED
@@ -77,6 +77,7 @@ class TestTable < TestHBaseJRubyBase
|
|
77
77
|
assert_equal 1, @table.get(row1).fixnum('cf1:a')
|
78
78
|
assert_equal 'a', @table.get(row1).string('cf1:b')
|
79
79
|
assert_equal 'a', String.from_java_bytes(@table.get(row1).raw('cf1:b'))
|
80
|
+
assert_equal 'a', @table.get(row1).byte_array('cf1:b').as(:string)
|
80
81
|
assert_equal 3.14, @table.get(row1).float('cf1:c')
|
81
82
|
assert_equal true, @table.get(row1).boolean('cf1:d')
|
82
83
|
assert_equal :sym, @table.get(row1).symbol('cf1:f')
|
@@ -93,6 +94,7 @@ class TestTable < TestHBaseJRubyBase
|
|
93
94
|
assert_equal [1, 2], @table.get(row1).fixnums('cf1:a').values
|
94
95
|
assert_equal %w[a b], @table.get(row1).strings('cf1:b').values
|
95
96
|
assert_equal %w[a b], @table.get(row1).raws('cf1:b').values.map { |v| String.from_java_bytes v }
|
97
|
+
assert_equal %w[a b], @table.get(row1).byte_arrays('cf1:b').values.map { |v| v.as :string }
|
96
98
|
assert_equal [3.14, 6.28], @table.get(row1).floats('cf1:c').values
|
97
99
|
assert_equal [true, false], @table.get(row1).booleans('cf1:d').values
|
98
100
|
assert_equal [:sym, :bol], @table.get(row1).symbols('cf1:f').values
|
@@ -479,42 +481,56 @@ class TestTable < TestHBaseJRubyBase
|
|
479
481
|
assert_equal true, ret[1][:result]
|
480
482
|
assert_equal true, ret[2][:result]
|
481
483
|
|
484
|
+
# FIXME: Mutation in batch hangs on 0.96
|
485
|
+
mutation_in_batch = @aggregation
|
482
486
|
ret = @table.batch { |b|
|
483
487
|
b.put rk3, 'cf1:c' => 5
|
484
488
|
b.delete rk1, 'cf1:a'
|
485
489
|
b.increment rk2, 'cf1:a' => 10, 'cf1:b' => 20
|
486
490
|
b.append rk2, 'cf2:c' => ' world'
|
487
|
-
b.mutate(rk3) do |m|
|
488
|
-
m.put 'cf2:d' => 'hola'
|
489
|
-
m.put 'cf2:e' => 'mundo'
|
490
|
-
m.delete 'cf1:b'
|
491
|
-
end
|
492
491
|
b.get(rk1)
|
493
492
|
b.filter('cf1:a' => 0).get(rk1)
|
494
493
|
b.versions(1).project('cf2').get(rk1)
|
494
|
+
if mutation_in_batch
|
495
|
+
b.mutate(rk3) do |m|
|
496
|
+
m.put 'cf2:d' => 'hola'
|
497
|
+
m.put 'cf2:e' => 'mundo'
|
498
|
+
m.delete 'cf1:b'
|
499
|
+
end
|
500
|
+
else
|
501
|
+
@table.mutate(rk3) do |m|
|
502
|
+
m.put 'cf2:d' => 'hola'
|
503
|
+
m.put 'cf2:e' => 'mundo'
|
504
|
+
m.delete 'cf1:b'
|
505
|
+
end
|
506
|
+
end
|
495
507
|
}
|
496
|
-
|
497
|
-
|
498
|
-
ret.map { |r| r[:type] }
|
499
|
-
|
500
|
-
|
508
|
+
if mutation_in_batch
|
509
|
+
assert_equal 8, ret.length
|
510
|
+
assert_equal [:put, :delete, :increment, :append, :get, :get, :get, :mutate], ret.map { |r| r[:type] }
|
511
|
+
assert_equal [true, true, true], ret.values_at(0, 1, 7).map { |r| r[:result] }
|
512
|
+
else
|
513
|
+
assert_equal 7, ret.length
|
514
|
+
assert_equal [:put, :delete, :increment, :append, :get, :get, :get], ret.map { |r| r[:type] }
|
515
|
+
assert_equal [true, true], ret.values_at(0, 1).map { |r| r[:result] }
|
516
|
+
end
|
501
517
|
assert_equal 12, ret[2][:result]['cf1:a']
|
502
518
|
assert_equal 23, ret[2][:result]['cf1:b']
|
503
519
|
assert_equal 'hello world', ret[3][:result]['cf2:c'].to_s
|
504
520
|
# assert_equal nil, ret[5][:result].long('cf1:a') # No guarantee
|
505
|
-
assert_equal 2, ret[
|
506
|
-
assert_equal nil, ret[
|
507
|
-
assert_equal nil, ret[
|
508
|
-
assert_equal 'hello', ret[
|
509
|
-
|
510
|
-
assert_equal nil,
|
511
|
-
assert_equal 12,
|
512
|
-
assert_equal 23,
|
513
|
-
assert_equal 5,
|
521
|
+
assert_equal 2, ret[4][:result].long('cf1:b')
|
522
|
+
assert_equal nil, ret[5][:result]
|
523
|
+
assert_equal nil, ret[6][:result].fixnum('cf1:b')
|
524
|
+
assert_equal 'hello', ret[6][:result].string('cf2:c')
|
525
|
+
|
526
|
+
assert_equal nil, @table.get(rk1)['cf1:a']
|
527
|
+
assert_equal 12, @table.get(rk2).long('cf1:a')
|
528
|
+
assert_equal 23, @table.get(rk2).long('cf1:b')
|
529
|
+
assert_equal 5, @table.get(rk3).long('cf1:c')
|
514
530
|
assert_equal 'hello world', @table.get(rk2).string('cf2:c')
|
515
|
-
assert_equal 'hola',
|
516
|
-
assert_equal 'mundo',
|
517
|
-
assert_equal nil,
|
531
|
+
assert_equal 'hola', @table.get(rk3).string('cf2:d')
|
532
|
+
assert_equal 'mundo', @table.get(rk3).string('cf2:e')
|
533
|
+
assert_equal nil, @table.get(rk3).string('cf2:b')
|
518
534
|
end
|
519
535
|
|
520
536
|
def test_batch_exception
|
data/test/test_table_admin.rb
CHANGED
@@ -143,6 +143,8 @@ class TestTableAdmin < TestHBaseJRubyBase
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def test_add_coprocessor!
|
146
|
+
return unless @aggregation
|
147
|
+
|
146
148
|
coproc = 'org.apache.hadoop.hbase.coprocessor.AggregateImplementation'
|
147
149
|
assert_false @table.has_coprocessor? coproc
|
148
150
|
assert_raise(ArgumentError) {
|
@@ -163,10 +165,31 @@ class TestTableAdmin < TestHBaseJRubyBase
|
|
163
165
|
@table.drop!
|
164
166
|
assert @table.inspect.is_a?(String)
|
165
167
|
|
168
|
+
gz = begin
|
169
|
+
org.apache.hadoop.hbase.io.hfile.Compression::Algorithm::GZ
|
170
|
+
rescue Exception
|
171
|
+
org.apache.hadoop.hbase.io.compress.Compression::Algorithm::GZ
|
172
|
+
end
|
173
|
+
|
174
|
+
table_props = {
|
175
|
+
:max_filesize => 512 * 1024 ** 2,
|
176
|
+
:memstore_flushsize => 64 * 1024 ** 2,
|
177
|
+
:readonly => false,
|
178
|
+
:splits => [10, 20, 30, 40],
|
179
|
+
:split_policy =>
|
180
|
+
'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy',
|
181
|
+
'hello' => 'world'
|
182
|
+
}
|
183
|
+
if org.apache.hadoop.hbase.HTableDescriptor.method_defined? :setDurability
|
184
|
+
table_props[:durability] = :async_wal
|
185
|
+
else
|
186
|
+
table_props[:deferred_log_flush] = true
|
187
|
+
end
|
188
|
+
|
166
189
|
[
|
167
190
|
'GZ',
|
168
191
|
:gz,
|
169
|
-
|
192
|
+
gz
|
170
193
|
].each do |cmp|
|
171
194
|
@table.create!({
|
172
195
|
:cf => {
|
@@ -184,14 +207,9 @@ class TestTableAdmin < TestHBaseJRubyBase
|
|
184
207
|
:replication_scope => 0,
|
185
208
|
:ttl => 100,
|
186
209
|
:versions => 10,
|
210
|
+
'whatever' => 'works',
|
187
211
|
}
|
188
|
-
},
|
189
|
-
:max_filesize => 512 * 1024 ** 2,
|
190
|
-
:memstore_flushsize => 64 * 1024 ** 2,
|
191
|
-
:readonly => false,
|
192
|
-
:deferred_log_flush => true,
|
193
|
-
:splits => [10, 20, 30, 40]
|
194
|
-
)
|
212
|
+
}, table_props)
|
195
213
|
|
196
214
|
# Initial region count
|
197
215
|
regions = @table.regions
|
@@ -199,16 +217,23 @@ class TestTableAdmin < TestHBaseJRubyBase
|
|
199
217
|
|
200
218
|
# Table properties
|
201
219
|
props = @table.properties
|
202
|
-
|
220
|
+
assert props[:deferred_log_flush] || props[:durability] == 'ASYNC_WAL'
|
203
221
|
assert_equal false, props[:readonly]
|
204
222
|
assert_equal 64 * 1024 ** 2, props[:memstore_flushsize]
|
205
223
|
assert_equal 512 * 1024 ** 2, props[:max_filesize]
|
224
|
+
assert_equal 'world', props['hello']
|
225
|
+
assert_equal 'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy',
|
226
|
+
props[:split_policy]
|
206
227
|
|
207
228
|
rprops = @table.raw_properties
|
208
|
-
|
229
|
+
assert rprops['DEFERRED_LOG_FLUSH'] == 'true' || rprops['DURABILITY'] == 'ASYNC_WAL'
|
230
|
+
|
209
231
|
assert_equal false.to_s, rprops['READONLY']
|
210
232
|
assert_equal((64 * 1024 ** 2).to_s, rprops['MEMSTORE_FLUSHSIZE'])
|
211
233
|
assert_equal((512 * 1024 ** 2).to_s, rprops['MAX_FILESIZE'])
|
234
|
+
assert_equal 'world', rprops['hello']
|
235
|
+
assert_equal 'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy',
|
236
|
+
rprops['SPLIT_POLICY']
|
212
237
|
|
213
238
|
# Column family properties
|
214
239
|
cf = @table.families['cf']
|
@@ -221,6 +246,7 @@ class TestTableAdmin < TestHBaseJRubyBase
|
|
221
246
|
assert_equal 131072, cf[:blocksize]
|
222
247
|
assert_equal true, cf[:in_memory]
|
223
248
|
assert_equal true, cf[:blockcache]
|
249
|
+
assert_equal 'works', cf['whatever']
|
224
250
|
|
225
251
|
rcf = @table.raw_families['cf']
|
226
252
|
assert_equal 'ROW', rcf['BLOOMFILTER']
|
@@ -232,27 +258,16 @@ class TestTableAdmin < TestHBaseJRubyBase
|
|
232
258
|
assert_equal 131072.to_s, rcf['BLOCKSIZE']
|
233
259
|
assert_equal true.to_s, rcf['IN_MEMORY']
|
234
260
|
assert_equal true.to_s, rcf['BLOCKCACHE']
|
261
|
+
assert_equal 'works', rcf['whatever']
|
235
262
|
|
236
263
|
@table.put 31, 'cf:a' => 100
|
237
264
|
@table.put 37, 'cf:a' => 100
|
238
265
|
@table.split!(35)
|
239
|
-
|
240
|
-
# FIXME
|
241
|
-
10.times do |i|
|
242
|
-
break if @table.regions.count == 6
|
243
|
-
sleep 1
|
244
|
-
assert false, "Region not split" if i == 9
|
245
|
-
end
|
266
|
+
wait_for_regions 6
|
246
267
|
|
247
268
|
@table.put 39, 'cf:a' => 100
|
248
269
|
@table.split!(38)
|
249
|
-
|
250
|
-
# FIXME
|
251
|
-
10.times do |i|
|
252
|
-
break if @table.regions.count == 7
|
253
|
-
sleep 1
|
254
|
-
assert false, "Region not split" if i == 9
|
255
|
-
end
|
270
|
+
wait_for_regions 7
|
256
271
|
|
257
272
|
regions = @table.regions
|
258
273
|
assert_equal [10, 20, 30, 35, 38, 40], regions.map { |r| HBase::Util.from_bytes :fixnum, r[:start_key] }.compact.sort
|
@@ -293,5 +308,17 @@ class TestTableAdmin < TestHBaseJRubyBase
|
|
293
308
|
rescue Exception
|
294
309
|
# TODO: Only works on HBase 0.94 or above
|
295
310
|
end
|
311
|
+
|
312
|
+
private
|
313
|
+
def wait_for_regions rnum, max_tries = 30
|
314
|
+
sleep 5
|
315
|
+
max_tries.times do |i|
|
316
|
+
if @table.regions.count == rnum && @table.regions.all? { |r| r[:online] }
|
317
|
+
return
|
318
|
+
end
|
319
|
+
sleep 1
|
320
|
+
end
|
321
|
+
assert false, "Region not split"
|
322
|
+
end
|
296
323
|
end unless ENV['HBASE_JRUBY_TEST_SKIP_ADMIN']
|
297
324
|
|
data/test/test_util.rb
CHANGED
@@ -49,6 +49,10 @@ class TestUtil < Test::Unit::TestCase
|
|
49
49
|
|
50
50
|
assert_equal 0, Util.to_bytes(nil).length
|
51
51
|
|
52
|
+
byte_array = Util.from_bytes :byte_array, "1234".to_java_bytes
|
53
|
+
assert_instance_of HBase::ByteArray, byte_array
|
54
|
+
assert_equal "1234", byte_array.as(:string)
|
55
|
+
|
52
56
|
assert_raise(ArgumentError) { Util.from_bytes(:xxx, [].to_java(Java::byte)) }
|
53
57
|
assert_raise(ArgumentError) { Util.to_bytes({}) }
|
54
58
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hbase-jruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Junegunn Choi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|