neo4j 1.2.6-java → 1.3.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/CHANGELOG +16 -0
  2. data/README.rdoc +11 -0
  3. data/bin/neo4j-upgrade +72 -0
  4. data/lib/neo4j.rb +18 -19
  5. data/lib/neo4j/algo/algo.rb +2 -1
  6. data/lib/neo4j/database.rb +12 -0
  7. data/lib/neo4j/event_handler.rb +69 -7
  8. data/lib/neo4j/has_list/class_methods.rb +1 -1
  9. data/lib/neo4j/has_list/mapping.rb +13 -16
  10. data/lib/neo4j/index/class_methods.rb +9 -3
  11. data/lib/neo4j/index/index.rb +2 -1
  12. data/lib/neo4j/index/indexer.rb +3 -2
  13. data/lib/neo4j/index/indexer_registry.rb +1 -1
  14. data/lib/neo4j/jars/core/neo4j-community-1.5.jar +0 -0
  15. data/lib/neo4j/jars/core/neo4j-cypher-1.5.jar +0 -0
  16. data/lib/neo4j/jars/core/{neo4j-graph-algo-1.4.1.jar → neo4j-graph-algo-1.5.jar} +0 -0
  17. data/lib/neo4j/jars/core/neo4j-graph-matching-1.5.jar +0 -0
  18. data/lib/neo4j/jars/core/neo4j-jmx-1.5.jar +0 -0
  19. data/lib/neo4j/jars/core/neo4j-kernel-1.5.jar +0 -0
  20. data/lib/neo4j/jars/core/{neo4j-lucene-index-1.4.1.jar → neo4j-lucene-index-1.5.jar} +0 -0
  21. data/lib/neo4j/jars/{ha/neo4j-shell-1.4.1.jar → core/neo4j-shell-1.5.jar} +0 -0
  22. data/lib/neo4j/jars/core/neo4j-udc-1.5.jar +0 -0
  23. data/lib/neo4j/jars/{ha → core}/org.apache.servicemix.bundles.jline-0.9.94_1.jar +0 -0
  24. data/lib/neo4j/jars/core/scala-library-2.9.0-1.jar +0 -0
  25. data/lib/neo4j/jars/core/server-api-1.5.jar +0 -0
  26. data/lib/neo4j/jars/ha/neo4j-backup-1.5.jar +0 -0
  27. data/lib/neo4j/jars/ha/neo4j-com-1.5.jar +0 -0
  28. data/lib/neo4j/jars/ha/neo4j-enterprise-1.5.jar +0 -0
  29. data/lib/neo4j/jars/ha/neo4j-ha-1.5.jar +0 -0
  30. data/lib/neo4j/jars/ha/neo4j-management-1.5.jar +0 -0
  31. data/lib/neo4j/jars/ha/org.apache.servicemix.bundles.netty-3.2.5.Final_1.jar +0 -0
  32. data/lib/neo4j/jars/ha/slf4j-api-1.6.1.jar +0 -0
  33. data/lib/neo4j/neo4j.rb +16 -0
  34. data/lib/neo4j/node_mixin/node_mixin.rb +2 -2
  35. data/lib/neo4j/rails/attributes.rb +9 -5
  36. data/lib/neo4j/rails/compositions.rb +9 -1
  37. data/lib/neo4j/rails/mapping/property.rb +27 -25
  38. data/lib/neo4j/rails/model.rb +1 -0
  39. data/lib/neo4j/rails/persistence.rb +56 -56
  40. data/lib/neo4j/rails/rel_persistence.rb +1 -1
  41. data/lib/neo4j/rails/relationship.rb +9 -4
  42. data/lib/neo4j/rails/relationships/relationships.rb +6 -2
  43. data/lib/neo4j/rails/relationships/rels_dsl.rb +58 -0
  44. data/lib/neo4j/rails/relationships/storage.rb +10 -1
  45. data/lib/neo4j/rails/validations/uniqueness.rb +1 -0
  46. data/lib/neo4j/rails/versioning/versioning.rb +64 -9
  47. data/lib/neo4j/rule/event_listener.rb +7 -1
  48. data/lib/neo4j/rule/functions/count.rb +6 -0
  49. data/lib/neo4j/rule/rule.rb +20 -5
  50. data/lib/neo4j/rule/rule_node.rb +31 -19
  51. data/lib/neo4j/traversal/traverser.rb +38 -0
  52. data/lib/neo4j/version.rb +1 -1
  53. data/neo4j.gemspec +1 -1
  54. metadata +24 -17
  55. data/lib/neo4j/jars/core/neo4j-backup-1.4.1.jar +0 -0
  56. data/lib/neo4j/jars/core/neo4j-index-1.3-1.3.M01.jar +0 -0
  57. data/lib/neo4j/jars/core/neo4j-kernel-1.4.1.jar +0 -0
  58. data/lib/neo4j/jars/ha/neo4j-com-1.4.1.jar +0 -0
  59. data/lib/neo4j/jars/ha/neo4j-ha-1.4.1.jar +0 -0
  60. data/lib/neo4j/jars/ha/neo4j-jmx-1.4.1.jar +0 -0
  61. data/lib/neo4j/jars/ha/neo4j-management-1.4.1.jar +0 -0
  62. data/lib/neo4j/jars/ha/netty-3.2.1.Final.jar +0 -0
