neo4j 2.0.1-java → 2.2.0-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 (55) hide show
  1. data/CHANGELOG +12 -0
  2. data/Gemfile +0 -3
  3. data/README.rdoc +12 -22
  4. data/lib/db/index/lucene-store.db +0 -0
  5. data/lib/db/index/lucene.log.active +0 -0
  6. data/lib/db/index/{lucene.log.1 → lucene.log.v0} +0 -0
  7. data/lib/db/messages.log +170 -162
  8. data/lib/db/neostore +0 -0
  9. data/lib/db/neostore.id +0 -0
  10. data/lib/db/neostore.nodestore.db +0 -0
  11. data/lib/db/neostore.nodestore.db.id +0 -0
  12. data/lib/db/neostore.propertystore.db +0 -0
  13. data/lib/db/neostore.propertystore.db.arrays +0 -0
  14. data/lib/db/neostore.propertystore.db.arrays.id +0 -0
  15. data/lib/db/neostore.propertystore.db.id +0 -0
  16. data/lib/db/neostore.propertystore.db.index +0 -0
  17. data/lib/db/neostore.propertystore.db.index.id +0 -0
  18. data/lib/db/neostore.propertystore.db.index.keys +0 -0
  19. data/lib/db/neostore.propertystore.db.index.keys.id +0 -0
  20. data/lib/db/neostore.propertystore.db.strings +0 -0
  21. data/lib/db/neostore.propertystore.db.strings.id +0 -0
  22. data/lib/db/neostore.relationshipstore.db +0 -0
  23. data/lib/db/neostore.relationshipstore.db.id +0 -0
  24. data/lib/db/neostore.relationshiptypestore.db +0 -0
  25. data/lib/db/neostore.relationshiptypestore.db.id +0 -0
  26. data/lib/db/neostore.relationshiptypestore.db.names +0 -0
  27. data/lib/db/neostore.relationshiptypestore.db.names.id +0 -0
  28. data/lib/db/nioneo_logical.log.active +0 -0
  29. data/lib/db/nioneo_logical.log.v0 +0 -0
  30. data/lib/db/tm_tx_log.1 +0 -0
  31. data/lib/neo4j/rails/attributes.rb +6 -3
  32. data/lib/neo4j/rails/column.rb +26 -0
  33. data/lib/neo4j/rails/finders.rb +48 -4
  34. data/lib/{db/lock → neo4j/rails/ha_console.rb} +0 -0
  35. data/lib/neo4j/rails/ha_console/ha_console.rb +68 -0
  36. data/lib/neo4j/rails/ha_console/railtie.rb +21 -0
  37. data/lib/neo4j/rails/ha_console/zookeeper/clean.sh +4 -0
  38. data/lib/neo4j/rails/ha_console/zookeeper/conf/server1.cfg +11 -0
  39. data/lib/neo4j/rails/ha_console/zookeeper/data/zookeeper1/myid +1 -0
  40. data/lib/neo4j/rails/ha_console/zookeeper/start_zookeeper.sh +17 -0
  41. data/lib/neo4j/rails/ha_console/zookeeper/zookeeper.rb +62 -0
  42. data/lib/neo4j/rails/has_n.rb +3 -0
  43. data/lib/neo4j/rails/persistence.rb +3 -1
  44. data/lib/neo4j/rails/rails.rb +2 -1
  45. data/lib/neo4j/version.rb +1 -1
  46. data/lib/neo4j/version.rb~ +3 -0
  47. data/lib/orm_adapter/adapters/neo4j.rb +52 -5
  48. data/neo4j.gemspec +1 -1
  49. metadata +311 -186
  50. data/bin/neo4j-shell~ +0 -108
  51. data/lib/Gemfile~ +0 -3
  52. data/lib/config2.yml~ +0 -86
  53. data/lib/db/nioneo_logical.log.1 +0 -0
  54. data/lib/perf.rb~ +0 -36
  55. data/lib/test.rb~ +0 -2
data/lib/db/neostore CHANGED
Binary file
data/lib/db/neostore.id CHANGED
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/lib/db/tm_tx_log.1 CHANGED
Binary file
@@ -18,7 +18,8 @@ module Neo4j
18
18
  included do
19
19
  include ActiveModel::Dirty # track changes to attributes
20
20
  include ActiveModel::MassAssignmentSecurity # handle attribute hash assignment
21
-
21
+
22
+
22
23
  class << self
23
24
  attr_accessor :attribute_defaults
24
25
  end
@@ -238,10 +239,12 @@ module Neo4j
238
239
  module ClassMethods
