neo4j 1.0.0.beta.9 → 1.0.0.beta.10
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +5 -1971
- data/lib/neo4j/mapping/class_methods/relationship.rb +2 -2
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +6 -1
- data/lib/neo4j/mapping/has_n.rb +17 -1
- data/lib/neo4j/node_traverser.rb +14 -1
- data/lib/neo4j/rails/model.rb +127 -31
- data/lib/neo4j/rails/tx_methods.rb +11 -0
- data/lib/neo4j/rails/value.rb +44 -1
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j.rb +1 -0
- metadata +4 -59
- data/lib/neo4j.old/batch_inserter.rb +0 -144
- data/lib/neo4j.old/config.rb +0 -138
- data/lib/neo4j.old/event_handler.rb +0 -73
- data/lib/neo4j.old/extensions/activemodel.rb +0 -158
- data/lib/neo4j.old/extensions/aggregate/aggregate_enum.rb +0 -40
- data/lib/neo4j.old/extensions/aggregate/ext/node_mixin.rb +0 -69
- data/lib/neo4j.old/extensions/aggregate/node_aggregate.rb +0 -8
- data/lib/neo4j.old/extensions/aggregate/node_aggregate_mixin.rb +0 -331
- data/lib/neo4j.old/extensions/aggregate/node_aggregator.rb +0 -216
- data/lib/neo4j.old/extensions/aggregate/node_group.rb +0 -43
- data/lib/neo4j.old/extensions/aggregate/prop_group.rb +0 -30
- data/lib/neo4j.old/extensions/aggregate/property_enum.rb +0 -24
- data/lib/neo4j.old/extensions/aggregate/props_aggregate.rb +0 -8
- data/lib/neo4j.old/extensions/aggregate/props_aggregate_mixin.rb +0 -31
- data/lib/neo4j.old/extensions/aggregate/props_aggregator.rb +0 -80
- data/lib/neo4j.old/extensions/aggregate.rb +0 -12
- data/lib/neo4j.old/extensions/find_path.rb +0 -117
- data/lib/neo4j.old/extensions/graph_algo/all_simple_paths.rb +0 -133
- data/lib/neo4j.old/extensions/graph_algo/neo4j-graph-algo-0.3.jar +0 -0
- data/lib/neo4j.old/extensions/graph_algo.rb +0 -1
- data/lib/neo4j.old/extensions/reindexer.rb +0 -104
- data/lib/neo4j.old/extensions/rest/rest.rb +0 -336
- data/lib/neo4j.old/extensions/rest/rest_mixin.rb +0 -193
- data/lib/neo4j.old/extensions/rest/server.rb +0 -50
- data/lib/neo4j.old/extensions/rest/stubs.rb +0 -141
- data/lib/neo4j.old/extensions/rest.rb +0 -21
- data/lib/neo4j.old/extensions/rest_master.rb +0 -34
- data/lib/neo4j.old/extensions/rest_slave.rb +0 -31
- data/lib/neo4j.old/extensions/tx_tracker.rb +0 -392
- data/lib/neo4j.old/indexer.rb +0 -187
- data/lib/neo4j.old/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
- data/lib/neo4j.old/jars/neo4j-kernel-1.0.jar +0 -0
- data/lib/neo4j.old/jars.rb +0 -6
- data/lib/neo4j.old/mixins/java_list_mixin.rb +0 -139
- data/lib/neo4j.old/mixins/java_node_mixin.rb +0 -205
- data/lib/neo4j.old/mixins/java_property_mixin.rb +0 -169
- data/lib/neo4j.old/mixins/java_relationship_mixin.rb +0 -60
- data/lib/neo4j.old/mixins/migration_mixin.rb +0 -157
- data/lib/neo4j.old/mixins/node_mixin.rb +0 -249
- data/lib/neo4j.old/mixins/property_class_methods.rb +0 -265
- data/lib/neo4j.old/mixins/rel_class_methods.rb +0 -167
- data/lib/neo4j.old/mixins/relationship_mixin.rb +0 -103
- data/lib/neo4j.old/neo.rb +0 -247
- data/lib/neo4j.old/node.rb +0 -49
- data/lib/neo4j.old/reference_node.rb +0 -15
- data/lib/neo4j.old/relationship.rb +0 -85
- data/lib/neo4j.old/relationships/decl_relationship_dsl.rb +0 -164
- data/lib/neo4j.old/relationships/has_list.rb +0 -101
- data/lib/neo4j.old/relationships/has_n.rb +0 -129
- data/lib/neo4j.old/relationships/node_traverser.rb +0 -138
- data/lib/neo4j.old/relationships/relationship_dsl.rb +0 -149
- data/lib/neo4j.old/relationships/traversal_position.rb +0 -50
- data/lib/neo4j.old/relationships/wrappers.rb +0 -51
- data/lib/neo4j.old/search_result.rb +0 -72
- data/lib/neo4j.old/transaction.rb +0 -254
- data/lib/neo4j.old/version.rb +0 -3
data/lib/neo4j.old/config.rb
DELETED
@@ -1,138 +0,0 @@
|
|
1
|
-
|
2
|
-
module Neo4j
|
3
|
-
|
4
|
-
|
5
|
-
# Keeps configuration for neo4j.
|
6
|
-
#
|
7
|
-
# Neo4j::Config[:storage_path]:: is used for locating the neo4j database on the filesystem.
|
8
|
-
# Neo4j::Config[:rest_port]:: used by the REST extension for starting a web server on a port
|
9
|
-
#
|
10
|
-
class Config
|
11
|
-
# This code is copied from merb-core/config.rb.
|
12
|
-
class << self
|
13
|
-
# Returns the hash of default config values for neo4j
|
14
|
-
#
|
15
|
-
# ==== Returns
|
16
|
-
# Hash:: The defaults for the config.
|
17
|
-
def defaults
|
18
|
-
@defaults ||= {
|
19
|
-
:storage_path => 'tmp/neo4j',
|
20
|
-
:rest_port => 9123
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
# Yields the configuration.
|
26
|
-
#
|
27
|
-
# ==== Block parameters
|
28
|
-
# c<Hash>:: The configuration parameters.
|
29
|
-
#
|
30
|
-
# ==== Examples
|
31
|
-
# Neo4j::Config.use do |config|
|
32
|
-
# config[:storage_path] = '/var/neo4j'
|
33
|
-
# end
|
34
|
-
#
|
35
|
-
# ==== Returns
|
36
|
-
# nil
|
37
|
-
def use
|
38
|
-
@configuration ||= {}
|
39
|
-
yield @configuration
|
40
|
-
nil
|
41
|
-
end
|
42
|
-
|
43
|
-
|
44
|
-
# Set the value of a config entry.
|
45
|
-
#
|
46
|
-
# ==== Parameters
|
47
|
-
# key<Object>:: The key to set the parameter for.
|
48
|
-
# val<Object>:: The value of the parameter.
|
49
|
-
#
|
50
|
-
def []=(key, val)
|
51
|
-
(@configuration ||= setup)[key] = val
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
# Gets the the value of a config entry
|
56
|
-
#
|
57
|
-
# ==== Parameters
|
58
|
-
# key<Object>:: The key of the config entry value we want
|
59
|
-
#
|
60
|
-
def [](key)
|
61
|
-
(@configuration ||= setup)[key]
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
# Remove the value of a config entry.
|
66
|
-
#
|
67
|
-
# ==== Parameters
|
68
|
-
# key<Object>:: The key of the parameter to delete.
|
69
|
-
#
|
70
|
-
# ==== Returns
|
71
|
-
# Object:: The value of the removed entry.
|
72
|
-
#
|
73
|
-
def delete(key)
|
74
|
-
@configuration.delete(key)
|
75
|
-
end
|
76
|
-
|
77
|
-
|
78
|
-
# Remove all configuration. This can be useful for testing purpose.
|
79
|
-
#
|
80
|
-
#
|
81
|
-
# ==== Returns
|
82
|
-
# nil
|
83
|
-
#
|
84
|
-
def delete_all
|
85
|
-
@configuration = nil
|
86
|
-
end
|
87
|
-
|
88
|
-
|
89
|
-
# Retrieve the value of a config entry, returning the provided default if the key is not present
|
90
|
-
#
|
91
|
-
# ==== Parameters
|
92
|
-
# key<Object>:: The key to retrieve the parameter for.
|
93
|
-
# default<Object>::
|
94
|
-
# The default value to return if the parameter is not set.
|
95
|
-
#
|
96
|
-
# ==== Returns
|
97
|
-
# Object:: The value of the configuration parameter or the default.
|
98
|
-
#
|
99
|
-
def fetch(key, default)
|
100
|
-
@configuration.fetch(key, default)
|
101
|
-
end
|
102
|
-
|
103
|
-
# Sets up the configuration
|
104
|
-
#
|
105
|
-
# ==== Returns
|
106
|
-
# The configuration as a hash.
|
107
|
-
#
|
108
|
-
def setup()
|
109
|
-
@configuration = {}
|
110
|
-
@configuration.merge!(defaults)
|
111
|
-
@configuration
|
112
|
-
end
|
113
|
-
|
114
|
-
|
115
|
-
# Returns the configuration as a hash.
|
116
|
-
#
|
117
|
-
# ==== Returns
|
118
|
-
# Hash:: The config as a hash.
|
119
|
-
#
|
120
|
-
# :api: public
|
121
|
-
def to_hash
|
122
|
-
@configuration
|
123
|
-
end
|
124
|
-
|
125
|
-
# Returns the config as YAML.
|
126
|
-
#
|
127
|
-
# ==== Returns
|
128
|
-
# String:: The config as YAML.
|
129
|
-
#
|
130
|
-
# :api: public
|
131
|
-
def to_yaml
|
132
|
-
require "yaml"
|
133
|
-
@configuration.to_yaml
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
# Handles events like a new node is created or deleted
|
4
|
-
class EventHandler
|
5
|
-
def initialize
|
6
|
-
@listeners = []
|
7
|
-
@filter_classes = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def add(listener)
|
11
|
-
@listeners << listener unless @listeners.include?(listener)
|
12
|
-
add_filter(listener) # the listener do not want to get events on it self
|
13
|
-
end
|
14
|
-
|
15
|
-
def remove(listener)
|
16
|
-
@listeners.delete(listener)
|
17
|
-
end
|
18
|
-
|
19
|
-
def remove_all
|
20
|
-
@listeners = []
|
21
|
-
end
|
22
|
-
|
23
|
-
def print
|
24
|
-
puts "Listeners #{@listeners.size}"
|
25
|
-
@listeners.each {|li| puts " Listener '#{li}'"}
|
26
|
-
end
|
27
|
-
|
28
|
-
def add_filter(filter_class)
|
29
|
-
@filter_classes << filter_class unless @filter_classes.include?(filter_class)
|
30
|
-
end
|
31
|
-
|
32
|
-
def remove_filter(filter_class)
|
33
|
-
@filter_classes.delete filter_class
|
34
|
-
end
|
35
|
-
|
36
|
-
def node_created(node)
|
37
|
-
return if @filter_classes.include?(node.class)
|
38
|
-
@listeners.each {|li| li.on_node_created(node) if li.respond_to?(:on_node_created)}
|
39
|
-
end
|
40
|
-
|
41
|
-
def node_deleted(node)
|
42
|
-
return if @filter_classes.include?(node.class)
|
43
|
-
@listeners.each {|li| li.on_node_deleted(node) if li.respond_to?(:on_node_deleted)}
|
44
|
-
end
|
45
|
-
|
46
|
-
def relationship_created(relationship)
|
47
|
-
return if @filter_classes.include?(relationship.class)
|
48
|
-
@listeners.each {|li| li.on_relationship_created(relationship) if li.respond_to?(:on_relationship_created)}
|
49
|
-
end
|
50
|
-
|
51
|
-
def relationship_deleted(relationship)
|
52
|
-
return if @filter_classes.include?(relationship.class)
|
53
|
-
@listeners.each {|li| li.on_relationship_deleted(relationship) if li.respond_to?(:on_relationship_deleted)}
|
54
|
-
end
|
55
|
-
|
56
|
-
def property_changed(node, key, old_value, new_value)
|
57
|
-
return if @filter_classes.include?(node.class)
|
58
|
-
@listeners.each {|li| li.on_property_changed(node, key, old_value, new_value) if li.respond_to?(:on_property_changed)}
|
59
|
-
end
|
60
|
-
|
61
|
-
def tx_finished(tx)
|
62
|
-
@listeners.each {|li| li.on_tx_finished(tx) if li.respond_to?(:on_tx_finished)}
|
63
|
-
end
|
64
|
-
|
65
|
-
def neo_started(neo_instance)
|
66
|
-
@listeners.each {|li| li.on_neo_started(neo_instance) if li.respond_to?(:on_neo_started)}
|
67
|
-
end
|
68
|
-
|
69
|
-
def neo_stopped(neo_instance)
|
70
|
-
@listeners.each {|li| li.on_neo_stopped(neo_instance) if li.respond_to?(:on_neo_stopped)}
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,158 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'singleton'
|
3
|
-
require 'neo4j'
|
4
|
-
require 'active_model'
|
5
|
-
|
6
|
-
|
7
|
-
module Neo4j::NodeMixin
|
8
|
-
def to_model
|
9
|
-
Neo4j::ActiveModel::ActiveModelFactory.instance.to_model(self)
|
10
|
-
end
|
11
|
-
|
12
|
-
def attributes
|
13
|
-
attr = props
|
14
|
-
attr.keys.each {|k| attr.delete k if k[0] == ?_}
|
15
|
-
attr
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
module Neo4j::ActiveModel
|
21
|
-
|
22
|
-
def self.on_property_changed(node, key, old_value, new_value)
|
23
|
-
# make model dirty since it is changed
|
24
|
-
ActiveModelFactory.instance.dirty_node!(node.neo_id)
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.on_tx_finished(tx)
|
28
|
-
# make all models clean again
|
29
|
-
ActiveModelFactory.instance.clean!
|
30
|
-
end
|
31
|
-
|
32
|
-
class ActiveModelFactory
|
33
|
-
private
|
34
|
-
def initialize
|
35
|
-
@classes = {}
|
36
|
-
@node_models = {}
|
37
|
-
Thread.current[:neo4j_active_model_factory] = self
|
38
|
-
Neo4j.event_handler.add(self)
|
39
|
-
end
|
40
|
-
|
41
|
-
public
|
42
|
-
def self.instance
|
43
|
-
# create one Neo4jActiveModelFactory for each thread
|
44
|
-
# since a transaction belongs to a thread and we don't want
|
45
|
-
# side effect of one transaction making model object dirty or clean for a different transaction
|
46
|
-
# in a different thread.
|
47
|
-
Thread.current[:neo4j_active_model_factory] || ActiveModelFactory.new
|
48
|
-
end
|
49
|
-
|
50
|
-
def dirty_node!(neo_id)
|
51
|
-
@node_models[neo_id] && @node_models[neo_id].dirty!
|
52
|
-
end
|
53
|
-
|
54
|
-
def clean!
|
55
|
-
@node_models.clear
|
56
|
-
end
|
57
|
-
|
58
|
-
def to_model(obj)
|
59
|
-
@node_models[obj.neo_id] || create_model_for(obj)
|
60
|
-
end
|
61
|
-
|
62
|
-
def create_model_for(obj)
|
63
|
-
clazz = @classes[obj.class] || create_wrapped_class_for(obj)
|
64
|
-
@node_models[obj.neo_id] = clazz.new(obj)
|
65
|
-
end
|
66
|
-
|
67
|
-
def create_wrapped_class_for(obj)
|
68
|
-
clazz = Class.new do
|
69
|
-
def initialize(wrapped)
|
70
|
-
@dirty = false
|
71
|
-
@wrapped = wrapped
|
72
|
-
end
|
73
|
-
|
74
|
-
def dirty!
|
75
|
-
@dirty = true
|
76
|
-
end
|
77
|
-
|
78
|
-
def persisted?
|
79
|
-
! @dirty
|
80
|
-
end
|
81
|
-
|
82
|
-
def to_key
|
83
|
-
persisted? ? @wrapped.neo_id : nil
|
84
|
-
end
|
85
|
-
|
86
|
-
def to_param
|
87
|
-
to_key
|
88
|
-
end
|
89
|
-
|
90
|
-
if obj.respond_to?(:errors)
|
91
|
-
def errors;
|
92
|
-
@wrapped.errors;
|
93
|
-
end
|
94
|
-
else
|
95
|
-
def errors
|
96
|
-
object = Object.new
|
97
|
-
|
98
|
-
def object.[](key)
|
99
|
-
[]
|
100
|
-
end
|
101
|
-
|
102
|
-
def object.full_messages()
|
103
|
-
[]
|
104
|
-
end
|
105
|
-
|
106
|
-
object
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
if obj.respond_to?(:valid?)
|
111
|
-
def valid?;
|
112
|
-
@wrapped.valid?;
|
113
|
-
end
|
114
|
-
else
|
115
|
-
def valid?
|
116
|
-
true
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
singleton = class << clazz;
|
122
|
-
self;
|
123
|
-
end
|
124
|
-
singleton.class_eval do
|
125
|
-
# class methods
|
126
|
-
define_method :model_name do
|
127
|
-
@_model_name ||= ActiveModel::Name.new(obj.class)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
@classes[obj.class] = clazz
|
132
|
-
clazz
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
|
137
|
-
Neo4j.event_handler.add(self)
|
138
|
-
end
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
#class LintTest < ActiveModel::TestCase
|
143
|
-
# include ActiveModel::Lint::Tests
|
144
|
-
#
|
145
|
-
# class MyModel
|
146
|
-
# include Neo4j::NodeMixin
|
147
|
-
# end
|
148
|
-
#
|
149
|
-
# def setup
|
150
|
-
# @model = MyModel.new
|
151
|
-
# end
|
152
|
-
#
|
153
|
-
#end
|
154
|
-
#
|
155
|
-
#require 'test/unit/ui/console/testrunner'
|
156
|
-
#Neo4j::Transaction.run do
|
157
|
-
# Test::Unit::UI::Console::TestRunner.run(LintTest)
|
158
|
-
#end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module Neo4j::Aggregate
|
2
|
-
# Used for an enumerable result of aggregates
|
3
|
-
# See Neo4j::NodeMixin#aggregates
|
4
|
-
#
|
5
|
-
# :api: private
|
6
|
-
class AggregateEnum #:nodoc:
|
7
|
-
include Enumerable
|
8
|
-
|
9
|
-
def initialize(node)
|
10
|
-
@node = node
|
11
|
-
end
|
12
|
-
|
13
|
-
def empty?
|
14
|
-
each {true}.nil?
|
15
|
-
end
|
16
|
-
|
17
|
-
def each
|
18
|
-
# if node is an aggregate group then we should look for parent aggregates
|
19
|
-
if (@node.property?(:aggregate_group))
|
20
|
-
@node.rels.incoming.nodes.each do |parent_group|
|
21
|
-
next unless parent_group.property?(:aggregate_size)
|
22
|
-
# if it has the property aggregate_group then it is a group node
|
23
|
-
if (parent_group.property?(:aggregate_group))
|
24
|
-
AggregateEnum.new(parent_group).each {|agg| yield agg}
|
25
|
-
else
|
26
|
-
# aggregate found
|
27
|
-
yield parent_group
|
28
|
-
end
|
29
|
-
end
|
30
|
-
else
|
31
|
-
# the given node (@node) is not a group, we guess it is an leaf in an aggregate
|
32
|
-
# get all the groups that this leaf belongs to and then those groups aggregate nodes
|
33
|
-
@node.rels.incoming(:aggregate).nodes.each do |group|
|
34
|
-
AggregateEnum.new(group ).each {|agg| yield agg}
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
org.neo4j.kernel.impl.core.NodeProxy.class_eval do
|
2
|
-
|
3
|
-
# Returns an enumeration of aggregates that this nodes belongs to.
|
4
|
-
#
|
5
|
-
# Is used in combination with the Neo4j::AggregateNodeMixin
|
6
|
-
#
|
7
|
-
# ==== Example
|
8
|
-
#
|
9
|
-
# class MyNode
|
10
|
-
# include Neo4j::NodeMixin
|
11
|
-
# include Neo4j::NodeAggregateMixin
|
12
|
-
# end
|
13
|
-
#
|
14
|
-
# agg1 = MyNode
|
15
|
-
# agg1.aggregate([node1,node2]).group_by(:colour)
|
16
|
-
#
|
17
|
-
# agg2 = MyNode
|
18
|
-
# agg2.aggregate([node1,node2]).group_by(:age)
|
19
|
-
#
|
20
|
-
# [*node1.aggregates] # => [agg1, agg2]
|
21
|
-
#
|
22
|
-
def aggregates
|
23
|
-
Neo4j::Aggregate::AggregateEnum.new(self)
|
24
|
-
end
|
25
|
-
|
26
|
-
# Returns an enumeration of groups that this nodes belongs to.
|
27
|
-
#
|
28
|
-
# Is used in combination with the Neo4j::AggregateNodeMixin
|
29
|
-
#
|
30
|
-
# ==== Parameters
|
31
|
-
#
|
32
|
-
# * group which aggregate group we want, default is :all - an enumeration of all groups will be return
|
33
|
-
#
|
34
|
-
#
|
35
|
-
# ==== Returns
|
36
|
-
# an enumeration of all groups that this node belongs to, or if the group parameter was used
|
37
|
-
# only the given group or nil if not found.
|
38
|
-
#
|
39
|
-
# ==== Example
|
40
|
-
#
|
41
|
-
# class MyNode
|
42
|
-
# include Neo4j::NodeMixin
|
43
|
-
# include Neo4j::AggregateNodeMixin
|
44
|
-
# end
|
45
|
-
#
|
46
|
-
# agg1 = MyNode
|
47
|
-
# agg1.aggregate(:colours).group_by(:colour)
|
48
|
-
#
|
49
|
-
# agg2 = MyNode
|
50
|
-
# agg2.aggregate(:age).group_by(:age)
|
51
|
-
#
|
52
|
-
# agg1 << node1
|
53
|
-
# agg2 << node1
|
54
|
-
#
|
55
|
-
# [*node1.aggregate_groups] # => [agg1[some_group], agg2[some_other_group]]
|
56
|
-
#
|
57
|
-
def aggregate_groups(group = :all)
|
58
|
-
return rels.incoming(:aggregate).nodes if group == :all
|
59
|
-
[*rels.incoming(:aggregate).filter{self[:aggregate_group] == group.to_s}.nodes][0]
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
module Neo4j
|
66
|
-
module NodeMixin
|
67
|
-
def_delegators :@_java_node, :aggregate_groups, :aggregates
|
68
|
-
end
|
69
|
-
end
|