pacer 1.0.2-java → 1.0.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 (48) hide show
  1. data/blog/2012-09-18-pacer-1.0.md +63 -0
  2. data/lib/pacer/core/graph/element_route.rb +8 -4
  3. data/lib/pacer/core/graph/vertices_route.rb +1 -1
  4. data/lib/pacer/core/route.rb +20 -0
  5. data/lib/pacer/exceptions.rb +1 -0
  6. data/lib/pacer/filter/future_filter.rb +2 -0
  7. data/lib/pacer/graph/graph_transactions_mixin.rb +13 -12
  8. data/lib/pacer/graph/hash_index.rb +29 -0
  9. data/lib/pacer/graph/pacer_graph.rb +23 -6
  10. data/lib/pacer/graph/simple_encoder.rb +9 -4
  11. data/lib/pacer/graph/yaml_encoder.rb +18 -31
  12. data/lib/pacer/loader.rb +93 -0
  13. data/lib/pacer/route/mixin/bulk_operations.rb +1 -1
  14. data/lib/pacer/route.rb +0 -151
  15. data/lib/pacer/route_builder.rb +142 -0
  16. data/lib/pacer/side_effect/as.rb +1 -3
  17. data/lib/pacer/version.rb +1 -1
  18. data/lib/pacer/wrappers/edge_wrapper.rb +13 -16
  19. data/lib/pacer/wrappers/element_wrapper.rb +12 -22
  20. data/lib/pacer/wrappers/vertex_wrapper.rb +7 -4
  21. data/lib/{pacer-1.0.2-standalone.jar → pacer-1.0.3-standalone.jar} +0 -0
  22. data/lib/pacer.rb +9 -15
  23. data/pom.xml +1 -1
  24. data/spec/pacer/blueprints/dex_spec.rb +1 -154
  25. data/spec/pacer/blueprints/neo4j_spec.rb +8 -154
  26. data/spec/pacer/blueprints/orient_spec.rb +5 -0
  27. data/spec/pacer/blueprints/tg_spec.rb +1 -76
  28. data/spec/pacer/core/graph/vertices_route_spec.rb +32 -5
  29. data/spec/pacer/graph/pacer_graph_spec.rb +304 -336
  30. data/spec/pacer/graph/simple_encoder_spec.rb +78 -0
  31. data/spec/pacer/graph/yaml_encoder_spec.rb +71 -0
  32. data/spec/pacer/transform/join_spec.rb +1 -1
  33. data/spec/pacer/utils/tsort_spec.rb +1 -3
  34. data/spec/pacer/wrapper/edge_wrapper_spec.rb +46 -40
  35. data/spec/pacer/wrapper/element_wrapper_spec.rb +8 -13
  36. data/spec/support/graph_runner.rb +12 -3
  37. metadata +13 -14
  38. data/lib/pacer/blueprints.rb +0 -3
  39. data/lib/pacer/core.rb +0 -8
  40. data/lib/pacer/filter.rb +0 -17
  41. data/lib/pacer/graph.rb +0 -12
  42. data/lib/pacer/route/mixins.rb +0 -2
  43. data/lib/pacer/routes.rb +0 -6
  44. data/lib/pacer/side_effect.rb +0 -11
  45. data/lib/pacer/support.rb +0 -10
  46. data/lib/pacer/transform.rb +0 -16
  47. data/lib/pacer/visitors.rb +0 -7
  48. data/lib/pacer/wrappers.rb +0 -21
