command_post 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1dc61811db3cff203fc9f8a44cf6eb614925b26e
4
- data.tar.gz: c831dd3bdc0c8d7f965c01036c30e751b39fd83f
3
+ metadata.gz: e017af18ee1497964678d7476ff8923328d115f1
4
+ data.tar.gz: b1e3e62ddb8333b3ae2af14cb119f03613211f6e
5
5
  SHA512:
6
- metadata.gz: d440906323ee20c677c3e531be56a5b29335f5bc042bd935d98d06db96525faa7346b15a037e1a58b8bc908e6149f2ecccdf6e762fd1382b4ee841eee2a4e403
7
- data.tar.gz: 19d63955d9819abf4a65e96df7d5114d383f3bc686f89d106cce8d8cd611757b3d230aa1c6e46ac2f5a726f656a9075b49068f247b99e68a2bad817ac9924a7e
6
+ metadata.gz: 678251e4d7116fd089a225ab83cd9a4eddcf513305624a998ec68eb1ec8c1578a7a890b492cb1b29a80ee866c379fd98d850f2a658dde249e2b374b03226bab7
7
+ data.tar.gz: 4a2490595d96353e8e674e50a47ce93e40c6b612fe97c434f34311caa7c5b7a2abd547b35c48ccb95009c3e4255ca55f5c62d8651382a100bd5c57c8bf1ba9d7
data/Gemfile CHANGED
@@ -5,6 +5,10 @@ gem 'pg'
5
5
 
6
6
 
7
7
 
8
+
8
9
  group :development, :test do
9
10
  gem 'starting_blocks'
11
+ gem 'faker'
12
+ gem 'pry'
13
+ gem 'pry-debugger'
10
14
  end
data/Gemfile.lock CHANGED
@@ -1,20 +1,40 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
+ coderay (1.0.9)
5
+ columnize (0.3.6)
6
+ debugger (1.6.1)
7
+ columnize (>= 0.3.1)
8
+ debugger-linecache (~> 1.2.0)
9
+ debugger-ruby_core_source (~> 1.2.3)
10
+ debugger-linecache (1.2.0)
11
+ debugger-ruby_core_source (1.2.3)
12
+ faker (1.2.0)
13
+ i18n (~> 0.5)
4
14
  ffi (1.9.0)
5
15
  ffi (1.9.0-x86-mingw32)
16
+ i18n (0.6.5)
6
17
  listen (1.2.2)
7
18
  rb-fsevent (>= 0.9.3)
8
19
  rb-inotify (>= 0.9)
9
20
  rb-kqueue (>= 0.2)
21
+ method_source (0.8.2)
10
22
  pg (0.16.0)
11
23
  pg (0.16.0-x86-mingw32)
24
+ pry (0.9.12.2)
25
+ coderay (~> 1.0.5)
26
+ method_source (~> 0.8)
27
+ slop (~> 3.4)
28
+ pry-debugger (0.2.2)
29
+ debugger (~> 1.3)
30
+ pry (~> 0.9.10)
12
31
  rb-fsevent (0.9.3)
13
32
  rb-inotify (0.9.0)
14
33
  ffi (>= 0.5.0)
15
34
  rb-kqueue (0.2.0)
16
35
  ffi (>= 0.5.0)
17
36
  sequel (4.0.0)
37
+ slop (3.4.6)
18
38
  starting_blocks (0.0.31)
19
39
  listen (>= 1.0)
20
40
 
@@ -23,6 +43,9 @@ PLATFORMS
23
43
  x86-mingw32
24
44
 
25
45
  DEPENDENCIES
46
+ faker
26
47
  pg
48
+ pry
49
+ pry-debugger
27
50
  sequel
28
51
  starting_blocks
@@ -35,11 +35,19 @@ create index aggregate_lookup_idx on aggregates(aggregate_lookup_value);
35
35
 
36
36
 
37
37
 
38
-
39
38
 
39
+ create table aggregate_index (
40
+ aggregate_id bigint not null,
41
+ index_field varchar(100) not null,
42
+ index_value varchar(100) not null,
43
+ ) ;
40
44
 
