diametric 0.0.4 → 0.1.1

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 (67) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +21 -18
  3. data/Jarfile +15 -1
  4. data/README.md +22 -14
  5. data/Rakefile +17 -1
  6. data/bin/datomic-rest +33 -0
  7. data/bin/download-datomic +13 -0
  8. data/datomic_version.yml +4 -0
  9. data/diametric.gemspec +9 -6
  10. data/ext/diametric/DiametricCollection.java +147 -0
  11. data/ext/diametric/DiametricConnection.java +113 -0
  12. data/ext/diametric/DiametricDatabase.java +107 -0
  13. data/ext/diametric/DiametricEntity.java +90 -0
  14. data/ext/diametric/DiametricListenableFuture.java +47 -0
  15. data/ext/diametric/DiametricObject.java +66 -0
  16. data/ext/diametric/DiametricPeer.java +414 -0
  17. data/ext/diametric/DiametricService.java +102 -0
  18. data/ext/diametric/DiametricUUID.java +61 -0
  19. data/ext/diametric/DiametricUtils.java +183 -0
  20. data/lib/boolean_type.rb +3 -0
  21. data/lib/diametric.rb +24 -0
  22. data/lib/diametric/entity.rb +219 -14
  23. data/lib/diametric/generators/active_model.rb +2 -2
  24. data/lib/diametric/persistence.rb +0 -1
  25. data/lib/diametric/persistence/common.rb +28 -9
  26. data/lib/diametric/persistence/peer.rb +122 -87
  27. data/lib/diametric/persistence/rest.rb +4 -3
  28. data/lib/diametric/query.rb +94 -23
  29. data/lib/diametric/rest_service.rb +74 -0
  30. data/lib/diametric/service_base.rb +77 -0
  31. data/lib/diametric/transactor.rb +86 -0
  32. data/lib/diametric/version.rb +1 -1
  33. data/lib/diametric_service.jar +0 -0
  34. data/lib/value_enums.rb +8 -0
  35. data/spec/conf_helper.rb +55 -0
  36. data/spec/config/free-transactor-template.properties +73 -0
  37. data/spec/config/logback.xml +59 -0
  38. data/spec/data/seattle-data0.dtm +452 -0
  39. data/spec/data/seattle-data1.dtm +326 -0
  40. data/spec/developer_create_sample.rb +39 -0
  41. data/spec/developer_query_spec.rb +120 -0
  42. data/spec/diametric/config_spec.rb +1 -1
  43. data/spec/diametric/entity_spec.rb +263 -0
  44. data/spec/diametric/peer_api_spec.rb +147 -0
  45. data/spec/diametric/persistence/peer_many2many_spec.rb +76 -0
  46. data/spec/diametric/persistence/peer_spec.rb +13 -22
  47. data/spec/diametric/persistence/rest_spec.rb +12 -19
  48. data/spec/diametric/query_spec.rb +4 -5
  49. data/spec/diametric/rest_service_spec.rb +56 -0
  50. data/spec/diametric/transactor_spec.rb +68 -0
  51. data/spec/integration_spec.rb +5 -3
  52. data/spec/parent_child_sample.rb +42 -0
  53. data/spec/peer_integration_spec.rb +106 -22
  54. data/spec/peer_seattle_spec.rb +200 -0
  55. data/spec/rc2013_seattle_big.rb +82 -0
  56. data/spec/rc2013_seattle_small.rb +60 -0
  57. data/spec/rc2013_simple_sample.rb +72 -0
  58. data/spec/seattle_integration_spec.rb +106 -0
  59. data/spec/simple_validation_sample.rb +31 -0
  60. data/spec/spec_helper.rb +31 -45
  61. data/spec/support/entities.rb +157 -0
  62. data/spec/support/gen_entity_class.rb +2 -0
  63. data/spec/support/persistence_examples.rb +9 -5
  64. data/spec/test_version_file.yml +4 -0
  65. metadata +131 -75
  66. data/Jarfile.lock +0 -134
  67. data/lib/jrclj.rb +0 -63
