diametric 0.1.1-java

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 (73) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +28 -0
  3. data/Jarfile +20 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +264 -0
  6. data/Rakefile +49 -0
  7. data/bin/datomic-rest +33 -0
  8. data/bin/download-datomic +13 -0
  9. data/datomic_version.yml +4 -0
  10. data/diametric-java.gemspec +39 -0
  11. data/ext/diametric/DiametricCollection.java +147 -0
  12. data/ext/diametric/DiametricConnection.java +113 -0
  13. data/ext/diametric/DiametricDatabase.java +107 -0
  14. data/ext/diametric/DiametricEntity.java +90 -0
  15. data/ext/diametric/DiametricListenableFuture.java +47 -0
  16. data/ext/diametric/DiametricObject.java +66 -0
  17. data/ext/diametric/DiametricPeer.java +414 -0
  18. data/ext/diametric/DiametricService.java +102 -0
  19. data/ext/diametric/DiametricUUID.java +61 -0
  20. data/ext/diametric/DiametricUtils.java +183 -0
  21. data/lib/boolean_type.rb +3 -0
  22. data/lib/diametric.rb +42 -0
  23. data/lib/diametric/config.rb +54 -0
  24. data/lib/diametric/config/environment.rb +42 -0
  25. data/lib/diametric/entity.rb +659 -0
  26. data/lib/diametric/errors.rb +13 -0
  27. data/lib/diametric/generators/active_model.rb +42 -0
  28. data/lib/diametric/persistence.rb +48 -0
  29. data/lib/diametric/persistence/common.rb +82 -0
  30. data/lib/diametric/persistence/peer.rb +154 -0
  31. data/lib/diametric/persistence/rest.rb +107 -0
  32. data/lib/diametric/query.rb +259 -0
  33. data/lib/diametric/railtie.rb +52 -0
  34. data/lib/diametric/rest_service.rb +74 -0
  35. data/lib/diametric/service_base.rb +77 -0
  36. data/lib/diametric/transactor.rb +86 -0
  37. data/lib/diametric/version.rb +3 -0
  38. data/lib/diametric_service.jar +0 -0
  39. data/lib/tasks/create_schema.rb +27 -0
  40. data/lib/tasks/diametric_config.rb +45 -0
  41. data/lib/value_enums.rb +8 -0
  42. data/spec/conf_helper.rb +55 -0
  43. data/spec/config/free-transactor-template.properties +73 -0
  44. data/spec/config/logback.xml +59 -0
  45. data/spec/data/seattle-data0.dtm +452 -0
  46. data/spec/data/seattle-data1.dtm +326 -0
  47. data/spec/developer_create_sample.rb +39 -0
  48. data/spec/developer_query_spec.rb +120 -0
  49. data/spec/diametric/config_spec.rb +60 -0
  50. data/spec/diametric/entity_spec.rb +476 -0
  51. data/spec/diametric/peer_api_spec.rb +147 -0
  52. data/spec/diametric/persistence/peer_many2many_spec.rb +76 -0
  53. data/spec/diametric/persistence/peer_spec.rb +27 -0
  54. data/spec/diametric/persistence/rest_spec.rb +30 -0
  55. data/spec/diametric/persistence_spec.rb +59 -0
  56. data/spec/diametric/query_spec.rb +118 -0
  57. data/spec/diametric/rest_service_spec.rb +56 -0
  58. data/spec/diametric/transactor_spec.rb +68 -0
  59. data/spec/integration_spec.rb +107 -0
  60. data/spec/parent_child_sample.rb +42 -0
  61. data/spec/peer_integration_spec.rb +121 -0
  62. data/spec/peer_seattle_spec.rb +200 -0
  63. data/spec/rc2013_seattle_big.rb +82 -0
  64. data/spec/rc2013_seattle_small.rb +60 -0
  65. data/spec/rc2013_simple_sample.rb +72 -0
  66. data/spec/seattle_integration_spec.rb +106 -0
  67. data/spec/simple_validation_sample.rb +31 -0
  68. data/spec/spec_helper.rb +63 -0
  69. data/spec/support/entities.rb +157 -0
  70. data/spec/support/gen_entity_class.rb +9 -0
  71. data/spec/support/persistence_examples.rb +104 -0
  72. data/spec/test_version_file.yml +4 -0
  73. metadata +290 -0
