neo4j 1.2.6-java → 2.0.0.alpha.3-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 (78) hide show
  1. data/CHANGELOG +30 -0
  2. data/CONTRIBUTORS +1 -0
  3. data/Gemfile +16 -4
  4. data/README.rdoc +25 -3
  5. data/bin/neo4j-jars +15 -8
  6. data/bin/neo4j-shell +0 -1
  7. data/bin/neo4j-upgrade +72 -0
  8. data/config/neo4j/config.yml +5 -4
  9. data/lib/neo4j/algo/algo.rb +0 -1
  10. data/lib/neo4j/batch/inserter.rb +5 -0
  11. data/lib/neo4j/database.rb +18 -12
  12. data/lib/neo4j/event_handler.rb +76 -9
  13. data/lib/neo4j/has_list/class_methods.rb +1 -1
  14. data/lib/neo4j/has_list/mapping.rb +13 -33
  15. data/lib/neo4j/has_n/decl_relationship_dsl.rb +17 -13
  16. data/lib/neo4j/has_n/mapping.rb +6 -23
  17. data/lib/neo4j/identity_map.rb +0 -3
  18. data/lib/neo4j/index/class_methods.rb +9 -3
  19. data/lib/neo4j/index/index.rb +2 -1
  20. data/lib/neo4j/index/indexer.rb +3 -2
  21. data/lib/neo4j/index/indexer_registry.rb +1 -1
  22. data/lib/neo4j/index/lucene_query.rb +52 -33
  23. data/lib/neo4j/neo4j.rb +19 -0
  24. data/lib/neo4j/node.rb +42 -36
  25. data/lib/neo4j/node_mixin/node_mixin.rb +9 -5
  26. data/lib/neo4j/paginated.rb +23 -0
  27. data/lib/neo4j/rails/accept_id.rb +66 -0
  28. data/lib/neo4j/rails/attributes.rb +14 -9
  29. data/lib/neo4j/rails/compositions.rb +9 -1
  30. data/lib/neo4j/rails/finders.rb +5 -1
  31. data/lib/neo4j/rails/mapping/property.rb +41 -28
  32. data/lib/neo4j/rails/model.rb +2 -0
  33. data/lib/neo4j/rails/observer.rb +61 -2
  34. data/lib/neo4j/rails/persistence.rb +57 -57
  35. data/lib/neo4j/rails/rails.rb +1 -0
  36. data/lib/neo4j/rails/railtie.rb +4 -1
  37. data/lib/neo4j/rails/rel_persistence.rb +11 -12
  38. data/lib/neo4j/rails/relationship.rb +9 -4
  39. data/lib/neo4j/rails/relationships/node_dsl.rb +15 -5
  40. data/lib/neo4j/rails/relationships/relationships.rb +42 -2
  41. data/lib/neo4j/rails/relationships/rels_dsl.rb +60 -3
  42. data/lib/neo4j/rails/relationships/storage.rb +43 -5
  43. data/lib/neo4j/rails/validations/uniqueness.rb +1 -0
  44. data/lib/neo4j/rails/versioning/versioning.rb +64 -9
  45. data/lib/neo4j/relationship.rb +79 -73
  46. data/lib/neo4j/rule/event_listener.rb +7 -1
  47. data/lib/neo4j/rule/functions/count.rb +6 -0
  48. data/lib/neo4j/rule/rule.rb +20 -5
  49. data/lib/neo4j/rule/rule_node.rb +33 -20
  50. data/lib/neo4j/to_java.rb +5 -0
  51. data/lib/neo4j/traversal/traverser.rb +38 -1
  52. data/lib/neo4j/type_converters/type_converters.rb +56 -5
  53. data/lib/neo4j/version.rb +1 -1
  54. data/lib/neo4j.rb +3 -49
  55. data/neo4j.gemspec +2 -2
  56. metadata +191 -216
  57. data/bin/neo4j-shell~ +0 -108
  58. data/lib/Gemfile~ +0 -3
  59. data/lib/config2.yml~ +0 -86
  60. data/lib/neo4j/jars/core/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
  61. data/lib/neo4j/jars/core/lucene-core-3.1.0.jar +0 -0
  62. data/lib/neo4j/jars/core/neo4j-backup-1.4.1.jar +0 -0
  63. data/lib/neo4j/jars/core/neo4j-graph-algo-1.4.1.jar +0 -0
  64. data/lib/neo4j/jars/core/neo4j-index-1.3-1.3.M01.jar +0 -0
  65. data/lib/neo4j/jars/core/neo4j-kernel-1.4.1.jar +0 -0
  66. data/lib/neo4j/jars/core/neo4j-lucene-index-1.4.1.jar +0 -0
  67. data/lib/neo4j/jars/ha/log4j-1.2.16.jar +0 -0
  68. data/lib/neo4j/jars/ha/neo4j-com-1.4.1.jar +0 -0
  69. data/lib/neo4j/jars/ha/neo4j-ha-1.4.1.jar +0 -0
  70. data/lib/neo4j/jars/ha/neo4j-jmx-1.4.1.jar +0 -0
  71. data/lib/neo4j/jars/ha/neo4j-management-1.4.1.jar +0 -0
  72. data/lib/neo4j/jars/ha/neo4j-shell-1.4.1.jar +0 -0
  73. data/lib/neo4j/jars/ha/netty-3.2.1.Final.jar +0 -0
  74. data/lib/neo4j/jars/ha/org.apache.servicemix.bundles.jline-0.9.94_1.jar +0 -0
  75. data/lib/neo4j/jars/ha/zookeeper-3.3.2.jar +0 -0
  76. data/lib/neo4j/paginate.rb +0 -25
  77. data/lib/perf.rb~ +0 -36
  78. data/lib/test.rb~ +0 -2