@@ -0,0 +1,142 @@
1
+ module Pacer
2
+ class RouteBuilder
3
+ class << self
4
+ attr_writer :current
5
+
6
+ def current
7
+ @current ||= RouteBuilder.new
8
+ end
9
+ end
10
+
11
+ attr_reader :types
12
+
13
+ def initialize
14
+ @types = Hash.new do |h, type_def|
15
+ h[type_def] = Class.new(Route) do
16
+ type_def.each do |mods|
17
+ mods.each do |mod|
18
+ include mod
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def chain(source, args)
26
+ types[type_def(source, args)].new source, configuration(source, args), arguments(source, args)
27
+ end
28
+
29
+ protected
30
+
31
+ def source_value(source, name)
32
+ source.send name if source.respond_to? name
33
+ end
34
+
35
+ def type_def(source, args)
36
+ [
37
+ type_modules(source, args),
38
+ function_modules(source, args),
39
+ other_modules(source, args),
40
+ extension_modules(source, args)
41
+ ]
42
+ end
43
+
44
+ def configuration(source, args)
45
+ {
46
+ element_type: element_type(source, args),
47
+ graph: graph(source, args),
48
+ extensions: extensions(source, args),
49
+ wrapper: wrapper(source, args),
50
+ function: function_modules(source, args).first
51
+ }
52
+ end
53
+
54
+ def arguments(source, args)
55
+ args.reject do |key, val|
56
+ Set[:element_type, :wrapper, :extensions, :modules, :graph, :back, :filter, :side_effect, :transform, :visitor].include? key
57
+ end
58
+ end
59
+
60
+ def graph(source, args)
61
+ args[:graph] || source_value(source, :graph)
62
+ end
63
+
64
+ def element_type(source, args)
65
+ et = args[:element_type] || source_value(source, :element_type)
66
+ if not et
67
+ fail ClientError, "No element_type specified or inferred"
68
+ end
69
+ if not graph(source, args) and (et == :vertex or et == :edge or et == :mixed)
70
+ fail ClientError, "Element type #{ et.inspect } specified, but no graph specified."
71
+ end
72
+ et
73
+ end
74
+
75
+ def type_modules(source, args)
76
+ case element_type source, args
77
+ when :vertex
78
+ [Pacer::Core::Graph::ElementRoute, Pacer::Core::Graph::VerticesRoute]
79
+ when :edge
80
+ [Pacer::Core::Graph::ElementRoute, Pacer::Core::Graph::EdgesRoute]
81
+ when :mixed
82
+ [Pacer::Core::Graph::ElementRoute, Pacer::Core::Graph::MixedRoute]
83
+ else
84
+ []
85
+ end
86
+ end
87
+
88
+ def other_modules(source, args)
89
+ [*args[:modules]]
90
+ end
91
+
92
+ def type_from_source?(source, args)
93
+ element_type(source, args) == source_value(source, :element_type)
94
+ end
95
+
96
+ def wrapper(source, args)
97
+ args.fetch(:wrapper) do
98
+ source_value(source, :wrapper) if type_from_source? source, args
99
+ end
100
+ end
101
+
102
+ def extensions(source, args)
103
+ exts = args.fetch(:extensions) do
104
+ source_value(source, :extensions) if type_from_source? source, args
105
+ end
106
+ if exts.is_a? Set
107
+ exts.to_a
108
+ elsif exts.is_a? Module
109
+ [exts]
110
+ elsif exts.is_a? Array
111
+ exts.uniq
112
+ else
113
+ []
114
+ end
115
+ end
116
+
117
+ def all_extensions(source, args)
118
+ w = wrapper source, args
119
+ exts = extensions source, args
120
+ if w and exts
121
+ (w.extensions + exts).uniq
122
+ elsif w
123
+ w.extensions
124
+ elsif exts
125
+ exts
126
+ else
127
+ []
128
+ end
129
+ end
130
+
131
+ def extension_modules(source, args)
132
+ all_extensions(source, args).uniq.select do |mod|
133
+ mod.respond_to?(:const_defined?) and mod.const_defined? :Route
134
+ end.map { |mod| mod::Route }
135
+ end
136
+
137
+
138
+ def function_modules(source, args)
139
+ FunctionResolver.function(args).compact
140
+ end
141
+ end
142
+ end
@@ -11,9 +11,7 @@ module Pacer
11
11
 
12
12
  module SideEffect
13
13
  module As
14
- class AsPipe < Pacer::Pipes::AbstractPipe
15
-
16
- field_reader :starts
14
+ class AsPipe < Pacer::Pipes::RubyPipe
17
15
  attr_accessor :vars
18
16
 
19
17
  def initialize(pipe, vars, variable_name)
data/lib/pacer/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Pacer
2
2
  unless const_defined? :VERSION
3
- VERSION = "1.0.2"
3
+ VERSION = "1.0.3"
4
4
 
5
5
  JAR = "pacer-#{ VERSION }-standalone.jar"
6
6
  JAR_PATH = "lib/#{ JAR }"
@@ -9,10 +9,13 @@ module Pacer::Wrappers
9
9
  :getRawEdge
10
10
 
11
11
  class << self
12
+ def wrappers
13
+ @wrappers ||= {}
14
+ end
15
+
12
16
  def wrapper_for(exts)
13
- @wrappers = {} unless defined? @wrappers
14
17
  if exts
15
- @wrappers[exts.to_set] ||= build_edge_wrapper(exts)
18
+ EdgeWrapper.wrappers[exts] ||= build_edge_wrapper(exts)
16
19
  else
