neo4j 1.0.0.beta.21-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 (99) hide show
  1. data/CHANGELOG +141 -0
  2. data/CONTRIBUTORS +17 -0
  3. data/Gemfile +16 -0
  4. data/README.rdoc +135 -0
  5. data/lib/generators/neo4j.rb +65 -0
  6. data/lib/generators/neo4j/model/model_generator.rb +39 -0
  7. data/lib/generators/neo4j/model/templates/model.erb +7 -0
  8. data/lib/neo4j.rb +77 -0
  9. data/lib/neo4j/config.rb +153 -0
  10. data/lib/neo4j/database.rb +56 -0
  11. data/lib/neo4j/equal.rb +21 -0
  12. data/lib/neo4j/event_handler.rb +116 -0
  13. data/lib/neo4j/index/class_methods.rb +62 -0
  14. data/lib/neo4j/index/index.rb +33 -0
  15. data/lib/neo4j/index/indexer.rb +312 -0
  16. data/lib/neo4j/index/indexer_registry.rb +68 -0
  17. data/lib/neo4j/index/lucene_query.rb +191 -0
  18. data/lib/neo4j/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
  19. data/lib/neo4j/jars/lucene-core-3.0.2.jar +0 -0
  20. data/lib/neo4j/jars/neo4j-index-1.2-1.2.M03.jar +0 -0
  21. data/lib/neo4j/jars/neo4j-kernel-1.2-1.2.M03.jar +0 -0
  22. data/lib/neo4j/jars/neo4j-lucene-index-0.2-1.2.M03.jar +0 -0
  23. data/lib/neo4j/load.rb +21 -0
  24. data/lib/neo4j/mapping/class_methods/init_node.rb +50 -0
  25. data/lib/neo4j/mapping/class_methods/init_rel.rb +35 -0
  26. data/lib/neo4j/mapping/class_methods/list.rb +13 -0
  27. data/lib/neo4j/mapping/class_methods/property.rb +82 -0
  28. data/lib/neo4j/mapping/class_methods/relationship.rb +91 -0
  29. data/lib/neo4j/mapping/class_methods/rule.rb +295 -0
  30. data/lib/neo4j/mapping/decl_relationship_dsl.rb +214 -0
  31. data/lib/neo4j/mapping/has_list.rb +134 -0
  32. data/lib/neo4j/mapping/has_n.rb +83 -0
  33. data/lib/neo4j/mapping/node_mixin.rb +112 -0
  34. data/lib/neo4j/mapping/relationship_mixin.rb +120 -0
  35. data/lib/neo4j/model.rb +4 -0
  36. data/lib/neo4j/neo4j.rb +95 -0
  37. data/lib/neo4j/node.rb +131 -0
  38. data/lib/neo4j/node_mixin.rb +4 -0
  39. data/lib/neo4j/node_relationship.rb +149 -0
  40. data/lib/neo4j/node_traverser.rb +157 -0
  41. data/lib/neo4j/property.rb +111 -0
  42. data/lib/neo4j/rails/attributes.rb +155 -0
  43. data/lib/neo4j/rails/callbacks.rb +34 -0
  44. data/lib/neo4j/rails/finders.rb +134 -0
  45. data/lib/neo4j/rails/lucene_connection_closer.rb +19 -0
  46. data/lib/neo4j/rails/mapping/property.rb +60 -0
  47. data/lib/neo4j/rails/model.rb +105 -0
  48. data/lib/neo4j/rails/persistence.rb +260 -0
  49. data/lib/neo4j/rails/railtie.rb +21 -0
  50. data/lib/neo4j/rails/relationships/mapper.rb +96 -0
  51. data/lib/neo4j/rails/relationships/relationship.rb +30 -0
  52. data/lib/neo4j/rails/relationships/relationships.rb +60 -0
  53. data/lib/neo4j/rails/serialization.rb +25 -0
  54. data/lib/neo4j/rails/timestamps.rb +65 -0
  55. data/lib/neo4j/rails/transaction.rb +67 -0
  56. data/lib/neo4j/rails/tx_methods.rb +15 -0
  57. data/lib/neo4j/rails/validations.rb +38 -0
  58. data/lib/neo4j/rails/validations/non_nil.rb +11 -0
  59. data/lib/neo4j/rails/validations/uniqueness.rb +37 -0
  60. data/lib/neo4j/relationship.rb +169 -0
  61. data/lib/neo4j/relationship_mixin.rb +4 -0
  62. data/lib/neo4j/relationship_traverser.rb +92 -0
  63. data/lib/neo4j/to_java.rb +31 -0
  64. data/lib/neo4j/transaction.rb +68 -0
  65. data/lib/neo4j/type_converters.rb +117 -0
  66. data/lib/neo4j/version.rb +3 -0
  67. data/lib/orm_adapter/adapters/neo4j.rb +55 -0
  68. data/lib/tmp/neo4j/active_tx_log +1 -0
  69. data/lib/tmp/neo4j/index/lucene-store.db +0 -0
  70. data/lib/tmp/neo4j/index/lucene.log.active +0 -0
  71. data/lib/tmp/neo4j/lucene-fulltext/lucene-store.db +0 -0
  72. data/lib/tmp/neo4j/lucene-fulltext/lucene.log.active +0 -0
  73. data/lib/tmp/neo4j/lucene/lucene-store.db +0 -0
  74. data/lib/tmp/neo4j/lucene/lucene.log.active +0 -0
  75. data/lib/tmp/neo4j/messages.log +85 -0
  76. data/lib/tmp/neo4j/neostore +0 -0
  77. data/lib/tmp/neo4j/neostore.id +0 -0
  78. data/lib/tmp/neo4j/neostore.nodestore.db +0 -0
  79. data/lib/tmp/neo4j/neostore.nodestore.db.id +0 -0
  80. data/lib/tmp/neo4j/neostore.propertystore.db +0 -0
  81. data/lib/tmp/neo4j/neostore.propertystore.db.arrays +0 -0
  82. data/lib/tmp/neo4j/neostore.propertystore.db.arrays.id +0 -0
  83. data/lib/tmp/neo4j/neostore.propertystore.db.id +0 -0
  84. data/lib/tmp/neo4j/neostore.propertystore.db.index +0 -0
  85. data/lib/tmp/neo4j/neostore.propertystore.db.index.id +0 -0
  86. data/lib/tmp/neo4j/neostore.propertystore.db.index.keys +0 -0
  87. data/lib/tmp/neo4j/neostore.propertystore.db.index.keys.id +0 -0
  88. data/lib/tmp/neo4j/neostore.propertystore.db.strings +0 -0
  89. data/lib/tmp/neo4j/neostore.propertystore.db.strings.id +0 -0
  90. data/lib/tmp/neo4j/neostore.relationshipstore.db +0 -0
  91. data/lib/tmp/neo4j/neostore.relationshipstore.db.id +0 -0
  92. data/lib/tmp/neo4j/neostore.relationshiptypestore.db +0 -0
  93. data/lib/tmp/neo4j/neostore.relationshiptypestore.db.id +0 -0
  94. data/lib/tmp/neo4j/neostore.relationshiptypestore.db.names +0 -0
  95. data/lib/tmp/neo4j/neostore.relationshiptypestore.db.names.id +0 -0
  96. data/lib/tmp/neo4j/nioneo_logical.log.active +0 -0
  97. data/lib/tmp/neo4j/tm_tx_log.1 +0 -0
  98. data/neo4j.gemspec +31 -0
  99. metadata +216 -0