@@ -19,7 +19,8 @@ module Neo4j
19
19
  # Neo4j::Index::ClassMethods::index
20
20
  #
21
21
  def add_index(field, value=self[field])
22
- self.class.add_index(wrapped_entity, field.to_s, value)
22
+ converted_value = Neo4j::TypeConverters.convert(value, field, self.class)
23
+ self.class.add_index(wrapped_entity, field.to_s, converted_value)
23
24
  end
24
25
 
25
26
  # Removes an index on the given property.
@@ -2,6 +2,7 @@ module Neo4j
2
2
  module Index
3
3
  class Indexer
4
4
  attr_reader :indexer_for, :field_types, :via_relationships, :entity_type, :parent_indexers, :via_relationships
5
+ alias_method :index_types, :field_types # public method accessible from node.index_types
5
6
 
6
7
  def initialize(clazz, type) #:nodoc:
7
8
  # part of the unique name of the index
@@ -155,7 +156,7 @@ module Neo4j
155
156
  end
156
157
 
157
158
  def update_single_index_on(node, field, old_val, new_val) #:nodoc:
158
- if @field_types.include?(field)
159
+ if @field_types.has_key?(field)
159
160
  rm_index(node, field, old_val) if old_val
160
161
  add_index(node, field, new_val) if new_val
161
162
  end
@@ -322,7 +323,7 @@ module Neo4j
322
323
  def index_names
323
324
  @index_names ||= Hash.new do |hash, index_type|
324
325
  default_filename = index_prefix + @indexer_for.to_s.gsub('::', '_')
325
- hash.fetch(index_type) {"#{default_filename}-#{index_type}"}
326
+ hash.fetch(index_type) {"#{default_filename}_#{index_type}"}
326
327
  end
327
328
  end
328
329
 
@@ -10,7 +10,7 @@ module Neo4j
10
10
  def create_for(this_clazz, using_other_clazz, type)
11
11
  @@indexers ||= {}
12
12
  index = Indexer.new(this_clazz, type)
13
- index.inherit_fields_from(@@indexers[using_other_clazz.to_s])
13
+ index.inherit_fields_from(@@indexers[using_other_clazz.to_s]) if @@indexers[using_other_clazz.to_s]
14
14
  @@indexers[this_clazz.to_s] = index
15
15
  end
16
16
 
@@ -71,6 +71,22 @@ module Neo4j
71
71
  Neo4j::Config
72
72
  end
73
73
 
74
+ # Executes a Cypher Query
75
+ # Check the neo4j http://docs.neo4j.org/chunked/milestone/cypher-query-lang.html
76
+ # Returns an enumerable of hash values.
77
+ #
78
+ # === Usage
79
+ #
80
+ # q = Neo4j.query("START n=node({node}) RETURN n", 'node' => @node.neo_id)
81
+ # q.first['n'] #=> the @node
82
+ # q.columns.first => 'n'
83
+ #
84
+ def query(query, params = {})
85
+ engine = org.neo4j.cypher.javacompat.ExecutionEngine.new(db)
86
+ engine.execute(query, params)
87
+ end
88
+
89
+
74
90
  # Returns the logger used by neo4j.
75
91
  # If not specified (with Neo4j.logger=) it will use the standard Ruby logger.
76
92
  # You can change standard logger threshold by configuration :logger_level.
@@ -80,7 +80,7 @@ module Neo4j
80
80
  def _java_entity
