tinkit 0.0.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.
Files changed (51) hide show
  1. data/LICENSE +176 -0
  2. data/README +11 -0
  3. data/Rakefile +75 -0
  4. data/lib/glue_envs/couchrest/couchrest_attachment_handler.rb +260 -0
  5. data/lib/glue_envs/couchrest/couchrest_files_mgr.rb +198 -0
  6. data/lib/glue_envs/couchrest_glue_env.rb +536 -0
  7. data/lib/glue_envs/files_mgr_base.rb +51 -0
  8. data/lib/glue_envs/filesystem/filesystem_files_mgr.rb +187 -0
  9. data/lib/glue_envs/filesystem_glue_env.rb +395 -0
  10. data/lib/glue_envs/mysql/mysql_files_mgr.rb +175 -0
  11. data/lib/glue_envs/mysql_glue_env.rb +428 -0
  12. data/lib/glue_envs/sdb_s3/sdb_s3_files_mgr.rb +314 -0
  13. data/lib/glue_envs/sdb_s3_glue_env.rb +248 -0
  14. data/lib/helpers/camel.rb +21 -0
  15. data/lib/helpers/filesystem_helpers.rb +27 -0
  16. data/lib/helpers/hash_helpers.rb +74 -0
  17. data/lib/helpers/log_helper.rb +34 -0
  18. data/lib/helpers/mime_types_new.rb +126 -0
  19. data/lib/helpers/old_more_open_struct.rb +28 -0
  20. data/lib/helpers/require_helper.rb +45 -0
  21. data/lib/helpers/tk_escape.rb +17 -0
  22. data/lib/midas/bufs_data_structure.rb +84 -0
  23. data/lib/midas/node_element_operations.rb +264 -0
  24. data/lib/tinkit.rb +38 -0
  25. data/lib/tinkit_base_node.rb +733 -0
  26. data/lib/tinkit_node_factory.rb +47 -0
  27. data/spec/couchrest_files_mgr_spec.rb +551 -0
  28. data/spec/couchrest_glue_spec.rb +246 -0
  29. data/spec/filesystem_files_mgr_spec.rb +236 -0
  30. data/spec/filesystem_glue_spec.rb +243 -0
  31. data/spec/filesystem_helpers_spec.rb +42 -0
  32. data/spec/helpers/bufs_node_builder.rb +17 -0
  33. data/spec/helpers/bufs_sample_dataset.rb +160 -0
  34. data/spec/helpers/bufs_test_environments.rb +81 -0
  35. data/spec/helpers/tmp_view_cleaner.rb +15 -0
  36. data/spec/lib_helpers/tk_escape_spec.rb +45 -0
  37. data/spec/mysql_files_mgr_spec.rb +250 -0
  38. data/spec/mysql_glue_spec.rb +214 -0
  39. data/spec/node_element_operations_spec.rb +392 -0
  40. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec1.rb +82 -0
  41. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec2.rb +68 -0
  42. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec3.rb +80 -0
  43. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec4.rb +110 -0
  44. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec5.rb +84 -0
  45. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec6.rb +83 -0
  46. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec7.rb +101 -0
  47. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec8.rb +92 -0
  48. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec_all.rb +266 -0
  49. data/spec/sdb_s3_glue_spec.rb +230 -0
  50. data/spec/tinkit_node_factory_spec.rb +1108 -0
  51. metadata +114 -0