17
20
  fail Pacer::LogicError, "Extensions should not be nil"
18
21
  end
@@ -127,18 +130,12 @@ module Pacer::Wrappers
127
130
  #
128
131
  # @raise [StandardError] If this the associated vertices don't exist and :create_vertices is not set
129
132
  def clone_into(target_graph, opts = {})
130
- e_idx = target_graph.index("tmp-e-#{graph.graph_id}", :edge, :create => true)
131
- e = target_graph.edge(element_id)
132
- unless e
133
- e = e_idx.first('id', element_id)
134
- if e
135
- e = EdgeWrapper.new(graph, e)
136
- end
137
- end
133
+ e_idx = target_graph.temp_index("tmp-e-#{graph.graph_id}", :edge, :create => true)
134
+ e = e_idx.first('id', element_id)
138
135
  unless e
139
- v_idx = target_graph.index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
140
- iv = target_graph.vertex(in_vertex.element_id) || v_idx.first('id', in_vertex.element_id)
141
- ov = target_graph.vertex(out_vertex.element_id) || v_idx.first('id', out_vertex.element_id)
136
+ v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
137
+ iv = v_idx.first('id', in_vertex.element_id)
138
+ ov = v_idx.first('id', out_vertex.element_id)
142
139
  if opts[:create_vertices]
143
140
  iv ||= in_vertex.clone_into target_graph
144
141
  ov ||= out_vertex.clone_into target_graph
@@ -149,7 +146,7 @@ module Pacer::Wrappers
149
146
  raise message unless opts[:ignore_missing_vertices]
150
147
  return nil
151
148
  end
152
- e = target_graph.create_edge(element_id, iv, ov, label, properties)
149
+ e = target_graph.create_edge(element_id, ov, iv, label, properties)
153
150
  e_idx.put('id', element_id, e)
154
151
  yield e if block_given?
155
152
  end
@@ -165,12 +162,12 @@ module Pacer::Wrappers
165
162
  #
166
163
  # @raise [StandardError] If this the associated vertices don't exist
167
164
  def copy_into(target_graph)
168
- v_idx = target_graph.index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
165
+ v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
169
166
  iv = v_idx.first('id', in_vertex.element_id) || target_graph.vertex(in_vertex.element_id)
170
167
  ov = v_idx.first('id', out_vertex.element_id) || target_graph.vertex(out_vertex.element_id)
171
168
 
172
169
  raise 'vertices not found' if not iv or not ov
173
- e = target_graph.create_edge nil, iv, ov, label, properties
170
+ e = target_graph.create_edge nil, ov, iv, label, properties
174
171
  yield e if block_given?
175
172
  e
176
173
  end
@@ -20,7 +20,6 @@ module Pacer::Wrappers
20
20
  end
21
21
 
22
22
  def clear_cache
23
- Pacer.send :remove_const, :Wrap if Pacer.const_defined? :Wrap
24
23
  VertexWrapper.clear_cache
25
24
  EdgeWrapper.clear_cache
26
25
  end
@@ -42,31 +41,18 @@ module Pacer::Wrappers
42
41
  def build_extension_wrapper(exts, mod_names, superclass)
43
42
  sc_name = superclass.to_s.split(/::/).last
44
43
  exts = exts.uniq unless exts.is_a? Set
45
- classname = "#{sc_name}#{exts.map { |m| m.to_s }.join('')}".gsub(/::/, '_').gsub(/\W/, '')
46
- begin
47
- wrapper = Pacer::Wrap.const_get classname
48
- rescue NameError
49
- eval %{
50
- module ::Pacer
51
- module Wrap
52
- class #{classname.to_s} < #{sc_name}
44
+ Class.new(superclass) do
45
+ exts.each do |obj|
46
+ if obj.is_a? Module or obj.is_a? Class
47
+ mod_names.each do |mod_name|
48
+ if obj.const_defined? mod_name
49
+ include obj.const_get(mod_name)
50
+ extensions << obj unless extensions.include? obj
53
51
  end
54
52
  end
55
53
  end
56
- }
57
- wrapper = Pacer::Wrap.const_get classname
58
- end
59
- exts.each do |obj|
60
- if obj.is_a? Module or obj.is_a? Class
61
- mod_names.each do |mod_name|
62
- if obj.const_defined? mod_name
63
- wrapper.send :include, obj.const_get(mod_name)
64
- wrapper.extensions << obj unless wrapper.extensions.include? obj
65
- end
66
- end
67
54
  end
68
55
  end
69
- wrapper
70
56
  end
71
57
  end