81
81
  @_java_node
82
82
  end
83
-
83
+
84
84
  # Trigger rules.
85
85
  # You don't normally need to call this method (except in Migration) since
86
86
  # it will be triggered automatically by the Neo4j::Rule::Rule
@@ -131,7 +131,7 @@ module Neo4j
131
131
  super
132
132
  end
133
133
 
134
- c.node_indexer c
134
+ c.node_indexer c unless c == Neo4j::Rails::Model
135
135
  end
136
136
  end
137
137
  end
@@ -201,8 +201,8 @@ module Neo4j
201
201
  # Known properties are either in the @properties, the declared
202
202
  # properties or the property keys for the persisted node
203
203
  def property?(name)
204
- @properties.keys.include?(name) ||
205
- self.class._decl_props.map { |k| k.to_s }.include?(name) ||
204
+ @properties.has_key?(name) ||
205
+ self.class._decl_props.has_key?(name) ||
206
206
  begin
207
207
  persisted? && super
208
208
  rescue org.neo4j.graphdb.NotFoundException
@@ -216,9 +216,13 @@ module Neo4j
216
216
  def attribute?(name)
217
217
  name[0] != ?_ && property?(name)
218
218
  end
219
-
219
+
220
220
  def _classname
221
- self[:_classname]
221
+ self.class.to_s
222
+ end
223
+
224
+ def _classname=(value)
225
+ write_local_property_without_type_conversion("_classname",value)
222
226
  end
223
227
 
224
228
  # To get ActiveModel::Dirty to work, we need to be able to call undeclared
@@ -248,7 +252,7 @@ module Neo4j
248
252
 
249
253
  # Wrap the setter in a conversion from Ruby to Java
250
254
  def write_local_property_with_type_conversion(property, value)
251
- self.send("#{property}_before_type_cast=", value) if respond_to?("#{property}_before_type_cast=")
255
+ @properties_before_type_cast[property.to_sym]=value if self.class._decl_props.has_key? property.to_sym
252
256
  write_local_property_without_type_conversion(property, Neo4j::TypeConverters.to_java(self.class, property, value))
253
257
  end
254
258
  end
@@ -206,6 +206,14 @@ module Neo4j
206
206
  # :constructor => Proc.new { |ip| IPAddr.new(ip, Socket::AF_INET) },
207
207
  # :converter => Proc.new { |ip| ip.is_a?(Integer) ? IPAddr.new(ip, Socket::AF_INET) : IPAddr.new(ip.to_s) }
208
208
  #
209
+ def is_composed_property?(property)
210
+ composed_properties.contains(property)
211
+ end
212
+
213
+ def composed_properties
214
+ @composed_properties ||= java.util.HashSet.new
215
+ end
216
+
209
217
  def composed_of(part_id, options = {})
210
218
  options.assert_valid_keys(:class_name, :mapping, :allow_nil, :constructor, :converter)
211
219
 
@@ -216,7 +224,7 @@ module Neo4j
216
224
  allow_nil = options[:allow_nil] || false
217
225
  constructor = options[:constructor] || :new
218
226
  converter = options[:converter]
219
-
227
+ composed_properties.add(name.to_sym)
220
228
  reader_method(name, class_name, mapping, allow_nil, constructor)
221
229
  writer_method(name, class_name, mapping, allow_nil, converter)
222
230
  end
@@ -106,10 +106,10 @@ module Neo4j
106
106
 
107
107
  # Handles options for the property
108
108
  #
109
- # Set the property type :type => Time
110
- # Set a default :default => "default"
111
- # Property must be there :null => false
112
- # Property has a length limit :limit => 128
109
+ # Set the property type :type => Time
110
+ # Set a default :default => "default"
111
+ # Property must be there :null => false
112
+ # Property has a length limit :limit => 128
113
113
  def property(*args)
114
114
  options = args.extract_options!
115
115
  args.each do |property_sym|
@@ -132,39 +132,41 @@ module Neo4j
132
132
  validates(property, :non_nil => true, :on => :create)
133
133
  validates(property, :non_nil => true, :on => :update)
134
134
  end
