neo4j-wrapper 0.0.9-java → 0.0.10-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.
- data/lib/neo4j/type_converters/type_converters.rb +6 -6
- data/lib/neo4j-wrapper/has_n/class_methods.rb +5 -2
- data/lib/neo4j-wrapper/has_n/decl_rel.rb +42 -24
- data/lib/neo4j-wrapper/node_mixin/class_methods.rb +32 -0
- data/lib/neo4j-wrapper/version.rb +1 -1
- data/neo4j-wrapper.gemspec +1 -1
- metadata +3 -3
@@ -115,12 +115,12 @@ module Neo4j
|
|
115
115
|
|
116
116
|
def to_java(value)
|
117
117
|
return nil if value.nil?
|
118
|
-
value.to_s
|
118
|
+
Array === value ? value.map(&:to_s) : value.to_s
|
119
119
|
end
|
120
120
|
|
121
121
|
def to_ruby(value)
|
122
122
|
return nil if value.nil?
|
123
|
-
value
|
123
|
+
value
|
124
124
|
end
|
125
125
|
|
126
126
|
def index_as
|
@@ -141,12 +141,12 @@ module Neo4j
|
|
141
141
|
|
142
142
|
def to_java(value)
|
143
143
|
return nil if value.nil?
|
144
|
-
value.to_i
|
144
|
+
Array === value ? value.map(&:to_i) : value.to_i
|
145
145
|
end
|
146
146
|
|
147
147
|
def to_ruby(value)
|
148
148
|
return nil if value.nil?
|
149
|
-
value
|
149
|
+
value#.to_i
|
150
150
|
end
|
151
151
|
|
152
152
|
def index_as
|
@@ -165,12 +165,12 @@ module Neo4j
|
|
165
165
|
|
166
166
|
def to_java(value)
|
167
167
|
return nil if value.nil?
|
168
|
-
value.to_f
|
168
|
+
Array === value ? value.map(&:to_f) : value.to_f
|
169
169
|
end
|
170
170
|
|
171
171
|
def to_ruby(value)
|
172
172
|
return nil if value.nil?
|
173
|
-
value
|
173
|
+
value
|
174
174
|
end
|
175
175
|
|
176
176
|
def index_as
|
@@ -41,6 +41,7 @@ module Neo4j
|
|
41
41
|
# class FolderNode
|
42
42
|
# include Ne4j::NodeMixin
|
43
43
|
# has_n(:files).to(File)
|
44
|
+
# # Same as has_n(:files).to("File")
|
44
45
|
# end
|
45
46
|
#
|
46
47
|
# FolderNode.files #=> 'File#files' the name of the relationship
|
@@ -50,6 +51,8 @@ module Neo4j
|
|
50
51
|
# # generate accessor method for traversing and adding relationship on incoming nodes.
|
51
52
|
# class FileNode
|
52
53
|
# include Ne4j::NodeMixin
|
54
|
+
# has_one(:folder).from(FolderNode.files)
|
55
|
+
# # or same as
|
53
56
|
# has_one(:folder).from(FolderNode, :files)
|
54
57
|
# end
|
55
58
|
#
|
@@ -79,7 +82,7 @@ module Neo4j
|
|
79
82
|
|
80
83
|
instance_eval(%Q{
|
81
84
|
def #{rel_type}
|
82
|
-
_decl_rels[:#{rel_type}].rel_type
|
85
|
+
_decl_rels[:#{rel_type}].rel_type
|
83
86
|
end}, __FILE__, __LINE__)
|
84
87
|
|
85
88
|
_decl_rels[rel_type.to_sym] = DeclRel.new(rel_type, false, clazz)
|
@@ -125,7 +128,7 @@ module Neo4j
|
|
125
128
|
|
126
129
|
instance_eval(%Q{
|
127
130
|
def #{rel_type}
|
128
|
-
_decl_rels[:#{rel_type}].rel_type
|
131
|
+
_decl_rels[:#{rel_type}].rel_type
|
129
132
|
end}, __FILE__, __LINE__)
|
130
133
|
|
131
134
|
_decl_rels[rel_type.to_sym] = DeclRel.new(rel_type, true, clazz)
|
@@ -33,30 +33,30 @@ module Neo4j
|
|
33
33
|
# <b>File#folder</b> :: for accessing nodes from relationship 'files' from the outgoing Folder node
|
34
34
|
#
|
35
35
|
class DeclRel
|
36
|
-
attr_reader :
|
36
|
+
attr_reader :source_class, :dir, :rel_type
|
37
37
|
|
38
|
-
def initialize(method_id, has_one,
|
38
|
+
def initialize(method_id, has_one, source_class)
|
39
39
|
@method_id = method_id
|
40
40
|
@has_one = has_one
|
41
|
-
@target_class = target_class
|
42
41
|
@dir = :outgoing
|
43
|
-
@rel_type = method_id.
|
44
|
-
@source_class =
|
42
|
+
@rel_type = method_id.to_sym
|
43
|
+
@source_class = source_class
|
45
44
|
end
|
46
45
|
|
47
46
|
def inherit_new
|
48
47
|
base = self
|
49
|
-
dr = DeclRel.new(@method_id, @has_one, @
|
48
|
+
dr = DeclRel.new(@method_id, @has_one, @source_class)
|
50
49
|
dr.instance_eval do
|
51
50
|
@dir = base.dir
|
52
51
|
@rel_type = base.rel_type
|
52
|
+
@target_name = base.target_name if base.target_name
|
53
53
|
@source_class = base.source_class
|
54
54
|
end
|
55
55
|
dr
|
56
56
|
end
|
57
57
|
|
58
58
|
def to_s
|
59
|
-
"DeclRel #{object_id} dir: #{@dir} rel_id: #{@method_id}, rel_type: #{@rel_type}, target_class:#{@
|
59
|
+
"DeclRel #{object_id} dir: #{@dir} rel_id: #{@method_id}, rel_type: #{@rel_type}, target_class:#{@target_name} rel_class:#{@relationship}"
|
60
60
|
end
|
61
61
|
|
62
62
|
# @return [true, false]
|
@@ -75,13 +75,15 @@ module Neo4j
|
|
75
75
|
end
|
76
76
|
|
77
77
|
|
78
|
-
#
|
79
|
-
#
|
78
|
+
# Declares an outgoing relationship type.
|
79
|
+
# It is possible to prefix relationship types so that it's possible to distinguish different incoming relationships.
|
80
|
+
# There is no validation that the added node is of the specified class.
|
80
81
|
#
|
81
82
|
# @example Example
|
82
83
|
# class FolderNode
|
83
84
|
# include Neo4j::NodeMixin
|
84
85
|
# has_n(:files).to(FileNode)
|
86
|
+
# has_one(:root).to("FileSystem") # also possible, if the class is not defined yet
|
85
87
|
# end
|
86
88
|
#
|
87
89
|
# folder = FolderNode.new
|
@@ -99,18 +101,20 @@ module Neo4j
|
|
99
101
|
# # create an outgoing relationship of type 'contains' from folder node to file
|
100
102
|
# folder.files << FolderNode.new
|
101
103
|
#
|
102
|
-
# @param [Class] target the other class to which this relationship goes
|
104
|
+
# @param [Class, String, Symbol] target the other class to which this relationship goes (if String or Class) or the relationship (if Symbol)
|
105
|
+
# @param [Class, String, Symbol] rel_type the rel_type postfix for the relationships, which defaults to the same as the has_n/one method id
|
103
106
|
# @return self
|
104
|
-
def to(target)
|
107
|
+
def to(target, rel_type = @method_id)
|
105
108
|
@dir = :outgoing
|
106
109
|
|
107
|
-
if Class === target
|
110
|
+
if Class === target || String === target
|
108
111
|
# handle e.g. has_n(:friends).to(class)
|
109
|
-
@
|
110
|
-
@rel_type = "#{@source_class}##{
|
112
|
+
@target_name = target
|
113
|
+
@rel_type = "#{@source_class}##{rel_type}".to_sym
|
111
114
|
elsif Symbol === target
|
112
|
-
# handle e.g. has_n(:friends).to(:knows)
|
113
|
-
@
|
115
|
+
# handle e.g. has_n(:friends).to(:knows) or to("Person#friends")
|
116
|
+
@target_name = target.to_s.split("#")[0] if target.to_s.include?("#")
|
117
|
+
@rel_type = target.to_sym
|
114
118
|
else
|
115
119
|
raise "Expected a class or a symbol for, got #{target}/#{target.class}"
|
116
120
|
end
|
@@ -129,7 +133,8 @@ module Neo4j
|
|
129
133
|
# class FileNode
|
130
134
|
# include Neo4j::NodeMixin
|
131
135
|
# # will only traverse any incoming relationship of type files from node FileNode
|
132
|
-
# has_one(:folder).from(FolderNode
|
136
|
+
# has_one(:folder).from(FolderNode.files)
|
137
|
+
# # alternative: has_one(:folder).from(FolderNode, :files)
|
133
138
|
# end
|
134
139
|
#
|
135
140
|
# file = FileNode.new
|
@@ -158,14 +163,18 @@ module Neo4j
|
|
158
163
|
|
159
164
|
if args.size > 1
|
160
165
|
# handle specified (prefixed) relationship, e.g. has_n(:known_by).from(clazz, :type)
|
161
|
-
@
|
162
|
-
@rel_type = "#{@target_class}##{args[1]}"
|
166
|
+
@target_name = args[0]
|
163
167
|
@relationship_name = args[1].to_sym
|
168
|
+
@rel_type = "#{@target_name}##{args[1]}".to_sym
|
164
169
|
elsif Symbol === args[0]
|
165
170
|
# handle unspecified (unprefixed) relationship, e.g. has_n(:known_by).from(:type)
|
166
|
-
|
171
|
+
name = args[0].to_s
|
172
|
+
if name.include?("#")
|
173
|
+
@target_name, @relationship_name = name.split("#").map(&:to_sym)
|
174
|
+
end
|
175
|
+
@rel_type = args[0]
|
167
176
|
else
|
168
|
-
raise "Expected a symbol for, got #{args[0]}"
|
177
|
+
raise "Expected a symbol for, got #{args[0].inspect}"
|
169
178
|
end
|
170
179
|
self
|
171
180
|
end
|
@@ -195,20 +204,29 @@ module Neo4j
|
|
195
204
|
self
|
196
205
|
end
|
197
206
|
|
207
|
+
# @private
|
208
|
+
def target_name
|
209
|
+
@target_name
|
210
|
+
end
|
198
211
|
|
199
212
|
# @private
|
200
213
|
def relationship_class # :nodoc:
|
201
|
-
if
|
202
|
-
other_class_dsl =
|
214
|
+
if @dir == :incoming
|
215
|
+
other_class_dsl = target_class && target_class._decl_rels[@relationship_name]
|
203
216
|
if other_class_dsl
|
204
217
|
@relationship = other_class_dsl.relationship_class
|
205
218
|
else
|
206
|
-
Neo4j.logger.warn "Unknown outgoing relationship #{@relationship_name} on #{@
|
219
|
+
Neo4j.logger.warn "Unknown outgoing relationship #{@relationship_name} on #{@target_name}"
|
207
220
|
end
|
208
221
|
end
|
209
222
|
@relationship
|
210
223
|
end
|
211
224
|
|
225
|
+
def target_class
|
226
|
+
@target_name && (@target_name.is_a?(Class) ? @target_name : Neo4j::Wrapper.to_class(@target_name.to_s))
|
227
|
+
end
|
228
|
+
|
229
|
+
|
212
230
|
# @private
|
213
231
|
def each_node(node, &block)
|
214
232
|
node.rels(dir, rel_type).each do |rel|
|
@@ -48,6 +48,38 @@ module Neo4j
|
|
48
48
|
|
49
49
|
alias_method :create, :new
|
50
50
|
|
51
|
+
|
52
|
+
# Get the indexed entity, creating it (exactly once) if no indexed entity exist.
|
53
|
+
#
|
54
|
+
# @example Creating a Unique node
|
55
|
+
#
|
56
|
+
# class MyNode
|
57
|
+
# include Neo4j::NodeMixin
|
58
|
+
# property :email, :index => :exact, :unique => true
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# node = MyNode.get_or_create(:email =>'jimmy@gmail.com', :name => 'jimmy')
|
62
|
+
#
|
63
|
+
# @see #put_if_absent
|
64
|
+
def get_or_create(*args)
|
65
|
+
props = args.first
|
66
|
+
raise "Can't get or create entity since #{props.inspect} does not included unique key #{props[unique_factory_key]}'" unless props[unique_factory_key]
|
67
|
+
index = index_for_type(_decl_props[unique_factory_key][:index])
|
68
|
+
Neo4j::Core::Index::UniqueFactory.new(unique_factory_key, index) { |*| new(*args) }.get_or_create(unique_factory_key, props[unique_factory_key])
|
69
|
+
end
|
70
|
+
|
71
|
+
# @throws Exception if there are more then one property having unique index
|
72
|
+
# @return [Symbol,nil] the property which has an unique index or nil
|
73
|
+
def unique_factory_key
|
74
|
+
@unique_factory_key ||= begin
|
75
|
+
unique = []
|
76
|
+
_decl_props.each_pair { |k, v| unique << k if v[:unique] }
|
77
|
+
return nil if unique.empty?
|
78
|
+
raise "Only one property can be unique, got #{unique.join(', ')}" if unique.size > 1
|
79
|
+
unique.first
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
51
83
|
# Loads a wrapped node from the database given a neo id.
|
52
84
|
# @param [#to_i, nil] neo_id
|
53
85
|
# @return [Object, nil] If the node does not exist it will return nil otherwise the loaded node or wrapped node.
|
data/neo4j-wrapper.gemspec
CHANGED
@@ -27,5 +27,5 @@ It comes included with the Apache Lucene document database.
|
|
27
27
|
s.extra_rdoc_files = %w( README.rdoc )
|
28
28
|
s.rdoc_options = ["--quiet", "--title", "Neo4j.rb", "--line-numbers", "--main", "README.rdoc", "--inline-source"]
|
29
29
|
|
30
|
-
s.add_dependency("neo4j-core", "0.0.
|
30
|
+
s.add_dependency("neo4j-core", "0.0.14")
|
31
31
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: neo4j-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.10
|
6
6
|
platform: java
|
7
7
|
authors:
|
8
8
|
- Andreas Ronge
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-04-
|
13
|
+
date: 2012-04-24 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: neo4j-core
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - "="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.
|
23
|
+
version: 0.0.14
|
24
24
|
type: :runtime
|
25
25
|
version_requirements: *id001
|
26
26
|
description: |
|