239
240
  # Returns all defined properties
240
241
  def columns
241
- self._decl_props.keys
242
+ columns = []
243
+ props = Marshal.load( Marshal.dump(self._decl_props ))
244
+ props.each { |k,v| v.store(:name, k ); columns << Column.new(v) }
245
+ columns
242
246
  end
243
247
 
244
-
245
248
  # Declares a property.
246
249
  # It support the following hash options:
247
250
  # <tt>:default</tt>,<tt>:null</tt>,<tt>:limit</tt>,<tt>:type</tt>,<tt>:index</tt>,<tt>:converter</tt>.
@@ -0,0 +1,26 @@
1
+ #
2
+ # This is a way to wrap model attributes as Active Record-like column objects, providing a name and type for the column.
3
+ # This helps when using view generators, such as twitter-bootstrap-rails.
4
+ #
5
+
6
+
7
+ module Neo4j
8
+ module Rails
9
+
10
+ class Column
11
+
12
+ attr_reader :name, :type, :index, :converter
13
+
14
+ def initialize(args)
15
+ raise ArgumentError, "Column must passed a :name" if args[:name].nil?
16
+ args[:type] ||= "String" # default the type to String.
17
+ args.each do |k,v|
18
+ instance_variable_set("@#{k}", v.to_s) unless v.nil?
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end #rails
25
+ end #neo4j
26
+
@@ -57,7 +57,7 @@ module Neo4j
57
57
  if self._decl_props[field.to_sym] && self._decl_props[field.to_sym][:type] == Fixnum
58
58
  module_eval <<-RUBY, __FILE__, __LINE__
59
59
  def self.all_by_#{field}(value)