45
+ create index aggregate_index on aggregates(aggregate_lookup_value);
46
+
41
47
  CREATE SEQUENCE aggregate START 1;
42
48
 
49
+
43
50
  CREATE SEQUENCE transaction START 1;
44
51
 
45
- CREATE SEQUENCE misc START 1;
52
+ CREATE SEQUENCE misc START 1;
53
+
@@ -15,9 +15,8 @@ module CommandPost
15
15
  class Aggregate
16
16
 
17
17
  @@prep_stmt_insert ||= $DB[:aggregates].prepare(:insert, :insert_aggregate, :aggregate_id => :$aggregate_id, :aggregate_type => :$aggregate_type, :content => :$content, :aggregate_lookup_value => :$aggregate_lookup_value )
18
- @@prep_stmt_update ||= $DB[:aggregates].prepare(:update, :update_content_aggregate_lookup_value, :aggregate_id => :$aggregate_id, :content => :$content, :aggregate_lookup_value => :$aggregate_lookup_value )
19
-
20
-
18
+ @@prep_stmt_insert_index ||= $DB[:aggregate_indexes].prepare(:insert, :insert_aggregate_indexes, :aggregate_id => :$aggregate_id, :index_field => :$index_field, :index_value => :$index_value )
19
+
21
20
 
22
21
  def self.replace object, aggregate_lookup_value
23
22
 
@@ -29,9 +28,24 @@ module CommandPost
29
28
 
30
29
 
31
30
  if (version) == 1
32
- @@prep_stmt_insert.call(:aggregate_id => aggregate_id, :aggregate_type => aggregate_type.to_s , :content => content, :aggregate_lookup_value => aggregate_lookup_value )
31
+ @@prep_stmt_insert.call(:aggregate_id => aggregate_id.to_i, :aggregate_type => aggregate_type , :content => content, :aggregate_lookup_value => aggregate_lookup_value )
32
+
33
+ object = Aggregate.get_by_aggregate_id Object.const_get(aggregate_type), aggregate_id
34
+
35
+ object.index_fields.each do |field|
36
+ index_value = object.send field
37
+ index_field = "#{object.class.to_s}.#{field.to_s}"
38
+ @@prep_stmt_insert_index.call(:aggregate_id => aggregate_id, :index_field => index_field, :index_value => index_value )
39
+ end
33
40
  else
34
41
  $DB["UPDATE aggregates set content = ?, aggregate_lookup_value = ? where aggregate_id = ?", content, aggregate_lookup_value, aggregate_id ].update
42
+ object = Aggregate.get_by_aggregate_id Object.const_get(aggregate_type), aggregate_id
43
+ @@prep_stmt_insert.call(:aggregate_id => aggregate_id.to_i, :aggregate_type => aggregate_type , :content => content, :aggregate_lookup_value => aggregate_lookup_value )
44
+ object.index_fields.each do |field|
45
+ index_value = object.send field
46
+ index_field = "#{object.class.to_s}.#{field.to_s}"
47
+ $DB["UPDATE aggregate_indexes set index_value = ? where aggregate_id = ? and index_field = ?", index_value, aggregate_id.to_i, index_field ].update
48
+ end
35
49
  end
36
50
  end
37
51
 
@@ -7,6 +7,9 @@ require_relative './data_validation.rb'
7
7
  require_relative './auto_load.rb'
8
8
  require_relative '../command/command.rb'
9
9
 
10
+ require 'pry'
11
+ require 'pry-debugger'
12
+
10
13
  module CommandPost
11
14
 
12
15
  class Persistence
@@ -17,9 +20,11 @@ module CommandPost
17
20
  def initialize
18
21
 
19
22
  @@fields ||= Hash.new
23
+ @@indexes ||= Hash.new
20
24
  @aggregate_info_set = false
21
25
  @data = Hash.new
22
26
  self.class.init_schema self.class.schema
27
+ self.class.init_indexes self.class.indexes
23
28
  Command.auto_generate self.class
24
29
  end
25
30
 