135
- validates(property, :length => { :maximum => options[:limit] }) if options[:limit]
136
- end
137
-
138
- def define_property_methods_for(property, options)
139
- unless method_defined?(property)
140
- class_eval <<-RUBY, __FILE__, __LINE__
141
- def #{property}
142
- send(:[], "#{property}")
143
- end
135
+ validates(property, :length => { :maximum => options[:limit] }) if options[:limit]
136
+ end
137
+
138
+ def define_property_methods_for(property, options)
139
+ unless method_defined?(property)
140
+ class_eval <<-RUBY, __FILE__, __LINE__
141
+ def #{property}
142
+ send(:[], "#{property}")
143
+ end
144
144
  RUBY
145
145
  end
146
146
 
147
147
  unless method_defined?("#{property}=".to_sym)
148
148
  class_eval <<-RUBY, __FILE__, __LINE__
149
- def #{property}=(value)
150
- send(:[]=, "#{property}", value)
151
- end
152
- RUBY
153
- end
154
- end
149
+ def #{property}=(value)
150
+ send(:[]=, "#{property}", value)
151
+ end
152
+ RUBY
153
+ end
154
+ end
155
155
 
156
156
  def define_property_before_type_cast_methods_for(property, options)
157
157
  property_before_type_cast = "#{property}_before_type_cast"
158
158
  class_eval <<-RUBY, __FILE__, __LINE__