@@ -0,0 +1,82 @@
1
+ require 'conf_helper'
2
+ require 'support/entities'
3
+
4
+ describe "Seattle Sample", :jruby => true do
5
+ context Community do
6
+ before(:all) do
7
+ datomic_uri = "datomic:mem://seattle-#{SecureRandom.uuid}"
8
+ @conn = Diametric::Persistence::Peer.connect(datomic_uri)
9
+ Neighborhood.create_schema(@conn).get
10
+ District.create_schema(@conn).get
11
+ Community.create_schema(@conn).get
12
+ filename = File.join(File.dirname(__FILE__), "data", "seattle-data0.dtm")
13
+ list = Diametric::Persistence::Utils.read_all(filename)
14
+ map = @conn.transact(list.first).get
15
+ end
16
+
17
+ after(:all) do
18
+ @conn.release
19
+ end
20
+
21
+ it "should do queries" do
22
+ query = Diametric::Query.new(Community, @conn)
23
+ results = query.all #150
24
+ binding.pry
25
+
26
+ query = Diametric::Query.new(Neighborhood, @conn, true).where(:name => "Capitol Hill")
27
+ binding.pry
28
+ # Navigating up
29
+ #
30
+ # 6 communities have their neighborhood whoose name is "Capitol
31
+ # Hill"
32
+ #
33
+ communities = query.first.community_from_this_neighborhood(@conn)
34
+ binding.pry
35
+
36
+ communities.size.should == 6
37
+
38
+ communities.collect(&:name).should =~
39
+ ["15th Ave Community",
40
+ "Capitol Hill Community Council",
41
+ "Capitol Hill Housing",
42
+ "Capitol Hill Triangle",
43
+ "CHS Capitol Hill Seattle Blog",
44
+ "KOMO Communities - Captol Hill"]
45
+ binding.pry
46
+
47
+ #
48
+ # Adds another set of data
49
+ #
50
+ # Makes sure "before" state
51
+ #
52
+ query = Diametric::Query.new(Community, @conn)
53
+ results = query.all
54
+ results.size.should == 150
55
+ binding.pry
56
+
57
+ past = Time.now
58
+
59
+ binding.pry
60
+
61
+ filename1 = File.join(File.dirname(__FILE__), "data", "seattle-data1.dtm")
62
+ list = Diametric::Persistence::Utils.read_all(filename1)
63
+
64
+ map2 = @conn.transact(list.first).get
65
+ query = Diametric::Query.new(Community, @conn)
66
+ results = query.all
67
+ results.size.should == 258
68
+
69
+ binding.pry
70
+
71
+ past_db = @conn.db.as_of(past)
72
+
73
+ binding.pry
74
+
75
+ query = Diametric::Query.new(Community, past_db)
76
+ results = query.all
77
+ results.size.should == 150
78
+
79
+ binding.pry
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,60 @@
1
+ require 'conf_helper'
2
+ require 'support/entities'
3
+
4
+ describe Diametric::Entity, :jruby => true do
5
+ context Community do
6
+ before(:all) do
7
+ datomic_uri = "datomic:mem://community-#{SecureRandom.uuid}"
8
+ @conn = Diametric::Persistence::Peer.connect(datomic_uri)
9
+ Neighborhood.create_schema(@conn).get
10
+ District.create_schema(@conn).get
11
+ Community.create_schema(@conn).get
12
+ binding.pry
13
+ end
14
+ after(:all) do
15
+ @conn.release
16
+ end
17
+
18
+ it "should save instance" do
19
+ district = District.new
20
+ district.name = "East"
21
+ district.region = District::Region::E
22
+ binding.pry
23
+ neighborhood = Neighborhood.new
24
+ neighborhood.name = "Capitol Hill"
25
+ neighborhood.district = district
26
+ community = Community.new
27
+ community.name = "15th Ave Community"
28
+ community.url = "http://groups.yahoo.com/group/15thAve_Community/"
29
+ community.neighborhood = neighborhood
30
+ community.category = ["15th avenue residents"]
31
+ community.orgtype = Community::Orgtype::COMMUNITY
32
+ community.type = Community::Type::EMAIL_LIST
33
+ binding.pry
34
+ res = community.save(@conn)
35
+ binding.pry
36
+
37
+ query = Diametric::Query.new(Community, @conn, true)
38
+ community = query.where(:name => "15th Ave Community").first
39
+ binding.pry
40
+ puts "community.name: #{community.name}"
41
+ puts "community.url: #{community.url}"
42
+ puts "community.category: #{community.category}"
43
+ puts "community.category: #{community.category.to_a.join(",")}"
44
+ puts "community.orgtype: #{community.orgtype}"
45
+ puts "community.orgtype == Community::Orgtype::COMMUNITY ? #{community.orgtype == Community::Orgtype::COMMUNITY}"
46
+ puts "community.type: #{community.type}"
47
+ puts "community.type == Community::Type::EMAIL_LIST ? #{community.type == Community::Type::EMAIL_LIST}"
48
+ binding.pry
49
+ puts "community.neighborhood.dbid: #{community.neighborhood.dbid}"
50
+ puts "community.neighborhood.name: #{community.neighborhood.name}"
51
+ binding.pry
52
+ puts "community.neighborhood.district.dbid: #{community.neighborhood.district.dbid}"
53
+ puts "community.neighborhood.district.name: #{community.neighborhood.district.name}"
54
+ puts "community.neighborhood.district.region: #{community.neighborhood.district.region}"
55
+ puts "community.neighborhood.district.region == District::Region::E ? #{community.neighborhood.district.region == District::Region::E}"
56
+ binding.pry
57
+ end
58
+ end
59
+
60
+ end
@@ -0,0 +1,72 @@
1
+ require 'conf_helper'
2
+
3
+ class Person
4
+ include Diametric::Entity
5
+ include Diametric::Persistence::Peer
6
+
7
+ attribute :name, String
8
+ attribute :nerd_rate, Integer
9
+ end
10
+
11
+ describe "RailsConf 2013", :jruby => true do
12
+ context Person do
13
+ before(:all) do
14
+ datomic_uri = "datomic:mem://person-#{SecureRandom.uuid}"
15
+ @conn = Diametric::Persistence::Peer.connect(datomic_uri)
16
+ binding.pry
17
+ end
18
+ after(:all) do
19
+ @conn.release
20
+ end
21
+
22
+ it "should create schema and save instaces" do
23
+ binding.pry
24
+ Person.create_schema(@conn).get
25
+
26
+ foo = Person.new
27
+ foo.name = "Yoko"
28
+ foo.nerd_rate = 50
29
+ binding.pry
30
+ foo.save
31
+
32
+ bar = Person.new(:name => "Clinton", :nerd_rate => 98)
33
+ binding.pry
34
+ bar.save
35
+
36
+ query = Diametric::Query.new(Person, @conn.db, true)
37
+ result = query.all
38
+ binding.pry
39
+
40
+ query = Diametric::Query.new(Person, @conn.db, true).where(:name => "Yoko")
41
+ result = query.all
42
+ binding.pry
43
+
44
+ past = Time.now
45
+ binding.pry
46
+
47
+ yoko = result.first
48
+ yoko.update_attributes(:nerd_rate => 70)
49
+ binding.pry
50
+
51
+ query = Diametric::Query.new(Person, @conn.db, true).where(:name => "Yoko")
52
+ result = query.all
53
+ binding.pry
54
+
55
+ past_db = @conn.db.as_of(past)
56
+ binding.pry
57
+
58
+ query = Diametric::Query.new(Person, past_db, true).where(:name => "Yoko")
59
+ result = query.all
60
+ binding.pry
61
+
62
+ query = Diametric::Query.new(Person, @conn.db, true).filter(:>, :nerd_rate, 60)
63
+ result = query.all
64
+ binding.pry
65
+
66
+ query = Diametric::Query.new(Person, past_db, true).filter(:>, :nerd_rate, 60)
67
+ result = query.all
68
+ binding.pry
69
+
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+ require 'diametric/entity'
3
+ require 'datomic/client'
4
+
5
+ describe "Seattle Sample", :integration => true, :jruby => true do
6
+ context Diametric::Persistence::Utils do
7
+ before(:all) do
8
+ datomic_uri = "datomic:mem://utils-#{SecureRandom.uuid}"
9
+ @u_conn = Diametric::Persistence::Peer.connect(datomic_uri)
10
+ end
11
+
12
+ after(:all) do
13
+ @u_conn.release
14
+ end
15
+
16
+ it "should read all data from filename" do
17
+ filename = File.join(File.dirname(__FILE__), "data", "seattle-data0.dtm")
18
+ list = Diametric::Persistence::Utils.read_all(filename)
19
+ list.first.size.should == 450
20
+ end
21
+
22
+ it "should transact data read from file" do
23
+ Neighborhood.create_schema(@u_conn).get
24
+ District.create_schema(@u_conn).get
25
+ Community.create_schema(@u_conn).get
26
+ filename = File.join(File.dirname(__FILE__), "data", "seattle-data0.dtm")
27
+ list = Diametric::Persistence::Utils.read_all(filename)
28
+ map = @u_conn.transact(list.first).get
29
+ map.should_not be_nil
30
+ end
31
+ end
32
+
33
+ context Community do
34
+ before(:all) do
35
+ datomic_uri = "datomic:mem://community-#{SecureRandom.uuid}"
36
+ @s_conn1 = Diametric::Persistence::Peer.connect(datomic_uri)
37
+ Neighborhood.create_schema(@s_conn1).get
38
+ District.create_schema(@s_conn1).get
39
+ Community.create_schema(@s_conn1).get
40
+ filename = File.join(File.dirname(__FILE__), "data", "seattle-data0.dtm")
41
+ list = Diametric::Persistence::Utils.read_all(filename)
42
+ map = @s_conn1.transact(list.first).get
43
+ end
44
+
45
+ after(:all) do
46
+ @s_conn1.release
47
+ end
48
+
49
+ it "should get all community names" do
50
+ query = Diametric::Query.new(Community, @s_conn1)
51
+ results = query.all
52
+ results.size.should == 150
53
+ end
54
+
55
+ it "should get reverse reference" do
56
+ query = Diametric::Query.new(Neighborhood, @s_conn1, true).where(:name => "Capitol Hill")
57
+ communities = query.first.community_from_this_neighborhood(@s_conn1)
58
+ communities.size.should == 6
59
+ communities.collect(&:name).should =~
60
+ ["15th Ave Community",
61
+ "Capitol Hill Community Council",
62
+ "Capitol Hill Housing",
63
+ "Capitol Hill Triangle",
64
+ "CHS Capitol Hill Seattle Blog",
65
+ "KOMO Communities - Captol Hill"]
66
+ end
67
+ end
68
+
69
+ context Community do
70
+ before(:all) do
71
+ datomic_uri = "datomic:mem://community-#{SecureRandom.uuid}"
72
+ @s_conn2 = Diametric::Persistence::Peer.connect(datomic_uri)
73
+ Neighborhood.create_schema(@s_conn2).get
74
+ District.create_schema(@s_conn2).get
75
+ Community.create_schema(@s_conn2).get
76
+ filename0 = File.join(File.dirname(__FILE__), "data", "seattle-data0.dtm")
77
+ list = Diametric::Persistence::Utils.read_all(filename0)
78
+ map0 = @s_conn2.transact(list.first).get
79
+ end
80
+
81
+ after(:all) do
82
+ @s_conn2.release
83
+ end
84
+
85
+ it "should add another set of data" do
86
+ query = Diametric::Query.new(Community, @s_conn2)
87
+ results = query.all
88
+ results.size.should == 150
89
+
90
+ past = Time.now
91
+
92
+ filename1 = File.join(File.dirname(__FILE__), "data", "seattle-data1.dtm")
93
+ list = Diametric::Persistence::Utils.read_all(filename1)
94
+
95
+ map2 = @s_conn2.transact(list.first).get
96
+ query = Diametric::Query.new(Community, @s_conn2)
97
+ results = query.all
98
+ results.size.should == 258
99
+
100
+ past_db = @s_conn2.db.as_of(past)
101
+ query = Diametric::Query.new(Community, past_db)
102
+ results = query.all
103
+ results.size.should == 150
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,31 @@
1
+ require 'conf_helper'
2
+
3
+ class Person
4
+ include Diametric::Entity
5
+ include Diametric::Persistence::Peer
6
+
7
+ attribute :name, String
8
+ validates_presence_of :name
9
+ attribute :nerd_rate, Integer
10
+ end
11
+
12
+ describe "RailsConf 2013", :jruby => true do
13
+ context Person do
14
+ before(:all) do
15
+ datomic_uri = "datomic:mem://person-#{SecureRandom.uuid}"
16
+ @conn = Diametric::Persistence::Peer.connect(datomic_uri)
17
+ end
18
+ after(:all) do
19
+ @conn.release
20
+ end
21
+
22
+ it "should create schema and save instaces" do
23
+ binding.pry
24
+ Person.create_schema(@conn).get
25
+
26
+ foo = Person.new
27
+ binding.pry
28
+ foo.save
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,63 @@
1
+ require 'rspec'
2
+
3
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
4
+ require 'lock_jar'
5
+ jar_file = File.join(File.dirname(__FILE__), "..", "Jarfile")
6
+ lock_file = File.join(File.dirname(__FILE__), "..", "Jarfile.lock")
7
+ LockJar.lock(jar_file)
8
+ LockJar.install(lock_file)
9
+ LockJar.load(lock_file)
10
+ end
11
+ require 'diametric'
12
+ require 'diametric/rest_service'
13
+ require 'diametric/transactor'
14
+ Dir["./spec/support/**/*.rb"].each {|f| require f}
15
+
16
+ RSpec.configure do |c|
17
+ # c.fail_fast = true
18
+
19
+ c.filter_run_excluding :integration => true unless ENV['INTEGRATION']
20
+ c.filter_run_excluding :jruby => (not is_jruby?)
21
+ c.filter_run_excluding :service => true unless ENV['RESTSERVICE']
22
+ c.filter_run_excluding :transactor => true unless ENV['TRANSACTOR']
23
+
24
+ c.filter_run_including :focused => true
25
+ c.alias_example_to :fit, :focused => true
26
+
27
+ c.run_all_when_everything_filtered = true
28
+ c.treat_symbols_as_metadata_keys_with_true_values = true
29
+
30
+ c.before(:suite) do
31
+ @rest = Diametric::RestService.new("spec/test_version_file.yml", "tmp/datomic")
32
+ @rest.start(:port => 46291, :db_alias => @storage, :uri => "datomic:mem://")
33
+ PID = @rest.pid
34
+ if ENV['TRANSACTOR']
35
+ FileUtils.cp(File.join('spec', 'config', 'logback.xml'), File.join('bin', 'logback.xml'))
36
+ end
37
+ end
38
+
39
+ c.after(:suite) do
40
+ Diametric::Persistence::Peer.shutdown(true) if is_jruby?
41
+ Process.kill("HUP", PID)
42
+ if ENV['TRANSACTOR']
43
+ FileUtils.rm(File.join('bin', 'logback.xml'), :force => true)
44
+ end
45
+ end
46
+ end
47
+
48
+ shared_examples "ActiveModel" do |model|
49
+ require 'test/unit/assertions'
50
+ require 'active_model/lint'
51
+ include Test::Unit::Assertions
52
+ include ActiveModel::Lint::Tests
53
+
54
+ active_model_lints = ActiveModel::Lint::Tests.public_instance_methods.map(&:to_s).grep(/^test/)
55
+
56
+ let(:model) { subject }
57
+
58
+ active_model_lints.each do |test_name|
59
+ it "#{test_name.sub(/^test_/, '')}" do
60
+ send(test_name)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,157 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'diametric/entity'
4
+ require 'diametric/persistence'
5
+ require 'diametric/persistence/peer'
6
+ require 'diametric/persistence/rest'
7
+
8
+ # Prevent CRuby from blowing up
9
+ module Diametric
10
+ module Persistence
11
+ module Peer
12
+ end
13
+ module Utils
14
+ end
15
+ end
16
+ end
17
+
18
+ class Person
19
+ include Diametric::Entity
20
+
21
+ attribute :name, String, :index => true
22
+ attribute :email, String, :cardinality => :many
23
+ attribute :birthday, DateTime
24
+ attribute :awesome, :boolean, :doc => "Is this person awesome?"
25
+ attribute :ssn, String, :unique => :value
26
+ attribute :secret_name, String, :unique => :identity
27
+ attribute :bio, String, :fulltext => true
28
+ attribute :middle_name, String, :default => "Danger"
29
+ attribute :nicknames, String, :cardinality => :many, :default => ["Buddy", "Pal"]
30
+ attribute :parent, Ref, :cardinality => :many, :doc => "A person's parent"
31
+ end
32
+
33
+ class Goat
34
+ include Diametric::Entity
35
+
36
+ attribute :name, String
37
+ attribute :birthday, DateTime
38
+ end
39
+
40
+ class Robin
41
+ include Diametric::Entity
42
+ include Diametric::Persistence::REST
43
+
44
+ attribute :name, String
45
+ validates_presence_of :name
46
+ attribute :age, Integer
47
+ end
48
+
49
+ class Penguin
50
+ include Diametric::Entity
51
+ include Diametric::Persistence::Peer
52
+
53
+ attribute :name, String
54
+ attribute :age, Integer
55
+ end
56
+
57
+ class Rat
58
+ include Diametric::Entity
59
+ include Diametric::Persistence::Peer
60
+
61
+ attribute :name, String, :index => true
62
+ attribute :age, Integer
63
+ end
64
+
65
+ class Mouse
66
+ include Diametric::Entity
67
+ include Diametric::Persistence::REST
68
+
69
+ attribute :name, String, :index => true
70
+ attribute :age, Integer
71
+ end
72
+
73
+ class Author
74
+ include Diametric::Entity
75
+ include Diametric::Persistence::Peer
76
+
77
+ attribute :name, String
78
+ attribute :books, Ref, :cardinality => :many
79
+ end
80
+
81
+ class Book
82
+ include Diametric::Entity
83
+ include Diametric::Persistence::Peer
84
+
85
+ attribute :title, String
86
+ attribute :authors, Ref, :cardinality => :many
87
+ end
88
+
89
+ class Choice
90
+ include Diametric::Entity
91
+ include Diametric::Persistence::Peer
92
+
93
+ attribute :item, String
94
+ attribute :checked, Boolean
95
+ end
96
+
97
+ class Customer
98
+ include Diametric::Entity
99
+ include Diametric::Persistence::Peer
100
+
101
+ attribute :name, String
102
+ attribute :id, UUID
103
+ end
104
+
105
+ class Account
106
+ include Diametric::Entity
107
+ include Diametric::Persistence::Peer
108
+
109
+ attribute :name, String
110
+ attribute :deposit, Float, :cardinality => :many
111
+ attribute :amount, Double
112
+ end
113
+
114
+ class Organization
115
+ include Diametric::Entity
116
+ include Diametric::Persistence::REST
117
+
118
+ attribute :name, String, :cardinality => :one, :fulltext => true, :doc => "A organization's name"
119
+ attribute :url, String, :cardinality => :one, :doc => "A organization's url"
120
+ attribute :neighborhood, Ref, :cardinality => :one, :doc => "A organization's neighborhood"
121
+ attribute :category, String, :cardinality => :many, :fulltext => true, :doc => "All organization categories"
122
+ attribute :orgtype, Ref, :cardinality => :one, :doc => "A organization orgtype enum value"
123
+ attribute :type, Ref, :cardinality => :one, :doc => "A organization type enum value"
124
+ enum :orgtype, [:community, :commercial, :nonprofit, :personal]
125
+ enum :type, [:email_list, :twitter, :facebook_page, :blog, :website, :wiki, :myspace, :ning]
126
+ end
127
+
128
+ class Community
129
+ include Diametric::Entity
130
+ include Diametric::Persistence::Peer
131
+
132
+ attribute :name, String, :cardinality => :one, :fulltext => true, :doc => "A community's name"
133
+ attribute :url, String, :cardinality => :one, :doc => "A community's url"
134
+ attribute :neighborhood, Ref, :cardinality => :one, :doc => "A community's neighborhood"
135
+ attribute :category, String, :cardinality => :many, :fulltext => true, :doc => "All community categories"
136
+ attribute :orgtype, Ref, :cardinality => :one, :doc => "A community orgtype enum value"
137
+ attribute :type, Ref, :cardinality => :one, :doc => "A community type enum value"
138
+ enum :orgtype, [:community, :commercial, :nonprofit, :personal]
139
+ enum :type, [:email_list, :twitter, :facebook_page, :blog, :website, :wiki, :myspace, :ning]
140
+ end
141
+
142
+ class Neighborhood
143
+ include Diametric::Entity
144
+ include Diametric::Persistence::Peer
145
+
146
+ attribute :name, String, :cardinality => :one, :unique => :identity, :doc => "A unique neighborhood name (upsertable)"
147
+ attribute :district, Ref, :cardinality => :one, :doc => "A neighborhood's district"
148
+ end
149
+
150
+ class District
151
+ include Diametric::Entity
152
+ include Diametric::Persistence::Peer
153
+
154
+ attribute :name, String, :cardinality => :one, :unique => :identity, :doc => "A unique district name (upsertable)"
155
+ attribute :region, Ref, :cardinality => :one, :doc => "A district region enum value"
156
+ enum :region, [:n, :ne, :e, :se, :s, :sw, :w, :nw]
157
+ end