pacer-orient 2.0.0-java → 2.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ae4c997eba45204e9613c0e967992afa83446de5
4
+ data.tar.gz: 993cfec0e2021dfcbdc15dfa12d977ff2c6cd407
5
+ SHA512:
6
+ metadata.gz: a294fce502976561afb02005cd85757366f0c8f6227538834eae5871582acf52c8fd78bde4b9f537b001c7454ae988850b50b9788faf6286ca8360b4c46c04a1
7
+ data.tar.gz: 64604585eaa4cbbe65087b0e011b6c6f0a9f44fd94a4839d5d1e7e5a704de207728838b7efd87274aa533d8f07d3d2e5eb25e4076d61f85c15eedc7fa7222072
data/.gitignore CHANGED
@@ -1,2 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ target/*
1
6
  lib/*.jar
2
- pkg
data/README.md CHANGED
@@ -1,32 +1,21 @@
1
- # OrientDB Graph Database Adapter for Pacer
2
-
3
- *Note:* The Pacer test suite does not pass with this graph adapter,
4
- therefore this adapter is currently only experimental. Graphs with fully
5
- passing test suites currently include TinkerGraph, Neo4j and Dex.
1
+ # Orient Graph Database Adapter for Pacer
6
2
 
7
3
  [Pacer](https://github.com/pangloss/pacer) is a
8
4
  [JRuby](http://jruby.org) graph traversal framework built on the
9
5
  [Tinkerpop](http://www.tinkerpop.com) stack.
10
6
 
11
- This plugin enables full
12
- [OrientDB](http://http://www.orientechnologies.com/) graph support in Pacer.
7
+ This plugin enables full [Orient](http://orient.org) graph support in Pacer.
13
8
 
14
9
 
15
10
  ## Usage
16
11
 
17
- Here is how you open a OrientDB graph in Pacer.
12
+ Here is how you open a Orient graph in Pacer.
18
13
 
19
14
  require 'pacer'
20
15
  require 'pacer-orient'
21
16
 
22
- # Graph takes an OrientDB URL, e.g. disk back graph:
23
- graph = Pacer.orient 'local:path/to/graph'
24
-
25
- # In memory graph
26
- graph = Pacer.orient 'memory:foo'
27
-
28
- # Remote graph
29
- graph = Pacer.orient 'remote:localhost/graph', 'username', 'password'
17
+ # Graph will be created if it doesn't exist
18
+ graph = Pacer.orient 'path/to/graph'
30
19
 
31
20
  All other operations are identical across graph implementations (except
32
21
  where certain features are not supported). See Pacer's documentation for
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ file 'pom.xml' => 'lib/pacer-orient/version.rb' do
7
7
  open 'pom.xml', 'w' do |f|
8
8
  pom.each_line do |line|
9
9
  line.sub!(%r{<gem.version>.*</gem.version>}, "<gem.version>#{ Pacer::Orient::VERSION }</gem.version>")
10
- line.sub!(%r{<blueprints.version>.*</blueprints.version>}, "<blueprints.version>#{ Pacer::Orient::BLUEPRINTS_VERSION }</blueprints.version>")
10
+ line.sub!(%r{<orient.version>.*</orient.version>}, "<orient.version>#{ Pacer::Orient::ORIENT_VERSION }</orient.version>")
11
11
  line.sub!(%r{<pipes.version>.*</pipes.version>}, "<pipes.version>#{ Pacer::Orient::PIPES_VERSION }</pipes.version>")
12
12
  f << line
13
13
  end
@@ -22,7 +22,7 @@ file Pacer::Orient::JAR_PATH => 'pom.xml' do
22
22
  end
23
23
 
24
24
  task :note do
25
- puts "NOTE: touch lib/pacer-neo4j/version.rb (or rake touch) to force everything to rebuild"
25
+ puts "NOTE: touch lib/pacer-orient/version.rb (or rake touch) to force everything to rebuild"
26
26
  end
27
27
 
28
28
  task :build => [:note, Pacer::Orient::JAR_PATH]
@@ -32,3 +32,4 @@ desc 'Touch version.rb so that the jar rebuilds'
32
32
  task :touch do
33
33
  system 'touch', 'lib/pacer-orient/version.rb'
34
34
  end
35
+
@@ -0,0 +1,109 @@
1
+ require 'java'
2
+
3
+ module Pacer::Orient
4
+ class Encoder
5
+ JavaDate = java.util.Date
6
+ JavaSet = java.util.Set
7
+ JavaMap = java.util.Map
8
+ JavaList = java.util.List
9
+
10
+ def self.encode_property(value)
11
+ case value
12
+ when nil
13
+ nil
14
+ when String
15
+ value = value.strip
16
+ value = nil if value == ''
17
+ value
18
+ when Numeric
19
+ if value.is_a? Bignum
20
+ Marshal.dump(value).to_java_bytes
21
+ else
22
+ value.to_java
23
+ end
24
+ when true, false
25
+ value.to_java
26
+ when DateTime, Time, JavaDate
27
+ f = if value.is_a? JavaDate
28
+ value.getTime / 1000.0
29
+ else
30
+ value.to_time.to_f
31
+ end
32
+ i = f.truncate
33
+ r = (f.remainder(1) * 10000).round
34
+ if value.is_a? DateTime
35
+ c = 1
36
+ elsif value.is_a? Time and value.utc?
37
+ c = 2
38
+ else
39
+ c = 3
40
+ end
41
+ ["D", i, r, c].pack("ANnc").to_java_bytes
42
+ when Date
43
+ ["D", value.to_time.to_i].pack("AN").to_java_bytes
44
+ when Set
45
+ value.map { |x| encode_property(x) }.to_hashset
46
+ when Hash
47
+ value.to_hash_map { |k, v| [encode_property(k), encode_property(v)] }
48
+ when Enumerable
49
+ value.map { |x| encode_property(x) }.to_list
50
+ when JavaSet, JavaMap, JavaList
51
+ value
52
+ else
53
+ Marshal.dump(value).to_java_bytes
54
+ end
55
+ end
56
+
57
+ def self.decode_property(value)
58
+ case value
59
+ when ArrayJavaProxy
60
+ str = String.from_java_bytes(value)
61
+ flag = str[0]
62
+ case flag
63
+ when 'D'
64
+ data = str.unpack("ANnc")
65
+ i = data[1]
66
+ r = data[2]
67
+ c = data[3]
68
+ if r
69
+ t = Time.at(i + (r / 10000.0))
70
+ case c
71
+ when 1
72
+ t.utc.to_datetime
73
+ when 2
74
+ t.utc
75
+ else
76
+ t
77
+ end
78
+ else
79
+ Time.at(i).utc.to_date
80
+ end
81
+ else
82
+ Marshal.load str
83
+ end
84
+ when JavaDate
85
+ Time.at(value.getTime() / 1000.0)
86
+ when JavaSet
87
+ s = Set[]
88
+ value.each do |v|
89
+ s.add decode_property(v)
90
+ end
91
+ s
92
+ when JavaMap
93
+ h = {}
94
+ value.each do |k, v|
95
+ h[decode_property(k)] = decode_property(v)
96
+ end
97
+ h
98
+ when JavaList
99
+ a = []
100
+ value.each do |v|
101
+ a.push decode_property(v)
102
+ end
103
+ a
104
+ else
105
+ value
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,26 @@
1
+ module Pacer::Orient
2
+ class FactoryContainer
3
+ attr_reader :factory
4
+
5
+ def initialize(f)
6
+ @factory = f
7
+ end
8
+
9
+ def get
10
+ factory.get
11
+ end
12
+
13
+ def getTx
14
+ factory.getTx
15
+ end
16
+
17
+ def getNoTx
18
+ factory.getNoTx
19
+ end
20
+
21
+ # Pacer calls shutdown on all cached graphs when it exits. Orient caches this factory.
22
+ def shutdown
23
+ factory.close
24
+ end
25
+ end
26
+ end
@@ -1,28 +1,239 @@
1
- require 'yaml'
1
+ require 'set'
2
+
3
+ require 'pacer-orient/orient_type'
4
+ require 'pacer-orient/property'
5
+ require 'pacer-orient/encoder'
6
+ require 'pacer-orient/record_id'
7
+ require 'pacer-orient/factory_container'
2
8
 
3
9
  module Pacer
4
- class << self
5
- # Return a graph for the given path. Will create a graph if none exists at
6
- # that location. (The graph is only created if data is actually added to it).
7
- def orient(url, username = nil, password = nil)
8
- orient = com.tinkerpop.blueprints.impls.orient.OrientGraph
9
- open = proc do
10
- graph = Pacer.open_graphs[[url, username]]
11
- unless graph
12
- if username
13
- graph = orient.new(url, username, password)
14
- else
15
- graph = orient.new(url)
10
+ module Orient
11
+ class Graph < PacerGraph
12
+ import com.orientechnologies.orient.core.sql.OCommandSQL
13
+ import com.orientechnologies.orient.core.metadata.schema.OType
14
+ import com.orientechnologies.orient.core.metadata.schema.OClass
15
+
16
+ # Marked the types that should be most commonly used.
17
+ OTYPES = {
18
+ :any => OType::ANY,
19
+ :boolean => OType::BOOLEAN, # use this one
20
+ :bool => OType::BOOLEAN,
21
+ :short => OType::SHORT,
22
+ :integer => OType::INTEGER,
23
+ :int => OType::INTEGER,
24
+ :long => OType::LONG, # use this one
25
+ :float => OType::FLOAT,
26
+ :double => OType::DOUBLE, # use this one
27
+ :decimal => OType::DECIMAL, # use this one
28
+ :date => OType::DATE, # use this one
29
+ :datetime => OType::DATETIME, # use this one
30
+ :date_time => OType::DATETIME,
31
+ :byte => OType::BYTE,
32
+ :string => OType::STRING, # use this one
33
+ :binary => OType::BINARY,
34
+ :embedded => OType::EMBEDDED,
35
+ :embeddedlist => OType::EMBEDDEDLIST,
36
+ :embeddedset => OType::EMBEDDEDSET,
37
+ :embeddedmap => OType::EMBEDDEDMAP,
38
+ :link => OType::LINK,
39
+ :linklist => OType::LINKLIST,
40
+ :linkset => OType::LINKSET,
41
+ :linkmap => OType::LINKMAP,
42
+ :linkbag => OType::LINKBAG,
43
+ :transient => OType::TRANSIENT,
44
+ :custom => OType::CUSTOM
45
+ }
46
+
47
+
48
+ ITYPES = {
49
+ :range_dictionary => OClass::INDEX_TYPE::DICTIONARY,
50
+ :range_fulltext => OClass::INDEX_TYPE::FULLTEXT,
51
+ :range_full_text => OClass::INDEX_TYPE::FULLTEXT,
52
+ :range_notunique => OClass::INDEX_TYPE::NOTUNIQUE,
53
+ :range_not_unique => OClass::INDEX_TYPE::NOTUNIQUE,
54
+ :range_unique => OClass::INDEX_TYPE::UNIQUE,
55
+ :proxy => OClass::INDEX_TYPE::PROXY,
56
+ :dictionary => OClass::INDEX_TYPE::DICTIONARY_HASH_INDEX,
57
+ :fulltext => OClass::INDEX_TYPE::FULLTEXT_HASH_INDEX,
58
+ :full_text => OClass::INDEX_TYPE::FULLTEXT_HASH_INDEX,
59
+ :notunique => OClass::INDEX_TYPE::NOTUNIQUE_HASH_INDEX,
60
+ :not_unique => OClass::INDEX_TYPE::NOTUNIQUE_HASH_INDEX,
61
+ :spatial => OClass::INDEX_TYPE::SPATIAL,
62
+ :unique => OClass::INDEX_TYPE::UNIQUE_HASH_INDEX
63
+ }
64
+
65
+
66
+ def orient_graph
67
+ blueprints_graph.raw_graph
68
+ end
69
+
70
+ def allow_auto_tx=(b)
71
+ blueprints_graph.setAutoStartTx b
72
+ end
73
+
74
+ def allow_auto_tx
75
+ blueprints_graph.autoStartTx
76
+ end
77
+
78
+ def on_commit(&block)
79
+ return unless block
80
+ # todo
81
+ end
82
+
83
+ def on_commit_failed(&block)
84
+ return unless block
85
+ # todo
86
+ end
87
+
88
+ def before_commit(&block)
89
+ return unless block
90
+ # todo
91
+ end
92
+
93
+ def drop_handler(h)
94
+ # todo
95
+ end
96
+
97
+ # NOTE: if you use lightweight edges (they are on by default), g.e will only return edges that have been reified by having properties added to
98
+ # them.
99
+ def lightweight_edges
100
+ blueprints_graph.useLightweightEdges
101
+ end
102
+
103
+ alias lightweight_edges? lightweight_edges
104
+
105
+ def lightweight_edges=(b)
106
+ blueprints_graph.useLightweightEdges = b
107
+ end
108
+
109
+ def use_class_for_edge_label
110
+ blueprints_graph.useClassForEdgeLabel
111
+ end
112
+
113
+ def use_class_for_edge_label=(b)
114
+ blueprints_graph.useClassForEdgeLabel = b
115
+ end
116
+
117
+ def use_class_for_vertex_label
118
+ blueprints_graph.useClassForVertexLabel
119
+ end
120
+
121
+ def use_class_for_vertex_label=(b)
122
+ blueprints_graph.useClassForVertexLabel = b
123
+ end
124
+
125
+ def sql(extensions, sql = nil, *args)
126
+ if extensions.is_a? String
127
+ args = args.unshift sql if sql
128
+ sql = extensions
129
+ extensions = []
130
+ end
131
+ sql_command(sql, *args).iterator.to_route(based_on: self.v(extensions))
132
+ end
133
+
134
+ def sql_e(extensions, sql = nil, *args)
135
+ if extensions.is_a? String
136
+ args = args.unshift sql if sql
137
+ sql = extensions
138
+ extensions = []
139
+ end
140
+ sql_command(sql, *args).iterator.to_route(based_on: self.e(extensions))
141
+ end
142
+
143
+ def sql_command(sql, *args)
144
+ args = args.map { |a| encoder.encode_property(a) }
145
+ blueprints_graph.command(OCommandSQL.new(sql)).execute(*args)
146
+ end
147
+
148
+ def orient_type!(t, element_type = :vertex)
149
+ r = orient_type(t, element_type)
150
+ if r
151
+ r
152
+ else
153
+ in_pure_transaction do
154
+ t = if element_type == :vertex
155
+ blueprints_graph.createVertexType(t.to_s)
156
+ elsif element_type == :edge
157
+ blueprints_graph.createEdgeType(t.to_s)
158
+ end
159
+ OrientType.new self, element_type, t if t
16
160
  end
17
- Pacer.open_graphs[[url, username]] = graph
18
161
  end
19
- graph
20
162
  end
21
- shutdown = proc do |g|
22
- g.blueprints_graph.shutdown
23
- Pacer.open_graphs[[url, username]] = nil
163
+
164
+ def orient_type(t = nil, element_type = :vertex)
165
+ t ||= :V if element_type == :vertex
166
+ t ||= :E if element_type == :edge
167
+ if t.is_a? String or t.is_a? Symbol
168
+ t = if element_type == :vertex
169
+ blueprints_graph.getVertexType(t.to_s)
170
+ elsif element_type == :edge
171
+ blueprints_graph.getEdgeType(t.to_s)
172
+ end
173
+ OrientType.new self, element_type, t if t
174
+ elsif t.is_a? OrientType
175
+ t
176
+ end
177
+ end
178
+
179
+ def property_type(t)
180
+ if t.is_a? String or t.is_a? Symbol
181
+ OTYPES[t.to_sym]
182
+ else
183
+ t
184
+ end
185
+ end
186
+
187
+ def index_type(t)
188
+ if t.is_a? String or t.is_a? Symbol
189
+ ITYPES[t.to_sym]
190
+ else
191
+ t
192
+ end
193
+ end
194
+
195
+ def add_vertex_types(*types)
196
+ in_pure_transaction do
197
+ types.map do |t|
198
+ existing = orient_type(t, :vertex)
199
+ if existing
200
+ existing
201
+ else
202
+ t = blueprints_graph.createVertexType(t.to_s)
203
+ OrientType.new(self, :vertex, t) if t
204
+ end
205
+ end
206
+ end
207
+ end
208
+
209
+ def create_key_index(name, element_type = :vertex, itype = :non_unique)
210
+ type = orient_type(nil, element_type)
211
+ type.property!(name).create_index!(itype) if type
212
+ end
213
+
214
+ def drop_key_index(name, element_type = :vertex)
215
+ in_pure_transaction do
216
+ super
217
+ end
218
+ end
219
+
220
+ private
221
+
222
+ def in_pure_transaction
223
+ if @in_pure_transaction
224
+ yield
225
+ else
226
+ begin
227
+ @in_pure_transaction = true
228
+ transaction do
229
+ orient_graph.rollback
230
+ yield
231
+ end
232
+ ensure
233
+ @in_pure_transaction = false
234
+ end
235
+ end
24
236
  end
25
- PacerGraph.new(Pacer::YamlEncoder, open, shutdown)
26
237
  end
27
238
  end
28
239
  end
@@ -0,0 +1,79 @@
1
+ module Pacer::Orient
2
+ class OrientType
3
+ extend Forwardable
4
+
5
+ attr_reader :graph, :element_type, :type
6
+
7
+ # TODO: setters like in Property, once I figure out what these settings do.
8
+
9
+ def_delegators :@type,
10
+ :name, :short_name, :type_name, :abstract?, :strict_mode?,
11
+ :base_classes,
12
+ :class_indexes, :indexes, :involved_indexes,
13
+ :size, :over_size,
14
+ :cluster_selection, :cluster_ids,
15
+ :custom_keys, :custom
16
+
17
+ alias class_indices class_indexes
18
+ alias indices indexes
19
+ alias involved_indices involved_indexes
20
+
21
+ def initialize(graph, element_type, type)
22
+ @graph = graph
23
+ @element_type = type
24
+ @type = type
25
+ end
26
+
27
+ def raw_property(name)
28
+ if name.is_a? Symbol or name.is_a? String
29
+ type.getProperty name.to_s
30
+ else
31
+ name
32
+ end
33
+ end
34
+
35
+ def property(name)
36
+ p = raw_property(name)
37
+ Property.new self, p if p
38
+ end
39
+
40
+ def property!(name, otype)
41
+ p = raw_property(name)
42
+ unless p
43
+ p = graph.send(:in_pure_transaction) do
44
+ type.createProperty(name.to_s, graph.property_type(otype))
45
+ end
46
+ end
47
+ Property.new self, p
48
+ end
49
+
50
+ def super_class
51
+ if base_classes.any?
52
+ OrientType.new graph, type.getSuperClass
53
+ end
54
+ end
55
+
56
+ def set_super_class(sc)
57
+ type.setSuperClass graph.orient_type(element_type, sc)
58
+ self
59
+ end
60
+
61
+ def drop_property!(name)
62
+ type.dropProperty name
63
+ end
64
+
65
+ def properties
66
+ type.properties.map { |p| Property.new self, p }
67
+ end
68
+
69
+ def indexed_properties
70
+ type.indexedProperties.map { |p| Property.new self, p }
71
+ end
72
+
73
+ def inspect
74
+ abs = "Abstract" if abstract?
75
+ strict = " (strict)" if strict_mode?
76
+ "#<#{ abs }#{ type_name.capitalize }Type #{ name }#{ strict }>"
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,60 @@
1
+ module Pacer::Orient
2
+ class Property
3
+ extend Forwardable
4
+
5
+ attr_reader :el_type, :property
6
+
7
+ def_delegators :@property,
8
+ :name, :full_name, :not_null?, :collate,
9
+ :mandatory?, :readonly?, :min, :max, :index,
10
+ :indexed?, :regexp, :type, :custom, :custom_keys
11
+
12
+ def initialize(el_type, property)
13
+ @el_type = el_type
14
+ @property = property
15
+ end
16
+
17
+ def graph
18
+ el_type.graph
19
+ end
20
+
21
+ def create_index!(index_type = :not_unique)
22
+ unless indexed?
23
+ graph.send(:in_pure_transaction) do
24
+ property.createIndex graph.index_type(index_type)
25
+ end
26
+ end
27
+ self
28
+ end
29
+
30
+ def drop_index!
31
+ graph.drop_key_index name if indexed?
32
+ self
33
+ end
34
+
35
+ def set_type!(t)
36
+ # Not implemented as of 1.7.8
37
+ fail Pacer::InternalError.new("Type migration is a planned Orient 2.x feature")
38
+ end
39
+
40
+ def drop!
41
+ el_type.drop_property! name
42
+ nil
43
+ end
44
+
45
+ [ :set_name, :set_not_null, :set_collate,
46
+ :set_mandatory, :set_readonly, :set_min, :set_max,
47
+ :set_regexp, :set_custom, :remove_custom, :clear_custom
48
+ ].each do |setter|
49
+ define_method(setter) do |*args|
50
+ property.send setter, *args
51
+ self
52
+ end
53
+ end
54
+
55
+ def inspect
56
+ "#<#{ el_type.type_name.capitalize }Property #{ el_type.name }.#{ property.name } (#{ type })>"
57
+ end
58
+ end
59
+ end
60
+
@@ -0,0 +1,5 @@
1
+ class Java::ComOrientechnologiesOrientCoreId::ORecordId
2
+ def inspect
3
+ "<'#{to_s}'>"
4
+ end
5
+ end
@@ -13,20 +13,24 @@ class RSpec::GraphRunner
13
13
 
14
14
  def orient_graph
15
15
  return @orient_graph if @orient_graph
16
- @orient_graph = Pacer.orient("memory:spec1")
16
+ path1 = File.expand_path('/tmp/spec.orient')
17
+ dir = Pathname.new(path1)
18
+ dir.rmtree if dir.exist?
19
+ @orient_graph = Pacer.orient(path1, lightweight_edges: false, edge_classes: false)
17
20
  end
18
21
 
22
+ # Can't use 2 graphs on 1 thread.
19
23
  def orient_graph2
20
24
  return @orient_graph2 if @orient_graph2
21
- @orient_graph2 = Pacer.orient("memory:spec2")
25
+ @orient_graph2 = Pacer.tg
22
26
  end
23
27
 
24
28
  def orient_graph_no_indices
25
29
  return @orient_graph_no_indices if @orient_graph_no_indices
26
- @orient_graph_no_indices = Pacer.orient("memory:spec-no-idx")
27
- @orient_graph_no_indices.drop_index :vertices
28
- @orient_graph_no_indices.drop_index :edges
29
- @orient_graph_no_indices
30
+ path3 = File.expand_path('/tmp/spec.orient.3')
31
+ dir = Pathname.new(path3)
32
+ dir.rmtree if dir.exist?
33
+ @orient_graph_no_indices = Pacer.orient(path3, lightweight_edges: false, edge_classes: false)
30
34
  end
31
35
  end
32
36
  end
@@ -1,10 +1,10 @@
1
1
  module Pacer
2
2
  module Orient
3
- VERSION = "2.0.0"
3
+ VERSION = "2.1.0"
4
4
  JAR = "pacer-orient-#{ VERSION }-standalone.jar"
5
5
  JAR_PATH = "lib/#{ JAR }"
6
- BLUEPRINTS_VERSION = "2.1.0"
7
- PIPES_VERSION = "2.1.0"
8
- PACER_REQ = ">= 1.0.0"
6
+ ORIENT_VERSION = "1.7.8"
7
+ PIPES_VERSION = "2.5.0"
8
+ PACER_REQ = ">= 1.5.2"
9
9
  end
10
10
  end
data/lib/pacer-orient.rb CHANGED
@@ -1,6 +1,80 @@
1
+ require 'pacer' unless defined? Pacer
2
+
3
+ lib_path = File.expand_path(File.join(File.dirname(__FILE__), '../lib'))
4
+ $:.unshift lib_path unless $:.any? { |path| path == lib_path }
5
+
1
6
  require 'pacer-orient/version'
2
7
 
3
- require 'pacer'
4
8
  require Pacer::Orient::JAR
5
9
 
6
10
  require 'pacer-orient/graph'
11
+
12
+ Pacer::FunctionResolver.clear_cache
13
+
14
+ module Pacer
15
+ # Add 'static methods' to the Pacer namespace.
16
+ class << self
17
+ # Return a graph for the given path. Will create a graph if none exists at
18
+ # that location.
19
+ #
20
+ # If the graph is opened from a path, it will be registered to be closed by
21
+ # Ruby's at_exit callback, but if an already open graph is given, it will
22
+ # not.
23
+ def orient(url = nil, args = nil)
24
+ if url.nil?
25
+ url = "memory:#{ next_orient_name }"
26
+ elsif url.is_a? String and url !~ /^(plocal|local|remote|memory):/
27
+ url = "plocal:#{ url }"
28
+ end
29
+ if args
30
+ username = args.delete :username
31
+ password = args.delete :password
32
+ transactional = args.delete :transactional
33
+ lightweight_edges = args.delete :lightweight_edges
34
+ edge_classes = args.delete :edge_classes
35
+ vertex_classes = args.delete :vertex_classes
36
+ end
37
+ if url.is_a? String
38
+ open = proc do
39
+ # TODO: can / should I cache connections? Is it essential to shut down Orient?
40
+ factory = Pacer.open_graphs[[url, username]]
41
+ unless factory
42
+ factory =
43
+ if username
44
+ com.tinkerpop.blueprints.impls.orient.OrientGraphFactory.new url, username, password
45
+ else
46
+ com.tinkerpop.blueprints.impls.orient.OrientGraphFactory.new url
47
+ end
48
+ Pacer.open_graphs[[url, username]] = Pacer::Orient::FactoryContainer.new(factory)
49
+ end
50
+ if transactional == false
51
+ graph = factory.getNoTx()
52
+ else
53
+ graph = factory.getTx()
54
+ end
55
+ graph.useLightweightEdges = lightweight_edges if lightweight_edges == false
56
+ graph.useClassForEdgeLabel = edge_classes if edge_classes == false
57
+ graph.useClassForVertexLabel = vertex_classes if vertex_classes == false
58
+ #graph.setAutoStartTx false
59
+ graph
60
+ end
61
+ shutdown = proc do |g|
62
+ factory = Pacer.open_graphs.delete [url, username]
63
+ factory.shutdown if factory
64
+ end
65
+ Orient::Graph.new(Pacer::Orient::Encoder, open, shutdown)
66
+ else
67
+ # Don't register the new graph so that it won't be automatically closed.
68
+ graph = url
69
+ Orient::Graph.new Pacer::Orient::Encoder, proc { graph }
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def next_orient_name
76
+ @next_orient_name ||= "orient000"
77
+ @next_orient_name.succ!
78
+ end
79
+ end
80
+ end
data/pacer-orient.gemspec CHANGED
@@ -6,10 +6,10 @@ Gem::Specification.new do |s|
6
6
  s.name = "pacer-orient"
7
7
  s.version = Pacer::Orient::VERSION
8
8
  s.platform = 'java'
9
- s.authors = ["Paul Dlug"]
10
- s.email = ["paul.dlug@gmail.com"]
11
- s.homepage = "http://www.orientechnologies.com/"
12
- s.summary = %q{OrientDB jars and related code for Pacer}
9
+ s.authors = ["Darrick Wiebe"]
10
+ s.email = ["dw@xnlogic.com"]
11
+ s.homepage = "http://orientechnologies.com"
12
+ s.summary = %q{Orient jars and related code for Pacer}
13
13
  s.description = s.summary
14
14
 
15
15
  s.add_dependency 'pacer', Pacer::Orient::PACER_REQ
data/pom.xml CHANGED
@@ -3,69 +3,47 @@
3
3
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
4
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
5
5
  <modelVersion>4.0.0</modelVersion>
6
- <groupId>com.tinkerpop.pacer</groupId>
6
+ <groupId>com.xnlogic.pacer</groupId>
7
7
  <artifactId>pacer-orient</artifactId>
8
- <!-- NOTE: the following properties are automatically updated based on the values in lib/pacer-neo4j/version.rb -->
8
+ <!-- NOTE: the following properties are automatically updated based on the values in lib/pacer-orient/version.rb -->
9
9
  <properties>
10
- <gem.version>2.0.0</gem.version>
11
- <blueprints.version>2.1.0</blueprints.version>
12
- <pipes.version>2.1.0</pipes.version>
10
+ <orient.version>1.7.8</orient.version>
11
+ <gem.version>2.1.0</gem.version>
12
+ <pipes.version>2.5.0</pipes.version>
13
13
  </properties>
14
- <!-- NOTE: the following properties are automatically updated based on the values in lib/pacer-neo4j/version.rb -->
14
+ <!-- NOTE: the following properties are automatically updated based on the values in lib/pacer-orient/version.rb -->
15
15
  <version>${gem.version}</version>
16
16
  <packaging>pom</packaging>
17
17
  <url>https://github.com/pangloss/pacer</url>
18
- <name>Pacer OrientDB dependencies and related code.</name>
18
+ <name>Pacer Orient dependencies and related code.</name>
19
19
  <description>
20
20
  </description>
21
21
  <inceptionYear>2011</inceptionYear>
22
22
  <developers>
23
23
  <developer>
24
- <name>Paul Dlug</name>
25
- <email>paul.dlug@gmail.com</email>
26
- <url>http://github.com/pdlug</url>
24
+ <name>Darrick Wiebe</name>
25
+ <email>darrick@innatesoftware.com</email>
26
+ <url>http://github.com/pangloss</url>
27
27
  </developer>
28
28
  </developers>
29
29
  <dependencies>
30
- <!-- PROPERTY GRAPH MODEL SUPPORT -->
31
- <dependency>
32
- <groupId>com.tinkerpop.blueprints</groupId>
33
- <artifactId>blueprints-core</artifactId>
34
- <version>${blueprints.version}</version>
35
- </dependency>
36
- <dependency>
37
- <groupId>com.tinkerpop.blueprints</groupId>
38
- <artifactId>blueprints-orient-graph</artifactId>
39
- <version>${blueprints.version}</version>
40
- </dependency>
41
- <!-- GRAPH TRAVERSAL SUPPORT -->
42
- <dependency>
43
- <groupId>com.tinkerpop</groupId>
44
- <artifactId>pipes</artifactId>
45
- <version>${pipes.version}</version>
46
- </dependency>
30
+ <dependency>
31
+ <groupId>com.orientechnologies</groupId>
32
+ <artifactId>orient-commons</artifactId>
33
+ <version>${orient.version}</version>
34
+ </dependency>
35
+ <dependency>
36
+ <groupId>com.orientechnologies</groupId>
37
+ <artifactId>orientdb-core</artifactId>
38
+ <version>${orient.version}</version>
39
+ </dependency>
40
+ <dependency>
41
+ <groupId>com.orientechnologies</groupId>
42
+ <artifactId>orientdb-graphdb</artifactId>
43
+ <version>${orient.version}</version>
44
+ </dependency>
47
45
  </dependencies>
48
46
 
49
- <repositories>
50
- <repository>
51
- <id>tinkerpop-repository</id>
52
- <name>TinkerPop Maven2 Repository</name>
53
- <url>http://tinkerpop.com/maven2</url>
54
- <snapshots>
55
- <enabled>true</enabled>
56
- <updatePolicy>always</updatePolicy>
57
- </snapshots>
58
- </repository>
59
- </repositories>
60
-
61
- <distributionManagement>
62
- <repository>
63
- <id>tinkerpop-repository</id>
64
- <name>TinkerPop Maven2 Repository</name>
65
- <url>ftp://ftp.tinkerpop.com:21/public/maven2/</url>
66
- </repository>
67
- </distributionManagement>
68
-
69
47
  <build>
70
48
  <directory>${basedir}/target</directory>
71
49
  <finalName>${project.artifactId}-${project.version}</finalName>
metadata CHANGED
@@ -1,35 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pacer-orient
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
5
- prerelease:
4
+ version: 2.1.0
6
5
  platform: java
7
6
  authors:
8
- - Paul Dlug
7
+ - Darrick Wiebe
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-09-04 00:00:00.000000000 Z
11
+ date: 2014-09-18 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: pacer
16
15
  version_requirements: !ruby/object:Gem::Requirement
17
16
  requirements:
18
- - - ! '>='
17
+ - - '>='
19
18
  - !ruby/object:Gem::Version
20
- version: 1.0.0
21
- none: false
19
+ version: 1.5.2
22
20
  requirement: !ruby/object:Gem::Requirement
23
21
  requirements:
24
- - - ! '>='
22
+ - - '>='
25
23
  - !ruby/object:Gem::Version
26
- version: 1.0.0
27
- none: false
24
+ version: 1.5.2
28
25
  prerelease: false
29
26
  type: :runtime
30
- description: OrientDB jars and related code for Pacer
27
+ description: Orient jars and related code for Pacer
31
28
  email:
32
- - paul.dlug@gmail.com
29
+ - dw@xnlogic.com
33
30
  executables: []
34
31
  extensions: []
35
32
  extra_rdoc_files: []
@@ -38,40 +35,41 @@ files:
38
35
  - Gemfile
39
36
  - README.md
40
37
  - Rakefile
41
- - lib/pacer-orient-1.0.0-standalone.jar
42
38
  - lib/pacer-orient.rb
39
+ - lib/pacer-orient/encoder.rb
40
+ - lib/pacer-orient/factory_container.rb
43
41
  - lib/pacer-orient/graph.rb
42
+ - lib/pacer-orient/orient_type.rb
43
+ - lib/pacer-orient/property.rb
44
+ - lib/pacer-orient/record_id.rb
44
45
  - lib/pacer-orient/rspec.rb
45
46
  - lib/pacer-orient/version.rb
46
47
  - pacer-orient.gemspec
47
48
  - pom.xml
48
49
  - pom/standalone.xml
49
- - lib/pacer-orient-2.0.0-standalone.jar
50
- homepage: http://www.orientechnologies.com/
50
+ - lib/pacer-orient-2.1.0-standalone.jar
51
+ homepage: http://orientechnologies.com
51
52
  licenses: []
53
+ metadata: {}
52
54
  post_install_message:
53
55
  rdoc_options: []
54
56
  require_paths:
55
57
  - lib
56
58
  required_ruby_version: !ruby/object:Gem::Requirement
57
59
  requirements:
58
- - - ! '>='
60
+ - - '>='
59
61
  - !ruby/object:Gem::Version
60
- version: !binary |-
61
- MA==
62
- none: false
62
+ version: '0'
63
63
  required_rubygems_version: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ! '>='
65
+ - - '>='
66
66
  - !ruby/object:Gem::Version
67
- version: !binary |-
68
- MA==
69
- none: false
67
+ version: '0'
70
68
  requirements: []
71
69
  rubyforge_project: pacer-orient
72
- rubygems_version: 1.8.24
70
+ rubygems_version: 2.1.9
73
71
  signing_key:
74
- specification_version: 3
75
- summary: OrientDB jars and related code for Pacer
72
+ specification_version: 4
73
+ summary: Orient jars and related code for Pacer
76
74
  test_files: []
77
75
  has_rdoc:
Binary file
Binary file