doeskeyvalue 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
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.1.3"
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-09}
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
- @@key_value_column = column.to_sym
57
- cattr_accessor :key_value_column
58
- serialize @@key_value_column, Hashie::Mash
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 #{@@key_value_column}_key(key_name, opts={})
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(@@key_value_column, key_name, opts)
73
+ declare_key(column_name, key_name, opts)
69
74
  end
70
75
 
71
- def #{@@key_value_column}_index(key_name, opts={})
76
+ def #{@column_name}_index(key_name, opts={})
77
+ column_name = :#{@column_name}
72
78
  key_name = key_name.to_sym
73
- declare_index(@@key_value_column, key_name, opts)
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
@@ -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 # Index
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
@@ -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.1.3
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-09 00:00:00 -04:00
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: 2538889220135644083
88
+ hash: 4446485574923543024
88
89
  segments:
89
90
  - 0
90
91
  version: "0"