@@ -0,0 +1,39 @@
1
+ require 'conf_helper'
2
+
3
+ class Developer
4
+ include Diametric::Entity
5
+ include Diametric::Persistence::Peer
6
+
7
+ attribute :name, String
8
+ attribute :friends, Ref, :cardinality => :many
9
+ end
10
+
11
+ describe "RailsConf 2013", :jruby => true do
12
+ context Developer do
13
+ before(:all) do
14
+ datomic_uri = "datomic:mem://developer-#{SecureRandom.uuid}"
15
+ @conn = Diametric::Persistence::Peer.connect(datomic_uri)
16
+ end
17
+ after(:all) do
18
+ @conn.release
19
+ end
20
+
21
+ it "should create schema and save instaces" do
22
+ binding.pry
23
+ Developer.create_schema(@conn)
24
+
25
+ yoko = Developer.new
26
+ yoko.name = "Yoko Harada"
27
+ yoko.save
28
+ binding.pry
29
+
30
+ clinton = Developer.new(:name => "Clinton N. Dreisbach", :friends => [yoko])
31
+ clinton.save
32
+ binding.pry
33
+
34
+ ryan = Developer.new(:name => "Ryan Neufeld", :friends => [clinton, yoko])
35
+ ryan.save
36
+ binding.pry
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,120 @@
1
+ require 'spec_helper'
2
+
3
+ class Developer
4
+ include Diametric::Entity
5
+ include Diametric::Persistence::Peer
6
+
7
+ attribute :name, String
8
+ attribute :nerd_rate, Integer
9
+ attribute :friends, Ref, :cardinality => :many
10
+ end
11
+
12
+ describe Developer, :jruby => true do
13
+ before do
14
+ datomic_uri = "datomic:mem://developer-#{SecureRandom.uuid}"
15
+ @conn = Diametric::Persistence::Peer.connect(datomic_uri)
16
+ Developer.create_schema(@conn)
17
+ end
18
+ after do
19
+ @conn.release
20
+ end
21
+
22
+ it "should save an instace and get it" do
23
+ yoko = Developer.new
24
+ yoko.name = "Yoko Harada"
25
+ yoko.save(@conn)
26
+ query = Diametric::Query.new(Developer, @conn, true)
27
+ result = query.all
28
+ result.size.should == 1
29
+ result.first.name.should == "Yoko Harada"
30
+ end
31
+
32
+ it "should make query with the argument" do
33
+ yoko = Developer.new
34
+ yoko.name = "Yoko Harada"
35
+ yoko.nerd_rate = 50
36
+ yoko.save(@conn)
37
+ query = Diametric::Query.new(Developer, @conn, true).where(:name => "Yoko Harada")
38
+ query_data = "[:find ?e :in $ [?name] :where [?e :developer/name ?name]]"
39
+ query.data.first.gsub(" ", "").should == query_data.gsub(" ", "")
40
+ result = query.all
41
+ result.size.should == 1
42
+ result.first.nerd_rate.should == 50
43
+ end
44
+
45
+ it "should not resolve referenced object" do
46
+ yoko = Developer.new
47
+ yoko.name = "Yoko Harada"
48
+ yoko.nerd_rate = 50
49
+ yoko.save(@conn)
50
+ clinton = Developer.new(:name => "Clinton N. Dreisbach", :friends => [yoko])
51
+ clinton.nerd_rate = 98
52
+ clinton.save(@conn)
53
+
54
+ query = Diametric::Query.new(Developer, @conn).where(:name => "Clinton N. Dreisbach")
55
+ result = query.all
56
+ result.size.should == 1
57
+
58
+ developer = Developer.from_dbid_or_entity(result.first, @conn.db, false)
59
+ friends = developer.friends
60
+ friends.each do |f|
61
+ f.should be_a(Java::DatomicQuery::EntityMap)
62
+ end
63
+ end
64
+
65
+ it "should find three developers" do
66
+ yoko = Developer.new
67
+ yoko.name = "Yoko Harada"
68
+ yoko.nerd_rate = 50
69
+ yoko.save(@conn)
70
+ clinton = Developer.new(:name => "Clinton N. Dreisbach", :friends => [yoko])
71
+ clinton.nerd_rate = 98
72
+ clinton.save(@conn)
73
+ ryan = Developer.new(:name => "Ryan Neufeld", :friends => [clinton, yoko])
74
+ ryan.nerd_rate = 80
75
+ ryan.save(@conn)
76
+
77
+ query = Diametric::Query.new(Developer, @conn)
78
+ result = query.all
79
+ result.size.should == 3
80
+ resolved_result = result.map {|m| Developer.from_dbid_or_entity(m, @conn)}
81
+ resolved_result.collect(&:nerd_rate).should =~ [50, 98, 80]
82
+ end
83
+
84
+ it "should filter out developers" do
85
+ yoko = Developer.new
86
+ yoko.name = "Yoko Harada"
87
+ yoko.nerd_rate = 50
88
+ yoko.save(@conn)
89
+ clinton = Developer.new(:name => "Clinton N. Dreisbach", :friends => [yoko])
90
+ clinton.nerd_rate = 98
91
+ clinton.save(@conn)
92
+ ryan = Developer.new(:name => "Ryan Neufeld", :friends => [clinton, yoko])
93
+ ryan.nerd_rate = 80
94
+ ryan.save(@conn)
95
+
96
+ query = Diametric::Query.new(Developer, @conn).filter(:>, :nerd_rate, 70)
97
+ query_data = "[:find ?e :in $ :where [?e :developer/nerd_rate ?nerd_rate] [(> ?nerd_rate 70)]]"
98
+ query.data.first.gsub(" ", "").should == query_data.gsub(" ", "")
99
+ result = query.all
100
+ result.size.should == 2
101
+ end
102
+
103
+ it "should resolve referenced objects" do
104
+ yoko = Developer.new
105
+ yoko.name = "Yoko Harada"
106
+ yoko.nerd_rate = 50
107
+ yoko.save(@conn)
108
+ clinton = Developer.new(:name => "Clinton N. Dreisbach", :friends => [yoko])
109
+ clinton.nerd_rate = 98
110
+ clinton.save(@conn)
111
+ ryan = Developer.new(:name => "Ryan Neufeld", :friends => [clinton, yoko])
112
+ ryan.nerd_rate = 80
113
+ ryan.save(@conn)
114
+
115
+ query = Diametric::Query.new(Developer, @conn, true).where(:name => "Ryan Neufeld")
116
+ result = query.all
117
+ result.size.should == 1
118
+ result.first.friends.collect(&:name).should =~ ["Yoko Harada", "Clinton N. Dreisbach"]
119
+ end
120
+ end
@@ -52,7 +52,7 @@ describe Diametric::Config do
52
52
 
