cadet 0.0.7-java → 0.0.8-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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f052829fbaf2513fb3cefa7a3574c4ec8b96b0b8
4
- data.tar.gz: 15d0bcc566e85c75282a7a24721beb0bd4069aeb
3
+ metadata.gz: a1efba14fa6c1668a60ffd431f8c37d17cf22027
4
+ data.tar.gz: 40606929349bf698a9a7fde8710d7bbc48dc97b2
5
5
  SHA512:
6
- metadata.gz: 0d9520c3fad2f19c494e5bff35352f2df349c7c224969687af366a5b66f40613a17b8fabdcaf8651736a4284c6c6c7e74f85f0dfcb1935336cc8a62a51d378b0
7
- data.tar.gz: 2d21fe45cbec47b08948aa72f6a12a89a7f84a87bdb46de4da828057f43efb58cd08de1127b152f50031b0b88463741de8944be85e23ddda5a3d8873e6d17d2c
6
+ metadata.gz: 234bfad83bb8ab3d621ef663c7f8ee2324b0f6ab2868de827f52b979fc117819d09cdf071c84f0176d40286bd7250205faeedbc4566f1dbf79554a6457f4ba06
7
+ data.tar.gz: 4ec3008adb3781e3b76ba70ed3c9038ad60da616218e9362d1602dcb257c4637212d1daa2a32a1b5a9179d3242843d113717d2a1383506bbee0d47af5ea21dc4
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ rvm:
2
+ - jruby
3
+
data/README.md CHANGED
@@ -1,52 +1,29 @@
1
- - batchinsert mode ruby based index provider
2
- - support for batchinsert mode!
3
- just open the database with Cadet::BatchInserter::Session.open() instead of Cadet::Session.open()!
4
- this no-ops transaction, simply yielding to the supplied block.
1
+ [![Build Status](https://travis-ci.org/karabijavad/cadet.png?branch=master)](https://travis-ci.org/karabijavad/cadet)
5
2
 
6
- super simple. you dont even need to download neo4j.
7
-
8
- 1. Gemfile
9
-
10
- ```ruby
11
- gem 'cadet'
12
- ```
13
- 2. ``` bundle install ```
14
- 3. cadet-example.rb
3
+ Use neo4j via jruby! Nothing else needed, simply add this gem to get the power of embedded neo4j!
15
4
 
16
- ```ruby
5
+ * Batchinsert mode supported.
17
6
 
18
- require 'cadet'
19
- require 'yaml'
20
7
 
21
- data = YAML.load_file('legislators-current.yaml')
22
-
23
- #open the database, db is now used to interact with the database
24
- db = Cadet::Session.open("neo4j-community-2.0.0/data/graph.db")
25
-
26
- db.transaction do
27
- ["Legislator", "Party", "Gender", "State"].each {|v| db.constraint v, "name"}
28
- end
8
+ super simple. you dont even need to download neo4j.
29
9
 
30
- data.each do |leg|
31
- #begin a transaction. the transaction will automatically finish at the end of the provided block
32
- db.transaction do
33
10
 
34
- #get_a_X_by_y(value) will get or create a node labeled 'X', with a property 'y' of value 'value'
35
- l = db.get_a_Legislator_by_name leg["name"]["official_full"]
36
- p = db.get_a_Party_by_name leg["terms"].first["party"]
37
- g = db.get_a_Gender_by_name leg["bio"]["gender"]
38
- s = db.get_a_State_by_name leg["terms"].first["state"]
11
+ ```ruby
39
12
 
40
- l.outgoing(:party) << p
41
- l.outgoing(:gender) << g
42
- l.outgoing(:represents) << s
43
- end
44
- end
13
+ require 'cadet'
45
14
 
46
- #close the database
47
- db.close()
15
+ #open the database
16
+ db = Cadet::Session.open("neo4j-community-2.0.0/data/graph.db").dsl do
17
+ #begin a transaction. the transaction will automatically finish at the end of the provided block
18
+ transaction do
19
+ Person_by_name("Javad").lives_in_to City_by_name("Chicago")
20
+ end
21
+ end
48
22
 
23
+ #close the database
24
+ db.close
49
25
 
26
+ ```
50
27
 
51
- ```
52
- 4. ```bundle exec ruby```
28
+ Batch insert mode can be used by simply using Cadet::BatchInserter::Session instead of Cadet::Session!
29
+ None of your code needs to change.
@@ -1,18 +1,32 @@
1
1
  module Cadet
2
2
  module BatchInserter
3
3
  class Node < Cadet::Node
4
- include_package "org.neo4j.graphdb"
5
4
 
6
5
  def create_outgoing(to, type, properties = {})
7
- @db.createRelationship(@underlying, to.underlying, DynamicRelationshipType.withName(type), properties)
6
+ Relationship.new @db.createRelationship(@underlying, to.underlying, DynamicRelationshipType.withName(type), properties)
8
7
  end
9
8
 
10
9
  def []= (property, value)
11
- @db.setNodeProperty @underlying, property.to_s, val
10
+ @db.setNodeProperty @underlying, property.to_java_string, value
12
11
  end
13
12
 
14
13
  def [] (property)
15
- @db.getNodeProperties(@underlying)[property.to_s]
14
+ @db.getNodeProperties(@underlying)[property.to_java_string]
15
+ end
16
+
17
+ def == other_node
18
+ @underlying == other_node
19
+ end
20
+
21
+ def outgoing(type)
22
+ NodeTraverser.new(self, :outgoing, type)
23
+ end
24
+
25
+ def each_relationship(direction, type)
26
+ # not implemented in batch inserter mode. though, it could be done.
27
+ # the assumption is that this shouldnt be necessary, as batch inserter mode
28
+ # should be about inserting data, not querying data
29
+ raise NotImplementedError
16
30
  end
17
31
 
18
32
  end
@@ -1,14 +1,10 @@
1
1
  module Cadet
2
2
  module BatchInserter
3
3
  class Session < Cadet::Session
4
- include_package "org.neo4j.graphdb"
5
- include_package "org.neo4j.unsafe.batchinsert"
6
- include_package "org.neo4j.index.impl.lucene"
7
- include_package "org.neo4j.helpers.collection"
8
4
 
9
5
  def initialize(db)
10
- @db = db
11
- @index_provider = Cadet::CadetIndex::IndexProvider.new(db)
6
+ @index_provider = CadetIndex::IndexProvider.new(db)
7
+ super db
12
8
  end
13
9
 
14
10
  def close
@@ -16,32 +12,33 @@ module Cadet
16
12
  super
17
13
  end
18
14
 
19
- def self.open(location)
20
- new BatchInserters.inserter(location)
21
- end
22
-
23
- def transaction
24
- yield
15
+ def self.open(location, config = {})
16
+ new org.neo4j.unsafe.batchinsert.BatchInserters.inserter(location, config)
25
17
  end
26
18
 
27
19
  def constraint(label, property)
28
20
  @db.createDeferredConstraint(DynamicLabel.label(label))
29
- .assertPropertyIsUnique(property.to_s)
21
+ .assertPropertyIsUnique(property)
30
22
  .create()
31
23
  end
32
24
 
33
25
  def find_node(label, property, value)
34
26
  index = @index_provider.nodeIndex(label)
35
27
 
36
- ( node = IteratorUtil.firstOrNull(index.get(property, value)) ) ?
28
+ (node = index.get(property.to_sym, value).first) ?
37
29
  Node.new(node, @db) : nil
38
30
  end
39
31
 
40
- def create_node(label, property, value)
41
- Node.new(@db.createNode({property.to_s => value}, DynamicLabel.label(label)), @db).tap do |n|
42
- index = @index_provider.nodeIndex(label).add(n.underlying, property, value)
32
+ def create_node(label, properties, indexing_property = nil)
33
+ Node.new(@db.createNode(properties.inject({}){|result,(k,v)| result[k.to_java_string] = v; result}, DynamicLabel.label(label)), @db).tap do |n|
34
+ @index_provider.nodeIndex(label).add(n.underlying, indexing_property.to_sym, properties[indexing_property]) if indexing_property
43
35
  end
44
36
  end
37
+
38
+ def get_transaction
39
+ Cadet::BatchInserter::Transaction.new(self)
40
+ end
41
+
45
42
  end
46
43
  end
47
44
  end
@@ -0,0 +1,16 @@
1
+ module Cadet
2
+ module BatchInserter
3
+ class Transaction < Cadet::Transaction
4
+
5
+ def initialize(session)
6
+ @session = session
7
+ end
8
+
9
+ def success
10
+ end
11
+
12
+ def close
13
+ end
14
+ end
15
+ end
16
+ end
@@ -7,23 +7,27 @@ module Cadet
7
7
  @index = {}
8
8
  @lucene_index = lucene_index
9
9
  end
10
+
10
11
  def add(node, property, value)
11
12
  @index[property] ||= {}
12
13
  @index[property][value] = node
13
14
  end
15
+
14
16
  def get(property, value)
15
17
  @index[property] ||= {}
16
18
  [@index[property][value]]
17
19
  end
20
+
18
21
  def flush
19
22
  index = @lucene_index.nodeIndex(@name, @type)
20
23
 
21
24
  @index.each do |property, mappings|
22
25
  mappings.each do |value, node|
23
- index.add(node, {property.to_s => value})
26
+ index.add(node, {property.to_java_string => value})
24
27
  end
25
28
  end
26
29
  end
30
+
27
31
  end
28
32
  end
29
33
  end
@@ -1,14 +1,14 @@
1
1
  module Cadet
2
2
  module CadetIndex
3
3
  class IndexProvider
4
- include_package "org.neo4j.index.impl.lucene"
4
+
5
5
  def initialize(db)
6
6
  @db = db
7
7
  @indexes = {}
8
- @lucene_index = LuceneBatchInserterIndexProviderNewImpl.new(db)
8
+ @lucene_index = org.neo4j.index.impl.lucene.LuceneBatchInserterIndexProviderNewImpl.new(db)
9
9
  end
10
10
  def nodeIndex(name, type = {"type" => "exact"})
11
- @indexes[name] ||= Cadet::CadetIndex::Index.new(@lucene_index, name, type)
11
+ @indexes[name.to_sym] ||= CadetIndex::Index.new(@lucene_index, name.to_sym, type)
12
12
  end
13
13
  def shutdown
14
14
  @indexes.each do |name, index|
@@ -0,0 +1,6 @@
1
+ module Cadet
2
+ Directions = {
3
+ outgoing: org.neo4j.graphdb.Direction::OUTGOING,
4
+ incoming: org.neo4j.graphdb.Direction::INCOMING
5
+ }
6
+ end
data/lib/cadet/dsl.rb ADDED
@@ -0,0 +1,36 @@
1
+ module Cadet
2
+ class DSL
3
+ def initialize(db)
4
+ @db = db
5
+ end
6
+
7
+ def method_missing(name, *args, &block)
8
+ case name
9
+ when /^([A-z_]*)_by_([A-z_]*)/
10
+ self.class.class_eval "
11
+ def #{name}(value)
12
+ @db.get_node :#{$1}, :#{$2}, value
13
+ end"
14
+ return self.send(name, *args, &block)
15
+
16
+ when /^create_([A-z_]*)_on_([A-z_]*)/.match(name)
17
+ self.class.class_eval "
18
+ def #{name}(value)
19
+ @db.create_node :#{$1}, value, :#{$2}
20
+ end"
21
+ return self.send(name, *args, &block)
22
+
23
+ when /^create_([A-z_]*)/
24
+ self.class.class_eval "
25
+ def #{name}(value = {})
26
+ @db.create_node :#{$1}, value
27
+ end"
28
+ return self.send(name, *args, &block)
29
+
30
+ else
31
+ return @db.send(name, *args, &block)
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -3,7 +3,7 @@ module Cadet
3
3
  @dynamic_labels = {}
4
4
 
5
5
  def self.label(name)
6
- @dynamic_labels[name] ||= org.neo4j.graphdb.DynamicLabel.label(name.to_s)
6
+ @dynamic_labels[name.to_sym] ||= org.neo4j.graphdb.DynamicLabel.label(name)
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -3,7 +3,7 @@ module Cadet
3
3
  @dynamic_relationship_types = {}
4
4
 
5
5
  def self.withName(name)
6
- @dynamic_relationship_types[name] ||= org.neo4j.graphdb.DynamicRelationshipType.withName(name.to_s)
6
+ @dynamic_relationship_types[name.to_sym] ||= org.neo4j.graphdb.DynamicRelationshipType.withName(name)
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,15 @@
1
+ # This is to fix a (bug?) in jruby.
2
+ # typically, when a ruby symbol is passed into a native java function,
3
+ # it should be converted to a java string by jruby.
4
+ # unfortunately, this conversion does not seem to take place when the native
5
+ # java function is overloaded.
6
+ # This method allows me to specify :symbol.to_java_string,
7
+ # so that I do not need to create a Ruby string from a symbol,
8
+ # just so that i can get a native java string
9
+
10
+ class Symbol
11
+ JString = java.lang.String
12
+ def to_java_string
13
+ to_java(JString)
14
+ end
15
+ end
data/lib/cadet/node.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  module Cadet
2
2
  class Node
3
3
  attr_accessor :underlying
4
- include_package "org.neo4j.graphdb"
5
4
 
6
5
  def initialize(node, db = nil)
7
6
  @db = db
@@ -17,28 +16,50 @@ module Cadet
17
16
  end
18
17
 
19
18
  def []= (property, value)
20
- @underlying.setProperty(property.to_s, value)
19
+ @underlying.setProperty(property.to_java_string, value)
21
20
  end
22
21
 
23
22
  def [] (property)
24
- @underlying.getProperty(property.to_s)
23
+ @underlying.getProperty(property.to_java_string)
25
24
  end
26
25
 
27
- def get_relationships(direction, type)
28
- @underlying.getRelationships(direction, DynamicRelationshipType.withName(type))
26
+ def each_relationship(direction, type)
27
+ @underlying.getRelationships(Directions[direction], DynamicRelationshipType.withName(type)).each do |rel|
28
+ yield Relationship.new(rel)
29
+ end
29
30
  end
31
+
30
32
  def create_outgoing(to, type)
31
- @underlying.createRelationshipTo(to.underlying, DynamicRelationshipType.withName(type))
33
+ Relationship.new @underlying.createRelationshipTo(to.underlying, DynamicRelationshipType.withName(type))
32
34
  end
33
35
  def outgoing(type)
34
- Cadet::RelationshipTraverser.new(self, Direction::OUTGOING, type)
36
+ NodeTraverser.new(self, :outgoing, type)
35
37
  end
36
38
  def incoming(type)
37
- Cadet::RelationshipTraverser.new(self, Direction::INCOMING, type)
39
+ NodeTraverser.new(self, :incoming, type)
40
+ end
41
+
42
+ def outgoing_rels(type)
43
+ NodeRelationships.new(self, :outgoing, type)
44
+ end
45
+ def incoming_rels(type)
46
+ NodeRelationships.new(self, :incoming, type)
38
47
  end
39
48
 
40
49
  def == other_node
41
50
  @underlying.getId == other_node.underlying.getId
42
51
  end
52
+
53
+ def method_missing(name, *args, &block)
54
+ if match = /([A-z_]*)_to$/.match(name)
55
+ self.class.class_eval "
56
+ def #{name}(value)
57
+ create_outgoing(value, :#{match.captures[0]})
58
+ end
59
+ "
60
+ self.send(name, *args, &block)
61
+ end
62
+ end
63
+
43
64
  end
44
65
  end
@@ -0,0 +1,20 @@
1
+ module Cadet
2
+ class NodeRelationships
3
+ include Enumerable
4
+
5
+ def initialize(node, direction, type)
6
+ @node = node
7
+ @type = type
8
+ @direction = direction
9
+ end
10
+
11
+ def each &block
12
+ @node.each_relationship(@direction, @type, &block)
13
+ end
14
+
15
+ def ==(other)
16
+ self.to_a == other.to_a
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ module Cadet
2
+ class NodeTraverser
3
+ include Enumerable
4
+
5
+ def initialize(node, direction, type)
6
+ @node = node
7
+ @type = type
8
+ @direction = direction
9
+ end
10
+
11
+ def each
12
+ @node.each_relationship(@direction, @type) do |rel|
13
+ yield rel.get_other_node(@node)
14
+ end
15
+ end
16
+
17
+ def << (othernode)
18
+ @direction == :outgoing ? @node.create_outgoing(othernode, @type) : othernode.create_outgoing(@node, @type)
19
+ end
20
+
21
+ def outgoing(type)
22
+ PathTraverser.new to_a, :outgoing, type
23
+ end
24
+ def incoming(type)
25
+ PathTraverser.new to_a, :incoming, type
26
+ end
27
+
28
+ def ==(other)
29
+ self.to_a == other.to_a
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ module Cadet
2
+ class PathTraverser
3
+ include Enumerable
4
+
5
+ def initialize(nodes, direction, type)
6
+ @nodes = nodes
7
+ @direction = direction
8
+ @type = type
9
+ end
10
+
11
+ def each
12
+ if @direction == :outgoing
13
+ @nodes.each do |n|
14
+ n.outgoing(@type).each do |o|
15
+ yield o
16
+ end
17
+ end
18
+ else
19
+ @nodes.each do |n|
20
+ n.incoming(@type).each do |o|
21
+ yield o
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ def outgoing(type)
28
+ PathTraverser.new(to_a, :outgoing, type)
29
+ end
30
+ def incoming(type)
31
+ PathTraverser.new(to_a, :incoming, type)
32
+ end
33
+
34
+ def ==(other)
35
+ self.to_a == other.to_a
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ module Cadet
2
+ class Relationship
3
+ attr_accessor :underlying
4
+
5
+ def initialize(relationship)
6
+ @underlying = relationship
7
+ end
8
+
9
+ def == other_rel
10
+ @underlying.getId == other_rel.underlying.getId
11
+ end
12
+
13
+ def get_other_node(node)
14
+ Node.new @underlying.getOtherNode(node.underlying)
15
+ end
16
+ end
17
+ end
data/lib/cadet/session.rb CHANGED
@@ -1,39 +1,43 @@
1
1
  module Cadet
2
2
  class Session
3
- include_package "org.neo4j.graphdb"
4
- include_package "org.neo4j.graphdb.factory"
5
- include_package "org.neo4j.unsafe.batchinsert"
6
- include_package "org.neo4j.helpers.collection"
7
-
8
3
  def initialize(db)
9
4
  @db = db
10
5
  end
11
6
 
12
7
  def self.open(location)
13
- new GraphDatabaseFactory.new.newEmbeddedDatabase(location)
8
+ new org.neo4j.graphdb.factory.GraphDatabaseFactory.new.newEmbeddedDatabase(location)
14
9
  end
15
10
  def close
16
11
  @db.shutdown
17
12
  end
18
13
 
19
- def create_node(label, property, value)
14
+ def create_node(label, properties, indexing_property = nil)
20
15
  Node.new(@db.createNode).tap do |n|
21
16
  n.add_label label
22
- n[property] = value
17
+ properties.each { |prop, val| n[prop] = val }
23
18
  end
24
19
  end
25
20
 
26
21
  def find_node(label, property, value)
27
- ( node = IteratorUtil.firstOrNull(@db.findNodesByLabelAndProperty(DynamicLabel.label(label), property, value)) ) ?
22
+ ( node = org.neo4j.helpers.collection.IteratorUtil.firstOrNull(@db.findNodesByLabelAndProperty(DynamicLabel.label(label), property, value)) ) ?
28
23
  Node.new(node) : nil
29
24
  end
30
25
 
31
26
  def get_node(label, property, value)
32
- find_node(label, property, value) || create_node(label, property, value)
27
+ find_node(label, property, value) || create_node(label, {property.to_sym => value}, property)
28
+ end
29
+
30
+ def get_transaction
31
+ Transaction.new(self)
32
+ end
33
+
34
+ def dsl(&block)
35
+ DSL.new(self).instance_exec(self, &block)
36
+ self
33
37
  end
34
38
 
35
39
  def transaction
36
- tx = @db.beginTx
40
+ tx = get_transaction
37
41
  begin
38
42
  yield tx
39
43
  tx.success
@@ -45,15 +49,12 @@ module Cadet
45
49
  def constraint(label, property)
46
50
  @db.schema
47
51
  .constraintFor(DynamicLabel.label(label))
48
- .assertPropertyIsUnique(property.to_s)
52
+ .assertPropertyIsUnique(property)
49
53
  .create()
50
54
  end
51
55
 
52
- def method_missing(name, *args)
53
- if match = /^get_a_([A-Z][A-Za-z]*)_by_([A-z]*)/.match(name)
54
- return get_node match.captures[0], match.captures[1], args[0]
55
- end
56
+ def begin_tx
57
+ @db.beginTx
56
58
  end
57
-
58
59
  end
59
60
  end
@@ -1,20 +1,9 @@
1
1
  module Cadet
2
2
  module Test
3
3
  class Session < Cadet::Session
4
- include_package "org.neo4j.graphdb"
5
- include_package "org.neo4j.unsafe.batchinsert"
6
- include_package "org.neo4j.index.impl.lucene"
7
- include_package "org.neo4j.helpers.collection"
8
- include_package "org.neo4j.graphdb.GraphDatabaseService"
9
- include_package "org.neo4j.graphdb.Node"
10
- include_package "org.neo4j.graphdb.Transaction"
11
- include_package "org.neo4j.graphdb.factory.GraphDatabaseSettings"
12
- include_package "org.neo4j.test"
13
-
14
-
15
4
 
16
5
  def self.open
17
- new TestGraphDatabaseFactory.new.newImpermanentDatabase
6
+ new org.neo4j.test.TestGraphDatabaseFactory.new.newImpermanentDatabase
18
7
  end
19
8
 
20
9
  end
@@ -0,0 +1,27 @@
1
+ module Cadet
2
+ class Transaction
3
+ attr_accessor :underlying
4
+
5
+ def initialize(session)
6
+ @session = session
7
+ @underlying = @session.begin_tx
8
+ end
9
+
10
+ def method_missing(name, *args, &block)
11
+ # for the "dsl".
12
+ # the transaction block is instance_eval'd by this class,
13
+ # so any missing methods are then sent to the session
14
+ # essentially means that session.blah can then be writen blah
15
+ @session.send(name, *args, &block)
16
+
17
+ end
18
+
19
+ def success
20
+ @underlying.success
21
+ end
22
+ def close
23
+ @underlying.close
24
+ end
25
+
26
+ end
27
+ end
data/lib/cadet/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cadet
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
data/lib/cadet.rb CHANGED
@@ -1,20 +1,29 @@
1
1
  require 'java'
2
2
 
3
- require "neo4j/concurrentlinkedhashmap-lru-1.3.1.jar"
4
- require "neo4j/lucene-core-3.6.2.jar"
5
- require "neo4j/neo4j-kernel-2.0.1-tests.jar"
6
- require "neo4j/neo4j-kernel-2.0.1.jar"
7
3
  require "neo4j/neo4j-lucene-index-2.0.1.jar"
8
4
  require "neo4j/neo4j-shell-2.0.1.jar"
9
5
  require "neo4j/neo4j-kernel-2.0.1-tests.jar"
10
6
 
7
+ require 'cadet/helpers'
11
8
  require 'cadet/session'
12
9
  require 'cadet/node'
13
- require 'cadet/relationship_traverser'
10
+ require 'cadet/relationship'
11
+ require 'cadet/direction'
12
+ require 'cadet/node_traverser'
13
+ require 'cadet/path_traverser'
14
+ require 'cadet/node_relationships'
15
+ require 'cadet/transaction'
16
+
17
+ require 'cadet/dsl'
18
+
14
19
  require 'cadet/batch_inserter/session'
15
20
  require 'cadet/batch_inserter/node'
21
+ require 'cadet/batch_inserter/transaction'
22
+
23
+ require 'cadet/test/session'
24
+
16
25
  require 'cadet/cadet_index/index_provider'
17
26
  require 'cadet/cadet_index/index'
27
+
18
28
  require 'cadet/dynamic_relationshiptype'
19
29
  require 'cadet/dynamic_label'
20
- require 'cadet/test/session'
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,52 @@
1
1
  require 'cadet'
2
+ require 'tmpdir'
2
3
 
3
- def quick_neo4j
4
- db = Cadet::Test::Session.open
4
+ def quick_test_neo4j
5
+ test_neo4j do |db|
5
6
  db.transaction do |tx|
6
7
  yield db, tx
7
8
  end
9
+ end
10
+ end
11
+
12
+ def test_neo4j
13
+ db = Cadet::Test::Session.open
14
+ yield db
8
15
  db.close
9
16
  end
17
+
18
+ def quick_normal_neo4j(at = nil)
19
+ at ||= Dir.mktmpdir
20
+
21
+ normal_neo4j(at) do |db|
22
+ db.transaction do
23
+ yield db
24
+ end
25
+ end
26
+ at
27
+ end
28
+
29
+ def normal_neo4j(at)
30
+ db = Cadet::Session.open(at)
31
+ yield db
32
+ db.close
33
+ end
34
+
35
+ def quick_batch_neo4j(at = nil)
36
+ at ||= Dir.mktmpdir
37
+
38
+ batch_neo4j(at) do |db|
39
+ yield db
40
+ end
41
+ at
42
+ end
43
+
44
+ def batch_neo4j(at)
45
+ db = Cadet::BatchInserter::Session.open(at)
46
+ yield db
47
+ db.close
48
+ end
49
+
50
+ def quick_batch_dsl_neo4j
51
+ yield quick_batch_neo4j.dsl
52
+ end
@@ -0,0 +1,144 @@
1
+ require 'spec_helper'
2
+ require 'tmpdir'
3
+
4
+ describe Cadet::BatchInserter do
5
+ it "should set a nodes property" do
6
+ tmpdir = quick_batch_neo4j do |db|
7
+ javad = db.get_node(:Person, :name, "Javad")
8
+ javad[:age] = 25
9
+ end
10
+
11
+ quick_normal_neo4j(tmpdir) do |db|
12
+ javad = db.get_node(:Person, :name, "Javad")
13
+ javad[:age].should == 25
14
+ end
15
+ end
16
+
17
+ it "should create a relationship" do
18
+ tmpdir = quick_batch_neo4j do |db|
19
+ javad = db.get_node(:Person, :name, "Javad")
20
+ ellen = db.get_node(:Person, :name, "Ellen")
21
+
22
+ javad.outgoing(:knows) << ellen
23
+ end
24
+
25
+ quick_normal_neo4j(tmpdir) do |db|
26
+ javad = db.get_node(:Person, :name, "Javad")
27
+ ellen = db.get_node(:Person, :name, "Ellen")
28
+
29
+ javad.outgoing(:knows).should == [ellen]
30
+ end
31
+ end
32
+
33
+ it "should create a node with a set of properties, and index that node on a specified property" do
34
+ tmpdir = quick_batch_neo4j do |db|
35
+ javad = db.create_node(:Person, {name: "Javad", age: 25})
36
+ end
37
+
38
+ quick_normal_neo4j(tmpdir) do |db|
39
+ javad = db.get_node(:Person, :name, "Javad")
40
+
41
+ javad[:name].should == "Javad"
42
+ javad[:age].should == 25
43
+ end
44
+ end
45
+
46
+ it "should retrieve the same node, for the same label-key-value" do
47
+ tmpdir = quick_batch_neo4j do |db|
48
+ javad = db.get_node(:Person, :name, "Javad")
49
+ ellen = db.get_node(:Person, :name, "Ellen")
50
+
51
+ javad.outgoing(:lives_in) << db.get_node(:City, :name, "Chicago")
52
+ ellen.outgoing(:lives_in) << db.get_node(:City, :name, "Chicago")
53
+ end
54
+
55
+ quick_normal_neo4j(tmpdir) do |db|
56
+ javad = db.get_node(:Person, :name, "Javad")
57
+ ellen = db.get_node(:Person, :name, "Ellen")
58
+
59
+ javad.outgoing(:lives_in).should == ellen.outgoing(:lives_in)
60
+ end
61
+ end
62
+
63
+ it "should work" do
64
+ tmpdir = quick_batch_neo4j do |db|
65
+ javad = db.get_node :Person, :name, "Javad"
66
+ ellen = db.get_node :Person, :name, "Ellen"
67
+ trunkclub = db.get_node :Company, :name, "Trunkclub"
68
+ chicago = db.get_node :City, :name, "Chicago"
69
+ us = db.get_node :Country, :name, "United States"
70
+
71
+ javad.outgoing(:works_at) << trunkclub
72
+ trunkclub.outgoing(:located_in) << chicago
73
+ ellen.outgoing(:lives_in) << chicago
74
+ chicago.outgoing(:country) << us
75
+ end
76
+
77
+ quick_normal_neo4j(tmpdir) do |db|
78
+ javad = db.get_node :Person, :name, "Javad"
79
+ ellen = db.get_node :Person, :name, "Ellen"
80
+ trunkclub = db.get_node :Company, :name, "Trunkclub"
81
+ chicago = db.get_node :City, :name, "Chicago"
82
+ us = db.get_node :Country, :name, "United States"
83
+
84
+ javad.outgoing(:works_at).should == [trunkclub]
85
+ end
86
+
87
+ end
88
+
89
+ it "should work" do
90
+ tmpdir = quick_batch_neo4j do |db|
91
+ javad = db.get_node :Person, :name, "Javad"
92
+ ellen = db.get_node :Person, :name, "Ellen"
93
+ trunkclub = db.get_node :Company, :name, "Trunkclub"
94
+ chicago = db.get_node :City, :name, "Chicago"
95
+ us = db.get_node :Country, :name, "United States"
96
+
97
+ javad.outgoing(:lives_in) << chicago
98
+ ellen.outgoing(:lives_in) << chicago
99
+ end
100
+
101
+ quick_normal_neo4j(tmpdir) do |db|
102
+ javad = db.get_node :Person, :name, "Javad"
103
+ ellen = db.get_node :Person, :name, "Ellen"
104
+ trunkclub = db.get_node :Company, :name, "Trunkclub"
105
+ chicago = db.get_node :City, :name, "Chicago"
106
+ us = db.get_node :Country, :name, "United States"
107
+
108
+ javad.outgoing(:lives_in).should == [chicago]
109
+ ellen.outgoing(:lives_in).should == [chicago]
110
+ end
111
+ end
112
+
113
+ it "should not allow for get_relationships" do
114
+ tmpdir = quick_batch_neo4j do |db|
115
+ javad = db.get_node :Person, :name, "Javad"
116
+ ellen = db.get_node :Person, :name, "Ellen"
117
+ trunkclub = db.get_node :Company, :name, "Trunkclub"
118
+ chicago = db.get_node :City, :name, "Chicago"
119
+ us = db.get_node :Country, :name, "United States"
120
+
121
+ javad.outgoing(:lives_in) << chicago
122
+ chicago.outgoing(:country) << us
123
+
124
+ expect {javad.outgoing(:lives_in).outgoing(:country)}.to raise_error(NotImplementedError)
125
+ end
126
+ end
127
+
128
+ it "should accept database configs" do
129
+ db = Cadet::BatchInserter::Session.open(Dir.mktmpdir, {"use_memory_mapped_buffers" => "true"})
130
+ db.close
131
+ end
132
+
133
+ xit "should not allow for get_relationships" do
134
+ quick_batch_dsl_neo4j do
135
+ transaction do
136
+ Person_by_name("Javad").lives_in_to City_by_name("Chicago")
137
+
138
+ Person_by_name("Javad").outgoing(:lives_in).should == [City_by_name("Chicago")]
139
+ end
140
+ end
141
+ end
142
+
143
+
144
+ end
@@ -1,31 +1,101 @@
1
1
  require 'spec_helper'
2
- require 'tmpdir'
3
2
 
4
3
  describe Cadet do
5
4
 
6
5
  it "should set a node's property" do
7
- quick_neo4j do |db|
6
+ quick_normal_neo4j do |db|
8
7
  javad = db.get_node :Person, :name, "Javad"
9
8
  javad[:name].should == "Javad"
10
9
  end
11
10
  end
12
11
 
13
12
  it "should set a node's label" do
14
- quick_neo4j do |db|
13
+ quick_normal_neo4j do |db|
15
14
  javad = db.get_node :Person, :name, "Javad"
16
- javad.add_label "Member"
15
+ javad.add_label :Member
17
16
  javad.labels.should == ["Person", "Member"]
18
17
  end
19
18
  end
20
19
 
21
20
  it "should add outgoing relationship's to a node" do
22
- quick_neo4j do |db|
21
+ quick_normal_neo4j do |db|
23
22
  javad = db.get_node :Person, :name, "Javad"
24
23
  ellen = db.get_node :Person, :name, "Ellen"
25
24
 
26
25
  javad.outgoing(:knows) << ellen
27
26
 
28
- javad.outgoing(:knows).to_a.should == [ellen]
27
+ javad.outgoing(:knows).should == [ellen]
28
+ end
29
+ end
30
+
31
+ it "it should accept multiple relationships" do
32
+ quick_normal_neo4j do |db|
33
+ javad = db.get_node(:Person, :name, "Javad")
34
+ javad.outgoing(:lives_in) << db.get_node(:City, :name, "Chicago")
35
+ javad.outgoing(:lives_in) << db.get_node(:City, :name, "Houston")
36
+ javad.outgoing(:lives_in).should == [db.get_node(:City, :name, "Chicago"), db.get_node(:City, :name, "Houston")]
37
+ end
38
+ end
39
+
40
+ it "should allow for outgoing to be chained" do
41
+ quick_test_neo4j do |db|
42
+ db.dsl do |db|
43
+ javad = Person_by_name "Javad"
44
+ ellen = Person_by_name "Ellen"
45
+ trunkclub = Company_by_name "Trunkclub"
46
+ chicago = City_by_name "Chicago"
47
+ us = Country_by_name "United States"
48
+ springfield = City_by_name "Springfield"
49
+
50
+
51
+ javad.outgoing(:works_at) << trunkclub
52
+ trunkclub.outgoing(:located_in) << chicago
53
+ javad.outgoing(:lives_in) << chicago
54
+ ellen.outgoing(:lives_in) << chicago
55
+ chicago.outgoing(:country) << us
56
+
57
+ javad.outgoing(:works_at).outgoing(:located_in).outgoing(:country).should == [us]
58
+ chicago.incoming(:located_in).incoming(:works_at).should == [javad]
59
+ javad.outgoing(:works_at).outgoing(:located_in).incoming(:lives_in).should == [javad, ellen]
60
+ end
61
+ end
62
+ end
63
+
64
+ it "should allow for node relationship's to be accessed" do
65
+ quick_test_neo4j do |db|
66
+ db.dsl do |db|
67
+ javad = Person_by_name "Javad"
68
+ ellen = Person_by_name "Ellen"
69
+ javad.outgoing(:knows) << ellen
70
+ javad.incoming(:also_knows) << ellen
71
+
72
+ javad.outgoing_rels(:knows).map{ |rel| rel.get_other_node(javad)}.should == [ellen]
73
+ javad.incoming_rels(:also_knows).map{ |rel| rel.get_other_node(javad)}.should == [ellen]
74
+ end
75
+ end
76
+ end
77
+
78
+
79
+ xit "should enforce unique constraints" do
80
+ test_neo4j do |db|
81
+ db.transaction do
82
+ db.constraint :Person, :name
83
+ end
84
+ db.transaction do
85
+ db.create_node :Person, :name, "Javad"
86
+
87
+ expect { db.create_node :Person, :name, "Javad" }.to raise_error(org.neo4j.graphdb.ConstraintViolationException)
88
+ end
89
+ end
90
+ end
91
+
92
+ it 'should have a working dsl' do
93
+ db = Cadet::Test::Session.open.dsl do
94
+ transaction do |tx|
95
+ Person_by_name("Javad").lives_in_to City_by_name("Chicago")
96
+
97
+ Person_by_name("Javad").outgoing(:lives_in).should == [City_by_name("Chicago")]
98
+ end
29
99
  end
30
100
  end
31
101
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cadet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: java
6
6
  authors:
7
7
  - Javad Karabi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-21 00:00:00.000000000 Z
11
+ date: 2014-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -45,6 +45,7 @@ extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
47
  - .gitignore
48
+ - .travis.yml
48
49
  - Gemfile
49
50
  - Gemfile.lock
50
51
  - README.md
@@ -53,14 +54,22 @@ files:
53
54
  - lib/cadet.rb
54
55
  - lib/cadet/batch_inserter/node.rb
55
56
  - lib/cadet/batch_inserter/session.rb
57
+ - lib/cadet/batch_inserter/transaction.rb
56
58
  - lib/cadet/cadet_index/index.rb
57
59
  - lib/cadet/cadet_index/index_provider.rb
60
+ - lib/cadet/direction.rb
61
+ - lib/cadet/dsl.rb
58
62
  - lib/cadet/dynamic_label.rb
59
63
  - lib/cadet/dynamic_relationshiptype.rb
64
+ - lib/cadet/helpers.rb
60
65
  - lib/cadet/node.rb
61
- - lib/cadet/relationship_traverser.rb
66
+ - lib/cadet/node_relationships.rb
67
+ - lib/cadet/node_traverser.rb
68
+ - lib/cadet/path_traverser.rb
69
+ - lib/cadet/relationship.rb
62
70
  - lib/cadet/session.rb
63
71
  - lib/cadet/test/session.rb
72
+ - lib/cadet/transaction.rb
64
73
  - lib/cadet/version.rb
65
74
  - lib/neo4j/README.txt
66
75
  - lib/neo4j/concurrentlinkedhashmap-lru-1.3.1.jar
@@ -71,6 +80,7 @@ files:
71
80
  - lib/neo4j/neo4j-lucene-index-2.0.1.jar
72
81
  - lib/neo4j/neo4j-shell-2.0.1.jar
73
82
  - spec/spec_helper.rb
83
+ - spec/unit/batch_insert_spec.rb
74
84
  - spec/unit/cadet_spec.rb
75
85
  homepage: https://github.com/karabijavad/cadet
76
86
  licenses:
@@ -1,22 +0,0 @@
1
- module Cadet
2
- class RelationshipTraverser
3
- include Enumerable
4
- include_package "org.neo4j.graphdb"
5
-
6
- def initialize(node, direction, type)
7
- @node = node
8
- @type = type
9
- @direction = direction
10
- end
11
-
12
- def each
13
- @node.get_relationships(@direction, @type).each do |rel|
14
- yield Node.new(rel.getOtherNode(@node.underlying))
15
- end
16
- end
17
-
18
- def << (othernode)
19
- @direction == Direction::OUTGOING ? @node.create_outgoing(othernode, @type) : othernode.create_outgoing(@node, @type)
20
- end
21
- end
22
- end