hyper_record 0.2.8 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +8 -0
- data/HOW_TO_RUN_TESTS +44 -0
- data/LICENSE +1 -1
- data/README +5 -9
- data/Rakefile +10 -3
- data/VERSION.yml +2 -2
- data/hyper_record.gemspec +3 -3
- data/lib/active_record/connection_adapters/hypertable_adapter.rb +29 -11
- data/lib/hyper_record.rb +14 -3
- data/lib/hypertable/gen-rb/client_service.rb +370 -0
- data/lib/hypertable/gen-rb/client_types.rb +118 -21
- data/spec/lib/hyper_record_spec.rb +53 -0
- data/test/thrift_client_test.rb +56 -50
- metadata +5 -5
- data/pkg/hyper_record-0.2.8.gem +0 -0
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
0.9.3.0 (2010/05/30)
|
2
|
+
- updated HyperRecord version numbers to match Hypertable release number
|
3
|
+
- now compatible with Hypertable version 0.9.3.0
|
4
|
+
- no longer compatible with earlier Hypertable versions due to a Thrift
|
5
|
+
API change
|
6
|
+
- added support for asynchronous writes through new put_cells ThriftBroker API
|
7
|
+
- add documentation for running tests
|
8
|
+
|
1
9
|
0.2.8 (2010/03/01)
|
2
10
|
- support friendly migration-syntax declared using blocks
|
3
11
|
- new assemble_row_key_from_attributes that generates row keys in the same
|
data/HOW_TO_RUN_TESTS
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
The HyperRecord test suite is spread out across a number of different files
|
2
|
+
in the test/ and spec/ directories.
|
3
|
+
|
4
|
+
$ ls -l test/
|
5
|
+
total 28
|
6
|
+
-rw-r--r-- 1 root root 188 May 20 15:36 test_helper.rb
|
7
|
+
-rw-r--r-- 1 root root 22281 May 30 13:56 thrift_client_test.rb
|
8
|
+
|
9
|
+
$ ls -l spec/
|
10
|
+
total 12
|
11
|
+
drwxr-xr-x 3 root root 4096 May 20 15:36 fixtures
|
12
|
+
drwxr-xr-x 3 root root 4096 May 30 14:08 lib
|
13
|
+
-rw-r--r-- 1 root root 4067 May 20 15:36 spec_helper.rb
|
14
|
+
|
15
|
+
The test/ directory contains unit tests (using Ruby's standard Test::Unit
|
16
|
+
library) that exercise the Thrift client libraries only. These tests do
|
17
|
+
not cover any functionality specific to HyperRecord.
|
18
|
+
|
19
|
+
To run the Thrift client unit tests:
|
20
|
+
$ rake
|
21
|
+
<snip test output>
|
22
|
+
|
23
|
+
Failures in the test/ suite may be caused by:
|
24
|
+
|
25
|
+
1. A mismatch between the version of Thrift installed on your local machine
|
26
|
+
and the version of Thrift supported in this release on HyperRecord.
|
27
|
+
2. Problems communicating with a ThriftBroker process running on the default
|
28
|
+
port (38080) on localhost. Note: you must be running Hypertable for
|
29
|
+
these tests to pass and, specifically, a ThriftBroker process must be
|
30
|
+
running on localhost.
|
31
|
+
|
32
|
+
The spec/ directory contains rspec tests that cover HyperRecord functionality.
|
33
|
+
Since HyperRecord extends the base ActiveRecord implementation, these tests
|
34
|
+
can only be run if the HyperRecord gem directory has been unpacked into a
|
35
|
+
local Rails tree. This is typically done by:
|
36
|
+
|
37
|
+
$ gem install hyper_record
|
38
|
+
$ cd vendor/gems
|
39
|
+
$ gem unpack hyper_recrd
|
40
|
+
$ gem uninstall hyper_record
|
41
|
+
|
42
|
+
To run the HyperRecord rspec tests:
|
43
|
+
$ rake spec
|
44
|
+
<snip test output>
|
data/LICENSE
CHANGED
data/README
CHANGED
@@ -19,15 +19,11 @@ See:
|
|
19
19
|
INSTALLATION
|
20
20
|
============
|
21
21
|
|
22
|
-
1.
|
22
|
+
1. Install HyperRecord gem (http://rubygems.org/gems/hyper_record)
|
23
23
|
|
24
|
-
gem
|
24
|
+
gem install hyper_record
|
25
25
|
|
26
|
-
2.
|
27
|
-
|
28
|
-
gem install tylerkovacs-hyper_record
|
29
|
-
|
30
|
-
3. Configure Hypertable Adapter by adding an entry to config/database.yml
|
26
|
+
2. Configure Hypertable Adapter by adding an entry to config/database.yml
|
31
27
|
that points to an instance of the Hypertable Thrift Broker (uses port
|
32
28
|
38080 by default).
|
33
29
|
|
@@ -38,7 +34,7 @@ INSTALLATION
|
|
38
34
|
|
39
35
|
NOTE: HyperRecord requires Thrift SVN revision 765279 or later.
|
40
36
|
|
41
|
-
|
37
|
+
3. Add the following to the bottom of config/environment.rb:
|
42
38
|
|
43
39
|
require 'hyper_record'
|
44
40
|
|
@@ -46,4 +42,4 @@ INSTALLATION
|
|
46
42
|
COPYRIGHT
|
47
43
|
=========
|
48
44
|
|
49
|
-
Copyright (c)
|
45
|
+
Copyright (c) 2010 tylerkovacs. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -14,8 +14,6 @@ begin
|
|
14
14
|
s.description = "See README"
|
15
15
|
s.authors = ["tylerkovacs"]
|
16
16
|
end
|
17
|
-
|
18
|
-
Jeweler::GemcutterTasks.new
|
19
17
|
rescue LoadError
|
20
18
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
21
19
|
end
|
@@ -40,4 +38,13 @@ Rcov::RcovTask.new do |t|
|
|
40
38
|
t.verbose = true
|
41
39
|
end
|
42
40
|
|
43
|
-
task :
|
41
|
+
task :noop do
|
42
|
+
end
|
43
|
+
|
44
|
+
Rake::TestTask.new(:spec => :noop) do |t|
|
45
|
+
t.libs << 'spec'
|
46
|
+
t.test_files = FileList['spec/**/*_spec.rb']
|
47
|
+
t.verbose = true
|
48
|
+
end
|
49
|
+
|
50
|
+
task :default => :test
|
data/VERSION.yml
CHANGED
data/hyper_record.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{hyper_record}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.9.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["tylerkovacs"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-05-30}
|
13
13
|
s.description = %q{See README}
|
14
14
|
s.email = %q{tyler.kovacs@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
"CHANGELOG",
|
22
22
|
"LICENSE",
|
23
23
|
"README",
|
24
|
+
"HOW_TO_RUN_TESTS",
|
24
25
|
"Rakefile",
|
25
26
|
"VERSION.yml",
|
26
27
|
"benchmark/save.rb",
|
@@ -40,7 +41,6 @@ Gem::Specification.new do |s|
|
|
40
41
|
"lib/hypertable/gen-rb/hql_types.rb",
|
41
42
|
"lib/hypertable/thrift_client.rb",
|
42
43
|
"lib/hypertable/thrift_transport_monkey_patch.rb",
|
43
|
-
"pkg/hyper_record-0.2.8.gem",
|
44
44
|
"spec/fixtures/pages.yml",
|
45
45
|
"spec/fixtures/qualified_pages.yml",
|
46
46
|
"spec/lib/associations_spec.rb",
|
@@ -82,8 +82,11 @@ module ActiveRecord
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def raw_thrift_client(&block)
|
85
|
-
|
85
|
+
t1 = Time.now
|
86
|
+
results = Hypertable.with_thrift_client(@config[:host], @config[:port],
|
86
87
|
@config[:timeout], &block)
|
88
|
+
@@read_latency += Time.now - t1
|
89
|
+
results
|
87
90
|
end
|
88
91
|
|
89
92
|
# Return the current set of performance statistics. The application
|
@@ -330,7 +333,8 @@ module ActiveRecord
|
|
330
333
|
for cf in column_families
|
331
334
|
# Columns are lazily-deleted in Hypertable so still may show up
|
332
335
|
# in describe table output. Ignore.
|
333
|
-
|
336
|
+
del = cf.elements['deleted']
|
337
|
+
deleted = del ? del.text : 'false'
|
334
338
|
next if deleted == 'true'
|
335
339
|
|
336
340
|
column_name = cf.elements['Name'].text
|
@@ -526,16 +530,28 @@ module ActiveRecord
|
|
526
530
|
# mutator as argument. Mutators can be created with the open_mutator
|
527
531
|
# method. In the near future (Summer 2009), Hypertable will provide
|
528
532
|
# a periodic mutator that automatically flushes at specific intervals.
|
529
|
-
def write_cells(table_name, cells,
|
533
|
+
def write_cells(table_name, cells, options={})
|
530
534
|
return if cells.blank?
|
531
535
|
|
536
|
+
mutator = options[:mutator]
|
537
|
+
flags = options[:flags]
|
538
|
+
flush_interval = options[:flush_interval]
|
539
|
+
|
532
540
|
retry_on_connection_error {
|
533
541
|
local_mutator_created = !mutator
|
534
542
|
|
535
543
|
begin
|
536
544
|
t1 = Time.now
|
537
545
|
mutator ||= open_mutator(table_name, flags, flush_interval)
|
538
|
-
|
546
|
+
if options[:asynchronous_write]
|
547
|
+
mutate_spec = Hypertable::ThriftGen::MutateSpec.new
|
548
|
+
mutate_spec.appname = 'hyper_record'
|
549
|
+
mutate_spec.flush_interval = 1000
|
550
|
+
mutate_spec.flags = 2
|
551
|
+
@connection.put_cells_as_arrays(table_name, mutate_spec, cells)
|
552
|
+
else
|
553
|
+
@connection.set_cells_as_arrays(mutator, cells)
|
554
|
+
end
|
539
555
|
ensure
|
540
556
|
if local_mutator_created && mutator
|
541
557
|
close_mutator(mutator)
|
@@ -552,11 +568,12 @@ module ActiveRecord
|
|
552
568
|
# on write - used by special operations (e.g,. delete )
|
553
569
|
def thrift_cell_from_native_array(array)
|
554
570
|
cell = Hypertable::ThriftGen::Cell.new
|
555
|
-
cell.
|
556
|
-
cell.
|
557
|
-
cell.
|
571
|
+
cell.key = Hypertable::ThriftGen::Key.new
|
572
|
+
cell.key.row = array[0]
|
573
|
+
cell.key.column_family = array[1]
|
574
|
+
cell.key.column_qualifier = array[2] if !array[2].blank?
|
558
575
|
cell.value = array[3] if array[3]
|
559
|
-
cell.timestamp = array[4] if array[4]
|
576
|
+
cell.key.timestamp = array[4] if array[4]
|
560
577
|
cell
|
561
578
|
end
|
562
579
|
|
@@ -584,7 +601,7 @@ module ActiveRecord
|
|
584
601
|
@connection.with_mutator(table_name) do |mutator|
|
585
602
|
thrift_cells = cells.map{|c|
|
586
603
|
cell = thrift_cell_from_native_array(c)
|
587
|
-
cell.flag = Hypertable::ThriftGen::CellFlag::DELETE_CELL
|
604
|
+
cell.key.flag = Hypertable::ThriftGen::CellFlag::DELETE_CELL
|
588
605
|
cell
|
589
606
|
}
|
590
607
|
@connection.set_cells(mutator, thrift_cells)
|
@@ -599,8 +616,9 @@ module ActiveRecord
|
|
599
616
|
t1 = Time.now
|
600
617
|
cells = row_keys.map do |row_key|
|
601
618
|
cell = Hypertable::ThriftGen::Cell.new
|
602
|
-
cell.
|
603
|
-
cell.
|
619
|
+
cell.key = Hypertable::ThriftGen::Key.new
|
620
|
+
cell.key.row = row_key
|
621
|
+
cell.key.flag = Hypertable::ThriftGen::CellFlag::DELETE_ROW
|
604
622
|
cell
|
605
623
|
end
|
606
624
|
|
data/lib/hyper_record.rb
CHANGED
@@ -157,6 +157,7 @@ module ActiveRecord
|
|
157
157
|
def quoted_attributes_to_cells(quoted_attrs, table=self.class.table_name)
|
158
158
|
cells = []
|
159
159
|
pk = self.attributes[self.class.primary_key]
|
160
|
+
|
160
161
|
quoted_attrs.keys.each{|key|
|
161
162
|
name, qualifier = connection.hypertable_column_name(key, table).split(':', 2)
|
162
163
|
cells << connection.cell_native_array(pk, name, qualifier, quoted_attrs[key])
|
@@ -179,7 +180,12 @@ module ActiveRecord
|
|
179
180
|
# puts msg
|
180
181
|
end
|
181
182
|
|
182
|
-
connection.write_cells(table, cells,
|
183
|
+
connection.write_cells(table, cells, {
|
184
|
+
:mutator => mutator,
|
185
|
+
:flags => self.class.mutator_flags,
|
186
|
+
:flush_interval => self.class.mutator_flush_interval,
|
187
|
+
:asynchronous_write => self.class.asynchronous_write
|
188
|
+
})
|
183
189
|
end
|
184
190
|
|
185
191
|
# Delete an array of cells from Hypertable
|
@@ -421,7 +427,8 @@ module ActiveRecord
|
|
421
427
|
def find_by_hql(hql)
|
422
428
|
hql_result = connection.execute(hql)
|
423
429
|
cells_in_native_array_format = hql_result.cells.map do |c|
|
424
|
-
connection.cell_native_array(c.
|
430
|
+
connection.cell_native_array(c.key.row, c.key.column_family,
|
431
|
+
c.key.column_qualifier, c.value)
|
425
432
|
end
|
426
433
|
convert_cells_to_instantiated_rows(cells_in_native_array_format)
|
427
434
|
end
|
@@ -571,11 +578,15 @@ module ActiveRecord
|
|
571
578
|
end
|
572
579
|
end
|
573
580
|
|
574
|
-
attr_accessor :mutator, :mutator_flags, :mutator_flush_interval
|
581
|
+
attr_accessor :mutator, :mutator_flags, :mutator_flush_interval,
|
582
|
+
:asynchronous_write
|
583
|
+
|
575
584
|
def mutator_options(*attrs)
|
576
585
|
symbolized_attrs = attrs.first.symbolize_keys
|
577
586
|
@mutator_flags = symbolized_attrs[:flags].to_i
|
578
587
|
@mutator_flush_interval = symbolized_attrs[:flush_interval].to_i
|
588
|
+
@asynchronous_write = symbolized_attrs[:asynchronous_write]
|
589
|
+
|
579
590
|
if symbolized_attrs[:persistent]
|
580
591
|
@mutator = self.open_mutator(@mutator_flags, @mutator_flush_interval)
|
581
592
|
end
|
@@ -203,6 +203,66 @@ require 'client_types'
|
|
203
203
|
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'get_cells_as_arrays failed: unknown result')
|
204
204
|
end
|
205
205
|
|
206
|
+
def put_cells(tablename, mutate_spec, cells)
|
207
|
+
send_put_cells(tablename, mutate_spec, cells)
|
208
|
+
recv_put_cells()
|
209
|
+
end
|
210
|
+
|
211
|
+
def send_put_cells(tablename, mutate_spec, cells)
|
212
|
+
send_message('put_cells', Put_cells_args, :tablename => tablename, :mutate_spec => mutate_spec, :cells => cells)
|
213
|
+
end
|
214
|
+
|
215
|
+
def recv_put_cells()
|
216
|
+
result = receive_message(Put_cells_result)
|
217
|
+
raise result.e unless result.e.nil?
|
218
|
+
return
|
219
|
+
end
|
220
|
+
|
221
|
+
def put_cells_as_arrays(tablename, mutate_spec, cells)
|
222
|
+
send_put_cells_as_arrays(tablename, mutate_spec, cells)
|
223
|
+
recv_put_cells_as_arrays()
|
224
|
+
end
|
225
|
+
|
226
|
+
def send_put_cells_as_arrays(tablename, mutate_spec, cells)
|
227
|
+
send_message('put_cells_as_arrays', Put_cells_as_arrays_args, :tablename => tablename, :mutate_spec => mutate_spec, :cells => cells)
|
228
|
+
end
|
229
|
+
|
230
|
+
def recv_put_cells_as_arrays()
|
231
|
+
result = receive_message(Put_cells_as_arrays_result)
|
232
|
+
raise result.e unless result.e.nil?
|
233
|
+
return
|
234
|
+
end
|
235
|
+
|
236
|
+
def put_cell(tablename, mutate_spec, cell)
|
237
|
+
send_put_cell(tablename, mutate_spec, cell)
|
238
|
+
recv_put_cell()
|
239
|
+
end
|
240
|
+
|
241
|
+
def send_put_cell(tablename, mutate_spec, cell)
|
242
|
+
send_message('put_cell', Put_cell_args, :tablename => tablename, :mutate_spec => mutate_spec, :cell => cell)
|
243
|
+
end
|
244
|
+
|
245
|
+
def recv_put_cell()
|
246
|
+
result = receive_message(Put_cell_result)
|
247
|
+
raise result.e unless result.e.nil?
|
248
|
+
return
|
249
|
+
end
|
250
|
+
|
251
|
+
def put_cell_as_array(tablename, mutate_spec, cell)
|
252
|
+
send_put_cell_as_array(tablename, mutate_spec, cell)
|
253
|
+
recv_put_cell_as_array()
|
254
|
+
end
|
255
|
+
|
256
|
+
def send_put_cell_as_array(tablename, mutate_spec, cell)
|
257
|
+
send_message('put_cell_as_array', Put_cell_as_array_args, :tablename => tablename, :mutate_spec => mutate_spec, :cell => cell)
|
258
|
+
end
|
259
|
+
|
260
|
+
def recv_put_cell_as_array()
|
261
|
+
result = receive_message(Put_cell_as_array_result)
|
262
|
+
raise result.e unless result.e.nil?
|
263
|
+
return
|
264
|
+
end
|
265
|
+
|
206
266
|
def open_mutator(name, flags, flush_interval)
|
207
267
|
send_open_mutator(name, flags, flush_interval)
|
208
268
|
return recv_open_mutator()
|
@@ -309,6 +369,22 @@ require 'client_types'
|
|
309
369
|
return
|
310
370
|
end
|
311
371
|
|
372
|
+
def exists_table(name)
|
373
|
+
send_exists_table(name)
|
374
|
+
return recv_exists_table()
|
375
|
+
end
|
376
|
+
|
377
|
+
def send_exists_table(name)
|
378
|
+
send_message('exists_table', Exists_table_args, :name => name)
|
379
|
+
end
|
380
|
+
|
381
|
+
def recv_exists_table()
|
382
|
+
result = receive_message(Exists_table_result)
|
383
|
+
return result.success unless result.success.nil?
|
384
|
+
raise result.e unless result.e.nil?
|
385
|
+
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'exists_table failed: unknown result')
|
386
|
+
end
|
387
|
+
|
312
388
|
def get_table_id(name)
|
313
389
|
send_get_table_id(name)
|
314
390
|
return recv_get_table_id()
|
@@ -357,6 +433,22 @@ require 'client_types'
|
|
357
433
|
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'get_tables failed: unknown result')
|
358
434
|
end
|
359
435
|
|
436
|
+
def get_table_splits(name)
|
437
|
+
send_get_table_splits(name)
|
438
|
+
return recv_get_table_splits()
|
439
|
+
end
|
440
|
+
|
441
|
+
def send_get_table_splits(name)
|
442
|
+
send_message('get_table_splits', Get_table_splits_args, :name => name)
|
443
|
+
end
|
444
|
+
|
445
|
+
def recv_get_table_splits()
|
446
|
+
result = receive_message(Get_table_splits_result)
|
447
|
+
return result.success unless result.success.nil?
|
448
|
+
raise result.e unless result.e.nil?
|
449
|
+
raise ::Thrift::ApplicationException.new(::Thrift::ApplicationException::MISSING_RESULT, 'get_table_splits failed: unknown result')
|
450
|
+
end
|
451
|
+
|
360
452
|
def drop_table(name, if_exists)
|
361
453
|
send_drop_table(name, if_exists)
|
362
454
|
recv_drop_table()
|
@@ -509,6 +601,50 @@ require 'client_types'
|
|
509
601
|
write_result(result, oprot, 'get_cells_as_arrays', seqid)
|
510
602
|
end
|
511
603
|
|
604
|
+
def process_put_cells(seqid, iprot, oprot)
|
605
|
+
args = read_args(iprot, Put_cells_args)
|
606
|
+
result = Put_cells_result.new()
|
607
|
+
begin
|
608
|
+
@handler.put_cells(args.tablename, args.mutate_spec, args.cells)
|
609
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
610
|
+
result.e = e
|
611
|
+
end
|
612
|
+
write_result(result, oprot, 'put_cells', seqid)
|
613
|
+
end
|
614
|
+
|
615
|
+
def process_put_cells_as_arrays(seqid, iprot, oprot)
|
616
|
+
args = read_args(iprot, Put_cells_as_arrays_args)
|
617
|
+
result = Put_cells_as_arrays_result.new()
|
618
|
+
begin
|
619
|
+
@handler.put_cells_as_arrays(args.tablename, args.mutate_spec, args.cells)
|
620
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
621
|
+
result.e = e
|
622
|
+
end
|
623
|
+
write_result(result, oprot, 'put_cells_as_arrays', seqid)
|
624
|
+
end
|
625
|
+
|
626
|
+
def process_put_cell(seqid, iprot, oprot)
|
627
|
+
args = read_args(iprot, Put_cell_args)
|
628
|
+
result = Put_cell_result.new()
|
629
|
+
begin
|
630
|
+
@handler.put_cell(args.tablename, args.mutate_spec, args.cell)
|
631
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
632
|
+
result.e = e
|
633
|
+
end
|
634
|
+
write_result(result, oprot, 'put_cell', seqid)
|
635
|
+
end
|
636
|
+
|
637
|
+
def process_put_cell_as_array(seqid, iprot, oprot)
|
638
|
+
args = read_args(iprot, Put_cell_as_array_args)
|
639
|
+
result = Put_cell_as_array_result.new()
|
640
|
+
begin
|
641
|
+
@handler.put_cell_as_array(args.tablename, args.mutate_spec, args.cell)
|
642
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
643
|
+
result.e = e
|
644
|
+
end
|
645
|
+
write_result(result, oprot, 'put_cell_as_array', seqid)
|
646
|
+
end
|
647
|
+
|
512
648
|
def process_open_mutator(seqid, iprot, oprot)
|
513
649
|
args = read_args(iprot, Open_mutator_args)
|
514
650
|
result = Open_mutator_result.new()
|
@@ -586,6 +722,17 @@ require 'client_types'
|
|
586
722
|
write_result(result, oprot, 'flush_mutator', seqid)
|
587
723
|
end
|
588
724
|
|
725
|
+
def process_exists_table(seqid, iprot, oprot)
|
726
|
+
args = read_args(iprot, Exists_table_args)
|
727
|
+
result = Exists_table_result.new()
|
728
|
+
begin
|
729
|
+
result.success = @handler.exists_table(args.name)
|
730
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
731
|
+
result.e = e
|
732
|
+
end
|
733
|
+
write_result(result, oprot, 'exists_table', seqid)
|
734
|
+
end
|
735
|
+
|
589
736
|
def process_get_table_id(seqid, iprot, oprot)
|
590
737
|
args = read_args(iprot, Get_table_id_args)
|
591
738
|
result = Get_table_id_result.new()
|
@@ -619,6 +766,17 @@ require 'client_types'
|
|
619
766
|
write_result(result, oprot, 'get_tables', seqid)
|
620
767
|
end
|
621
768
|
|
769
|
+
def process_get_table_splits(seqid, iprot, oprot)
|
770
|
+
args = read_args(iprot, Get_table_splits_args)
|
771
|
+
result = Get_table_splits_result.new()
|
772
|
+
begin
|
773
|
+
result.success = @handler.get_table_splits(args.name)
|
774
|
+
rescue Hypertable::ThriftGen::ClientException => e
|
775
|
+
result.e = e
|
776
|
+
end
|
777
|
+
write_result(result, oprot, 'get_table_splits', seqid)
|
778
|
+
end
|
779
|
+
|
622
780
|
def process_drop_table(seqid, iprot, oprot)
|
623
781
|
args = read_args(iprot, Drop_table_args)
|
624
782
|
result = Drop_table_result.new()
|
@@ -1056,6 +1214,150 @@ require 'client_types'
|
|
1056
1214
|
|
1057
1215
|
end
|
1058
1216
|
|
1217
|
+
class Put_cells_args
|
1218
|
+
include ::Thrift::Struct
|
1219
|
+
TABLENAME = 1
|
1220
|
+
MUTATE_SPEC = 2
|
1221
|
+
CELLS = 3
|
1222
|
+
|
1223
|
+
::Thrift::Struct.field_accessor self, :tablename, :mutate_spec, :cells
|
1224
|
+
FIELDS = {
|
1225
|
+
TABLENAME => {:type => ::Thrift::Types::STRING, :name => 'tablename'},
|
1226
|
+
MUTATE_SPEC => {:type => ::Thrift::Types::STRUCT, :name => 'mutate_spec', :class => Hypertable::ThriftGen::MutateSpec},
|
1227
|
+
CELLS => {:type => ::Thrift::Types::LIST, :name => 'cells', :element => {:type => ::Thrift::Types::STRUCT, :class => Hypertable::ThriftGen::Cell}}
|
1228
|
+
}
|
1229
|
+
|
1230
|
+
def struct_fields; FIELDS; end
|
1231
|
+
|
1232
|
+
def validate
|
1233
|
+
end
|
1234
|
+
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
class Put_cells_result
|
1238
|
+
include ::Thrift::Struct
|
1239
|
+
E = 1
|
1240
|
+
|
1241
|
+
::Thrift::Struct.field_accessor self, :e
|
1242
|
+
FIELDS = {
|
1243
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1244
|
+
}
|
1245
|
+
|
1246
|
+
def struct_fields; FIELDS; end
|
1247
|
+
|
1248
|
+
def validate
|
1249
|
+
end
|
1250
|
+
|
1251
|
+
end
|
1252
|
+
|
1253
|
+
class Put_cells_as_arrays_args
|
1254
|
+
include ::Thrift::Struct
|
1255
|
+
TABLENAME = 1
|
1256
|
+
MUTATE_SPEC = 2
|
1257
|
+
CELLS = 3
|
1258
|
+
|
1259
|
+
::Thrift::Struct.field_accessor self, :tablename, :mutate_spec, :cells
|
1260
|
+
FIELDS = {
|
1261
|
+
TABLENAME => {:type => ::Thrift::Types::STRING, :name => 'tablename'},
|
1262
|
+
MUTATE_SPEC => {:type => ::Thrift::Types::STRUCT, :name => 'mutate_spec', :class => Hypertable::ThriftGen::MutateSpec},
|
1263
|
+
CELLS => {:type => ::Thrift::Types::LIST, :name => 'cells', :element => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::STRING}}}
|
1264
|
+
}
|
1265
|
+
|
1266
|
+
def struct_fields; FIELDS; end
|
1267
|
+
|
1268
|
+
def validate
|
1269
|
+
end
|
1270
|
+
|
1271
|
+
end
|
1272
|
+
|
1273
|
+
class Put_cells_as_arrays_result
|
1274
|
+
include ::Thrift::Struct
|
1275
|
+
E = 1
|
1276
|
+
|
1277
|
+
::Thrift::Struct.field_accessor self, :e
|
1278
|
+
FIELDS = {
|
1279
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1280
|
+
}
|
1281
|
+
|
1282
|
+
def struct_fields; FIELDS; end
|
1283
|
+
|
1284
|
+
def validate
|
1285
|
+
end
|
1286
|
+
|
1287
|
+
end
|
1288
|
+
|
1289
|
+
class Put_cell_args
|
1290
|
+
include ::Thrift::Struct
|
1291
|
+
TABLENAME = 1
|
1292
|
+
MUTATE_SPEC = 2
|
1293
|
+
CELL = 3
|
1294
|
+
|
1295
|
+
::Thrift::Struct.field_accessor self, :tablename, :mutate_spec, :cell
|
1296
|
+
FIELDS = {
|
1297
|
+
TABLENAME => {:type => ::Thrift::Types::STRING, :name => 'tablename'},
|
1298
|
+
MUTATE_SPEC => {:type => ::Thrift::Types::STRUCT, :name => 'mutate_spec', :class => Hypertable::ThriftGen::MutateSpec},
|
1299
|
+
CELL => {:type => ::Thrift::Types::STRUCT, :name => 'cell', :class => Hypertable::ThriftGen::Cell}
|
1300
|
+
}
|
1301
|
+
|
1302
|
+
def struct_fields; FIELDS; end
|
1303
|
+
|
1304
|
+
def validate
|
1305
|
+
end
|
1306
|
+
|
1307
|
+
end
|
1308
|
+
|
1309
|
+
class Put_cell_result
|
1310
|
+
include ::Thrift::Struct
|
1311
|
+
E = 1
|
1312
|
+
|
1313
|
+
::Thrift::Struct.field_accessor self, :e
|
1314
|
+
FIELDS = {
|
1315
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1316
|
+
}
|
1317
|
+
|
1318
|
+
def struct_fields; FIELDS; end
|
1319
|
+
|
1320
|
+
def validate
|
1321
|
+
end
|
1322
|
+
|
1323
|
+
end
|
1324
|
+
|
1325
|
+
class Put_cell_as_array_args
|
1326
|
+
include ::Thrift::Struct
|
1327
|
+
TABLENAME = 1
|
1328
|
+
MUTATE_SPEC = 2
|
1329
|
+
CELL = 3
|
1330
|
+
|
1331
|
+
::Thrift::Struct.field_accessor self, :tablename, :mutate_spec, :cell
|
1332
|
+
FIELDS = {
|
1333
|
+
TABLENAME => {:type => ::Thrift::Types::STRING, :name => 'tablename'},
|
1334
|
+
MUTATE_SPEC => {:type => ::Thrift::Types::STRUCT, :name => 'mutate_spec', :class => Hypertable::ThriftGen::MutateSpec},
|
1335
|
+
CELL => {:type => ::Thrift::Types::LIST, :name => 'cell', :element => {:type => ::Thrift::Types::STRING}}
|
1336
|
+
}
|
1337
|
+
|
1338
|
+
def struct_fields; FIELDS; end
|
1339
|
+
|
1340
|
+
def validate
|
1341
|
+
end
|
1342
|
+
|
1343
|
+
end
|
1344
|
+
|
1345
|
+
class Put_cell_as_array_result
|
1346
|
+
include ::Thrift::Struct
|
1347
|
+
E = 1
|
1348
|
+
|
1349
|
+
::Thrift::Struct.field_accessor self, :e
|
1350
|
+
FIELDS = {
|
1351
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1352
|
+
}
|
1353
|
+
|
1354
|
+
def struct_fields; FIELDS; end
|
1355
|
+
|
1356
|
+
def validate
|
1357
|
+
end
|
1358
|
+
|
1359
|
+
end
|
1360
|
+
|
1059
1361
|
class Open_mutator_args
|
1060
1362
|
include ::Thrift::Struct
|
1061
1363
|
NAME = 1
|
@@ -1296,6 +1598,40 @@ require 'client_types'
|
|
1296
1598
|
|
1297
1599
|
end
|
1298
1600
|
|
1601
|
+
class Exists_table_args
|
1602
|
+
include ::Thrift::Struct
|
1603
|
+
NAME = 1
|
1604
|
+
|
1605
|
+
::Thrift::Struct.field_accessor self, :name
|
1606
|
+
FIELDS = {
|
1607
|
+
NAME => {:type => ::Thrift::Types::STRING, :name => 'name'}
|
1608
|
+
}
|
1609
|
+
|
1610
|
+
def struct_fields; FIELDS; end
|
1611
|
+
|
1612
|
+
def validate
|
1613
|
+
end
|
1614
|
+
|
1615
|
+
end
|
1616
|
+
|
1617
|
+
class Exists_table_result
|
1618
|
+
include ::Thrift::Struct
|
1619
|
+
SUCCESS = 0
|
1620
|
+
E = 1
|
1621
|
+
|
1622
|
+
::Thrift::Struct.field_accessor self, :success, :e
|
1623
|
+
FIELDS = {
|
1624
|
+
SUCCESS => {:type => ::Thrift::Types::BOOL, :name => 'success'},
|
1625
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1626
|
+
}
|
1627
|
+
|
1628
|
+
def struct_fields; FIELDS; end
|
1629
|
+
|
1630
|
+
def validate
|
1631
|
+
end
|
1632
|
+
|
1633
|
+
end
|
1634
|
+
|
1299
1635
|
class Get_table_id_args
|
1300
1636
|
include ::Thrift::Struct
|
1301
1637
|
NAME = 1
|
@@ -1396,6 +1732,40 @@ require 'client_types'
|
|
1396
1732
|
|
1397
1733
|
end
|
1398
1734
|
|
1735
|
+
class Get_table_splits_args
|
1736
|
+
include ::Thrift::Struct
|
1737
|
+
NAME = 1
|
1738
|
+
|
1739
|
+
::Thrift::Struct.field_accessor self, :name
|
1740
|
+
FIELDS = {
|
1741
|
+
NAME => {:type => ::Thrift::Types::STRING, :name => 'name'}
|
1742
|
+
}
|
1743
|
+
|
1744
|
+
def struct_fields; FIELDS; end
|
1745
|
+
|
1746
|
+
def validate
|
1747
|
+
end
|
1748
|
+
|
1749
|
+
end
|
1750
|
+
|
1751
|
+
class Get_table_splits_result
|
1752
|
+
include ::Thrift::Struct
|
1753
|
+
SUCCESS = 0
|
1754
|
+
E = 1
|
1755
|
+
|
1756
|
+
::Thrift::Struct.field_accessor self, :success, :e
|
1757
|
+
FIELDS = {
|
1758
|
+
SUCCESS => {:type => ::Thrift::Types::LIST, :name => 'success', :element => {:type => ::Thrift::Types::STRUCT, :class => Hypertable::ThriftGen::TableSplit}},
|
1759
|
+
E => {:type => ::Thrift::Types::STRUCT, :name => 'e', :class => Hypertable::ThriftGen::ClientException}
|
1760
|
+
}
|
1761
|
+
|
1762
|
+
def struct_fields; FIELDS; end
|
1763
|
+
|
1764
|
+
def validate
|
1765
|
+
end
|
1766
|
+
|
1767
|
+
end
|
1768
|
+
|
1399
1769
|
class Drop_table_args
|
1400
1770
|
include ::Thrift::Struct
|
1401
1771
|
NAME = 1
|
@@ -18,8 +18,9 @@ module Hypertable
|
|
18
18
|
|
19
19
|
module MutatorFlag
|
20
20
|
NO_LOG_SYNC = 1
|
21
|
-
|
22
|
-
|
21
|
+
IGNORE_UNKNOWN_CFS = 2
|
22
|
+
VALUE_MAP = {1 => "NO_LOG_SYNC", 2 => "IGNORE_UNKNOWN_CFS"}
|
23
|
+
VALID_VALUES = Set.new([NO_LOG_SYNC, IGNORE_UNKNOWN_CFS]).freeze
|
23
24
|
end
|
24
25
|
|
25
26
|
# Specifies a range of rows
|
@@ -148,8 +149,9 @@ module Hypertable
|
|
148
149
|
START_TIME = 6
|
149
150
|
END_TIME = 7
|
150
151
|
COLUMNS = 8
|
152
|
+
KEYS_ONLY = 9
|
151
153
|
|
152
|
-
::Thrift::Struct.field_accessor self, :row_intervals, :cell_intervals, :return_deletes, :revs, :row_limit, :start_time, :end_time, :columns
|
154
|
+
::Thrift::Struct.field_accessor self, :row_intervals, :cell_intervals, :return_deletes, :revs, :row_limit, :start_time, :end_time, :columns, :keys_only
|
153
155
|
FIELDS = {
|
154
156
|
ROW_INTERVALS => {:type => ::Thrift::Types::LIST, :name => 'row_intervals', :element => {:type => ::Thrift::Types::STRUCT, :class => Hypertable::ThriftGen::RowInterval}, :optional => true},
|
155
157
|
CELL_INTERVALS => {:type => ::Thrift::Types::LIST, :name => 'cell_intervals', :element => {:type => ::Thrift::Types::STRUCT, :class => Hypertable::ThriftGen::CellInterval}, :optional => true},
|
@@ -158,7 +160,8 @@ module Hypertable
|
|
158
160
|
ROW_LIMIT => {:type => ::Thrift::Types::I32, :name => 'row_limit', :default => 0, :optional => true},
|
159
161
|
START_TIME => {:type => ::Thrift::Types::I64, :name => 'start_time', :optional => true},
|
160
162
|
END_TIME => {:type => ::Thrift::Types::I64, :name => 'end_time', :optional => true},
|
161
|
-
COLUMNS => {:type => ::Thrift::Types::LIST, :name => 'columns', :element => {:type => ::Thrift::Types::STRING}, :optional => true}
|
163
|
+
COLUMNS => {:type => ::Thrift::Types::LIST, :name => 'columns', :element => {:type => ::Thrift::Types::STRING}, :optional => true},
|
164
|
+
KEYS_ONLY => {:type => ::Thrift::Types::BOOL, :name => 'keys_only', :default => false, :optional => true}
|
162
165
|
}
|
163
166
|
|
164
167
|
def struct_fields; FIELDS; end
|
@@ -168,10 +171,10 @@ module Hypertable
|
|
168
171
|
|
169
172
|
end
|
170
173
|
|
171
|
-
# Defines a
|
174
|
+
# Defines a cell key
|
172
175
|
#
|
173
176
|
# <dl>
|
174
|
-
# <dt>
|
177
|
+
# <dt>row</dt>
|
175
178
|
# <dd>Specifies the row key. Note, it cannot contain null characters.
|
176
179
|
# If a row key is not specified in a return cell, it's assumed to
|
177
180
|
# be the same as the previous cell</dd>
|
@@ -182,9 +185,6 @@ module Hypertable
|
|
182
185
|
# <dt>column_qualifier</dt>
|
183
186
|
# <dd>Specifies the column qualifier. A column family must be specified.</dd>
|
184
187
|
#
|
185
|
-
# <dt>value</dt>
|
186
|
-
# <dd>Value of a cell. Currently a sequence of uninterpreted bytes.</dd>
|
187
|
-
#
|
188
188
|
# <dt>timestamp</dt>
|
189
189
|
# <dd>Nanoseconds since epoch for the cell<dd>
|
190
190
|
#
|
@@ -194,25 +194,122 @@ module Hypertable
|
|
194
194
|
# <dt>flag</dt>
|
195
195
|
# <dd>A 16-bit integer indicating the state of the cell</dd>
|
196
196
|
# </dl>
|
197
|
-
class
|
197
|
+
class Key
|
198
198
|
include ::Thrift::Struct
|
199
|
-
|
199
|
+
ROW = 1
|
200
200
|
COLUMN_FAMILY = 2
|
201
201
|
COLUMN_QUALIFIER = 3
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
FLAG = 7
|
202
|
+
TIMESTAMP = 4
|
203
|
+
REVISION = 5
|
204
|
+
FLAG = 6
|
206
205
|
|
207
|
-
::Thrift::Struct.field_accessor self, :
|
206
|
+
::Thrift::Struct.field_accessor self, :row, :column_family, :column_qualifier, :timestamp, :revision, :flag
|
208
207
|
FIELDS = {
|
209
|
-
|
210
|
-
COLUMN_FAMILY => {:type => ::Thrift::Types::STRING, :name => 'column_family'
|
211
|
-
COLUMN_QUALIFIER => {:type => ::Thrift::Types::STRING, :name => 'column_qualifier'
|
212
|
-
VALUE => {:type => ::Thrift::Types::STRING, :name => 'value', :optional => true},
|
208
|
+
ROW => {:type => ::Thrift::Types::STRING, :name => 'row'},
|
209
|
+
COLUMN_FAMILY => {:type => ::Thrift::Types::STRING, :name => 'column_family'},
|
210
|
+
COLUMN_QUALIFIER => {:type => ::Thrift::Types::STRING, :name => 'column_qualifier'},
|
213
211
|
TIMESTAMP => {:type => ::Thrift::Types::I64, :name => 'timestamp', :optional => true},
|
214
212
|
REVISION => {:type => ::Thrift::Types::I64, :name => 'revision', :optional => true},
|
215
|
-
FLAG => {:type => ::Thrift::Types::I16, :name => 'flag', :default => 255
|
213
|
+
FLAG => {:type => ::Thrift::Types::I16, :name => 'flag', :default => 255}
|
214
|
+
}
|
215
|
+
|
216
|
+
def struct_fields; FIELDS; end
|
217
|
+
|
218
|
+
def validate
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
# Specifies options for a shared periodic mutator
|
224
|
+
#
|
225
|
+
# <dl>
|
226
|
+
# <dt>appname</dt>
|
227
|
+
# <dd>String key used to share/retrieve mutator, eg: "my_ht_app"</dd>
|
228
|
+
#
|
229
|
+
# <dt>flush_interval</dt>
|
230
|
+
# <dd>Time interval between flushes</dd>
|
231
|
+
#
|
232
|
+
# <dt>flags</dt>
|
233
|
+
# <dd>Mutator flags</dt>
|
234
|
+
# </dl>
|
235
|
+
class MutateSpec
|
236
|
+
include ::Thrift::Struct
|
237
|
+
APPNAME = 1
|
238
|
+
FLUSH_INTERVAL = 2
|
239
|
+
FLAGS = 3
|
240
|
+
|
241
|
+
::Thrift::Struct.field_accessor self, :appname, :flush_interval, :flags
|
242
|
+
FIELDS = {
|
243
|
+
APPNAME => {:type => ::Thrift::Types::STRING, :name => 'appname', :default => %q""},
|
244
|
+
FLUSH_INTERVAL => {:type => ::Thrift::Types::I32, :name => 'flush_interval', :default => 1000},
|
245
|
+
FLAGS => {:type => ::Thrift::Types::I32, :name => 'flags', :default => 2}
|
246
|
+
}
|
247
|
+
|
248
|
+
def struct_fields; FIELDS; end
|
249
|
+
|
250
|
+
def validate
|
251
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field appname is unset!') unless @appname
|
252
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field flush_interval is unset!') unless @flush_interval
|
253
|
+
raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field flags is unset!') unless @flags
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|
257
|
+
|
258
|
+
# Defines a table cell
|
259
|
+
#
|
260
|
+
# <dl>
|
261
|
+
# <dt>key</dt>
|
262
|
+
# <dd>Specifies the cell key</dd>
|
263
|
+
#
|
264
|
+
# <dt>value</dt>
|
265
|
+
# <dd>Value of a cell. Currently a sequence of uninterpreted bytes.</dd>
|
266
|
+
# </dl>
|
267
|
+
class Cell
|
268
|
+
include ::Thrift::Struct
|
269
|
+
KEY = 1
|
270
|
+
VALUE = 2
|
271
|
+
|
272
|
+
::Thrift::Struct.field_accessor self, :key, :value
|
273
|
+
FIELDS = {
|
274
|
+
KEY => {:type => ::Thrift::Types::STRUCT, :name => 'key', :class => Hypertable::ThriftGen::Key},
|
275
|
+
VALUE => {:type => ::Thrift::Types::STRING, :name => 'value', :optional => true}
|
276
|
+
}
|
277
|
+
|
278
|
+
def struct_fields; FIELDS; end
|
279
|
+
|
280
|
+
def validate
|
281
|
+
end
|
282
|
+
|
283
|
+
end
|
284
|
+
|
285
|
+
# Defines a table split
|
286
|
+
#
|
287
|
+
# <dl>
|
288
|
+
# <dt>start_row</dt>
|
289
|
+
# <dd>Starting row of the split.</dd>
|
290
|
+
#
|
291
|
+
# <dt>end_row</dt>
|
292
|
+
# <dd>Ending row of the split.</dd>
|
293
|
+
#
|
294
|
+
# <dt>location</dt>
|
295
|
+
# <dd>Location (proxy name) of the split.</dd>
|
296
|
+
#
|
297
|
+
# <dt>ip_address</dt>
|
298
|
+
# <dd>The IP address of the split.</dd>
|
299
|
+
# </dl>
|
300
|
+
class TableSplit
|
301
|
+
include ::Thrift::Struct
|
302
|
+
START_ROW = 1
|
303
|
+
END_ROW = 2
|
304
|
+
LOCATION = 3
|
305
|
+
IP_ADDRESS = 4
|
306
|
+
|
307
|
+
::Thrift::Struct.field_accessor self, :start_row, :end_row, :location, :ip_address
|
308
|
+
FIELDS = {
|
309
|
+
START_ROW => {:type => ::Thrift::Types::STRING, :name => 'start_row', :optional => true},
|
310
|
+
END_ROW => {:type => ::Thrift::Types::STRING, :name => 'end_row', :optional => true},
|
311
|
+
LOCATION => {:type => ::Thrift::Types::STRING, :name => 'location', :optional => true},
|
312
|
+
IP_ADDRESS => {:type => ::Thrift::Types::STRING, :name => 'ip_address', :optional => true}
|
216
313
|
}
|
217
314
|
|
218
315
|
def struct_fields; FIELDS; end
|
@@ -842,6 +842,59 @@ module ActiveRecord
|
|
842
842
|
it "should support native each_row_as_arrays scanner method"
|
843
843
|
end
|
844
844
|
|
845
|
+
describe HyperBase, '.mutator_options' do
|
846
|
+
it 'should default to set_cells method' do
|
847
|
+
class Temp < ActiveRecord::HyperBase
|
848
|
+
def self.create_table
|
849
|
+
hql = "CREATE TABLE #{table_name} (
|
850
|
+
'name',
|
851
|
+
'url'
|
852
|
+
)"
|
853
|
+
connection.execute(hql)
|
854
|
+
end
|
855
|
+
end
|
856
|
+
|
857
|
+
Temp.drop_table
|
858
|
+
Temp.create_table
|
859
|
+
Temp.connection.instance_eval("@connection").should_receive(:set_cells_as_arrays).and_return(nil)
|
860
|
+
t = Temp.new({:ROW => 'test', :name => 'test'})
|
861
|
+
t.save!
|
862
|
+
Temp.drop_table
|
863
|
+
end
|
864
|
+
|
865
|
+
describe 'asynchronous_write' do
|
866
|
+
before(:each) do
|
867
|
+
class Temp < ActiveRecord::HyperBase
|
868
|
+
mutator_options :asynchronous_write => true
|
869
|
+
|
870
|
+
def self.create_table
|
871
|
+
hql = "CREATE TABLE #{table_name} (
|
872
|
+
'name',
|
873
|
+
'url'
|
874
|
+
)"
|
875
|
+
connection.execute(hql)
|
876
|
+
end
|
877
|
+
|
878
|
+
Temp.drop_table
|
879
|
+
Temp.create_table
|
880
|
+
end
|
881
|
+
end
|
882
|
+
|
883
|
+
it 'should use put_cells method when asynchronous_write enabled' do
|
884
|
+
Temp.connection.instance_eval("@connection").should_receive(:put_cells_as_arrays).and_return(nil)
|
885
|
+
t = Temp.new({:ROW => 'test', :name => 'test'})
|
886
|
+
t.save!
|
887
|
+
end
|
888
|
+
|
889
|
+
it 'should still result in cells being written to hypertable' do
|
890
|
+
t = Temp.new({:ROW => 'test', :name => 'test'})
|
891
|
+
t.save!
|
892
|
+
sleep 3
|
893
|
+
Temp.find('test').should == t
|
894
|
+
end
|
895
|
+
end
|
896
|
+
end
|
897
|
+
|
845
898
|
describe HyperBase, '.row_key_attributes' do
|
846
899
|
it "should assemble a row key in the order that matches row key attributes" do
|
847
900
|
Page.class_eval do
|
data/test/thrift_client_test.rb
CHANGED
@@ -212,8 +212,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
212
212
|
|
213
213
|
query = client.hql_query("SELECT * FROM thrift_test")
|
214
214
|
assert_equal 1, query.cells.length
|
215
|
-
assert_equal 'k1', query.cells[0].
|
216
|
-
assert_equal 'col', query.cells[0].column_family
|
215
|
+
assert_equal 'k1', query.cells[0].key.row
|
216
|
+
assert_equal 'col', query.cells[0].key.column_family
|
217
217
|
assert_equal 'v1', query.cells[0].value
|
218
218
|
end
|
219
219
|
end
|
@@ -222,16 +222,17 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
222
222
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
223
223
|
mutator = client.open_mutator('thrift_test', 0, 0)
|
224
224
|
cell1 = Hypertable::ThriftGen::Cell.new
|
225
|
-
cell1.
|
226
|
-
cell1.
|
225
|
+
cell1.key = Hypertable::ThriftGen::Key.new
|
226
|
+
cell1.key.row = 'k1'
|
227
|
+
cell1.key.column_family = 'col'
|
227
228
|
cell1.value = 'v1'
|
228
229
|
client.set_cell(mutator, cell1)
|
229
230
|
client.close_mutator(mutator, true)
|
230
231
|
|
231
232
|
query = client.hql_query("SELECT * FROM thrift_test")
|
232
233
|
assert_equal 1, query.cells.length
|
233
|
-
assert_equal 'k1', query.cells[0].
|
234
|
-
assert_equal 'col', query.cells[0].column_family
|
234
|
+
assert_equal 'k1', query.cells[0].key.row
|
235
|
+
assert_equal 'col', query.cells[0].key.column_family
|
235
236
|
assert_equal 'v1', query.cells[0].value
|
236
237
|
end
|
237
238
|
end
|
@@ -240,8 +241,9 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
240
241
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
241
242
|
mutator = client.open_mutator('thrift_test', 0, 500)
|
242
243
|
cell1 = Hypertable::ThriftGen::Cell.new
|
243
|
-
cell1.
|
244
|
-
cell1.
|
244
|
+
cell1.key = Hypertable::ThriftGen::Key.new
|
245
|
+
cell1.key.row = 'k1'
|
246
|
+
cell1.key.column_family = 'col'
|
245
247
|
cell1.value = 'v1'
|
246
248
|
client.set_cell(mutator, cell1)
|
247
249
|
|
@@ -252,8 +254,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
252
254
|
|
253
255
|
query = client.hql_query("SELECT * FROM thrift_test")
|
254
256
|
assert_equal 1, query.cells.length
|
255
|
-
assert_equal 'k1', query.cells[0].
|
256
|
-
assert_equal 'col', query.cells[0].column_family
|
257
|
+
assert_equal 'k1', query.cells[0].key.row
|
258
|
+
assert_equal 'col', query.cells[0].key.column_family
|
257
259
|
assert_equal 'v1', query.cells[0].value
|
258
260
|
end
|
259
261
|
end
|
@@ -276,16 +278,16 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
276
278
|
|
277
279
|
query = client.hql_query("SELECT * FROM thrift_test")
|
278
280
|
assert_equal 3, query.cells.length
|
279
|
-
assert_equal 'k1', query.cells[0].
|
280
|
-
assert_equal 'col', query.cells[0].column_family
|
281
|
+
assert_equal 'k1', query.cells[0].key.row
|
282
|
+
assert_equal 'col', query.cells[0].key.column_family
|
281
283
|
assert_equal 'v1', query.cells[0].value
|
282
284
|
|
283
|
-
assert_equal 'k2', query.cells[1].
|
284
|
-
assert_equal 'col', query.cells[1].column_family
|
285
|
+
assert_equal 'k2', query.cells[1].key.row
|
286
|
+
assert_equal 'col', query.cells[1].key.column_family
|
285
287
|
assert_equal 'v2', query.cells[1].value
|
286
288
|
|
287
|
-
assert_equal 'k3', query.cells[2].
|
288
|
-
assert_equal 'col', query.cells[2].column_family
|
289
|
+
assert_equal 'k3', query.cells[2].key.row
|
290
|
+
assert_equal 'col', query.cells[2].key.column_family
|
289
291
|
assert_equal 'v3', query.cells[2].value
|
290
292
|
end
|
291
293
|
end
|
@@ -294,18 +296,21 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
294
296
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
295
297
|
mutator = client.open_mutator('thrift_test', 0, 0)
|
296
298
|
cell1 = Hypertable::ThriftGen::Cell.new
|
297
|
-
cell1.
|
298
|
-
cell1.
|
299
|
+
cell1.key = Hypertable::ThriftGen::Key.new
|
300
|
+
cell1.key.row = 'k1'
|
301
|
+
cell1.key.column_family = 'col'
|
299
302
|
cell1.value = 'v1'
|
300
303
|
|
301
304
|
cell2 = Hypertable::ThriftGen::Cell.new
|
302
|
-
cell2.
|
303
|
-
cell2.
|
305
|
+
cell2.key = Hypertable::ThriftGen::Key.new
|
306
|
+
cell2.key.row = 'k2'
|
307
|
+
cell2.key.column_family = 'col'
|
304
308
|
cell2.value = 'v2'
|
305
309
|
|
306
310
|
cell3 = Hypertable::ThriftGen::Cell.new
|
307
|
-
cell3.
|
308
|
-
cell3.
|
311
|
+
cell3.key = Hypertable::ThriftGen::Key.new
|
312
|
+
cell3.key.row = 'k3'
|
313
|
+
cell3.key.column_family = 'col'
|
309
314
|
cell3.value = 'v3'
|
310
315
|
|
311
316
|
client.set_cells(mutator, [cell1, cell2, cell3])
|
@@ -313,16 +318,16 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
313
318
|
|
314
319
|
query = client.hql_query("SELECT * FROM thrift_test")
|
315
320
|
assert_equal 3, query.cells.length
|
316
|
-
assert_equal 'k1', query.cells[0].
|
317
|
-
assert_equal 'col', query.cells[0].column_family
|
321
|
+
assert_equal 'k1', query.cells[0].key.row
|
322
|
+
assert_equal 'col', query.cells[0].key.column_family
|
318
323
|
assert_equal 'v1', query.cells[0].value
|
319
324
|
|
320
|
-
assert_equal 'k2', query.cells[1].
|
321
|
-
assert_equal 'col', query.cells[1].column_family
|
325
|
+
assert_equal 'k2', query.cells[1].key.row
|
326
|
+
assert_equal 'col', query.cells[1].key.column_family
|
322
327
|
assert_equal 'v2', query.cells[1].value
|
323
328
|
|
324
|
-
assert_equal 'k3', query.cells[2].
|
325
|
-
assert_equal 'col', query.cells[2].column_family
|
329
|
+
assert_equal 'k3', query.cells[2].key.row
|
330
|
+
assert_equal 'col', query.cells[2].key.column_family
|
326
331
|
assert_equal 'v3', query.cells[2].value
|
327
332
|
end
|
328
333
|
end
|
@@ -343,16 +348,17 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
343
348
|
|
344
349
|
client.with_mutator('thrift_test') do |mutator|
|
345
350
|
cell1 = Hypertable::ThriftGen::Cell.new
|
346
|
-
cell1.
|
347
|
-
cell1.
|
351
|
+
cell1.key = Hypertable::ThriftGen::Key.new
|
352
|
+
cell1.key.row = 'k1'
|
353
|
+
cell1.key.column_family = 'col'
|
348
354
|
cell1.value = 'v1'
|
349
355
|
client.set_cells(mutator, [cell1])
|
350
356
|
end
|
351
357
|
|
352
358
|
query = client.hql_query("SELECT * FROM thrift_test")
|
353
359
|
assert_equal 1, query.cells.length
|
354
|
-
assert_equal 'k1', query.cells[0].
|
355
|
-
assert_equal 'col', query.cells[0].column_family
|
360
|
+
assert_equal 'k1', query.cells[0].key.row
|
361
|
+
assert_equal 'col', query.cells[0].key.column_family
|
356
362
|
assert_equal 'v1', query.cells[0].value
|
357
363
|
end
|
358
364
|
end
|
@@ -374,8 +380,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
374
380
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
375
381
|
query = client.hql_query("SELECT * FROM thrift_test WHERE CELL = 'k1','col'")
|
376
382
|
assert_equal 1, query.cells.length
|
377
|
-
assert_equal 'k1', query.cells[0].
|
378
|
-
assert_equal 'col', query.cells[0].column_family
|
383
|
+
assert_equal 'k1', query.cells[0].key.row
|
384
|
+
assert_equal 'col', query.cells[0].key.column_family
|
379
385
|
assert_equal 'v1', query.cells[0].value
|
380
386
|
end
|
381
387
|
end
|
@@ -404,8 +410,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
404
410
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
405
411
|
query = client.hql_query("SELECT * FROM thrift_test WHERE ROW = 'k1'")
|
406
412
|
assert_equal 1, query.cells.length
|
407
|
-
assert_equal 'k1', query.cells[0].
|
408
|
-
assert_equal 'col', query.cells[0].column_family
|
413
|
+
assert_equal 'k1', query.cells[0].key.row
|
414
|
+
assert_equal 'col', query.cells[0].key.column_family
|
409
415
|
assert_equal 'v1', query.cells[0].value
|
410
416
|
end
|
411
417
|
end
|
@@ -414,8 +420,8 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
414
420
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
415
421
|
cells = client.get_row("thrift_test", 'k1')
|
416
422
|
assert_equal 1, cells.length
|
417
|
-
assert_equal 'k1', cells[0].
|
418
|
-
assert_equal 'col', cells[0].column_family
|
423
|
+
assert_equal 'k1', cells[0].key.row
|
424
|
+
assert_equal 'col', cells[0].key.column_family
|
419
425
|
assert_equal 'v1', cells[0].value
|
420
426
|
end
|
421
427
|
end
|
@@ -437,16 +443,16 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
437
443
|
Hypertable.with_thrift_client("localhost", 38080) do |client|
|
438
444
|
query = client.hql_query("SELECT * FROM thrift_test")
|
439
445
|
assert_equal 3, query.cells.length
|
440
|
-
assert_equal 'k1', query.cells[0].
|
441
|
-
assert_equal 'col', query.cells[0].column_family
|
446
|
+
assert_equal 'k1', query.cells[0].key.row
|
447
|
+
assert_equal 'col', query.cells[0].key.column_family
|
442
448
|
assert_equal 'v1', query.cells[0].value
|
443
449
|
|
444
|
-
assert_equal 'k2', query.cells[1].
|
445
|
-
assert_equal 'col', query.cells[1].column_family
|
450
|
+
assert_equal 'k2', query.cells[1].key.row
|
451
|
+
assert_equal 'col', query.cells[1].key.column_family
|
446
452
|
assert_equal 'v2', query.cells[1].value
|
447
453
|
|
448
|
-
assert_equal 'k3', query.cells[2].
|
449
|
-
assert_equal 'col', query.cells[2].column_family
|
454
|
+
assert_equal 'k3', query.cells[2].key.row
|
455
|
+
assert_equal 'col', query.cells[2].key.column_family
|
450
456
|
assert_equal 'v3', query.cells[2].value
|
451
457
|
end
|
452
458
|
end
|
@@ -457,16 +463,16 @@ class ThriftClientTest < Test::Unit::TestCase
|
|
457
463
|
cells = client.get_cells("thrift_test", scan_spec)
|
458
464
|
|
459
465
|
assert_equal 3, cells.length
|
460
|
-
assert_equal 'k1', cells[0].
|
461
|
-
assert_equal 'col', cells[0].column_family
|
466
|
+
assert_equal 'k1', cells[0].key.row
|
467
|
+
assert_equal 'col', cells[0].key.column_family
|
462
468
|
assert_equal 'v1', cells[0].value
|
463
469
|
|
464
|
-
assert_equal 'k2', cells[1].
|
465
|
-
assert_equal 'col', cells[1].column_family
|
470
|
+
assert_equal 'k2', cells[1].key.row
|
471
|
+
assert_equal 'col', cells[1].key.column_family
|
466
472
|
assert_equal 'v2', cells[1].value
|
467
473
|
|
468
|
-
assert_equal 'k3', cells[2].
|
469
|
-
assert_equal 'col', cells[2].column_family
|
474
|
+
assert_equal 'k3', cells[2].key.row
|
475
|
+
assert_equal 'col', cells[2].key.column_family
|
470
476
|
assert_equal 'v3', cells[2].value
|
471
477
|
end
|
472
478
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 9
|
8
|
+
- 3
|
9
|
+
version: 0.9.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- tylerkovacs
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-05-30 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- CHANGELOG
|
33
33
|
- LICENSE
|
34
34
|
- README
|
35
|
+
- HOW_TO_RUN_TESTS
|
35
36
|
- Rakefile
|
36
37
|
- VERSION.yml
|
37
38
|
- benchmark/save.rb
|
@@ -51,7 +52,6 @@ files:
|
|
51
52
|
- lib/hypertable/gen-rb/hql_types.rb
|
52
53
|
- lib/hypertable/thrift_client.rb
|
53
54
|
- lib/hypertable/thrift_transport_monkey_patch.rb
|
54
|
-
- pkg/hyper_record-0.2.8.gem
|
55
55
|
- spec/fixtures/pages.yml
|
56
56
|
- spec/fixtures/qualified_pages.yml
|
57
57
|
- spec/lib/associations_spec.rb
|
data/pkg/hyper_record-0.2.8.gem
DELETED
Binary file
|