@@ -0,0 +1,92 @@
1
+ #require helper for cleaner require statements
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../../lib/helpers/require_helper')
3
+ require Tinkit.glue 'sdb_s3/sdb_s3_files_mgr'
4
+
5
+ include SdbS3Interface
6
+ GlueEnvMock = Struct.new(:user_datastore_location)
7
+
8
+ describe FilesMgr, "Setup and intialization" do
9
+ before(:all) do
10
+
11
+ @glue_env_mock = GlueEnvMock.new("attachment_spec__node_loc")
12
+ @node_key = :_id
13
+
14
+ file1_data = "Example File1\nJust some text"
15
+ file2_data = "Example File2\nJust some more text"
16
+ file1_fname = "/tmp/example_file1.txt"
17
+ file2_fname = "/tmp/example_file2.txt"
18
+ files = {file1_fname => file1_data, file2_fname => file2_data}
19
+ files.each do |fname, data|
20
+ File.open(fname, 'w'){|f| f.write(data)}
21
+ end
22
+ @file_datas = [{:src_filename => file1_fname}, {:src_filename => file2_fname}]
23
+ @node1_data = {:_id => 'spec_test1', :data => 'stuff1'}
24
+ end
25
+
26
+ it "should initialize" do
27
+ node_key_value = @node1_data[@node_key]
28
+ attach_handler = FilesMgr.new(@glue_env_mock, node_key_value)
29
+ buck_prefix = FilesMgr::BucketNamespacePrefix
30
+ node_loc = @glue_env_mock.user_datastore_location
31
+ check_bucket_location = "#{buck_prefix}_#{node_loc}"
32
+ #the below will sometimes fail due to AWS
33
+ attach_handler.bucket_name.should == check_bucket_location
34
+ end
35
+ end
36
+
37
+ describe FilesMgr, "Basic Operations" do
38
+ before(:all) do
39
+ @file1_fname = "/tmp/example_file1.txt"
40
+ @file2_fname = "/tmp/example_file2.txt"
41
+ f1_bname = File.basename(@file1_fname)
42
+ f2_bname = File.basename(@file2_fname)
43
+ @file_stored_data = { f1_bname => File.open(@file1_fname, 'rb'){|f| f.read},
44
+ f2_bname =>File.open(@file2_fname, 'rb'){|f| f.read} }
45
+ @glue_env_mock = GlueEnvMock.new("attachment_spec__node_loc")
46
+ @node_key = :_id
47
+ @file_datas = [{:src_filename => @file1_fname}, {:src_filename => @file2_fname}]
48
+ end
49
+
50
+
51
+ before(:each) do
52
+ @node1_data = {:_id => 'spec_test1', :data => 'stuff1'}
53
+ node_key_value = @node1_data[@node_key]
54
+ @attach_handler = FilesMgr.new(@glue_env_mock, node_key_value)
55
+ @attach_handler.subtract_files(nil, :all)
56
+ end
57
+
58
+ after(:each) do
59
+ @attach_handler.destroy_file_container
60
+ end
61
+
62
+ it "8) should delete all (subtract_all) files" do
63
+ node = nil
64
+ @attach_handler.add(node, @file_datas)
65
+
66
+ #create some more attachments
67
+ del_data = {}
68
+ del_data["del_data1"] = "my life will be short"
69
+ del_data["del_data2"] = "alas too short"
70
+
71
+ #add the attachments
72
+ del_data.each do |name, data|
73
+ @attach_handler.add_raw_data(node, name, "text/plain", data, Time.now.to_s)
74
+ end
75
+
76
+ #verify it's there
77
+ del_data.each do |name, data|
78
+ stored_data = @attach_handler.get_raw_data(node, name)
79
+ stored_data.should == data
80
+ end
81
+
82
+ #delete it all
83
+ @attach_handler.subtract(node, :all)
84
+
85
+ #verify it's not there
86
+
87
+ del_data.each do |name, data|
88
+ stored_data = @attach_handler.get_raw_data(node, name)
89
+ stored_data.should be_nil
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,266 @@
1
+ #require helper for cleaner require statements
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../../lib/helpers/require_helper')
3
+ require Tinkit.glue 'sdb_s3/sdb_s3_files_mgr'
4
+
5
+ include SdbS3Interface
6
+ GlueEnvMock = Struct.new(:user_datastore_location)
7
+
8
+ describe FilesMgr, "Setup and intialization" do
9
+ before(:all) do
10
+
11
+ @glue_env_mock = GlueEnvMock.new("attachment_spec__node_loc")
12
+ @node_key = :_id
13
+
14
+ file1_data = "Example File1\nJust some text"
15
+ file2_data = "Example File2\nJust some more text"
16
+ file1_fname = "/tmp/example_file1.txt"
17
+ file2_fname = "/tmp/example_file2.txt"
18
+ files = {file1_fname => file1_data, file2_fname => file2_data}
19
+ files.each do |fname, data|
20
+ File.open(fname, 'w'){|f| f.write(data)}
21
+ end
22
+ @file_datas = [{:src_filename => file1_fname}, {:src_filename => file2_fname}]
23
+ @node1_data = {:_id => 'spec_test1', :data => 'stuff1'}
24
+ end
25
+
26
+ it "should initialize" do
27
+ node_key_value = @node1_data[@node_key]
28
+ attach_handler = FilesMgr.new(@glue_env_mock, node_key_value)
29
+ buck_prefix = FilesMgr::BucketNamespacePrefix
30
+ node_loc = @glue_env_mock.user_datastore_location
31
+ check_bucket_location = "#{buck_prefix}_#{node_loc}"
32
+ #the below will sometimes fail due to AWS
33
+ attach_handler.bucket_name.should == check_bucket_location
34
+ end
35
+ end
36
+
37
+ describe FilesMgr, "Basic Operations" do
38
+ before(:all) do
39
+ @file1_fname = "/tmp/example_file1.txt"
40
+ @file2_fname = "/tmp/example_file2.txt"
41
+ f1_bname = File.basename(@file1_fname)
42
+ f2_bname = File.basename(@file2_fname)
43
+ @file_stored_data = { f1_bname => File.open(@file1_fname, 'rb'){|f| f.read},
44
+ f2_bname =>File.open(@file2_fname, 'rb'){|f| f.read} }
45
+ @glue_env_mock = GlueEnvMock.new("attachment_spec__node_loc")
46
+ @node_key = :_id
47
+ @file_datas = [{:src_filename => @file1_fname}, {:src_filename => @file2_fname}]
48
+ end
49
+
50
+
51
+ before(:each) do
52
+ @node1_data = {:_id => 'spec_test1', :data => 'stuff1'}
53
+ node_key_value = @node1_data[@node_key]
54
+ @attach_handler = FilesMgr.new(@glue_env_mock, node_key_value)
55
+ @attach_handler.subtract_files(nil, :all)
56
+ end
57
+
58
+ after(:each) do
59
+ @attach_handler.destroy_file_container
60
+ end
61
+
62
+ it "1) should add and retrieve files" do
63
+ node = nil
64
+ #@attach_handler.subtract_files(:all)
65
+ #Test that buckets/files don't exist on AWS
66
+ @file_datas.each do |file_data|
67
+ file_basename = File.basename(file_data[:src_filename])
68
+ data = @attach_handler.get_raw_data(node, file_basename)
69
+ data.should be_nil
70
+ end
71
+
72
+ #Add the Files
73
+ @attach_handler.add(node, @file_datas)
74
+
75
+ #Get the files and verify data
76
+ @file_datas.each do |file_data|
77
+ file_basename = File.basename(file_data[:src_filename])
78
+ data = @attach_handler.get_raw_data(node, file_basename)
79
+ data.should == @file_stored_data[file_basename]
80
+ end
81
+ end
82
+
83
+ it "2) should list attachment files" do
84
+ node = nil
85
+ @attach_handler.add(node, @file_datas)
86
+ files = @attach_handler.list(node)
87
+ files.sort.should == @file_stored_data.keys.sort
88
+ end
89
+
90
+ it "3) should list metadata" do
91
+ node = nil
92
+ @attach_handler.add(node, @file_datas)
93
+ md = @attach_handler.get_attachments_metadata(nil)
94
+ md.should_not == nil
95
+ @file_datas.each do |file_data|
96
+ file_basename = File.basename(file_data[:src_filename])
97
+ each_md = md[file_basename]
98
+ each_md.should_not == nil
99
+ each_md.keys.should include :content_type
100
+ each_md.keys.should include :file_modified
101
+
102
+ file_basename = File.basename(file_data[:src_filename])
103
+ md[file_basename][:content_type].should =~ /^text\/plain/
104
+ time_str = md[file_basename][:file_modified]
105
+ Time.parse(time_str).should > Time.now - 1 #should have been modified less than a second ago
106
+ end
107
+ end
108
+
109
+ it "4) should be well behaved adding more files" do
110
+ node = nil
111
+ @attach_handler.add(node, @file_datas)
112
+
113
+
114
+ #Get the original files and verify data
115
+ @file_datas.each do |file_data|
116
+ file_basename = File.basename(file_data[:src_filename])
117
+ data = @attach_handler.get_raw_data(node, file_basename)
118
+ data.should == @file_stored_data[file_basename]
119
+ end
120
+
121
+ #create some more files
122
+ file1_data = "Example File1\nNEW!! text"
123
+ file3_data = "Example File3\nYet more text"
124
+ file4_data = "Example File4\nand more text"
125
+ file3_fname = "/tmp/example_file3.txt"
126
+ file4_fname = "/tmp/example_file4.txt"
127
+ files = {@file1_fname => file1_data, file3_fname => file3_data, file4_fname => file4_data}
128
+ files.each do |fname, data|
129
+ File.open(fname, 'w'){|f| f.write(data)}
130
+ end
131
+ file1_data.should == File.open(@file1_fname){|f| f.read}
132
+ @file_datas2 = [{:src_filename => @file1_fname},
133
+ {:src_filename => file3_fname},
134
+ {:src_filename => file4_fname}]
135
+
136
+ #add them
137
+ @attach_handler.add(node, @file_datas2)
138
+
139
+ #Check the unchanged file (file2)
140
+ file2_basename = File.basename(@file2_fname)
141
+ data2 = @attach_handler.get_raw_data(node, file2_basename)
142
+ data2.should == @file_stored_data[file2_basename]
143
+
144
+ #Get the changed files and verify it is the new data
145
+ file1_basename = File.basename(@file1_fname)
146
+ data1 = @attach_handler.get_raw_data(node, file1_basename)
147
+ data1.should == file1_data
148
+
149
+ file3_basename = File.basename(file3_fname)
150
+ data3 = @attach_handler.get_raw_data(node, file3_basename)
151
+ data3.should == file3_data
152
+
153
+ file4_basename = File.basename(file4_fname)
154
+ data4 = @attach_handler.get_raw_data(node, file4_basename)
155
+ data4.should == file4_data
156
+ end
157
+
158
+ it "5) should delete (subtract) files" do
159
+ node = nil
160
+ @attach_handler.add(node, @file_datas)
161
+
162
+ files_to_delete = [@file1_fname, @file2_fname]
163
+
164
+ #they should exist in the node
165
+ files_to_delete.each do |fname|
166
+ file_basename = File.basename(fname)
167
+ data = @attach_handler.get_raw_data(node, file_basename)
168
+ data.should match /^Example File/
169
+ end
170
+
171
+ basenames_to_delete = files_to_delete.map{|f| File.basename(f)}
172
+ @attach_handler.subtract(node, basenames_to_delete)
173
+
174
+ files_to_delete.each do |fname|
175
+ file_basename = File.basename(fname)
176
+ data = @attach_handler.get_raw_data(node, file_basename)
177
+ data.should be_nil
178
+ end
179
+ end
180
+
181
+ it "6) should delete (subtract) files" do
182
+ node = nil
183
+ @attach_handler.add(node, @file_datas)
184
+
185
+ files_to_delete = [@file1_fname, @file2_fname]
186
+ #they should exist in the node
187
+ files_to_delete.each do |fname|
188
+ file_basename = File.basename(fname)
189
+ data = @attach_handler.get_raw_data(node, file_basename)
190
+ data.should match /^Example File/
191
+ end
192
+
193
+ basenames_to_delete = files_to_delete.map{|f| File.basename(f)}
194
+ @attach_handler.subtract(node, basenames_to_delete)
195
+
196
+ files_to_delete.each do |fname|
197
+ file_basename = File.basename(fname)
198
+ data = @attach_handler.get_raw_data(node, file_basename)
199
+ data.should be_nil
200
+ end
201
+ end
202
+
203
+ it "7) should add attachments from the raw data" do
204
+ node = nil
205
+ @attach_handler.add(node, @file_datas)
206
+
207
+ raw_data = "Example File3\nYet more text"
208
+ content_type = "text/plain"
209
+ modified_at = Time.now.to_s
210
+ att_name = "example_raw_data.txt"
211
+
212
+ #Add the Raw Data
213
+ @attach_handler.add_raw_data(node, att_name, content_type, raw_data, modified_at)
214
+
215
+ #Get the files and verify data
216
+
217
+ data = @attach_handler.get_raw_data(node, att_name)
218
+ all_metadata = @attach_handler.get_attachments_metadata(node)
219
+ all_metadata.should_not be_nil
220
+
221
+ attachment_metadata = all_metadata[att_name]
222
+
223
+ data.should == raw_data
224
+
225
+ #THESE TESTS FAIL
226
+ #TODO: There is a metadata issue here, but not in general
227
+ #something strange about metadata being requested like this
228
+ #it might have to do with the retries?
229
+ #attachment_metadata.should_not be_nil
230
+ #att_md = attachment_metadata
231
+ #att_md[:content_type].should == content_type
232
+ #att_md[:file_modified].should == modified_at
233
+ end
234
+
235
+ it "8) should delete all (subtract_all) files" do
236
+ node = nil
237
+ @attach_handler.add(node, @file_datas)
238
+
239
+ #create some more attachments
240
+ del_data = {}
241
+ del_data["del_data1"] = "my life will be short"
242
+ del_data["del_data2"] = "alas too short"
243
+
244
+ #add the attachments
245
+ del_data.each do |name, data|
246
+ @attach_handler.add_raw_data(node, name, "text/plain", data, Time.now.to_s)
247
+ end
248
+
249
+ #verify it's there
250
+ del_data.each do |name, data|
251
+ stored_data = @attach_handler.get_raw_data(node, name)
252
+ stored_data.should == data
253
+ end
254
+
255
+ #delete it all
256
+ @attach_handler.subtract(node, :all)
257
+
258
+ #verify it's not there
259
+
260
+ del_data.each do |name, data|
261
+ stored_data = @attach_handler.get_raw_data(node, name)
262
+ stored_data.should be_nil
263
+ end
264
+ end
265
+ #it "should add delete then re-add an object"
266
+ end
@@ -0,0 +1,230 @@
1
+ #require helper for cleaner require statements
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../lib/helpers/require_helper')
3
+
4
+ require Tinkit.glue 'sdb_s3_glue_env'
5
+
6
+ describe SdbS3Env::GlueEnv, "Initialization" do
7
+
8
+ before(:each) do
9
+ env = {:host => nil, :path => 'test_domain', :user_id => 'init_test_user'}
10
+ @persist_env = {:name => 'sdb_s3_glue_test', :env => env}
11
+ key_fields = {:required_keys => [:id],
12
+ :primary_key => :id }
13
+ @data_model_bindings = {:key_fields => key_fields, :views => nil}
14
+ end
15
+
16
+ it "should initialize properly" do
17
+ sdb_glue_obj = SdbS3Env::GlueEnv.new(@persist_env, @data_model_bindings)
18
+ sdb_glue_obj.user_id.should == @persist_env[:env][:user_id]
19
+ sdb_glue_obj.required_instance_keys.should == @data_model_bindings[:key_fields][:required_keys]
20
+ sdb_glue_obj.required_save_keys.should == @data_model_bindings[:key_fields][:required_keys]
21
+ sdb_glue_obj.node_key.should == @data_model_bindings[:key_fields][:primary_key]
22
+ sdb_glue_obj.metadata_keys.should == [sdb_glue_obj.version_key,
23
+ sdb_glue_obj.namespace_key]
24
+ path = @persist_env[:env][:path]
25
+ sdb_glue_obj.user_datastore_location.should == "#{path}__#{sdb_glue_obj.user_id}"
26
+ sdb_glue_obj._files_mgr_class.class.should_not == nil #temp test
27
+ sdb_glue_obj.views.should_not == nil #temp test
28
+ sdb_glue_obj.moab_data.should_not == nil #temp test
29
+ end
30
+ end
31
+
32
+
33
+ describe SdbS3Env::GlueEnv, "Persistent Layer Basic Operations" do
34
+
35
+ before(:each) do
36
+ env = {:host => nil, :path => 'test_domain', :user_id => 'init_test_user'}
37
+ @persist_env = {:env => env}
38
+ key_fields = {:required_keys => [:id],
39
+ :primary_key => :id }
40
+ @data_model_bindings = {:key_fields => key_fields, :views => nil}
41
+ @sdb_glue_obj = SdbS3Env::GlueEnv.new(@persist_env, @data_model_bindings)
42
+ end
43
+
44
+ after(:each) do
45
+ domain = @sdb_glue_obj.model_save_params[:domain]
46
+ sdb = @sdb_glue_obj.model_save_params[:sdb]
47
+ sdb.delete_domain(domain)
48
+ end
49
+
50
+ it "should persist data and be able to retrieve it" do
51
+ #:id was defined as the primary key
52
+ data1 = {:id => "test_id1", :data => "test data"}
53
+ empty_data = @sdb_glue_obj.get(data1[:id]) #hasn't been saved yet
54
+ empty_data.should == nil
55
+ @sdb_glue_obj.save(data1)
56
+ #Don't use native get_attributes, use obj's get, it will block until save is finished
57
+ persisted_data = @sdb_glue_obj.get(data1[:id])
58
+ persisted_data.should_not == nil
59
+ persisted_data[:id].should == data1[:id]
60
+ persisted_data[:data].should == data1[:data]
61
+ end
62
+
63
+ #it "should be able to delete data" do
64
+ # data1 = {:id => "test_id1", :data => "test data1"}
65
+ # data2 = {:id => "test_id2", :data => "test data2"}
66
+ # @sdb_glue_obj.save(data1)
67
+ # @sdb_glue_obj.save(data2)
68
+ #
69
+ #
70
+ #end
71
+ end
72
+
73
+ describe SdbS3Env::GlueEnv, "Persistent Layer Collection Operations" do
74
+
75
+ before(:each) do
76
+ env = {:host => nil, :path => 'test_domain', :user_id => 'init_test_user'}
77
+ @persist_env = {:env => env}
78
+ key_fields = {:required_keys => [:id],
79
+ :primary_key => :id }
80
+ @data_model_bindings = {:key_fields => key_fields, :views => nil}
81
+ @sdb_glue_obj = SdbS3Env::GlueEnv.new(@persist_env, @data_model_bindings)
82
+ end
83
+
84
+ after(:each) do
85
+ domain = @sdb_glue_obj.model_save_params[:domain]
86
+ sdb = @sdb_glue_obj.model_save_params[:sdb]
87
+ sdb.delete_domain(domain)
88
+ end
89
+
90
+ it "should be able to query all" do
91
+ data1 = {:id => "test_id1", :data => "test data1"}
92
+ data2 = {:id => "test_id2", :data => "test data2"}
93
+ @sdb_glue_obj.save(data1)
94
+ @sdb_glue_obj.save(data2)
95
+
96
+ results = @sdb_glue_obj.query_all
97
+ results.each do |raw_data|
98
+ case raw_data[:id]
99
+ when "test_id1"
100
+ raw_data[:data].should == "test data1"
101
+ when "test_id2"
102
+ raw_data[:data].should == "test data2"
103
+ else
104
+ raise "Unknown dataset"
105
+ end#case
106
+ end#each
107
+ end
108
+
109
+ it "should be able to find matching data" do
110
+ data1 = {:id => "test_id1", :data => "test data1", :tags => ['a', 'b', 'c']}
111
+ data2 = {:id => "test_id2", :data => "test data2", :tags => ['c', 'd', 'e']}
112
+ data3 = {:id => "test_id3", :data => "test data2", :tags => ['c', 'b', 'z']}
113
+ data_list = [data1, data2, data3]
114
+ data_list.each {|data| @sdb_glue_obj.save(data)}
115
+
116
+ result1 = @sdb_glue_obj.find_nodes_where(:id, :equals, "test_id1")
117
+ result1.size.should == 1
118
+ result1.first[:id].should == "test_id1"
119
+
120
+ result2 = @sdb_glue_obj.find_nodes_where(:id, :equals, "oops")
121
+ result2.should be_empty
122
+
123
+ result3 = @sdb_glue_obj.find_nodes_where(:data, :equals, "test data2")
124
+ result3.size.should == 2
125
+ ["test_id2", "test_id3"].should include result3.first[:id]
126
+ ["test_id2", "test_id3"].should include result3.last[:id]
127
+
128
+ result4 = @sdb_glue_obj.find_nodes_where(:tags, :equals, ['c', 'd', 'e'])
129
+ result4.size.should == 1
130
+ result4.first[:id].should == "test_id2"
131
+ end
132
+
133
+ it "should be able to find containting data" do
134
+ data1 = {:id => "test_id1", :data => "test data1", :tags => ['a', 'b', 'c']}
135
+ data2 = {:id => "test_id2", :data => "test data2", :tags => ['c', 'd', 'e']}
136
+ data3 = {:id => "test_id3", :data => "test data2", :tags => ['c', 'b', 'z']}
137
+ data_list = [data1, data2, data3]
138
+ data_list.each {|data| @sdb_glue_obj.save(data)}
139
+
140
+ result1 = @sdb_glue_obj.find_nodes_where(:id, :contains, "test_id2")
141
+ result1.size.should == 1
142
+ result1.first[:id].should == "test_id2"
143
+
144
+ result2 = @sdb_glue_obj.find_nodes_where(:tags, :contains, "c")
145
+ result2.size.should == 3
146
+
147
+ result3 = @sdb_glue_obj.find_nodes_where(:tags, :contains, "b")
148
+ result3.size.should == 2
149
+ ["test_id1", "test_id3"].should include result3.first[:id]
150
+ ["test_id1", "test_id3"].should include result3.last[:id]
151
+
152
+ result4 = @sdb_glue_obj.find_nodes_where(:tags, :contains, "oops")
153
+ result4.should be_empty
154
+ end
155
+
156
+ it "should be able to delete node data" do
157
+ data1 = {:id => "test_id1", :data => "keep me"}
158
+ data2 = {:id => "test_id2", :data => "delete me"}
159
+ @sdb_glue_obj.save(data1)
160
+ @sdb_glue_obj.save(data2)
161
+
162
+ results = @sdb_glue_obj.query_all
163
+ results.each do |raw_data|
164
+ case raw_data[:id]
165
+ when "test_id1"
166
+ raw_data[:data].should == "keep me"
167
+ when "test_id2"
168
+ raw_data[:data].should == "delete me"
169
+ else
170
+ raise "Unknown dataset"
171
+ end#case
172
+ end#each
173
+
174
+ model_metadata = {:id => "test_id2"}
175
+ @sdb_glue_obj.destroy_node(model_metadata)
176
+
177
+ results = @sdb_glue_obj.query_all
178
+ results.each do |raw_data|
179
+ case raw_data[:id]
180
+ when "test_id1"
181
+ raw_data[:data].should == "keep me"
182
+ when "test_id2"
183
+ raise "Oops should have been deleted"
184
+ else
185
+ raise "Unknown dataset"
186
+ end#case
187
+ end#each
188
+ end
189
+
190
+ it "should be able to delete in bulk" do
191
+ data1 = {:id => "test_id1", :data => "delete me"}
192
+ data2 = {:id => "test_id2", :data => "keep me"}
193
+ data3 = {:id => "test_id3", :data => "delete me too"}
194
+ @sdb_glue_obj.save(data1)
195
+ @sdb_glue_obj.save(data2)
196
+ @sdb_glue_obj.save(data3)
197
+
198
+ results = @sdb_glue_obj.query_all
199
+ results.each do |raw_data|
200
+ case raw_data[:id]
201
+ when "test_id1"
202
+ raw_data[:data].should == "delete me"
203
+ when "test_id2"
204
+ raw_data[:data].should == "keep me"
205
+ when "test_id3"
206
+ raw_data[:data].should == "delete me too"
207
+ else
208
+ raise "Unknown dataset"
209
+ end#case
210
+ end#each
211
+
212
+ raw_rcds_to_delete = [data1, data3]
213
+ @sdb_glue_obj.destroy_bulk(raw_rcds_to_delete)
214
+
215
+ results = @sdb_glue_obj.query_all
216
+ results.each do |raw_data|
217
+ case raw_data[:id]
218
+ when "test_id1"
219
+ raise "Oops should have been deleted"
220
+ when "test_id2"
221
+ raw_data[:data].should == "keep me"
222
+ when "test_id3"
223
+ raise "Oops should have been deleted"
224
+ else
225
+ raise "Unknown dataset"
226
+ end#case
227
+ end#each
228
+ end#it
229
+ end
230
+