data/CHANGELOG CHANGED
@@ -1,3 +1,33 @@
1
+ == 1.3.1 / 2011-12-14
2
+ * Make all relationships visible in Rails callback (rspecs #87, Dmytrii Nagirniak) [#211]
3
+ * Enable travis to build JRuby 1.9 (pull #87, Dmytrii Nagirniak) [#214]
4
+ * Support for composite lucene queries with OR and NOT (pull #89, Deepak N)
5
+ * Enforce the correct converter on a property type when the type is given (pull #86, Dmytrii Nagirniak)
6
+ * Development: make it easier to run RSpecs and guard (pull #85, Dmytrii Nagirniak)
7
+ * Added ability to disable observer (pull #84, Dmytrii Nagirniak)
8
+ * Fixing multiple assignment of has_one assocaition (pull #83 Deepak N)
9
+ * Accept association_id for has_one assocations (pull #82, Deepak N)
10
+ * Upgrade to 1.6.M01 Neo4j java jars [#209]
11
+ * Defer warning message 'Unknown outgoing relationship' (pull #81, Vivek Prahlad)
12
+ * Added string converter, e.g. property :name, :type => String (pull #80, Dmytrii Nagirniak)
13
+ * Added symbol converter e.g. property :status, :type => Symbol (pull #79, Dmytrii Nagirniak) [#205]
14
+
15
+ == 1.3.0 / 2011-12-06
16
+ * Added neo4j-upgrade script to rename lucene index files and upgrade to 1.5 [#197]
17
+ * Expose Neo4j::NodeMixin#index_types returning available indices (useful for Cypher queries) [#194]
18
+ * The to_other method is now available also in the Neo4j::Rails API [#193]
19
+ * Expose rel_type method for Neo4j::Rails::Relationship [#196]
20
+ * Support for breadth and depth first traversals [#198]
21
+ * Support for cypher query [#197]
22
+ * Fix for rule node concurrency issue (pull #78, Vivek Prahlad)
23
+ * Bugfix for the uniqueness validation for properties with quotes (pull #76, Vivek Prahlad)
24
+ * More performance tweaks (pull #75, #77, Vivek Prahlad)
25
+ * Fixing add_index for properties other than type string (pull #74, Deepak N)
26
+ * Significant performance boost for creating large numbers of models in a transaction (pull #73, Vivek Prahlad)
27
+ * Upgrade to neo4j 1.5 jars (pull #72, Vivek Prahlad)
28
+ * Fix for assigning nil values to incoming has_one relation (pull #70, Deepak N)
29
+ * Support for revert and fixes for Neo4j::Rails::Versioning (pull #71, Vivek Prahlad)
30
+
1
31
  == 1.2.6 / 2011-11-02
2
32
  * Generators can now generate relationships as well [#195]
3
33
  * Better will_paginate support for Neo4j::Rails::Model [#194]
data/CONTRIBUTORS CHANGED
@@ -2,6 +2,7 @@ Maintainer:
2
2
  Andreas Ronge <andreas dot ronge at gmail dot com>
3
3
 
4
4
  Contributors:
5
+ * Dmytrii Nagirniak
5
6
  * Marcio Toshio
6
7
  * Kalyan Akella
7
8
  * Vivek Prahlad
data/Gemfile CHANGED
@@ -5,14 +5,26 @@ gemspec
5
5
  group 'test' do
6
6
  gem "rake", ">= 0.8.7"
7
7
  gem "rdoc", ">= 2.5.10"
8
- gem "horo", ">= 1.0.2"
9
- gem "rspec", "= 2.6.0"
8
+ gem "horo", ">= 1.0.2" # TODO: Why horo, YARD seems to be much better option?
9
+ gem "rspec", "~> 2.8"
10
+ gem "its" # its(:with, :arguments) { should be_possible }
10
11
 
11
- # use this version for rspec-rails-matchers which work with latest RSpec (Rspec => RSpec)
12
- gem "rspec-rails-matchers", :git => 'git://github.com/afcapel/rspec-rails-matchers.git'
12
+ gem 'guard'
13
+ gem 'ruby_gntp', :require => false # GrowlNotify for Mac
14
+ gem 'rb-inotify', :require => false
15
+ gem 'rb-fsevent', :require => false
16
+ gem 'rb-fchange', :require => false
17
+ gem "guard-rspec"
18
+
19
+ gem 'shoulda-matchers', '~> 1.0'
13
20
 
14
21
  gem "test-unit"
15
22
  gem 'rcov'
23
+
24
+ gem 'pry'
25
+
26
+ gem 'neo4j-advanced', "1.6.0.alpha.5", :require => false
27
+ gem 'neo4j-enterprise', "1.6.0.alpha.5", :require => false
16
28
  end
17
29
 
18
30
  #gem 'ruby-debug-base19' if RUBY_VERSION.include? "1.9"
data/README.rdoc CHANGED
@@ -12,7 +12,9 @@ It uses two powerful and mature Java libraries:
12
12
  === Documentation
13
13
 
14
14
  * {Guides and API}[http://neo4j.rubyforge.org/guides/index.html]
15
+ * {RDoc}[http://neo4j.rubyforge.org]
15
16
  * {Blog: Neo4j and Rails 3}[http://blog.jayway.com/2011/03/02/neo4j-rb-1-0-0-and-rails-3/]
17
+ * {Kvitter Example Application}[https://github.com/andreasronge/kvitter/]
16
18
 
17
19
  === Why Neo4j.rb or a Graph Database ?
18
20
 
@@ -107,6 +109,15 @@ To run it with Tomcat instead of WEBrick
107
109
  gem install trinidad
108
110
  trinidad
109
111
 
112
+ === Architecture
113
+
114
+ As you seen above, neo4j.rb consists of a three layers API:
115
+
116
+ * Layer 1. For interacting with the basic building blocks of the graph database (node, properties and relationship), see Neo4j::Node and Neo4j::Relationship classes.
117
+ * Layer 2. A binding API to Ruby objects, see Neo4j::NodeMixin and Neo4j::RelationshipMixin modules.
118
+ * Layer 3. An implementation of the Rails Active Model and a subset of the Active Record API, see Neo4j::Rails::Model class.
119
+
120
+ Notice that you can always access the lower layers if you want to do some more advanced. You can even access the Java API directly.
110
121
 
111
122
  === Presentation Materials and other URLs
112
123
  * {Presentation: RailsConf 2011}[http://andreasronge.github.com/neo4j-railsconf.pdf]
@@ -115,17 +126,28 @@ To run it with Tomcat instead of WEBrick
115
126
 
116
127
  === Project information
117
128
  * {GitHub}[http://github.com/andreasronge/neo4j/tree/master]
118
- * {Lighthouse Issue Tracking}[http://neo4j.lighthouseapp.com]
129
+ * {Issue Tracking}[https://github.com/andreasronge/neo4j/issues]
119
130
  * {Twitter}[http://twitter.com/ronge]
120
- * IRC - #neo4j @ irc.freenode.net
121
131
  * {Mailing list, neo4jrb@googlegroups.com}[http://groups.google.com/group/neo4jrb]
132
+ * {Read only, old lighthouse issues}[http://neo4j.lighthouseapp.com]
133
+
134
+ === Configuration
135
+
136
+ {Development configuration}[http://neo4j.rubyforge.org/guides/index.html#development-and-testing-configuration] - You can configure Neo4j through the {Neo4j::Config}[http://neo4j.rubyforge.org/Neo4j/Config.html] object.
137
+
138
+ Neo4j::Config[:storage_path] = "/var/neo4j"
139
+
140
+ {Configuring Neo4j from Rails}[http://neo4j.rubyforge.org/guides/configuration.html#config-neo4j-from-rails] - When using Neo4j.rb from rails you can use the normal rails configuration to set Neo4j configuration.
141
+
142
+ config.neo4j.storage_path = "#{config.root}/db/neo4j"
122
143
 
123
144
  === Contributing
124
145
 
146
+ {<img src="https://secure.travis-ci.org/andreasronge/neo4j.png" />}[http://travis-ci.org/andreasronge/neo4j]
147
+
125
148
  Have you found a bug, need help or have a patch ?
126
149
  Just clone neo4j.rb and send me a pull request or email me.
127
150
  Do you need help - send me an email (andreas.ronge at gmail dot com).
128
- Please also check/add issues at lighthouse, http://neo4j.lighthouseapp.com
129
151
 
130
152
  === License
131
153
  * Neo4j.rb - MIT, see the LICENSE file http://github.com/andreasronge/neo4j/tree/master/LICENSE.
data/bin/neo4j-jars CHANGED
@@ -5,22 +5,29 @@ require 'neo4j'
5
5
  if ARGV.length == 0
6
6
  puts <<TEXT
7
7
  A tool for copying jar files needed by the application server, like trinidad
8
- It copies the jar files to the lib folder of the current directory
9
- Usage: neo4j-jars [-ha|-backup]
10
- -ha copies the High Available cluster Jars
11
- -backup copies the online backup jars
12
- -local copies only the jars for running a local neo4j db
8
+ It copies all jar files which has been required (neo4j-community, neo4j-advanced or neo4j-enterprise) to the lib folder of the current directory
9
+
10
+ Usage: neo4j-jars <community|advanced|enterprise>
11
+
13
12
  TEXT
14
13
  exit
15
14
  end
16
15
 
17
- Neo4j.load_online_backup if ARGV.include?('-backup')
18
- Neo4j.load_ha_jars if ARGV.include?('-ha')
16
+ if ARGV.include?('community')
17
+ require 'neo4j-community' # not really needed
18
+ elsif ARGV.include?('advanced')
19
+ require 'neo4j-advanced' # not really needed
20
+ elsif ARGV.include?('enterprise')
21
+ require 'neo4j-enterprise' # not really needed
22
+ else
23
+ puts "Expected community, advanced, enterprise"
24
+ exit -1
25
+ end
19
26
 
20
27
  lib_dir = File.join(Dir.pwd, 'lib')
21
28
  raise "Expected a lib folder where to copy the jars file, mkdir #{lib_dir}? " unless File.exist?(lib_dir)
22
29
 
23
- files = $CLASSPATH.find_all{|x| x =~ /neo4j\/jars/}.collect{|y| y.sub('file:', '')}
30
+ files = $CLASSPATH.find_all{|x| x =~ /\.jar$/}.collect{|y| y.sub('file:', '')}
24
31
  files.each {|file| FileUtils.cp(file, lib_dir)}
25
32
 
26
33
  puts "copied #{files.size} files to #{lib_dir}"
data/bin/neo4j-shell CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'neo4j'
4
- Neo4j.load_shell_jars
5
4
  org.neo4j.shell.StartClient.main(ARGV)
data/bin/neo4j-upgrade ADDED
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fileutils'
4
+ require 'neo4j'
5
+
6
+ if ARGV.length == 0
7
+ puts <<TEXT
8
+ A tool for upgrading the neo4j database to #{Neo4j::VERSION}.
9
+ Make sure you shutdown the database cleanly before running this script.
10
+ More info: http://neo4j.rubyforge.org/guides/configuration.html#upgrade-to-a-new-neo4j-version
11
+
12
+ Usage : neo4j-upgrade <location of database>
13
+ Example : neo4j-upgrade db/neo4j-development
14
+
15
+ TEXT
16
+ exit
17
+ end
18
+
19
+ def error(msg)
20
+ puts msg
21
+ exit
22
+ end
23
+
24
+ def rename_index(folder, file)
25
+ new_file = File.join(folder, file.gsub(/-/, '_'))
26
+ old_file = File.join(folder, file)
27
+ puts "moved index '#{old_file}' to '#{new_file}'"
28
+ FileUtils.move(old_file, new_file)
29
+ end
30
+
31
+ def upgrade(path)
32
+ Dir.entries(path).each do |file|
33
+ rename_index(path, file) if file =~ /(-exact)|(-fulltext)$/
34
+ end
35
+ end
36
+
37
+ root = ARGV[0]
38
+ error("Can't find database at location #{root}") unless File.exist?(root)
39
+ error("Expected location #{root} to be a folder") unless File.directory?(root)
40
+
41
+ # Upgrade
42
+ puts "upgrade database to Neo4j.rb version #{Neo4j::VERSION}, this might take a while ...."
43
+ Neo4j::Config[:storage_path] = root
44
+ Neo4j::Config[:allow_store_upgrade] = 'true'
45
+ Neo4j.start
46
+ puts "Neo4j database at #{root} upgraded to #{Neo4j::VERSION}, now shutdown"
47
+ Neo4j.shutdown
48
+ puts "Rename lucene index files"
49
+
50
+ nodes_path = File.join(root, "index", "lucene", "node")
51
+ if File.exist?(nodes_path)
52
+ upgrade(nodes_path)
53
+ else
54
+ puts("Can't find lucene index at location #{nodes_path}")
55
+ end
56
+
57
+
58
+ nodes_path = File.join(root, "index", "lucene", "node")
59
+ if File.exist?(nodes_path)
60
+ upgrade(nodes_path)
61
+ else
62
+ puts("No lucene index for nodes found at location #{nodes_path}, continue")
63
+ end
64
+
65
+ nodes_path = File.join(root, "index", "lucene", "relationship")
66
+ if File.exist?(nodes_path)
67
+ upgrade(nodes_path)
68
+ else
69
+ puts("No lucene index for relationship found at location #{nodes_path}")
70
+ end
71
+
72
+ puts "Upgraded database done at '#{root}'"
@@ -28,17 +28,18 @@ lucene: { fulltext: { provider: lucene,
28
28
  # If set to true it you can use the database while it is migrating.
29
29
  migration_thread: false
30
30
 
31
- # If online backup should be available, if it is the Online JAR file will be loaded.
32
- online_backup_enabled: false
31
+ # If online backup should be available, if it is the Online JAR file will be loaded,
32
+ # Notice it must be either 'true' or 'false' as string
33
+ enable_online_backup: 'false'
33
34
 
34
35
  #use the clustered Neo4j GraphDatabase (org.neo4j.kernel.HighlyAvailableGraphDatabase)
35
36
  ha.db: false
36
37
 
37
38
  # Example of HA Configuration, see http://wiki.neo4j.org/content/High_Availability_Cluster
38
39
  # This is only used when ha.db is set to true
39
- ha.machine_id: 2
40
+ ha.server_id: 2
40
41
  ha.server: 'localhost:6002'
41
- ha.zoo_keeper_servers: 'localhost:2181,localhost:2182,localhost:2183'
42
+ ha.coordinators: 'localhost:2181,localhost:2182,localhost:2183'
42
43
 
43
44
  # if enabled you can use the bin/neo4j-shell command to access the database
44
45
  enable_remote_shell: "port=9332"
@@ -1,6 +1,5 @@
1
1
  # external neo4j dependencies
2
2
  require 'neo4j/to_java'
3
- require 'neo4j/jars/core/neo4j-graph-algo-1.4.1.jar'
4
3
 
5
4
  module Neo4j
6
5
 
@@ -48,6 +48,8 @@ module Neo4j
48
48
  props = {} if clazz != Neo4j::Node && props.nil?
49
49
  props['_classname'] = clazz.to_s if clazz != Neo4j::Node
50
50
 
51
+ props = ensure_valid_props(props)
52
+
51
53
  node = @batch_inserter.create_node(props)
52
54
  props && _index(node, props, clazz)
53
55
  @rule_inserter.node_added(node, props)
@@ -68,6 +70,9 @@ module Neo4j
68
70
  def create_rel(rel_type, from_node, to_node, props=nil, clazz=Neo4j::Relationship)
69
71
  props = {} if clazz != Neo4j::Relationship && props.nil?
70
72
  props['_classname'] = clazz.to_s if clazz != Neo4j::Relationship
73
+
74
+ props = ensure_valid_props(props)
75
+
71
76
  rel = @batch_inserter.create_relationship(from_node, to_node, type_to_java(rel_type), props)
72
77
 
73
78
  props && _index(rel, props, clazz)
@@ -13,6 +13,8 @@ module Neo4j
13
13
  class Database
14
14
  attr_reader :graph, :lucene, :event_handler, :storage_path
15
15
 
16
+ alias_method :index, :lucene # needed by cypher
17
+
16
18
  def initialize()
17
19
  @event_handler = EventHandler.new
18
20
  end
@@ -22,12 +24,6 @@ module Neo4j
22
24
  @running = true
23
25
  @storage_path = Config.storage_path
24
26
 
25
-
26
- if Config[:enable_remote_shell]
27
- Neo4j.logger.info("Enable remote shell at port #{Config[:enable_remote_shell]}")
28
- Neo4j.load_shell_jars
29
- end
30
-
31
27
  begin
32
28
  if self.class.locked?
33
29
  start_readonly_graph_db
@@ -48,24 +44,34 @@ module Neo4j
48
44
 
49
45
  def start_readonly_graph_db #:nodoc:
50
46
  Neo4j.logger.info "Starting Neo4j in readonly mode since the #{@storage_path} is locked"
51
- Neo4j.load_local_jars
52
47
  @graph = org.neo4j.kernel.EmbeddedReadOnlyGraphDatabase.new(@storage_path, Config.to_java_map)
53
48
  @lucene = @graph.index
54
49
  end
55
50
 
56
51
  def start_local_graph_db #:nodoc:
57
52
  Neo4j.logger.info "Starting local Neo4j using db #{@storage_path}"
58
- Neo4j.load_local_jars
59
53
  @graph = org.neo4j.kernel.EmbeddedGraphDatabase.new(@storage_path, Config.to_java_map)
60
54
  @graph.register_transaction_event_handler(@event_handler)
61
55
  @lucene = @graph.index
62
56
  @event_handler.neo4j_started(self)
63
57
  end
64
58
 
59
+ # needed by cypher
60
+ def getNodeById(id) #:nodoc:
61
+ Neo4j::Node.load(id)
62
+ end
63
+
64
+ # needed by cypher
65
+ def getRelationshipById(id) #:nodoc:
66
+ Neo4j::Relationship.load(id)
67
+ end
68
+
65
69
  def start_ha_graph_db
66
- Neo4j.logger.info "starting Neo4j in HA mode, machine id: #{Neo4j.config['ha.machine_id']} at #{Neo4j.config['ha.server']} db #{@storage_path}"
67
- Neo4j.load_ha_jars # those jars are only needed for the HighlyAvailableGraphDatabase
68
- Neo4j.load_online_backup if Neo4j.config[:online_backup_enabled]
70
+ Neo4j.logger.info "starting Neo4j in HA mode, machine id: #{Neo4j.config['ha.server_id']} at #{Neo4j.config['ha.server']} db #{@storage_path}"
71
+ # Modify the public base classes for the HA Node and Relationships
72
+ # (instead of private org.neo4j.kernel.HighlyAvailableGraphDatabase::LookupNode)
73
+ Neo4j::Node.extend_java_class(org.neo4j.tooling.wrap.WrappedNode)
74
+ Neo4j::Relationship.extend_java_class(org.neo4j.tooling.wrap.WrappedRelationship)
69
75
  @graph = org.neo4j.kernel.HighlyAvailableGraphDatabase.new(@storage_path, Neo4j.config.to_java_map)
70
76
  @graph.register_transaction_event_handler(@event_handler)
71
77
  @lucene = @graph.index
@@ -94,7 +100,7 @@ module Neo4j
94
100
  # Returns true if the neo4j db was started in read only mode.
95
101
  # This can occur if the database was locked (it was already one instance running).
96
102
  def read_only?
97
- @graph.isReadOnly
103
+ @graph.java_class == org.neo4j.kernel.EmbeddedGraphDatabase
98
104
  end
99
105
 
100
106
  # check if the database is locked. A neo4j database is locked when the database is running.
@@ -71,6 +71,9 @@ module Neo4j
71
71
  # * <tt>old_value</tt> :: old value of the property
72
72
  # * <tt>new_value</tt> :: new value of the property
73
73
  #
74
+ # ==== classes_changed(class_change_map)
75
+ # * <tt>class_change_map</tt> :: a hash with class names as keys, and class changes as values. See Neo4j::ClassChanges
76
+ #
74
77
  # == Usage
75
78
  #
76
79
  # class MyListener
@@ -99,30 +102,47 @@ module Neo4j
99
102
  end
100
103
 
101
104
  def before_commit(data)
102
- created_node_identity_map = node_identity_map(data.created_nodes)
103
- deleted_node_identity_map = node_identity_map(data.deleted_nodes)
105
+ class_change_map = java.util.HashMap.new
106
+ created_node_identity_map = iterate_created_nodes(data.created_nodes, class_change_map)
107
+ deleted_node_identity_map = deleted_node_identity_map(data.deleted_nodes)
104
108
  deleted_relationship_set = relationship_set(data.deleted_relationships)
105
109
  removed_node_properties_map = property_map(data.removed_node_properties)
106
110
  removed_relationship_properties_map = property_map(data.removed_relationship_properties)
111
+ add_deleted_nodes(data, class_change_map, removed_node_properties_map)
107
112
  empty_map = java.util.HashMap.new
108
- data.created_nodes.each{|node| node_created(node)}
109
- data.assigned_node_properties.each { |tx_data| property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, tx_data.value) }
113
+ data.assigned_node_properties.each { |tx_data| property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, tx_data.value) unless tx_data.key == '_classname'}
110
114
  data.removed_node_properties.each { |tx_data| property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, nil) unless deleted_node_identity_map.containsKey(tx_data.entity.getId) }
111
115
  data.deleted_nodes.each { |node| node_deleted(node, removed_node_properties_map.get(node.getId)||empty_map, deleted_relationship_set, deleted_node_identity_map)}
112
116
  data.created_relationships.each {|rel| relationship_created(rel, created_node_identity_map)}
113
117
  data.deleted_relationships.each {|rel| relationship_deleted(rel, removed_relationship_properties_map.get(rel.getId)||empty_map, deleted_relationship_set, deleted_node_identity_map)}
114
118
  data.assigned_relationship_properties.each { |tx_data| rel_property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, tx_data.value) }
115
119
  data.removed_relationship_properties.each {|tx_data| rel_property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, nil) unless deleted_relationship_set.contains_rel?(tx_data.entity) }
120
+ classes_changed(class_change_map)
121
+ rescue Exception => e
122
+ # since these exceptions gets swallowed
123
+ puts "ERROR in before commit hook #{e}"
124
+ puts e.backtrace.join("\n")
116
125
  end
117
126
 
118
- def node_identity_map(nodes)
119
- identity_map = java.util.HashMap.new(nodes.size)
120
- nodes.each{|node| identity_map.put(node.neo_id,node)}#using put due to a performance regression in JRuby 1.6.4
127
+
128
+ def iterate_created_nodes(nodes, class_change_map)
129
+ identity_map = java.util.HashMap.new
130
+ nodes.each do |node|
131
+ identity_map.put(node.neo_id,node) #using put due to a performance regression in JRuby 1.6.4
132
+ instance_created(node, class_change_map)
133
+ node_created(node)
134
+ end
135
+ identity_map
136
+ end
137
+
138
+ def deleted_node_identity_map(nodes)
139
+ identity_map = java.util.HashMap.new
140
+ nodes.each{|node| identity_map.put(node.neo_id,node)} #using put due to a performance regression in JRuby 1.6.4
121
141
  identity_map
122
142
  end
123
143
 
124
144
  def relationship_set(relationships)
125
- relationship_set = Neo4j::RelationshipSet.new(relationships.size)
145
+ relationship_set = Neo4j::RelationshipSet.new#(relationships.size)
126
146
  relationships.each{|rel| relationship_set.add(rel)}
127
147
  relationship_set
128
148
  end
@@ -192,5 +212,52 @@ module Neo4j
192
212
  def rel_property_changed(rel, key, old_value, new_value)
193
213
  @listeners.each {|li| li.on_rel_property_changed(rel, key, old_value, new_value) if li.respond_to?(:on_rel_property_changed)}
194
214
  end
215
+
216
+ def add_deleted_nodes(data, class_change_map, removed_node_properties_map)
217
+ data.deleted_nodes.each{|node| instance_deleted(node, removed_node_properties_map, class_change_map)}
218
+ end
219
+
220
+ def instance_created(node, class_change_map)
221
+ classname = node[:_classname]
222
+ class_change(classname, class_change_map).add(node) if classname
223
+ end
224
+
225
+ def instance_deleted(node, removed_node_properties_map, class_change_map)
226
+ properties = removed_node_properties_map.get(node.getId)
227
+ if properties
228
+ classname = properties.get("_classname")
229
+ class_change(classname, class_change_map).delete(node) if classname
230
+ end
231
+ end
232
+
233
+ def class_change(classname, class_change_map)
234
+ class_change_map.put(classname, ClassChanges.new) if class_change_map.get(classname).nil?
235
+ class_change_map.get(classname)
236
+ end
237
+
238
+ def classes_changed(changed_class_map)
239
+ @listeners.each {|li| li.classes_changed(changed_class_map) if li.respond_to?(:classes_changed)}
240
+ end
241
+ end
242
+
243
+ class ClassChanges
244
+ attr_accessor :added, :deleted
245
+
246
+ def initialize
247
+ self.added = []
248
+ self.deleted = []
249
+ end
250
+
251
+ def add(node)
252
+ self.added << node
253
+ end
254
+
255
+ def delete(node)
256
+ self.deleted << node
257
+ end
258
+
259
+ def net_change
260
+ self.added.size - self.deleted.size
261
+ end
195
262
  end
196
- end
263
+ end
@@ -3,7 +3,7 @@ module Neo4j::HasList
3
3
  def has_list(name, params = {})
4
4
  module_eval(%Q{
5
5
  def #{name}
6
- Neo4j::HasList::Mapping.new(self, '#{name}')
6
+ Neo4j::HasList::Mapping.new(self.class, self, '#{name}')
7
7
  end}, __FILE__, __LINE__)
8
8
  end
9
9
  end
@@ -34,11 +34,11 @@ module Neo4j
34
34
  class Mapping
35
35
  include Enumerable
36
36
  include ToJava
37
- include WillPaginate::Finders::Base
38
-
39
37
 
40
- def initialize(node, name)
41
- @time_line = org.neo4j.index.timeline.Timeline.new(name, node._java_node, true, Neo4j.started_db.graph)
38
+
39
+ def initialize(indexer_for, node, name)
40
+ @index = Neo4j.started_db.lucene.for_nodes("#{indexer_for.to_s.gsub('::', '_')}_#{name}-timeline", Neo4j::Config[:lucene][:exact])
41
+ @time_line = org.neo4j.index.lucene.LuceneTimeline.new(Neo4j.started_db.graph, @index)
42
42
  @node = node
43
43
  @name = name
44
44
  self.size = 0 unless size
@@ -57,38 +57,38 @@ module Neo4j
57
57
 
58
58
  # returns the first node with index n
59
59
  def [](n)
60
- @time_line.getAllNodesBetween(n-1, n+1).first
60
+ @time_line.getBetween(n, n).first
61
61
  end
62
62
 
63
63
  # returns all nodes with the given index n
64
64
  def all(n)
65
- @time_line.getAllNodesBetween(n-1, n+1)
65
+ @time_line.getBetween(n, n)
66
66
  end
67
67
 
68
68
  # returns the first node in the list or nil
69
69
  def first
70
- @time_line.first_node
70
+ @time_line.getFirst()
71
71
  end
72
72
 
73
73
  # returns the last node in the list or nil
74
74
  def last
75
- @time_line.last_node
75
+ @time_line.getLast
76
76
  end
77
77
 
78
78
  # adds a node to the list with the given index n
79
79
  def []=(n, other_node)
80
- @time_line.add_node(other_node, n)
80
+ @time_line.add(other_node, n)
81
81
  self.size = self.size + 1
82
82
  end
83
83
 
84
84
  # returns all the nodes between the given Range
85
85
  def between(range)
86
- @time_line.getAllNodesBetween(range.first-1, range.end+1)
86
+ @time_line.getBetween(range.first, range.end)
87
87
  end
88
88
 
89
89
  # removes one node from the list and decrases the size of the list,
90
90
  def remove(node)
91
- @time_line.remove_node(node)
91
+ @index.remove(node, "timestamp")
92
92
  self.size = self.size - 1
93
93
  end
94
94
 
@@ -104,7 +104,7 @@ module Neo4j
104
104
  # person.feeds.each {|node| node}
105
105
  #
106
106
  def each
107
- @time_line.all_nodes.iterator.each do |node|
107
+ @time_line.getBetween(java.lang.Long::MIN_VALUE,java.lang.Long::MAX_VALUE).iterator.each do |node|
108
108
  if @raw then
109
109
  yield node
110
110
  else
@@ -113,41 +113,21 @@ module Neo4j
113
113
  end
114
114
  end
115
115
 
116
- def wp_query(options, pager, args, &block) #:nodoc:
117
- @raw = true
118
- page = pager.current_page || 1
119
- to = pager.per_page * page
120
- from = to - pager.per_page
121
- i = 0
122
- res = []
123
- each do |node|
124
- res << node.wrapper if i >= from
125
- i += 1
126
- break if i >= to
127
- end
128
- pager.replace res
129
- pager.total_entries ||= size
130
- end
131
-
132
116
  # If called then it will only return the raw java nodes and not the Ruby wrappers using the Neo4j::NodeMixin
133
117
  def raw
134
118
  @raw = true
135
119
  end
136
120
 
137
121
  def <<(other)
138
- @time_line.add_node(other, size)
122
+ @time_line.add(other._java_node, size)
139
123
  self.size = self.size + 1
140
124
  self
141
125
  end
142
126
 
143
-
144
127
  private
145
128
  def size=(size)
146
129
  @node["_list_size_#{@name}"] = size
147
130
  end
148
-
149
-
150
131
  end
151
-
152
132
  end
153
133
  end