massive_record 0.2.1 → 0.2.2.rc1
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/CHANGELOG.md +58 -2
- data/Gemfile.lock +17 -17
- data/README.md +98 -41
- data/lib/massive_record.rb +2 -1
- data/lib/massive_record/adapters/thrift/hbase/hbase.rb +2425 -2154
- data/lib/massive_record/adapters/thrift/hbase/hbase_constants.rb +3 -3
- data/lib/massive_record/adapters/thrift/hbase/hbase_types.rb +195 -195
- data/lib/massive_record/adapters/thrift/row.rb +35 -4
- data/lib/massive_record/adapters/thrift/table.rb +49 -12
- data/lib/massive_record/orm/attribute_methods.rb +77 -5
- data/lib/massive_record/orm/attribute_methods/cast_numbers_on_write.rb +24 -0
- data/lib/massive_record/orm/attribute_methods/dirty.rb +18 -0
- data/lib/massive_record/orm/attribute_methods/time_zone_conversion.rb +24 -3
- data/lib/massive_record/orm/attribute_methods/write.rb +8 -1
- data/lib/massive_record/orm/base.rb +62 -8
- data/lib/massive_record/orm/column.rb +7 -11
- data/lib/massive_record/orm/default_id.rb +1 -1
- data/lib/massive_record/orm/embedded.rb +66 -0
- data/lib/massive_record/orm/errors.rb +17 -0
- data/lib/massive_record/orm/finders.rb +124 -71
- data/lib/massive_record/orm/finders/rescue_missing_table_on_find.rb +1 -1
- data/lib/massive_record/orm/finders/scope.rb +58 -34
- data/lib/massive_record/orm/id_factory.rb +22 -105
- data/lib/massive_record/orm/id_factory/atomic_incrementation.rb +117 -0
- data/lib/massive_record/orm/id_factory/timestamp.rb +60 -0
- data/lib/massive_record/orm/identity_map.rb +256 -0
- data/lib/massive_record/orm/log_subscriber.rb +18 -0
- data/lib/massive_record/orm/observer.rb +69 -0
- data/lib/massive_record/orm/persistence.rb +47 -119
- data/lib/massive_record/orm/persistence/operations.rb +100 -0
- data/lib/massive_record/orm/persistence/operations/atomic_operation.rb +71 -0
- data/lib/massive_record/orm/persistence/operations/destroy.rb +17 -0
- data/lib/massive_record/orm/persistence/operations/embedded/destroy.rb +26 -0
- data/lib/massive_record/orm/persistence/operations/embedded/insert.rb +27 -0
- data/lib/massive_record/orm/persistence/operations/embedded/operation_helpers.rb +66 -0
- data/lib/massive_record/orm/persistence/operations/embedded/reload.rb +39 -0
- data/lib/massive_record/orm/persistence/operations/embedded/update.rb +29 -0
- data/lib/massive_record/orm/persistence/operations/insert.rb +19 -0
- data/lib/massive_record/orm/persistence/operations/reload.rb +26 -0
- data/lib/massive_record/orm/persistence/operations/suppress.rb +15 -0
- data/lib/massive_record/orm/persistence/operations/table_operation_helpers.rb +106 -0
- data/lib/massive_record/orm/persistence/operations/update.rb +25 -0
- data/lib/massive_record/orm/query_instrumentation.rb +26 -49
- data/lib/massive_record/orm/raw_data.rb +47 -0
- data/lib/massive_record/orm/relations.rb +4 -0
- data/lib/massive_record/orm/relations/interface.rb +134 -0
- data/lib/massive_record/orm/relations/metadata.rb +58 -12
- data/lib/massive_record/orm/relations/proxy.rb +17 -12
- data/lib/massive_record/orm/relations/proxy/embedded_in.rb +54 -0
- data/lib/massive_record/orm/relations/proxy/embedded_in_polymorphic.rb +15 -0
- data/lib/massive_record/orm/relations/proxy/embeds_many.rb +215 -0
- data/lib/massive_record/orm/relations/proxy/references_many.rb +112 -88
- data/lib/massive_record/orm/relations/proxy/references_one.rb +1 -1
- data/lib/massive_record/orm/relations/proxy/references_one_polymorphic.rb +1 -1
- data/lib/massive_record/orm/relations/proxy_collection.rb +84 -0
- data/lib/massive_record/orm/schema/column_family.rb +3 -2
- data/lib/massive_record/orm/schema/{column_interface.rb → embedded_interface.rb} +38 -4
- data/lib/massive_record/orm/schema/field.rb +2 -0
- data/lib/massive_record/orm/schema/table_interface.rb +19 -2
- data/lib/massive_record/orm/single_table_inheritance.rb +37 -2
- data/lib/massive_record/orm/timestamps.rb +17 -7
- data/lib/massive_record/orm/validations.rb +4 -0
- data/lib/massive_record/orm/validations/associated.rb +50 -0
- data/lib/massive_record/rails/railtie.rb +31 -0
- data/lib/massive_record/version.rb +1 -1
- data/lib/massive_record/wrapper/cell.rb +8 -1
- data/massive_record.gemspec +4 -4
- data/spec/adapter/thrift/atomic_increment_spec.rb +16 -0
- data/spec/adapter/thrift/table_find_spec.rb +14 -2
- data/spec/adapter/thrift/table_spec.rb +6 -6
- data/spec/adapter/thrift/utf8_encoding_of_id_spec.rb +71 -0
- data/spec/orm/cases/attribute_methods_spec.rb +215 -22
- data/spec/orm/cases/auto_generate_id_spec.rb +1 -1
- data/spec/orm/cases/change_id_spec.rb +62 -0
- data/spec/orm/cases/default_id_spec.rb +25 -6
- data/spec/orm/cases/default_values_spec.rb +6 -3
- data/spec/orm/cases/dirty_spec.rb +150 -102
- data/spec/orm/cases/embedded_spec.rb +250 -0
- data/spec/orm/cases/{finder_default_scope.rb → finder_default_scope_spec.rb} +4 -0
- data/spec/orm/cases/finder_scope_spec.rb +96 -29
- data/spec/orm/cases/finders_spec.rb +57 -10
- data/spec/orm/cases/id_factory/atomic_incrementation_spec.rb +72 -0
- data/spec/orm/cases/id_factory/timestamp_spec.rb +61 -0
- data/spec/orm/cases/identity_map/identity_map_spec.rb +357 -0
- data/spec/orm/cases/identity_map/middleware_spec.rb +74 -0
- data/spec/orm/cases/log_subscriber_spec.rb +15 -2
- data/spec/orm/cases/observing_spec.rb +61 -0
- data/spec/orm/cases/persistence_spec.rb +151 -60
- data/spec/orm/cases/raw_data_spec.rb +58 -0
- data/spec/orm/cases/single_table_inheritance_spec.rb +58 -2
- data/spec/orm/cases/table_spec.rb +3 -3
- data/spec/orm/cases/time_zone_awareness_spec.rb +27 -0
- data/spec/orm/cases/timestamps_spec.rb +23 -109
- data/spec/orm/cases/validation_spec.rb +9 -0
- data/spec/orm/models/address.rb +5 -1
- data/spec/orm/models/address_with_timestamp.rb +12 -0
- data/spec/orm/models/car.rb +5 -0
- data/spec/orm/models/person.rb +13 -1
- data/spec/orm/models/person_with_timestamp.rb +4 -2
- data/spec/orm/models/test_class.rb +1 -0
- data/spec/orm/persistence/operations/atomic_operation_spec.rb +58 -0
- data/spec/orm/persistence/operations/destroy_spec.rb +22 -0
- data/spec/orm/persistence/operations/embedded/destroy_spec.rb +71 -0
- data/spec/orm/persistence/operations/embedded/insert_spec.rb +59 -0
- data/spec/orm/persistence/operations/embedded/operation_helpers_spec.rb +92 -0
- data/spec/orm/persistence/operations/embedded/reload_spec.rb +67 -0
- data/spec/orm/persistence/operations/embedded/update_spec.rb +60 -0
- data/spec/orm/persistence/operations/insert_spec.rb +31 -0
- data/spec/orm/persistence/operations/reload_spec.rb +48 -0
- data/spec/orm/persistence/operations/suppress_spec.rb +17 -0
- data/spec/orm/persistence/operations/table_operation_helpers_spec.rb +98 -0
- data/spec/orm/persistence/operations/update_spec.rb +25 -0
- data/spec/orm/persistence/operations_spec.rb +58 -0
- data/spec/orm/relations/interface_spec.rb +188 -0
- data/spec/orm/relations/metadata_spec.rb +92 -15
- data/spec/orm/relations/proxy/embedded_in_polymorphic_spec.rb +37 -0
- data/spec/orm/relations/proxy/embedded_in_spec.rb +66 -0
- data/spec/orm/relations/proxy/embeds_many_spec.rb +651 -0
- data/spec/orm/relations/proxy/references_many_spec.rb +466 -2
- data/spec/orm/schema/column_family_spec.rb +21 -0
- data/spec/orm/schema/embedded_interface_spec.rb +181 -0
- data/spec/orm/schema/field_spec.rb +7 -0
- data/spec/orm/schema/table_interface_spec.rb +31 -1
- data/spec/shared/orm/id_factories.rb +44 -0
- data/spec/shared/orm/model_with_timestamps.rb +132 -0
- data/spec/shared/orm/persistence/a_persistence_embedded_operation_class.rb +3 -0
- data/spec/shared/orm/persistence/a_persistence_operation_class.rb +11 -0
- data/spec/shared/orm/persistence/a_persistence_table_operation_class.rb +11 -0
- data/spec/shared/orm/relations/proxy.rb +9 -2
- data/spec/spec_helper.rb +9 -0
- data/spec/support/mock_massive_record_connection.rb +2 -1
- metadata +106 -21
- data/spec/orm/cases/column_spec.rb +0 -49
- data/spec/orm/cases/id_factory_spec.rb +0 -92
- data/spec/orm/schema/column_interface_spec.rb +0 -136
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'massive_record/orm/persistence/operations/table_operation_helpers'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
class Destroy
|
8
|
+
include Operations, TableOperationHelpers
|
9
|
+
|
10
|
+
def execute
|
11
|
+
row_for_record.destroy
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'massive_record/orm/persistence/operations/embedded/operation_helpers'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
module Embedded
|
8
|
+
class Destroy
|
9
|
+
include Operations, OperationHelpers
|
10
|
+
|
11
|
+
def execute
|
12
|
+
embedded_in_proxies.each do |proxy|
|
13
|
+
if proxy.load_proxy_target && proxy.load_proxy_target.persisted?
|
14
|
+
inverse_proxy_for(proxy).delete(record)
|
15
|
+
update_embedded(proxy, nil)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'massive_record/orm/persistence/operations/embedded/operation_helpers'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
module Embedded
|
8
|
+
class Insert
|
9
|
+
include Operations, OperationHelpers
|
10
|
+
|
11
|
+
def execute
|
12
|
+
raise_error_if_embedded_in_proxy_targets_are_missing
|
13
|
+
|
14
|
+
# NOTE
|
15
|
+
#
|
16
|
+
# When / if we allow for auto-save false when assigning
|
17
|
+
# an embedded record to an embeds many collection we might
|
18
|
+
# want to only update current insert in the targets, not a
|
19
|
+
# complete save of the parent.
|
20
|
+
embedded_in_proxy_targets.collect(&:save).any?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module MassiveRecord
|
2
|
+
module ORM
|
3
|
+
module Persistence
|
4
|
+
module Operations
|
5
|
+
module Embedded
|
6
|
+
module OperationHelpers
|
7
|
+
def embedded_in_proxies
|
8
|
+
record.relation_proxies.select { |proxy| proxy.metadata.embedded_in? }
|
9
|
+
end
|
10
|
+
|
11
|
+
def embedded_in_proxy_targets
|
12
|
+
embedded_in_proxies.collect(&:load_proxy_target).compact
|
13
|
+
end
|
14
|
+
|
15
|
+
def raise_error_if_embedded_in_proxy_targets_are_missing
|
16
|
+
relations_not_assigned = []
|
17
|
+
relations_assigned = []
|
18
|
+
|
19
|
+
embedded_in_proxies.each do |proxy|
|
20
|
+
if proxy.load_proxy_target.nil?
|
21
|
+
relations_not_assigned << proxy.metadata.name
|
22
|
+
else
|
23
|
+
relations_assigned << proxy.metadata.name
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
if relations_assigned.empty?
|
28
|
+
raise MassiveRecord::ORM::NotAssignedToEmbeddedCollection.new(record, relations_not_assigned)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def update_embedded(relation_proxy, value)
|
33
|
+
row = row_for_record(relation_proxy)
|
34
|
+
row.values = {
|
35
|
+
inverse_proxy_for(relation_proxy).metadata.store_in => {
|
36
|
+
record.database_id => value
|
37
|
+
}
|
38
|
+
}
|
39
|
+
row.save
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
def inverse_proxy_for(proxy)
|
48
|
+
proxy.load_proxy_target.send(:relation_proxy, proxy.metadata.inverse_of)
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def row_for_record(record)
|
53
|
+
raise IdMissing.new("You must set an ID before save.") if record.id.blank?
|
54
|
+
|
55
|
+
MassiveRecord::Wrapper::Row.new({
|
56
|
+
:id => record.id,
|
57
|
+
:table => record.class.table
|
58
|
+
})
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'massive_record/orm/persistence/operations/embedded/operation_helpers'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
module Embedded
|
8
|
+
class Reload
|
9
|
+
include Operations, OperationHelpers
|
10
|
+
|
11
|
+
class UnsupportedNumberOfEmbeddedIn < MassiveRecordError; end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
if record.persisted? && embeds_many_proxy_to_reload_from
|
15
|
+
embeds_many_proxy_to_reload_from = inverse_proxy_for(embedded_in_proxies.first)
|
16
|
+
embeds_many_proxy_to_reload_from.reload
|
17
|
+
embeds_many_proxy_to_reload_from.find(record.id).tap do |reloaded_record|
|
18
|
+
record.reinit_with({
|
19
|
+
'attributes' => reloaded_record.attributes,
|
20
|
+
'raw_data' => reloaded_record.raw_data
|
21
|
+
})
|
22
|
+
end
|
23
|
+
|
24
|
+
true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def embeds_many_proxy_to_reload_from
|
32
|
+
@embeds_many_proxy_to_reload_from ||= embedded_in_proxies.select { |p| p.load_proxy_target.present? }.first
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'massive_record/orm/persistence/operations/embedded/operation_helpers'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
module Embedded
|
8
|
+
class Update
|
9
|
+
include Operations, OperationHelpers
|
10
|
+
|
11
|
+
def execute
|
12
|
+
raise_error_if_embedded_in_proxy_targets_are_missing
|
13
|
+
update_only_embedded_record_in_owners
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def update_only_embedded_record_in_owners
|
20
|
+
embedded_in_proxies.select { |p| p.load_proxy_target.present? }.each do |proxy|
|
21
|
+
update_embedded(proxy, Base.coder.dump(record.attributes_db_raw_data_hash))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'massive_record/orm/persistence/operations/table_operation_helpers'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
class Insert
|
8
|
+
include Operations, TableOperationHelpers
|
9
|
+
|
10
|
+
def execute
|
11
|
+
ensure_that_we_have_table_and_column_families!
|
12
|
+
raise RecordNotUnique if klass.check_record_uniqueness_on_create && klass.exists?(record.id)
|
13
|
+
store_record_to_database('create')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'massive_record/orm/persistence/operations/table_operation_helpers'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
class Reload
|
8
|
+
include Operations, TableOperationHelpers
|
9
|
+
|
10
|
+
def execute
|
11
|
+
if record.persisted?
|
12
|
+
klass.find(record.id).tap do |reloaded_record|
|
13
|
+
record.reinit_with({
|
14
|
+
'attributes' => reloaded_record.attributes,
|
15
|
+
'raw_data' => reloaded_record.raw_data
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
true
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'massive_record/orm/query_instrumentation'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
module TableOperationHelpers
|
8
|
+
|
9
|
+
def self.included(base)
|
10
|
+
base.class_eval do
|
11
|
+
include MassiveRecord::ORM::QueryInstrumentation::Operations
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
#
|
17
|
+
# Calculate which column families are missing in the database in
|
18
|
+
# context of what the schema instructs.
|
19
|
+
#
|
20
|
+
def self.calculate_missing_family_names(klass)
|
21
|
+
existing_family_names = klass.table.fetch_column_families.collect(&:name) rescue []
|
22
|
+
expected_family_names = klass.column_families ? klass.column_families.collect(&:name) : []
|
23
|
+
|
24
|
+
expected_family_names.collect(&:to_s) - existing_family_names.collect(&:to_s)
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Creates table for ORM classes
|
29
|
+
#
|
30
|
+
def self.hbase_create_table!(klass)
|
31
|
+
missing_family_names = calculate_missing_family_names(klass)
|
32
|
+
klass.table.create_column_families(missing_family_names) unless missing_family_names.empty?
|
33
|
+
klass.table.save
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# Iterates over tables and column families and ensure that we
|
38
|
+
# have what we need
|
39
|
+
#
|
40
|
+
def ensure_that_we_have_table_and_column_families! # :nodoc:
|
41
|
+
#
|
42
|
+
# TODO: Can we skip checking if it exists at all, and instead, rescue it if it does not?
|
43
|
+
#
|
44
|
+
hbase_create_table! unless klass.table.exists?
|
45
|
+
raise ColumnFamiliesMissingError.new(klass, calculate_missing_family_names) if calculate_missing_family_names.any?
|
46
|
+
end
|
47
|
+
|
48
|
+
def hbase_create_table!
|
49
|
+
TableOperationHelpers.hbase_create_table!(klass)
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def calculate_missing_family_names
|
54
|
+
TableOperationHelpers.calculate_missing_family_names(klass)
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
#
|
62
|
+
# Returns a Wrapper::Row class which we can manipulate this
|
63
|
+
# record in the database with
|
64
|
+
#
|
65
|
+
def row_for_record
|
66
|
+
raise IdMissing.new("You must set an ID before save.") if record.id.blank?
|
67
|
+
|
68
|
+
MassiveRecord::Wrapper::Row.new({
|
69
|
+
:id => record.id,
|
70
|
+
:table => klass.table
|
71
|
+
})
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# Returns attributes on a form which Wrapper::Row expects
|
76
|
+
#
|
77
|
+
def attributes_to_row_values_hash(only_attr_names = [])
|
78
|
+
values = Hash.new { |hash, key| hash[key] = Hash.new }
|
79
|
+
|
80
|
+
record.attributes_schema.each do |attr_name, orm_field|
|
81
|
+
next unless only_attr_names.empty? || only_attr_names.include?(attr_name)
|
82
|
+
values[orm_field.column_family.name][orm_field.column] = orm_field.encode(record[attr_name])
|
83
|
+
end
|
84
|
+
|
85
|
+
record.relation_proxies_for_embedded.select { |p| p.proxy_targets_update_hash.any? }.each do |proxy_with_changes|
|
86
|
+
values[proxy_with_changes.metadata.store_in].merge!(proxy_with_changes.proxy_targets_update_hash)
|
87
|
+
end
|
88
|
+
|
89
|
+
values
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
#
|
94
|
+
# Takes care of the actual storing of the record to the database
|
95
|
+
# Both update and create is using this
|
96
|
+
#
|
97
|
+
def store_record_to_database(action, attribute_names_to_update = [])
|
98
|
+
row = row_for_record
|
99
|
+
row.values = attributes_to_row_values_hash(attribute_names_to_update)
|
100
|
+
row.save
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'massive_record/orm/persistence/operations/table_operation_helpers'
|
2
|
+
|
3
|
+
module MassiveRecord
|
4
|
+
module ORM
|
5
|
+
module Persistence
|
6
|
+
module Operations
|
7
|
+
class Update
|
8
|
+
include Operations, TableOperationHelpers
|
9
|
+
|
10
|
+
def execute
|
11
|
+
ensure_that_we_have_table_and_column_families!
|
12
|
+
store_record_to_database('update', attribute_names_to_update)
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def attribute_names_to_update
|
19
|
+
options[:attribute_names_to_update] || []
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,64 +1,41 @@
|
|
1
1
|
module MassiveRecord
|
2
2
|
module ORM
|
3
3
|
module QueryInstrumentation
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
4
|
+
module Table
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
%w(find_one find_some find_all).each do |method_to_instrument|
|
9
|
+
module_eval <<-RUBY, __FILE__, __LINE__
|
10
|
+
|
11
|
+
def #{method_to_instrument}(*args)
|
12
|
+
ActiveSupport::Notifications.instrument("load.massive_record", {
|
13
|
+
:name => [model_name, 'load'].join(' '),
|
14
|
+
:description => "#{method_to_instrument}",
|
15
|
+
:options => args
|
16
|
+
}) do
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
RUBY
|
19
22
|
end
|
20
23
|
end
|
24
|
+
end
|
21
25
|
|
26
|
+
module Operations
|
27
|
+
def store_record_to_database(action, attribute_names_to_update = [])
|
28
|
+
description = action + " id: #{record.id},"
|
29
|
+
description += " attributes: #{attribute_names_to_update.join(', ')}" if attribute_names_to_update.any?
|
22
30
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
def hbase_query_all_first(type, *args)
|
28
|
-
ActiveSupport::Notifications.instrument("find_query.massive_record", {
|
29
|
-
:name => [model_name, 'query'].join(' '),
|
30
|
-
:description => type,
|
31
|
-
:options => args
|
32
|
-
}) do
|
33
|
-
super
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def hbase_query_find(what_to_find, options)
|
38
|
-
ActiveSupport::Notifications.instrument("find_query.massive_record", {
|
39
|
-
:name => [model_name, 'query'].join(' '),
|
40
|
-
:description => "find id(s): #{what_to_find}",
|
41
|
-
:options => options
|
31
|
+
ActiveSupport::Notifications.instrument("query.massive_record", {
|
32
|
+
:name => [klass.model_name, 'save'].join(' '),
|
33
|
+
:description => description
|
42
34
|
}) do
|
43
35
|
super
|
44
36
|
end
|
45
37
|
end
|
46
38
|
end
|
47
|
-
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def store_record_to_database(action, attribute_names_to_update = [])
|
52
|
-
description = action + " id: #{id},"
|
53
|
-
description += " attributes: #{attribute_names_to_update.join(', ')}" if attribute_names_to_update.any?
|
54
|
-
|
55
|
-
ActiveSupport::Notifications.instrument("query.massive_record", {
|
56
|
-
:name => [self.class.model_name, 'save'].join(' '),
|
57
|
-
:description => description
|
58
|
-
}) do
|
59
|
-
super
|
60
|
-
end
|
61
|
-
end
|
62
39
|
end
|
63
40
|
end
|
64
41
|
end
|