72
58
 
@@ -92,6 +78,10 @@ module Pacer::Wrappers
92
78
  after_initialize
93
79
  end
94
80
 
81
+ def chain_route(args_hash)
82
+ Pacer::RouteBuilder.current.chain self, args_hash
83
+ end
84
+
95
85
  # Convenience method to retrieve a property by name.
96
86
  #
97
87
  # @param [#to_s] key the property name
@@ -137,7 +127,7 @@ module Pacer::Wrappers
137
127
  #
138
128
  # @return [Hash]
139
129
  def properties
140
- element.getPropertyKeys.inject({}) { |h, name| h[name] = element.getProperty(name); h }
130
+ Hash[element.getPropertyKeys.map { |name| [name, graph.decode_property(element.getProperty(name))] }]
141
131
  end
142
132
 
143
133
  # Replace the element's properties with the given hash
@@ -9,10 +9,13 @@ module Pacer::Wrappers
9
9
  :getRawVertex
10
10
 
11
11
  class << self
12
+ def wrappers
13
+ @wrappers ||= {}
14
+ end
15
+
12
16
  def wrapper_for(exts)
13
- @wrappers = {} unless defined? @wrappers
14
17
  if exts
15
- @wrappers[exts.to_set] ||= build_vertex_wrapper(exts)
18
+ VertexWrapper.wrappers[exts.to_set] ||= build_vertex_wrapper(exts)
16
19
  else
17
20
  fail Pacer::LogicError, "Extensions should not be nil"
18
21
  end
@@ -128,8 +131,8 @@ module Pacer::Wrappers
128
131
  # @yield [v] Optional block yields the vertex after it has been created.
129
132
  # @return [Pacer::Wrappers::VertexWrapper] the new vertex
130
133
  def clone_into(target_graph, opts = nil)
131
- v_idx = target_graph.index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
132
- v = target_graph.vertex(element_id) || v_idx.first('id', element_id)
134
+ v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
135
+ v = v_idx.first('id', element_id)
133
136
  unless v
134
137
  v = target_graph.create_vertex element_id, properties
135
138
  v_idx.put('id', element_id, v.element)
data/lib/pacer.rb CHANGED
@@ -39,21 +39,7 @@ module Pacer
39
39
 
40
40
  require JAR
41
41
 
42
- require 'pacer/exceptions'
43
- require 'pacer/pipes'
44
- require 'pacer/core'
45
- require 'pacer/graph'
46
- require 'pacer/routes'
47
- require 'pacer/wrappers'
48
- require 'pacer/route'
49
- require 'pacer/blueprints'
50
- require 'pacer/support'
51
- require 'pacer/utils'
52
- require 'pacer/visitors'
53
- require 'pacer/filter'
54
- require 'pacer/transform'
55
- require 'pacer/side_effect'
56
- require 'pacer/function_resolver'
42
+ require 'pacer/loader'
57
43
 
58
44
  class << self
59
45
  # A global place for pacer to put debug info if it's tucked deep in
@@ -180,6 +166,14 @@ module Pacer
180
166
  FunctionResolver.clear_cache
181
167
  end
182
168
 
169
+ def vertex_wrapper(*exts)
170
+ Wrappers::VertexWrapper.wrapper_for(exts)
171
+ end
172
+
173
+ def edge_wrapper(*exts)
174
+ Wrappers::EdgeWrapper.wrapper_for(exts)
175
+ end
176
+
183
177
  # Is the object a vertex?
184
178
  def vertex?(element)
185
179
  element.is_a? Pacer::Wrappers::VertexWrapper
data/pom.xml CHANGED
@@ -7,7 +7,7 @@
7
7
  <artifactId>pacer</artifactId>
8
8
  <!-- NOTE: the following properties are automatically updated based on the values in lib/pacer-neo4j/version.rb -->
9
9
  <properties>
10
- <gem.version>1.0.2</gem.version>
10
+ <gem.version>1.0.3</gem.version>
11
11
  <blueprints.version>2.1.0</blueprints.version>
12
12
  <pipes.version>2.1.0</pipes.version>
13
13
  <gremlin.version>2.1.0</gremlin.version>
