diametric 0.0.4 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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