159
- attr_writer :#{property_before_type_cast}
159
+ def #{property_before_type_cast}=(value)
160
+ @properties_before_type_cast[:#{property}]=value
161
+ end
160
162
 
161
163
  def #{property_before_type_cast}
162
- instance_variable_defined?(:@#{property_before_type_cast}) ? @#{property_before_type_cast} : self.#{property}
164
+ @properties_before_type_cast.has_key?(:#{property}) ? @properties_before_type_cast[:#{property}] : self.#{property}
163
165
  end
164
166
  RUBY
165
167
  end
166
- end
167
- end
168
- end
169
- end
168
+ end
169
+ end
170
+ end
171
+ end
170
172
  end
@@ -48,6 +48,7 @@ module Neo4j
48
48
 
49
49
  # Initialize a Node with a set of properties (or empty if nothing is passed)
50
50
  def initialize(attributes = {})
51
+ @properties_before_type_cast=java.util.HashMap.new
51
52
  reset_attributes
52
53
  clear_relationships
53
54
  self.attributes = attributes if attributes.is_a?(Hash)
@@ -1,62 +1,62 @@
1
1
  module Neo4j
2
- module Rails
3
- module Persistence
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- extend TxMethods
8
- tx_methods :destroy, :create, :update, :update_nested_attributes, :delete, :update_attributes, :update_attributes!
9
- end
10
-
11
- # Persist the object to the database. Validations and Callbacks are included
12
- # by default but validation can be disabled by passing :validate => false
13
- # to #save.
2
+ module Rails
3
+ module Persistence
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ extend TxMethods
8
+ tx_methods :destroy, :create, :update, :update_nested_attributes, :delete, :update_attributes, :update_attributes!
9
+ end
10
+
11
+ # Persist the object to the database. Validations and Callbacks are included
12
+ # by default but validation can be disabled by passing :validate => false
13
+ # to #save.
14
14
  def save(*)
15
- create_or_update
15
+ create_or_update
16
16
  end
17
17
 
18
18
  # Persist the object to the database. Validations and Callbacks are included
19
- # by default but validation can be disabled by passing :validate => false
20
- # to #save!.
21
- #
22
- # Raises a RecordInvalidError if there is a problem during save.
19
+ # by default but validation can be disabled by passing :validate => false
20
+ # to #save!.
21
+ #
22
+ # Raises a RecordInvalidError if there is a problem during save.
23
23
  def save!(*args)
24
- unless save(*args)
25
- raise RecordInvalidError.new(self)
26
- end
27
- end
28
-
29
- # Updates a single attribute and saves the record.
30
- # This is especially useful for boolean flags on existing records. Also note that
31
- #
32
- # * Validation is skipped.
33
- # * Callbacks are invoked.
34
- # * Updates all the attributes that are dirty in this object.
35
- #
36
- def update_attribute(name, value)
37
- respond_to?("#{name}=") ? send("#{name}=", value) : self[name] = value
38
- save(:validate => false)
39
- end
40
-
41
- # Removes the node from Neo4j and freezes the object.
42
- def destroy
43
- delete
44
- freeze
45
- end
46
-
47
- # Same as #destroy but doesn't run destroy callbacks and doesn't freeze
48
- # the object
49
- def delete
50
- del unless new_record?
51
- set_deleted_properties
52
- end
53
-
54
- # Returns true if the object was destroyed.
55
- def destroyed?()
24
+ unless save(*args)
25
+ raise RecordInvalidError.new(self)
26
+ end
27
+ end
28
+
29
+ # Updates a single attribute and saves the record.
30
+ # This is especially useful for boolean flags on existing records. Also note that
31
+ #
32
+ # * Validation is skipped.
33
+ # * Callbacks are invoked.
34
+ # * Updates all the attributes that are dirty in this object.
35
+ #
36
+ def update_attribute(name, value)
37
+ respond_to?("#{name}=") ? send("#{name}=", value) : self[name] = value
38
+ save(:validate => false)
39
+ end
40
+
41
+ # Removes the node from Neo4j and freezes the object.
42
+ def destroy
43
+ delete
44
+ freeze
45
+ end
46
+
47
+ # Same as #destroy but doesn't run destroy callbacks and doesn't freeze
48
+ # the object
49
+ def delete
50
+ del unless new_record?
51
+ set_deleted_properties
52
+ end
53
+
54
+ # Returns true if the object was destroyed.
55
+ def destroyed?()
56
56
  @_deleted || Neo4j::Node._load(id).nil?
57
57
  end
58
58
 
59
- # Updates this resource with all the attributes from the passed-in Hash and requests that the record be saved.
59
+ # Updates this resource with all the attributes from the passed-in Hash and requests that the record be saved.
60
60
  # If saving fails because the resource is invalid then false will be returned.
61
61
  def update_attributes(attributes)
62
62
  self.attributes = attributes
@@ -95,9 +95,9 @@ module Neo4j
95
95
  alias :new? :new_record?
96
96
 
97
97
  # Freeze the properties hash.
98
- def freeze
99
- @properties.freeze; self
100
- end
98
+ def freeze
99
+ @properties.freeze; self
100
+ end
101
101
 
102
102
  # Returns +true+ if the properties hash has been frozen.
103
103
  def frozen?
@@ -162,7 +162,7 @@ module Neo4j
162
162
  end
163
163
 
164
164
  def init_on_create(*)
165
- self["_classname"] = self.class.to_s
165
+ self._classname = self.class.to_s
166
166
  write_default_attributes
167
167
  write_changed_attributes
168
168
  write_changed_relationships
@@ -262,7 +262,7 @@ module Neo4j
262
262
  super(@record.errors.full_messages.join(", "))
263
263
  end
264
264
  end
265
- end
266
- end
265
+ end
266
+ end
267
267
  end
268
268
 
@@ -161,7 +161,7 @@ module Neo4j
161
161
  Neo4j::IdentityMap.add(@_java_rel, self)
162
162
  init_on_create
163
163
  clear_changes
164
- end unless @end_node.nil?
164
+ end unless @end_node.nil? or @start_node.nil?
165
165
  true
166
166
  end
167
167
 
@@ -21,7 +21,8 @@ module Neo4j
21
21
 
22
22
  # Initialize a Node with a set of properties (or empty if nothing is passed)
23
23
  def initialize(*args)
24
- @type = args[0]
24
+ @properties_before_type_cast=java.util.HashMap.new
25
+ @type = args[0].to_s
25
26
  self.start_node = args[1]
26
27
  self.end_node = args[2]
27
28
  attributes = args[3]
@@ -39,11 +40,15 @@ module Neo4j
39
40
 
40
41
 
41
42
  alias_method :get_other_node, :other_node # so it looks like the java version
42
-
43
+
44
+ def rel_type
45
+ persisted? ? _java_entity.rel_type : @type
46
+ end
47
+
43
48
  def to_s
44
49
  "id: #{self.object_id} start_node: #{start_node.id} end_node: #{end_node.id} type:#{@type}"
45
50
  end
46
-
51
+
47
52
  def id
48
53
  _java_rel.nil? || neo_id.nil? ? nil : neo_id.to_s
49
54
  end
@@ -111,7 +116,7 @@ module Neo4j
111
116
  def _all
112
117
  _indexer.find(:_classname => self)
113
118
  end
114
-
119
+
115
120
  def load(*ids) # TODO Copied from finders.rb
116
121
  result = ids.map { |id| entity_load(id) }
117
122
  if ids.length == 1