@@ -29,6 +34,11 @@ module CommandPost
29
34
  @@fields[self.class]
30
35
  end
31
36
 
37
+ def index_fields
38
+ @@indexes[self.class]
39
+ end
40
+
41
+
32
42
 
33
43
  def set_data data_hash
34
44
  @data = data_hash
@@ -57,12 +67,55 @@ module CommandPost
57
67
  end
58
68
 
59
69
 
60
- def method_missing(nm, *args)
70
+ def self.stringify_values values
71
+
72
+ values.collect{|x| "'#{x}'"}.join(',')
73
+
74
+ end
75
+
76
+ def self.get_index_sql name, values
77
+
78
+ "SELECT aggregate_id FROM aggregate_indexes WHERE index_field = '#{name}' AND index_value in (#{self.stringify_values(values)}) "
79
+ end
80
+
81
+
82
+ def self.get_ids_for_index index_name, *args
83
+
84
+ values = args[0][0]
85
+ name = "#{self.to_s}.#{index_name.to_s.sub(/_in$/,'')}"
86
+ sql = get_index_sql name, values
87
+ results = Array.new
88
+ $DB.fetch(sql) do |row|
89
+ results << row[:aggregate_id]
90
+ end
91
+
92
+ results
93
+
94
+ end
95
+
61
96
 
97
+ def self.method_missing nm, *args , &block
62
98
  name = nm.to_s
63
- if name.end_with?('=') == false
99
+ search_index = name.gsub(/_in/,'').to_sym
100
+ if (name.end_with?('_in') && self.indexes.include?(search_index))
101
+ ids = self.get_ids_for_index nm, args
102
+ return ids
103
+ else
104
+ begin
105
+ super
106
+ rescue Exception => e
107
+ raise e.message
108
+ end
109
+ end
110
+ end
111
+
64
112
 
113
+ def method_missing(nm, *args)
65
114
 
115
+ name = nm.to_s
116
+ error_msg = "SCHEMA ERROR: #{name} is not a defined attribute of or index on '#{self.class.to_s}'"
117
+
118
+ if name.end_with?('=') == false
66
119
  if @data.keys.include? nm
67
120
  get_data nm
68
121
  else
@@ -71,13 +124,14 @@ module CommandPost
71
124
  else
72
125
  begin
73
126
  super
74
- rescue
75
- puts "#{nm} is not a defined field in #{self}"
127
+ rescue Exception => e
128
+ raise error_msg
76
129
  end
77
130
  end
78
131
  end
79
132
  else
80
133
  nm = name.gsub(/\=/,'').to_sym
134
+ raise error_msg unless schema_fields.keys.include?(nm)
81
135
  @data[nm] = args.first
82
136
  end
83
137
  end
@@ -109,6 +163,16 @@ module CommandPost
109
163
  @@fields[self] ||= fields
110
164
  end
111
165
 
166
+ def self.init_indexes index_fields
167
+ @@indexes ||= Hash.new
168
+ # index_error_messages = IndexValidation.validate_indexes(index_fields)
169
+ # if index_error_messages.length > 0
170
+ # raise ArgumentError, "The declared indexes for #{self} had the following error(s): #{pp index_error_messages}"
171
+ # end
172
+ @@indexes[self] ||= index_fields
173
+ end
174
+
175
+
112
176
 
113
177
  def self.load_from_hash the_class, string_hash
114
178
 
@@ -127,9 +191,9 @@ module CommandPost
127
191
  object.set_data data_hash
128
192
  object.populate_auto_load_fields #unless self.bypass_auto_load == true
129
193
  object.populate_local_persistent_objects
130
- if (the_class.included_modules.include?(CommandPost::Identity) == true)
131
- object.set_aggregate_lookup_value
132
- end
194
+ # if (the_class.included_modules.include?(CommandPost::Identity) == true)
195
+ # object.set_aggregate_lookup_value
196
+ # end
133
197
  object
134
198
  end
135
199
 