60
- find_with_indexer(:#{field} => value)
60
+ find_with_indexer_or_traversal(:#{field} => value)
61
61
  end
62
62
  def self.find_by_#{field}(value)
63
63
  all_by_#{field}(value).first
@@ -66,7 +66,7 @@ module Neo4j
66
66
  else
67
67
  module_eval <<-RUBY, __FILE__, __LINE__
68
68
  def self.all_by_#{field}(value)
69
- find_with_indexer("#{field}: \\"\#{value}\\"")
69
+ find_with_indexer_or_traversal("#{field}: \\"\#{value}\\"")
70
70
  end
71
71
 
72
72
  def self.find_by_#{field}(value)
@@ -175,13 +175,19 @@ module Neo4j
175
175
  if ids
176
176
  [find_with_ids(ids)].flatten
177
177
  else
178
- find_with_indexer(*args, &block)
178
+ find_with_indexer_or_traversal(*args, &block)
179
179
  end
180
180
  end
181
181
  end
182
182
 
183
183
  def first(*args, &block)
184
- all(*args, &block).first
184
+ found = all(*args, &block).first
185
+ if found && args.first.is_a?(Hash) && args.first.include?(:id)
186
+ # if search for an id then all the other properties must match
187
+ args.first.find{|k,v| k != :id && found.send(k) != v} ? nil : found
188
+ else
189
+ found
190
+ end
185
191
  end
186
192
 
187
193
  def last(*args)
@@ -245,6 +251,28 @@ module Neo4j
245
251
  entity.is_a?(self) and entity.reachable_from_ref_node?
246
252
  end
247
253
 
254
+
255
+ def use_traversal_finder?(*args)
256
+ # Conditions for using a traversal:
257
+ # 1. the first argument is a hash
258
+ return false unless args.first.is_a?(Hash)
259
+
260
+ # 2. no support for :condition hash
261
+ return false if args.first.include?(:conditions)
262
+
263
+ # 3. there is at least one property which does not have a lucene index
264
+ args.first.keys.find{|k| !index?(k)}
265
+ end
266
+
267
+
268
+ def find_with_indexer_or_traversal(*args, &block)
269
+ if use_traversal_finder?(*args)
270
+ find_with_traversal(args.first)
271
+ else
272
+ find_with_indexer(*args, &block)
273
+ end
274
+ end
275
+
248
276
  def find_with_indexer(*args, &block)
249
277
  hits = if args.first.is_a?(Hash) && args.first.include?(:conditions)
250
278
  params = args.first.clone
@@ -262,6 +290,22 @@ module Neo4j
262
290
  hits
263
291
  end
264
292
 
293
+ def find_with_traversal(conditions)
294
+ this = self
295
+ all.query do |cypher|
296
+ conditions.each_pair do |k,v|
297
+ if this._decl_rels.keys.include?(k)
298
+ n = node(v.id)
299
+ rel_name = rel(this._decl_rels[k].rel_type)
300
+ this._decl_rels[k].dir == :outgoing ? cypher > rel_name > n : cypher < rel_name < n
301
+ else
302
+ cypher[k] == v
303
+ end
304
+ end
305
+ cypher
306
+ end
307
+ end
308
+
265
309
  # Find the first object or create/initialize it.
266
310
  #
267
311
  # @example Find or perform an action.
File without changes
@@ -0,0 +1,68 @@
1
+ require 'neo4j-enterprise'
2
+ require 'fileutils'
3
+ require 'tmpdir'
4
+
5
+ module Neo4j
6
+
7
+ module Rails
8
+
9
+ # Configures Neo4j HA and Zookeeper in order to be used from a rails console
10
+ # @see Railtie
11
+ module HaConsole
12
+ class << self
13
+ def machine_id
14
+ (defined? IRB) ? 2 : 1
15
+ end
16
+
17
+ def proj_root
18
+ Object::Rails.root
19
+ end
20
+
21
+ def storage_path(id = machine_id)
22
+ File.expand_path("db/ha_neo_#{id}", proj_root)
23
+ end
24
+
25
+ def config_machine(id = machine_id)
26
+ puts "config_machine #{id}"
27
+ # override this default config with this machine configuration
28
+ Neo4j.config['ha.db'] = true
29
+ Neo4j.config['ha.server_id'] = id
30
+ Neo4j.config['ha.server'] = "localhost:600#{machine_id}"
31
+ Neo4j.config['ha.pull_interval'] = "2"
32
+ Neo4j.config[:storage_path] = storage_path(id)
33
+
34
+ copy_config unless File.exist?(config_dir)
35
+ require "#{config_dir}/zookeeper"
36
+ end
37
+
38
+ def config_dir
39
+ File.expand_path("neo4j_ha_console/zookeeper", Dir.tmpdir)
40
+ end
41
+
42
+ def copy_config
43
+ source_dir = File.expand_path("zookeeper", File.dirname(__FILE__))
44
+ system("mkdir -p #{File.expand_path("..", config_dir)}")
45
+ system("cp -r #{source_dir} #{config_dir}")
46
+ end
47
+
48
+ def zookeeper_running?
49
+ Zookeeper.pid_file?
50
+ end
51
+
52
+ def start_zookeeper
53
+ Zookeeper.start unless zookeeper_running?
54
+ end
55
+
56
+ def shutdown_zookeeper
57
+ if zookeeper_running?
58
+ Zookeeper.shutdown
59
+ else
60
+ puts "Can't shutdown zookeeper - no PID file found for zookeeper process at #{Zookeeper.pid_file}"
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+ end
67
+ end
68
+
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../ha_console', __FILE__)
2
+
3
+ module Neo4j
4
+
5
+ module Rails
6
+
7
+ module HaConsole
8
+
9
+ # Include this in your config/application.rb in order to run a rails console
10
+ # It avoids the Neo4j limitation of only having one process accessing the database by using HA clustering/neo4j-enterprise
11
+ class Railtie < Object::Rails::Railtie
12
+ config.before_configuration do
13
+ Neo4j::Rails::HaConsole.config_machine
14
+ Neo4j::Rails::HaConsole.start_zookeeper
15
+ config.neo4j.storage_path = Neo4j::Rails::HaConsole.storage_path
16
+ puts "HA: #{Neo4j.config['ha.db']}, server_id: #{Neo4j.config['ha.server_id']}, master: #{Neo4j.ha_master?}, storage_path=#{config.neo4j.storage_path}"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+
3
+ rm -rf db
4
+ rm -rf data/zookeeper1/version-2
@@ -0,0 +1,11 @@
1
+ #server1.cfg
2
+ tickTime=2000
3
+ initLimit=10
4
+ syncLimit=5
5
+
6
+ dataDir=data/zookeeper1
7
+ clientPort=2181
8
+
9
+ server.1=localhost:2888:3888
10
+ #server.2=localhost:2889:3889
11
+ #server.3=localhost:2890:3890
@@ -0,0 +1,17 @@
1
+ #!/bin/sh
2
+
3
+ # Only follow symlinks if readlink supports it
4
+ if readlink -f "$0" > /dev/null 2>&1
5
+ then
6
+ ZOOBIN=`readlink -f "$0"`
7
+ else
8
+ ZOOBIN="$0"
9
+ fi
10
+
11
+ ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"
12
+
13
+ ZOOBINDIR=`dirname "$ZOOBIN"`
14
+ JARDIR=`cd "${ZOOBINDIR}/lib"; pwd`
15
+
16
+ CLASSPATH=$JARDIR/log4j-1.2.16.jar:$JARDIR/zookeeper-3.3.2.jar
17
+ java -cp "$CLASSPATH" $ZOOMAIN conf/server1.cfg
@@ -0,0 +1,62 @@
1
+ module Neo4j
2
+ module Rails
3
+ module HaConsole
4
+ module Zookeeper
5
+ class << self
6
+ def shutdown
7
+ return unless pid_file?
8
+ file = File.open(pid_file, "rb")
9
+ pid = file.read.to_s.chomp
10
+ IO.popen("pkill -TERM -P #{pid}")
11
+ puts "Zookeeper: shutdown #{pid}"
12
+ system("rm -f #{pid_file}")
13
+ end
14
+
15
+ def clean
16
+ dir = File.expand_path("data/zookeeper1/version-2", File.dirname(__FILE__))
17
+ puts "Zookeeper: clean #{dir}"
18
+ system("rm -rf #{dir}")
19
+ end
20
+
21
+ def pid_file
22
+ File.expand_path("zookeeper.pid", File.dirname(__FILE__)).to_s
23
+ end
24
+
25
+ def pid_file?
26
+ x = File.exist?(pid_file)
27
+ puts "Zookeeper: pid file #{x} at #{pid_file}"
28
+ x
29
+ end
30
+
31
+ def lib_dir
32
+ File.expand_path("lib", File.dirname(__FILE__))
33
+ end
34
+
35
+ def copy_jars
36
+ puts "Zookeeper: Copy JARs"
37
+ files = $CLASSPATH.find_all{|x| x =~ /\.jar$/}.collect{|y| y.sub('file:', '')}
38
+ zookeeper = files.find{|f| f =~ /\/zookeeper/}
39
+ raise "zookeper JAR not found in a GEM, did you forget to include neo4j-enterprise in your Gemfile (development)" unless zookeeper
40
+
41
+ log4j = files.find{|f| f =~ /\/log4j/}
42
+ raise "log4j not found in a GEM, did you forget to include neo4j-enterprise in your Gemfile (development)" unless log4j
43
+
44
+
45
+ system("mkdir -p #{lib_dir}")
46
+ FileUtils.cp(zookeeper, lib_dir)
47
+ FileUtils.cp(log4j, lib_dir)
48
+ end
49
+
50
+ def start
51
+ puts "Zookeeper: start, check jars?"
52
+ copy_jars unless File.exist?(lib_dir)
53
+ zookeeper_exec = File.expand_path("start_zookeeper.sh", File.dirname(__FILE__)).to_s
54
+ Dir.chdir(File.dirname(__FILE__))
55
+ pipe = IO.popen(zookeeper_exec)
56
+ File.open(pid_file, 'w') { |f| f.write(pipe.pid) }
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -63,6 +63,9 @@ module Neo4j
63
63
  define_has_n_methods_for(args.first, options)
64
64
  end
65
65
 
66
+
67
+ alias_method :has_many, :has_n
68
+
66
69
  # Declares ONE incoming or outgoing relationship
67
70
  #
68
71
  # @example
@@ -160,11 +160,13 @@ module Neo4j
160
160
  else
161
161
  true
162
162
  end
163
+ rescue => e
164
+ Neo4j::Rails::Transaction.fail if Neo4j::Rails::Transaction.running?
165
+ raise e
163
166
  ensure
164
167
  @_create_or_updating = nil
165
168
  end
166
169
 
167
-
168
170
  def set_deleted_properties
169
171
  @_deleted = true
170
172
  end
@@ -13,6 +13,7 @@ require 'neo4j/rails/observer'
13
13
  require 'neo4j/rails/compositions'
14
14
  require 'neo4j/rails/accept_id'
15
15
  require 'neo4j/rails/timestamps'
16
+ require 'neo4j/rails/column'
16
17
  require 'neo4j/rails/attributes'
17
18
  require 'neo4j/rails/nested_attributes'
18
19
  require 'neo4j/rails/serialization'
@@ -27,4 +28,4 @@ require 'neo4j/rails/has_n'
27
28
  require 'neo4j/rails/rack_middleware'
28
29
  require 'neo4j/rails/versioning/versioning'
29
30
  require 'neo4j/rails/model'
30
- require 'neo4j/rails/relationship'
31
+ require 'neo4j/rails/relationship'
data/lib/neo4j/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Neo4j
2
- VERSION = "2.0.1"
2
+ VERSION = "2.2.0"
3
3
  end