53
53
  describe ".connect!" do
54
54
  it "establishes a base connection" do
55
- settings = stub
55
+ settings = double
56
56
  Diametric::Persistence.should_receive(:establish_base_connection).with(settings)
57
57
  Diametric::Config.connect!(settings)
58
58
  end
@@ -1,4 +1,30 @@
1
1
  require 'spec_helper'
2
+ require 'diametric/entity'
3
+
4
+ require 'rspec/expectations'
5
+
6
+ RSpec::Matchers.define :be_an_equivalent_hash do |expected|
7
+ match do |actual|
8
+ status = true
9
+ expected.each do |k, v|
10
+ next if k == ":db/id"
11
+ status = false if actual[k].nil?
12
+ status = false unless actual[k] == v
13
+ end
14
+ status
15
+ end
16
+ end
17
+
18
+ RSpec::Matchers.define :be_an_equivalent_array do |expected|
19
+ match do |actual|
20
+ status = true
21
+ expected.each_with_index do |e, index|
22
+ next if e == "#db/id[:db.part/user]"
23
+ status = false unless actual[index] == e
24
+ end
25
+ status
26
+ end
27
+ end
2
28
 
3
29
  describe Diametric::Entity do
4
30
  describe "in a class" do
@@ -210,4 +236,241 @@ describe Diametric::Entity do
210
236
  end