@@ -0,0 +1,153 @@
1
+
2
+ module Neo4j
3
+
4
+
5
+ # == Keeps configuration for neo4j
6
+ #
7
+ # The most important configuration is <tt>Neo4j::Config[:storage_path]</tt> which is used to
8
+ # locate where the neo4j database is stored on the filesystem.
9
+ # If this directory is empty then a new database will be created, otherwise it will use the
10
+ # database from that directory.
11
+ #
12
+ # ==== Default Configurations
13
+ # <tt>:storage_path</tt>:: default <tt>tmp/neo4j</tt> where the database is stored
14
+ # <tt>:timestamps</tt>:: default <tt>true</tt> for Rails Neo4j::Model - if timestamps should be used when saving the model
15
+ # <tt>:lucene</tt>:: default hash keys: <tt>:fulltext</tt>, <tt>:exact</tt> configuration how the lucene index is stored
16
+ # <tt>:converters</tt>:: defines which converters should be used before writing and reading to neo4j, see Neo4j::TypeConverters
17
+ #
18
+ class Config
19
+ # This code is copied from merb-core/config.rb.
20
+ class << self
21
+ # Returns the hash of default config values for neo4j
22
+ #
23
+ # ==== Returns
24
+ # Hash:: The defaults for the config.
25
+ def defaults
26
+ @defaults ||= {
27
+ :storage_path => 'tmp/neo4j',
28
+ :timestamps => true,
29
+
30
+ # TODO: Just pickup all converter classes that are in the Neo4j::TypeConverters module?
31
+ :converters => { Date => Neo4j::TypeConverters::DateConverter,
32
+ DateTime => Neo4j::TypeConverters::DateTimeConverter,
33
+ Time => Neo4j::TypeConverters::TimeConverter
34
+ },
35
+
36
+ :lucene => {
37
+ :fulltext => {"provider" => "lucene", "type" => "fulltext" },
38
+ :exact => {"provider" => "lucene", "type" => "exact" }}
39
+ }
40
+ end
41
+
42
+
43
+ # Yields the configuration.
44
+ #
45
+ # ==== Block parameters
46
+ # c :: The configuration parameters, a hash.
47
+ #
48
+ # ==== Examples
49
+ # Neo4j::Config.use do |config|
50
+ # config[:storage_path] = '/var/neo4j'
51
+ # end
52
+ #
53
+ # ==== Returns
54
+ # nil
55
+ def use
56
+ @configuration ||= {}
57
+ yield @configuration
58
+ nil
59
+ end
60
+
61
+
62
+ # Set the value of a config entry.
63
+ #
64
+ # ==== Parameters
65
+ # key :: The key to set the parameter for.
66
+ # val :: The value of the parameter.
67
+ #
68
+ def []=(key, val)
69
+ (@configuration ||= setup)[key] = val
70
+ end
71
+
72
+
73
+ # Gets the the value of a config entry
74
+ #
75
+ # ==== Parameters
76
+ # key:: The key of the config entry value we want
77
+ #
78
+ def [](key)
79
+ (@configuration ||= setup)[key]
80
+ end
81
+
82
+
83
+ # Remove the value of a config entry.
84
+ #
85
+ # ==== Parameters
86
+ # key<Object>:: The key of the parameter to delete.
87
+ #
88
+ # ==== Returns
89
+ # The value of the removed entry.
90
+ #
91
+ def delete(key)
92
+ @configuration.delete(key)
93
+ end
94
+
95
+
96
+ # Remove all configuration. This can be useful for testing purpose.
97
+ #
98
+ #
99
+ # ==== Returns
100
+ # nil
101
+ #
102
+ def delete_all
103
+ @configuration = nil
104
+ end
105
+
106
+
107
+ # Retrieve the value of a config entry, returning the provided default if the key is not present
108
+ #
109
+ # ==== Parameters
110
+ # key:: The key to retrieve the parameter for.
111
+ # default::The default value to return if the parameter is not set.
112
+ #
113
+ # ==== Returns
114
+ # The value of the configuration parameter or the default.
115
+ #
116
+ def fetch(key, default)
117
+ @configuration.fetch(key, default)
118
+ end
119
+
120
+ # Sets up the configuration
121
+ #
122
+ # ==== Returns
123
+ # The configuration as a hash.
124
+ #
125
+ def setup()
126
+ @configuration = {}
127
+ @configuration.merge!(defaults)
128
+ @configuration
129
+ end
130
+
131
+
132
+ # Returns the configuration as a hash.
133
+ #
134
+ # ==== Returns
135
+ # The config as a hash.
136
+ #
137
+ def to_hash
138
+ @configuration
139
+ end
140
+
141
+ # Returns the config as YAML.
142
+ #
143
+ # ==== Returns
144
+ # The config as YAML.
145
+ #
146
+ def to_yaml
147
+ require "yaml"
148
+ @configuration.to_yaml
149
+ end
150
+ end
151
+ end
152
+
153
+ end
@@ -0,0 +1,56 @@
1
+ module Neo4j
2
+ class Database #:nodoc:
3
+ attr_reader :graph, :lucene, :event_handler
4
+
5
+ def initialize()
6
+ @event_handler = EventHandler.new
7
+ end
8
+
9
+
10
+ def start
11
+ @graph = org.neo4j.kernel.EmbeddedGraphDatabase.new(Config[:storage_path])
12
+ @lucene = @graph.index #org.neo4j.index.impl.lucene.LuceneIndexProvider.new
13
+ @graph.register_transaction_event_handler(@event_handler)
14
+ @running = true
15
+ @event_handler.neo4j_started(self)
16
+ at_exit { shutdown }
17
+ end
18
+
19
+ def shutdown
20
+ if @running
21
+ @graph.unregister_transaction_event_handler(@event_handler)
22
+ @event_handler.neo4j_shutdown(self)
23
+ @graph.shutdown
24
+ @graph = nil
25
+ @lucene = nil
26
+ end
27
+
28
+ @running = false
29
+ end
30
+
31
+ def running?
32
+ @running
33
+ end
34
+
35
+ def begin_tx
36
+ @graph.begin_tx
37
+ end
38
+
39
+
40
+ def each_node
41
+ iter = @graph.all_nodes.iterator
42
+ while (iter.hasNext)
43
+ yield iter.next.wrapper
44
+ end
45
+ end
46
+
47
+ def _each_node
48
+ iter = @graph.all_nodes.iterator
49
+ while (iter.hasNext)
50
+ yield iter.next
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,21 @@
1
+ module Neo4j
2
+
3
+ # == This mixin is used for both nodes and relationships to decide if two entities are equal or not.
4
+ #
5
+ module Equal
6
+ def equal?(o)
7
+ eql?(o)
8
+ end
9
+
10
+ def eql?(o)
11
+ return false unless o.respond_to?(:getId)
12
+ o.getId == getId
13
+ end
14
+
15
+ def ==(o)
16
+ eql?(o)
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,116 @@
1
+ module Neo4j
2
+
3
+ # == Handles Transactional Events
4
+ #
5
+ # You can use this to receive event before the transaction commits.
6
+ # The following events are supported:
7
+ # * <tt>on_neo4j_started</tt>
8
+ # * <tt>on_neo4j_shutdown</tt>
9
+ # * <tt>on_node_created</tt>
10
+ # * <tt>on_node_deleted</tt>
11
+ # * <tt>on_relationship_created</tt>
12
+ # * <tt>on_relationship_deleted</tt>
13
+ # * <tt>on_property_changed</tt>
14
+ # * <tt>on_rel_property_changed</tt>
15
+ #
16
+ # === Usage
17
+ #
18
+ # class MyListener
19
+ # def on_node_deleted(node, old_props, tx_data)
20
+ # end
21
+ # end
22
+ #
23
+ # # to add an listener without starting neo4j:
24
+ # Neo4j.unstarted_db.event_handler.add(MyListener.new)
25
+ #
26
+ # You only need to implement the methods that you need.
27
+ #
28
+ class EventHandler
29
+ include org.neo4j.graphdb.event.TransactionEventHandler
30
+
31
+ def initialize
32
+ @listeners = []
33
+ end
34
+
35
+
36
+ def after_commit(data, state)
37
+ end
38
+
39
+ def after_rollback(data, state)
40
+ end
41
+
42
+ def before_commit(data)
43
+ data.created_nodes.each{|node| node_created(node)}
44
+ data.assigned_node_properties.each { |tx_data| property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, tx_data.value) }
45
+ data.removed_node_properties.each { |tx_data| property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, nil) unless data.deleted_nodes.include?(tx_data.entity) }
46
+ data.deleted_nodes.each { |node| node_deleted(node, deleted_properties_for(node,data), data)}
47
+ data.created_relationships.each {|rel| relationship_created(rel, data)}
48
+ data.deleted_relationships.each {|rel| relationship_deleted(rel, deleted_rel_properties_for(rel, data), data)}
49
+ data.assigned_relationship_properties.each { |tx_data| rel_property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, tx_data.value) }
50
+ data.removed_relationship_properties.each {|tx_data| rel_property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, nil) unless data.deleted_relationships.include?(tx_data.entity) }
51
+ end
52
+
53
+ def deleted_properties_for(node, data)
54
+ data.removed_node_properties.find_all{|tx_data| tx_data.entity == node}.inject({}) do |memo, tx_data|
55
+ memo[tx_data.key] = tx_data.previously_commited_value
56
+ memo
57
+ end
58
+ end
59
+
60
+ def deleted_rel_properties_for(rel, data)
61
+ data.removed_relationship_properties.find_all{|tx_data| tx_data.entity == rel}.inject({}) do |memo, tx_data|
62
+ memo[tx_data.key] = tx_data.previously_commited_value
63
+ memo
64
+ end
65
+ end
66
+
67
+ def add(listener)
68
+ @listeners << listener unless @listeners.include?(listener)
69
+ end
70
+
71
+ def remove(listener)
72
+ @listeners.delete(listener)
73
+ end
74
+
75
+ def remove_all
76
+ @listeners = []
77
+ end
78
+
79
+ def print
80
+ puts "Listeners #{@listeners.size}"
81
+ @listeners.each {|li| puts " Listener '#{li}'"}
82
+ end
83
+
84
+ def neo4j_started(db)
85
+ @listeners.each { |li| li.on_neo4j_started(db) if li.respond_to?(:on_neo4j_started) }
86
+ end
87
+
88
+ def neo4j_shutdown(db)
89
+ @listeners.each { |li| li.on_neo4j_shutdown(db) if li.respond_to?(:on_neo4j_shutdown) }
90
+ end
91
+
92
+ def node_created(node)
93
+ @listeners.each {|li| li.on_node_created(node) if li.respond_to?(:on_node_created)}
94
+ end
95
+
96
+ def node_deleted(node,old_properties, data)
97
+ @listeners.each {|li| li.on_node_deleted(node,old_properties, data) if li.respond_to?(:on_node_deleted)}
98
+ end
99
+
100
+ def relationship_created(relationship, tx_data)
101
+ @listeners.each {|li| li.on_relationship_created(relationship, tx_data) if li.respond_to?(:on_relationship_created)}
102
+ end
103
+
104
+ def relationship_deleted(relationship, old_props, data)
105
+ @listeners.each {|li| li.on_relationship_deleted(relationship, old_props, data) if li.respond_to?(:on_relationship_deleted)}
106
+ end
107
+
108
+ def property_changed(node, key, old_value, new_value)
109
+ @listeners.each {|li| li.on_property_changed(node, key, old_value, new_value) if li.respond_to?(:on_property_changed)}
110
+ end
111
+
112
+ def rel_property_changed(rel, key, old_value, new_value)
113
+ @listeners.each {|li| li.on_rel_property_changed(rel, key, old_value, new_value) if li.respond_to?(:on_rel_property_changed)}
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,62 @@
1
+ module Neo4j
2
+ module Index
3
+ module ClassMethods
4
+ attr_reader :_indexer
5
+
6
+ extend Forwardable
7
+
8
+ ##
9
+ # See Neo4j::Index::Indexer#index
10
+ # Forwards to the indexer that should be used.
11
+ # It is possible to share the same index for several different classes, see #node_indexer.
12
+ # :singleton-method: index
13
+
14
+ ##
15
+ # See Neo4j::Index::Indexer#find
16
+ # Forwards to the indexer that should be used.
17
+ # It is possible to share the same index for several different classes, see #node_indexer.
18
+ # :singleton-method: find
19
+
20
+
21
+ def_delegators :@_indexer, :index, :find, :index?, :index_type?, :delete_index_type, :rm_field_type, :add_index, :rm_index, :index_type_for, :index_name
22
+
23
+
24
+ # Sets which indexer should be used for the given node class.
25
+ # You can share an indexer between several different classes.
26
+ #
27
+ # ==== Example
28
+ # class Contact
29
+ # include Neo4j::NodeMixin
30
+ # index :name
31
+ # has_one :phone
32
+ # end
33
+ #
34
+ # class Phone
35
+ # include Neo4j::NodeMixin
36
+ # property :phone
37
+ # node_indexer Contact # put index on the Contact class instead
38
+ # index :phone
39
+ # end
40
+ #
41
+ # # Find an contact with a phone number, this works since they share the same index
42
+ # Contact.find('phone: 12345').first #=> a phone object !
43
+ #
44
+ # ==== Returns
45
+ # The indexer that should be used to index the given class
46
+ def node_indexer(clazz)
47
+ indexer(clazz, :node)
48
+ end
49
+
50
+ # Sets which indexer should be used for the given relationship class
51
+ # Same as #node_indexer except that it indexes relationships instead of nodes.
52
+ #
53
+ def rel_indexer(clazz)
54
+ indexer(clazz, :rel)
55
+ end
56
+
57
+ def indexer(clazz, type) #:nodoc:
58
+ @_indexer = IndexerRegistry.create_for(self, clazz, type)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,33 @@
1
+ module Neo4j
2
+
3
+ module Index
4
+
5
+ # Adds an index on the given property
6
+ # Notice that you normally don't have to do that since you simply can declare
7
+ # that the property and index should be updated automatically by using the class method #index.
8
+ #
9
+ # The index operation will take place immediately unlike when using the Neo4j::Index::ClassMethods::index
10
+ # method which instead will guarantee that the neo4j database and the lucene database will be consistent.
11
+ # It uses a two phase commit when the transaction is about to be committed.
12
+ #
13
+ # ==== See also
14
+ # Neo4j::Index::ClassMethods::index
15
+ #
16
+ def add_index(field, value=self[field])
17
+ self.class.add_index(wrapped_entity, field.to_s, value)
18
+ end
19
+
20
+ # Removes an index on the given property.
21
+ # Just like #add_index this is normally not needed since you instead can declare it with the
22
+ # #index class method instead.
23
+ #
24
+ # ==== See also
25
+ # Neo4j::Index::ClassMethods::index
26
+ # Neo4j::Index#add_index
27
+ #
28
+ def rm_index(field, value=self[field])
29
+ self.class.rm_index(wrapped_entity, field.to_s, value)
30
+ end
31
+
32
+ end
33
+ end