@@ -1,158 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  Run.dex do
4
- describe Pacer::Dex do
5
- let(:v0) { graph.create_vertex }
6
- let(:v1) { graph.create_vertex }
7
- let(:e0) { graph.create_edge '0', v0, v1, :default }
8
-
9
- describe '#element_type' do
10
- context 'invalid' do
11
- it { expect { graph.element_type(:nothing) }.to raise_error(ArgumentError) }
12
- end
13
-
14
- context ':vertex' do
15
- subject { graph.element_type(:vertex) }
16
- it { should == :vertex }
17
- end
18
-
19
- context 'a vertex' do
20
- subject { graph.element_type(v0) }
21
- it { should == :vertex }
22
- end
23
-
24
- context ':edge' do
25
- subject { graph.element_type(:edge) }
26
- it { should == :edge }
27
- end
28
-
29
- context 'an edge' do
30
- subject { graph.element_type(e0) }
31
- it { should == :edge }
32
- end
33
-
34
- context ':mixed' do
35
- subject { graph.element_type(:mixed) }
36
- it { should == :mixed }
37
- end
38
-
39
- context ':object' do
40
- subject { graph.element_type(:object) }
41
- it { should == :object }
42
- end
43
-
44
- context 'from element_type' do
45
- context ':vertex' do
46
- subject { graph.element_type(graph.element_type :vertex) }
47
- it { should == :vertex }
48
- end
49
-
50
- context ':edge' do
51
- subject { graph.element_type(graph.element_type :edge) }
52
- it { should == :edge }
53
- end
54
-
55
- context ':mixed' do
56
- subject { graph.element_type(graph.element_type :mixed) }
57
- it { should == :mixed }
58
- end
59
-
60
- context ':object' do
61
- subject { graph.element_type(graph.element_type :object) }
62
- it { should == :object }
63
- end
64
- end
65
-
66
- context 'from index_class' do
67
- context ':vertex' do
68
- subject { graph.element_type(graph.index_class :vertex) }
69
- it { should == :vertex }
70
- end
71
- end
72
- end
73
-
74
- describe '#indices' do
75
- subject { graph.indices.to_a }
76
- it { should_not be_empty }
77
- end
78
-
79
- describe '#sanitize_properties' do
80
- let(:original) do
81
- { :string => ' bob ',
82
- :symbol => :abba,
83
- :empty => '',
84
- :integer => 121,
85
- :float => 100.001,
86
- :time => Time.utc(1999, 11, 9, 9, 9, 1),
87
- :object => { :a => 1, 1 => :a },
88
- 99 => 'numeric key',
89
- 'string key' => 'string value'
90
- }
91
- end
92
-
93
- subject { graph.sanitize_properties original }
94
-
95
- it { should_not equal(original) }
96
- specify 'original should be unchanged' do
97
- original.should == {
98
- :string => ' bob ',
99
- :symbol => :abba,
100
- :empty => '',
101
- :integer => 121,
102
- :float => 100.001,
103
- :time => Time.utc(1999, 11, 9, 9, 9, 1),
104
- :object => { :a => 1, 1 => :a },
105
- 99 => 'numeric key',
106
- 'string key' => 'string value'
107
- }
108
- end
109
-
110
- specify 'string should be stripped' do
111
- subject[:string].should == 'bob'
112
- end
113
-
114
- specify 'empty string becomes nil' do
115
- subject[:empty].should be_nil
116
- end
117
-
118
- specify 'numbers should be javafied' do
119
- subject[:integer].should == 121.to_java(:int)
120
- subject[:float].should == 100.001
121
- end
122
-
123
- specify 'everything else should be yaml' do
124
- subject[:time].should == YAML.dump(Time.utc(1999, 11, 9, 9, 9, 1))
125
- end
126
-
127
- its(:keys) { should == original.keys }
128
- end
129
-
130
- describe '#in_vertex' do
131
- it 'should wrap the vertex' do
132
- v = e0.in_vertex(Tackle::SimpleMixin)
133
- v.should == v1
134
- v.extensions.should include(Tackle::SimpleMixin)
135
- end
136
-
137
- it 'should wrap the vertex 2' do
138
- v = e0.in_vertex([Tackle::SimpleMixin])
139
- v.should == v1
140
- v.extensions.should include(Tackle::SimpleMixin)
141
- end
142
- end
143
-
144
- describe '#out_vertex' do
145
- it 'should wrap the vertex' do
146
- v = e0.out_vertex(Tackle::SimpleMixin)
147
- v.should == v0
148
- v.extensions.should include(Tackle::SimpleMixin)
149
- end
150
-
151
- it 'should wrap the vertex 2' do
152
- v = e0.out_vertex([Tackle::SimpleMixin])
153
- v.should == v0
154
- v.extensions.should include(Tackle::SimpleMixin)
155
- end
156
- end
157
- end
4
+ # no special cases?
158
5
  end