@@ -1,3 +1,3 @@
1
1
  module CommandPost
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -15,6 +15,9 @@ class Test003Person < CommandPost::Persistence
15
15
  fields[ :lookup ] = { :use => :aggregate_id }
16
16
  fields
17
17
  end
18
+ def self.indexes
19
+ []
20
+ end
18
21
  end
19
22
 
20
23
 
@@ -18,6 +18,9 @@ class Test002Person < CommandPost::Persistence
18
18
  fields[ :lookup ] = { :use => :checksum }
19
19
  fields
20
20
  end
21
+ def self.indexes
22
+ []
23
+ end
21
24
  end
22
25
 
23
26
 
@@ -18,6 +18,9 @@ class Test001Person < CommandPost::Persistence
18
18
  fields[ :lookup ] = { :use => :ssn }
19
19
  fields
20
20
  end
21
+ def self.indexes
22
+ []
23
+ end
21
24
  end
22
25
 
23
26
 
@@ -15,6 +15,9 @@ class SomeClass < CommandPost::Persistence
15
15
  fields[ :favorite_number ] = { :required => true, :type => Fixnum, :location => :local }
16
16
  fields
17
17
  end
18
+ def self.indexes
19
+ []
20
+ end
18
21
  end
19
22
 
20
23
 
@@ -19,6 +19,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../../command_post/require')
19
19
  fields[ :last_name ] = { :required => true, :type => String, :location => :local }
20
20
  fields
21
21
  end
22
+ def self.indexes
23
+ []
24
+ end
22
25
  end
23
26
  some_class = SomeClass01.new
24
27
  some_class.class.must_be_same_as SomeClass01
@@ -45,6 +48,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../../command_post/require')
45
48
  fields[ 'last_name' ] = { :required => true, :type => String, :location => :local }
46
49
  fields
47
50
  end
51
+ def self.indexes
52
+ []
53
+ end
48
54
  end
49
55
 
50
56
  assert_raises(ArgumentError) { some_class = SomeClass02.new }
@@ -94,6 +100,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../../command_post/require')
94
100
  fields[ :last_name ] = { :required => true, :type => String, :location => :local }
95
101
  fields
96
102
  end
103
+ def self.indexes
104
+ []
105
+ end
97
106
  end
98
107
 
99
108
  assert_raises(ArgumentError) { some_class = SomeClass04.new }
@@ -119,6 +128,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../../command_post/require')
119
128
  fields[ :last_name ] = { :required => true, :type => String, :location => :local }
120
129
  fields
121
130
  end
131
+ def self.indexes
132
+ []
133
+ end
122
134
  end
123
135
 
124
136
  assert_raises(ArgumentError) { some_class = SomeClass05.new }
@@ -144,6 +156,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../../command_post/require')
144
156
  fields[ :last_name ] = { :required => true, :type => String, :location => :local }
145
157
  fields
146
158
  end
159
+ def self.indexes
160
+ []
161
+ end
147
162
  end
148
163
 
149
164
  assert_raises(ArgumentError) { some_class = SomeClass06.new }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: command_post
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Meirow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-21 00:00:00.000000000 Z
11
+ date: 2013-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -73,6 +73,7 @@ files:
73
73
  - spec/command_post/identity/identity_lookup_value_field_spec.rb
74
74
  - spec/command_post/persistence/data_validation_spec.rb
75
75
  - spec/command_post/persistence/nested_remote_spec.rb
76
+ - spec/command_post/persistence/querying_spec.rb
76
77
  - spec/command_post/persistence/schema_validation_spec.rb
77
78
  - spec/command_post/require.rb
78
79
  - spec/spec_helper.rb
@@ -107,6 +108,7 @@ test_files:
107
108
  - spec/command_post/identity/identity_lookup_value_field_spec.rb
108
109
  - spec/command_post/persistence/data_validation_spec.rb
109
110
  - spec/command_post/persistence/nested_remote_spec.rb
111
+ - spec/command_post/persistence/querying_spec.rb
110
112
  - spec/command_post/persistence/schema_validation_spec.rb
111
113
  - spec/command_post/require.rb
112
114
  - spec/spec_helper.rb