doeskeyvalue 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/doeskeyvalue.gemspec +3 -2
- data/lib/doeskeyvalue.rb +27 -7
- data/lib/doeskeyvalue/indexes.rb +5 -1
- data/lib/doeskeyvalue/key_manager.rb +119 -0
- data/lib/doeskeyvalue/keys.rb +5 -0
- metadata +4 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/doeskeyvalue.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{doeskeyvalue}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Awexome Labs"]
|
12
|
-
s.date = %q{2011-06-
|
12
|
+
s.date = %q{2011-06-29}
|
13
13
|
s.description = %q{Bring the fun of NoSQL into your SQL-backed Active Record objects in a compartmentalized way. Turns any text field on your objects into a schema-less key value store.}
|
14
14
|
s.email = %q{gems@awexomelabs.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
"doeskeyvalue.gemspec",
|
28
28
|
"lib/doeskeyvalue.rb",
|
29
29
|
"lib/doeskeyvalue/indexes.rb",
|
30
|
+
"lib/doeskeyvalue/key_manager.rb",
|
30
31
|
"lib/doeskeyvalue/keys.rb",
|
31
32
|
"lib/doeskeyvalue/util.rb",
|
32
33
|
"lib/generators/doeskeyvalue/doeskeyvalue_generator.rb",
|
data/lib/doeskeyvalue.rb
CHANGED
@@ -6,6 +6,7 @@ require 'rails'
|
|
6
6
|
require 'active_record'
|
7
7
|
require 'hashie'
|
8
8
|
|
9
|
+
require 'doeskeyvalue/key_manager'
|
9
10
|
require 'doeskeyvalue/keys'
|
10
11
|
require 'doeskeyvalue/indexes'
|
11
12
|
require 'doeskeyvalue/util'
|
@@ -53,9 +54,11 @@ module ActiveRecord
|
|
53
54
|
extend DoesKeyValue::Indexes
|
54
55
|
|
55
56
|
# Identify the AR text column holding our data and serialize it:
|
56
|
-
|
57
|
-
|
58
|
-
|
57
|
+
@column_name = column.to_sym
|
58
|
+
serialize @column_name, Hashie::Mash
|
59
|
+
|
60
|
+
# Add the column to the key and column manager so we can reference it later:
|
61
|
+
DoesKeyValue::KeyManager.instance.declare_column(self, @column_name)
|
59
62
|
end
|
60
63
|
|
61
64
|
Array.class_eval do
|
@@ -63,14 +66,31 @@ module ActiveRecord
|
|
63
66
|
end
|
64
67
|
|
65
68
|
instance_eval <<-EOS
|
66
|
-
def #{
|
69
|
+
def #{@column_name}_key(key_name, opts={})
|
70
|
+
printf("DOESKEYVALUE: %s.%s key declared on class %s\n", @column_name, key_name, self.to_s)
|
71
|
+
column_name = :#{@column_name}
|
67
72
|
key_name = key_name.to_sym
|
68
|
-
declare_key(
|
73
|
+
declare_key(column_name, key_name, opts)
|
69
74
|
end
|
70
75
|
|
71
|
-
def #{
|
76
|
+
def #{@column_name}_index(key_name, opts={})
|
77
|
+
column_name = :#{@column_name}
|
72
78
|
key_name = key_name.to_sym
|
73
|
-
declare_index(
|
79
|
+
declare_index(column_name, key_name, opts)
|
80
|
+
end
|
81
|
+
|
82
|
+
def key_value_columns
|
83
|
+
return DoesKeyValue::KeyManager.instance.columns_for(self)
|
84
|
+
end
|
85
|
+
|
86
|
+
def #{@column_name}_keys
|
87
|
+
column_name = :#{@column_name}
|
88
|
+
return DoesKeyValue::KeyManager.instance.keys_for(self, column_name)
|
89
|
+
end
|
90
|
+
|
91
|
+
def #{@column_name}_indexes
|
92
|
+
column_name = :#{@column_name}
|
93
|
+
return DoesKeyValue::KeyManager.instance.indexes_for(self, column_name)
|
74
94
|
end
|
75
95
|
EOS
|
76
96
|
end
|
data/lib/doeskeyvalue/indexes.rb
CHANGED
@@ -93,8 +93,12 @@ module DoesKeyValue
|
|
93
93
|
end
|
94
94
|
after_destroy "update_index_#{key_value_column}_#{key_name}_after_destroy"
|
95
95
|
|
96
|
+
|
97
|
+
# Add the index to the key and column manager:
|
98
|
+
DoesKeyValue::KeyManager.instance.declare_index(self, key_value_column, key_name, opts)
|
99
|
+
|
96
100
|
end
|
97
101
|
|
98
102
|
|
99
|
-
end #
|
103
|
+
end # Indexes
|
100
104
|
end # DoesKeyValue
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# AWEXOME LABS
|
2
|
+
# DoesKeyValue
|
3
|
+
#
|
4
|
+
# KeyManager -- Holds and maintains key_value configuration for all
|
5
|
+
# classes and blob-containers implementing DoesKeyValue
|
6
|
+
|
7
|
+
module DoesKeyValue
|
8
|
+
class KeyManager
|
9
|
+
|
10
|
+
# There can be only one:
|
11
|
+
include Singleton
|
12
|
+
|
13
|
+
|
14
|
+
# Return the Hash of known columns, organized by declaring class
|
15
|
+
def columns
|
16
|
+
@columns ||= Hashie::Mash.new
|
17
|
+
end
|
18
|
+
|
19
|
+
# Declare a key_value columns' existing in a given class
|
20
|
+
def declare_column(klass, column_name)
|
21
|
+
@columns ||= Hashie::Mash.new
|
22
|
+
if @columns[klass].nil?
|
23
|
+
@columns[klass] = [column_name]
|
24
|
+
else
|
25
|
+
@columns[klass] << column_name
|
26
|
+
end
|
27
|
+
@columns[klass]
|
28
|
+
end
|
29
|
+
|
30
|
+
# Return the key columns present on a specific class
|
31
|
+
def columns_for(klass)
|
32
|
+
columns_this_klass = columns[klass]
|
33
|
+
columns_lineage = [ columns_this_klass ]
|
34
|
+
if ancestor = klass.ancestors[1]
|
35
|
+
unless ancestor == ActiveRecord::Base
|
36
|
+
columns_lineage << columns_for(ancestor)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
columns_lineage.reject{|i| i.nil? }.flatten
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# Return the Hash of known keys, organized by the declaring class
|
44
|
+
def keys
|
45
|
+
@keys ||= Hashie::Mash.new
|
46
|
+
end
|
47
|
+
|
48
|
+
# Declare a key in a specific column set for a specific class
|
49
|
+
def declare_key(klass, column_name, key, opts={})
|
50
|
+
# TODO: Store the key options in the manager
|
51
|
+
printf "KEY_MANAGER: KeyValueKey %s.%s declared on class %s\n", column_name, key, klass
|
52
|
+
column_name = column_name.to_sym
|
53
|
+
@keys ||= Hashie::Mash.new
|
54
|
+
if klass_keys = @keys[klass]
|
55
|
+
if column_keys = klass_keys[column_name]
|
56
|
+
column_keys << key
|
57
|
+
else
|
58
|
+
column_keys = [key]
|
59
|
+
end
|
60
|
+
else
|
61
|
+
@keys[klass] = {column_name => [key]}
|
62
|
+
end
|
63
|
+
@keys[klass][column_name]
|
64
|
+
end
|
65
|
+
|
66
|
+
# Return the keys present for the given column on a specific class
|
67
|
+
def keys_for(klass, column_name)
|
68
|
+
keys_this_klass = keys[klass][column_name] rescue []
|
69
|
+
keys_lineage = [ keys_this_klass ]
|
70
|
+
if ancestor = klass.ancestors[1]
|
71
|
+
unless ancestor == ActiveRecord::Base
|
72
|
+
keys_lineage << keys_for(ancestor, column_name)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
keys_lineage.flatten
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
# Return the Hash of known Indexes, organized by the declaring class
|
81
|
+
def indexes
|
82
|
+
@indexes ||= Hashie::Mash.new
|
83
|
+
end
|
84
|
+
|
85
|
+
# Declare an index in a specific column set for a specific class
|
86
|
+
def declare_index(klass, column_name, key, opts={})
|
87
|
+
# TODO: Store the index options in the manager
|
88
|
+
|
89
|
+
printf "KEY_MANAGER: KeyValueIndex %s.%s declared on class %s\n", column_name, key, klass
|
90
|
+
column_name = column_name.to_sym
|
91
|
+
@indexes ||= Hashie::Mash.new
|
92
|
+
if klass_indexes = @indexes[klass]
|
93
|
+
if column_indexes = klass_indexes[column_name]
|
94
|
+
column_indexes << key
|
95
|
+
else
|
96
|
+
column_indexes = [key]
|
97
|
+
end
|
98
|
+
else
|
99
|
+
@indexes[klass] = {@column_name => [key]}
|
100
|
+
end
|
101
|
+
@indexes[klass][column_name]
|
102
|
+
end
|
103
|
+
|
104
|
+
# Return the indexes present for the given column on a specific class
|
105
|
+
def indexes_for(klass, column_name)
|
106
|
+
indexes_this_klass = indexes[klass][column_name] rescue []
|
107
|
+
indexes_lineage = [ indexes_this_klass ]
|
108
|
+
if ancestor = klass.ancestors[1]
|
109
|
+
unless ancestor == ActiveRecord::Base
|
110
|
+
indexes_lineage << indexes_for(ancestor, column_name)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
indexes_lineage.flatten
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
end # KeyManager
|
119
|
+
end # DoesKeyValue
|
data/lib/doeskeyvalue/keys.rb
CHANGED
@@ -7,6 +7,8 @@ module DoesKeyValue
|
|
7
7
|
module Keys
|
8
8
|
|
9
9
|
def declare_key(key_value_column, key_name, opts={})
|
10
|
+
# printf("DECLARE_KEY: %s.%s key declaration beginning\n", key_value_column, key_name)
|
11
|
+
|
10
12
|
raise DoesKeyValue::NoColumnNameSpecified unless key_value_column
|
11
13
|
raise DoesKeyValue::NoKeyNameSpecified unless key_name
|
12
14
|
raise DoesKeyValue::KeyAndIndexOptionsMustBeHash unless opts.is_a?(Hash)
|
@@ -32,6 +34,9 @@ module DoesKeyValue
|
|
32
34
|
if opts[:index] == true
|
33
35
|
declare_index(key_value_column, key_name) # TODO: Provide mechanism for passing index options
|
34
36
|
end
|
37
|
+
|
38
|
+
# Add the key to the key and column manager:
|
39
|
+
DoesKeyValue::KeyManager.instance.declare_key(self, key_value_column, key_name, opts)
|
35
40
|
|
36
41
|
end
|
37
42
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: doeskeyvalue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Awexome Labs
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-29 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- doeskeyvalue.gemspec
|
67
67
|
- lib/doeskeyvalue.rb
|
68
68
|
- lib/doeskeyvalue/indexes.rb
|
69
|
+
- lib/doeskeyvalue/key_manager.rb
|
69
70
|
- lib/doeskeyvalue/keys.rb
|
70
71
|
- lib/doeskeyvalue/util.rb
|
71
72
|
- lib/generators/doeskeyvalue/doeskeyvalue_generator.rb
|
@@ -84,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
84
85
|
requirements:
|
85
86
|
- - ">="
|
86
87
|
- !ruby/object:Gem::Version
|
87
|
-
hash:
|
88
|
+
hash: 4446485574923543024
|
88
89
|
segments:
|
89
90
|
- 0
|
90
91
|
version: "0"
|