211
237
 
212
238
  end
239
+
240
+ context "boolean type" do
241
+ subject { Choice }
242
+
243
+ it "should generate a schema" do
244
+ expected = []
245
+ if is_jruby?
246
+ expected = [
247
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
248
+ ":db/ident" => ":choice/item",
249
+ ":db/valueType" => ":db.type/string",
250
+ ":db/cardinality" => ":db.cardinality/one",
251
+ ":db.install/_attribute" => ":db.part/db" },
252
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
253
+ ":db/ident" => ":choice/checked",
254
+ ":db/valueType" => ":db.type/boolean",
255
+ ":db/cardinality" => ":db.cardinality/one",
256
+ ":db.install/_attribute" => ":db.part/db" }
257
+ ]
258
+ else
259
+ expected = [
260
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
261
+ :"db/ident" => :"choice/item",
262
+ :"db/valueType" => :"db.type/string",
263
+ :"db/cardinality" => :"db.cardinality/one",
264
+ :"db.install/_attribute" => :"db.part/db" },
265
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
266
+ :"db/ident" => :"choice/checked",
267
+ :"db/valueType" => :"db.type/boolean",
268
+ :"db/cardinality" => :"db.cardinality/one",
269
+ :"db.install/_attribute" => :"db.part/db" }
270
+ ]
271
+ end
272
+ @created_schema = subject.schema
273
+ expected.each do |e|
274
+ @created_schema.shift.should be_an_equivalent_hash(e)
275
+ end
276
+ end
277
+ end
278
+
279
+ context "uuid type" do
280
+ subject { Customer }
281
+
282
+ it "should generate a schema" do
283
+ expected = []
284
+ if is_jruby?
285
+ expected = [
286
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
287
+ ":db/ident" => ":customer/name",
288
+ ":db/valueType" => ":db.type/string",
289
+ ":db/cardinality" => ":db.cardinality/one",
290
+ ":db.install/_attribute" => ":db.part/db" },
291
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
292
+ ":db/ident" => ":customer/id",
293
+ ":db/valueType" => ":db.type/uuid",
294
+ ":db/cardinality" => ":db.cardinality/one",
295
+ ":db.install/_attribute" => ":db.part/db" }
296
+ ]
297
+ else
298
+ expected = [
299
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
300
+ :"db/ident" => :"customer/name",
301
+ :"db/valueType" => :"db.type/string",
302
+ :"db/cardinality" => :"db.cardinality/one",
303
+ :"db.install/_attribute" => :"db.part/db" },
304
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
305
+ :"db/ident" => :"customer/id",
306
+ :"db/valueType" => :"db.type/uuid",
307
+ :"db/cardinality" => :"db.cardinality/one",
308
+ :"db.install/_attribute" => :"db.part/db" }
309
+ ]
310
+ end
311
+ @created_schema = subject.schema
312
+ expected.each do |e|
313
+ @created_schema.shift.should be_an_equivalent_hash(e)
314
+ end
315
+ end
316
+ end
317
+
318
+ context "Float, Double type" do
319
+ subject { Account }
320
+
321
+ it "should generate a schema" do
322
+ expected = []
323
+ if is_jruby?
324
+ expected = [
325
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
326
+ ":db/ident" => ":account/name",
327
+ ":db/valueType" => ":db.type/string",
328
+ ":db/cardinality" => ":db.cardinality/one",
329
+ ":db.install/_attribute" => ":db.part/db" },
330
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
331
+ ":db/ident" => ":account/deposit",
332
+ ":db/valueType" => ":db.type/double",
333
+ ":db/cardinality" => ":db.cardinality/many",
334
+ ":db.install/_attribute" => ":db.part/db" },
335
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
336
+ ":db/ident" => ":account/amount",
337
+ ":db/valueType" => ":db.type/double",
338
+ ":db/cardinality" => ":db.cardinality/one",
339
+ ":db.install/_attribute" => ":db.part/db" }
340
+ ]
341
+ else
342
+ expected = [
343
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
344
+ :"db/ident" => :"account/name",
345
+ :"db/valueType" => :"db.type/string",
346
+ :"db/cardinality" => :"db.cardinality/one",
347
+ :"db.install/_attribute" => :"db.part/db" },
348
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
349
+ :"db/ident" => :"account/deposit",
350
+ :"db/valueType" => :"db.type/double",
351
+ :"db/cardinality" => :"db.cardinality/many",
352
+ :"db.install/_attribute" => :"db.part/db" },
353
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
354
+ :"db/ident" => :"account/amount",
355
+ :"db/valueType" => :"db.type/double",
356
+ :"db/cardinality" => :"db.cardinality/one",
357
+ :"db.install/_attribute" => :"db.part/db" }
358
+ ]
359
+ end
360
+ @created_schema = subject.schema
361
+ expected.each do |e|
362
+ @created_schema.shift.should be_an_equivalent_hash(e)
363
+ end
364
+ end
365
+ end
366
+
367
+ context "community sample" do
368
+ subject { Organization }
369
+
370
+ it { should respond_to(:attribute) }
371
+ it { should respond_to(:enum) }
372
+ it { should respond_to(:schema) }
373
+
374
+ it "should generate a schema" do
375
+ expected = [
376
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
377
+ :"db/ident" => :"organization/name",
378
+ :"db/valueType" => :"db.type/string",
379
+ :"db/cardinality" => :"db.cardinality/one",
380
+ :"db/fulltext" => true,
381
+ :"db/doc" => "A organization's name",
382
+ :"db.install/_attribute" => :"db.part/db" },
383
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
384
+ :"db/ident" => :"organization/url",
385
+ :"db/valueType" => :"db.type/string",
386
+ :"db/cardinality" => :"db.cardinality/one",
387
+ :"db/doc" => "A organization's url",
388
+ :"db.install/_attribute" => :"db.part/db" },
389
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
390
+ :"db/ident" => :"organization/neighborhood",
391
+ :"db/valueType" => :"db.type/ref",
392
+ :"db/cardinality" => :"db.cardinality/one",
393
+ :"db/doc" => "A organization's neighborhood",
394
+ :"db.install/_attribute" => :"db.part/db" },
395
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
396
+ :"db/ident" => :"organization/category",
397
+ :"db/valueType" => :"db.type/string",
398
+ :"db/cardinality" => :"db.cardinality/many",
399
+ :"db/fulltext" => true,
400
+ :"db/doc" => "All organization categories",
401
+ :"db.install/_attribute" => :"db.part/db" },
402
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
403
+ :"db/ident" => :"organization/orgtype",
404
+ :"db/valueType" => :"db.type/ref",
405
+ :"db/cardinality" => :"db.cardinality/one",
406
+ :"db/doc" => "A organization orgtype enum value",
407
+ :"db.install/_attribute" => :"db.part/db" },
408
+ { :"db/id" => subject.send(:tempid, :"db.part/db"),
409
+ :"db/ident" => :"organization/type",
410
+ :"db/valueType" => :"db.type/ref",
411
+ :"db/cardinality" => :"db.cardinality/one",
412
+ :"db/doc" => "A organization type enum value",
413
+ :"db.install/_attribute" => :"db.part/db" },
414
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.orgtype/community" ],
415
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.orgtype/commercial" ],
416
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.orgtype/nonprofit"],
417
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.orgtype/personal"],
418
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/email-list"],
419
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/twitter"],
420
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/facebook-page" ],
421
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/blog" ],
422
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/website" ],
423
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/wiki" ],
424
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/myspace" ],
425
+ [ :"db/add", subject.send(:tempid, :"db.part/user"), :"db/ident", :"organization.type/ning"]
426
+ ]
427
+
428
+ @created_schema = Organization.schema
429
+ expected.each do |e|
430
+ @created_schema.shift.should == e
431
+ end
432
+ end
433
+ end
434
+
435
+
436
+ context "seattle sample", :jruby do
437
+ describe Diametric::Entity do
438
+ subject { District }
439
+
440
+ it "should create peer schema" do
441
+ expected = [
442
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
443
+ ":db/ident" => ":district/name",
444
+ ":db/valueType" => ":db.type/string",
445
+ ":db/cardinality" => ":db.cardinality/one",
446
+ ":db/unique" => ":db.unique/identity",
447
+ ":db/doc" => "A unique district name (upsertable)",
448
+ ":db.install/_attribute" => ":db.part/db" },
449
+ { ":db/id" => subject.send(:tempid, ":db.part/db"),
450
+ ":db/ident" => ":district/region",
451
+ ":db/valueType" => ":db.type/ref",
452
+ ":db/cardinality" => ":db.cardinality/one",
453
+ ":db/doc" => "A district region enum value",
454
+ ":db.install/_attribute" => ":db.part/db" },
455
+ [ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/n"],
456
+ [ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/ne"],
457
+ [ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/e"],
458
+ [ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/se"],
459
+ [ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/s"],
460
+ [ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/sw"],
461
+ [ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/w"],
462
+ [ ":db/add", "#db/id[:db.part/user]", ":db/ident", ":district.region/nw"]
463
+ ]
464
+ @created_schema = District.schema
465
+ expected.each do |e|
466
+ if e.is_a? Hash
467
+ @created_schema.shift.should be_an_equivalent_hash(e)
468
+ else
469
+ @created_schema.shift.should be_an_equivalent_array(e)
470
+ end
471
+ end
472
+ end
473
+ end
474
+ end
475
+
213
476
  end
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+ require 'securerandom'
3
+
4
+ if is_jruby?
5
+ describe Diametric::Persistence::Peer, :jruby => true do
6
+ @db_name = "test-#{SecureRandom.uuid}"
7
+
8
+ it 'should create database' do
9
+ subject.create_database("datomic:mem://#{@db_name}").should be_true
10
+ end
11
+
12
+ context Diametric::Persistence::Peer do
13
+ it 'should connect to the database' do
14
+ subject.connect("datomic:mem://#{@db_name}").should be_true
15
+ end
16
+
17
+ it 'should get tempid' do
18
+ subject.tempid(":db.part/db").to_s.should match(/#db\/id\[:db.part\/db\s-\d+\]/)
19
+ subject.tempid(":db.part/user").to_s.should match(/#db\/id\[:db.part\/user\s-\d+\]/)
20
+ subject.tempid(":db.part/user", -1).to_s.should match(/#db\/id\[:db.part\/user\s-1\]/)
21
+ end
22
+
23
+ it "should return uuid from squuid" do
24
+ re = Regexp.new(/^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/)
25
+ subject.squuid.to_s.should match(re)
26
+ end
27
+
28
+ it "should return Fixnum from squuid_time_millis" do
29
+ du = Diametric::Persistence::UUID.new
30
+ subject.squuid_time_millis(du).class.should == Fixnum
31
+ end
32
+ end
33
+
34
+ context Diametric::Persistence::Connection do
35
+ @db_name = "test-#{SecureRandom.uuid}"
36
+ let(:connection) { Diametric::Persistence::Peer.connect("datomic:mem://#{@db_name}") }
37
+ let(:tempid) { Diametric::Persistence::Peer.tempid(":db.part/db") }
38
+ let(:tx_data) {
39
+ [{
40
+ ":db/id" => tempid,
41
+ ":db/ident" => ":person/name",
42
+ ":db/valueType" => ":db.type/string",
43
+ ":db/cardinality" => ":db.cardinality/one",
44
+ ":db/doc" => "A person's name",
45
+ ":db.install/_attribute" => ":db.part/db"
46
+ }]
47
+ }
48
+ let(:user_data) {
49
+ [{":db/id" => user_part_tempid, ":person/name" => "Alice"},
50
+ {":db/id" => user_part_tempid, ":person/name" => "Bob"},
51
+ {":db/id" => user_part_tempid, ":person/name" => "Chris"}]
52
+ }
53
+
54
+ it 'should transact schema' do
55
+ connection.transact(tx_data).class.should == Diametric::Persistence::ListenableFuture
56
+ end
57
+
58
+ it 'should get future object for schema' do
59
+ connection.transact(tx_data).get.should be_true
60
+ end
61
+
62
+ it 'should transact data' do
63
+ connection.transact(tx_data).get
64
+ connection.transact(user_data).get.should be_true
65
+ end
66
+
67
+ it 'should resolve tempid' do
68
+ tmp_tempid = user_part_tempid
69
+ connection.transact(tx_data).get
70
+ map = connection.transact([{":db/id" => tmp_tempid, ":person/name" => "Alice"}]).get
71
+ resolved_tempid = Diametric::Persistence::Peer.resolve_tempid(map, tmp_tempid)
72
+ resolved_tempid.should be_true
73
+ resolved_tempid.to_s.should match(/\d+/)
74
+ #puts "resolved_tempid: #{resolved_tempid}"
75
+ end
76
+ end
77
+
78
+ context 'Diametric query' do
79
+ before do
80
+ tx_data =
81
+ [{
82
+ ":db/id" => Diametric::Persistence::Peer.tempid(":db.part/db"),
83
+ ":db/ident" => ":person/name",
84
+ ":db/valueType" => ":db.type/string",
85
+ ":db/cardinality" => ":db.cardinality/one",
86
+ ":db/doc" => "A person's name",
87
+ ":db.install/_attribute" => ":db.part/db"
88
+ }]
89
+ user_data =
90
+ [{":db/id" => Diametric::Persistence::Peer.tempid(":db.part/user"), ":person/name" => "Alice"},
91
+ {":db/id" => Diametric::Persistence::Peer.tempid(":db.part/user"), ":person/name" => "Bob"},
92
+ {":db/id" => Diametric::Persistence::Peer.tempid(":db.part/user"), ":person/name" => "Chris"}]
93
+ @db_name = "test-#{SecureRandom.uuid}"
94
+ @connection = Diametric::Persistence::Peer.connect("datomic:mem://#{@db_name}")
95
+
96
+ @connection.transact(tx_data).get
97
+ @connection.transact(user_data).get
98
+ end
99
+
100
+ it 'should get ids from datomic' do
101
+ results = Diametric::Persistence::Peer.q("[:find ?c :where [?c :person/name]]", @connection.db)
102
+ results.class.should == Array
103
+ results.size.should be >= 3
104
+ #puts results.inspect
105
+ end
106
+
107
+ it 'should get names from datomic' do
108
+ results = Diametric::Persistence::Peer.q("[:find ?c ?name :where [?c :person/name ?name]]\
109
+ ", @connection.db)
110
+ results.flatten.should include("Alice")
111
+ results.flatten.should include("Bob")
112
+ results.flatten.should include("Chris")
113
+ #puts results.inspect
114
+ end
115
+
116
+ it 'should get entity by id' do
117
+ results = Diametric::Persistence::Peer.q("[:find ?c :where [?c :person/name]]",\
118
+ @connection.db)
119
+ id = results[0][0]
120
+ @connection.db.entity(id).should be_true
121
+ end
122
+
123
+ it 'should get keys from entity id' do
124
+ results = Diametric::Persistence::Peer.q("[:find ?c :where [?c :person/name]]",\
125
+ @connection.db)
126
+ id = results[0][0]
127
+ entity = @connection.db.entity(id)
128
+ entity.keys.should include(":person/name")
129
+ #puts entity.keys
130
+ end
131
+
132
+ it 'should get value from entity id' do
133
+ results = Diametric::Persistence::Peer.q("[:find ?c :where [?c :person/name]]",\
134
+ @connection.db)
135
+ id = results[0][0]
136
+ entity = @connection.db.entity(id)
137
+ value = entity.get(entity.keys[0])
138
+ value.should match(/Alice|Bob|Chris/)
139
+ #puts value
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ def user_part_tempid
146
+ Diametric::Persistence::Peer.tempid(":db.part/user")
147
+ end