pacer 1.0.2-java → 1.0.3-java

Sign up to get free protection for your applications and to get access to all the features.
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