pacer 1.1.1-java → 1.2.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +5 -0
- data/lib/pacer/blueprints/tg.rb +2 -2
- data/lib/pacer/core/array_route.rb +80 -0
- data/lib/pacer/core/graph/element_route.rb +13 -13
- data/lib/pacer/core/graph/mixed_route.rb +2 -2
- data/lib/pacer/core/hash_route.rb +25 -1
- data/lib/pacer/core/route.rb +4 -9
- data/lib/pacer/exceptions.rb +6 -5
- data/lib/pacer/filter/property_filter/filters.rb +2 -6
- data/lib/pacer/filter/range_filter.rb +3 -1
- data/lib/pacer/graph/graph_transactions_mixin.rb +48 -12
- data/lib/pacer/graph/pacer_graph.rb +41 -10
- data/lib/pacer/graph/yaml_encoder.rb +8 -1
- data/lib/pacer/loader.rb +1 -0
- data/lib/pacer/pipe/loop_pipe.rb +1 -1
- data/lib/pacer/pipe/path_wrapping_pipe.rb +2 -2
- data/lib/pacer/pipe/wrapping_pipe.rb +1 -1
- data/lib/pacer/route/mixin/bulk_operations.rb +2 -2
- data/lib/pacer/support/awesome_print.rb +44 -0
- data/lib/pacer/transform/join.rb +15 -1
- data/lib/pacer/transform/lookup_ids.rb +36 -0
- data/lib/pacer/transform/path.rb +3 -1
- data/lib/pacer/transform/path_tree.rb +1 -1
- data/lib/pacer/version.rb +4 -4
- data/lib/pacer/visitors/section.rb +1 -1
- data/lib/pacer/wrappers/edge_wrapper.rb +9 -9
- data/lib/pacer/wrappers/element_wrapper.rb +11 -0
- data/lib/pacer/wrappers/index_wrapper.rb +1 -1
- data/lib/pacer/wrappers/path_wrapping_pipe_function.rb +1 -1
- data/lib/pacer/wrappers/vertex_wrapper.rb +3 -3
- data/lib/pacer/wrappers/wrapper_selector.rb +30 -12
- data/lib/pacer/wrappers/wrapping_pipe_function.rb +3 -3
- data/pom.xml +4 -4
- data/spec/pacer/blueprints/neo4j_spec.rb +50 -8
- data/spec/pacer/core/graph/element_route_spec.rb +1 -1
- data/spec/pacer/graph/yaml_encoder_spec.rb +5 -1
- data/spec/pacer/route/mixin/base_spec.rb +4 -1
- data/spec/pacer/wrapper/edge_wrapper_spec.rb +1 -1
- data/spec/pacer/wrapper/element_wrapper_spec.rb +10 -3
- data/spec/pacer/wrapper/vertex_wrapper_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/graph_runner.rb +8 -3
- data/spec/support/matchers.rb +1 -1
- metadata +5 -4
|
@@ -21,6 +21,8 @@ module Pacer
|
|
|
21
21
|
end
|
|
22
22
|
when true, false
|
|
23
23
|
value.to_java
|
|
24
|
+
when DateTime, Time, Date
|
|
25
|
+
value.strftime ' time %Y-%m-%d %H:%M:%S.%L %z'
|
|
24
26
|
when Array
|
|
25
27
|
if value.length == 0
|
|
26
28
|
value_type = Fixnum
|
|
@@ -53,7 +55,12 @@ module Pacer
|
|
|
53
55
|
|
|
54
56
|
def self.decode_property(value)
|
|
55
57
|
if value.is_a? String and value[0, 1] == ' '
|
|
56
|
-
|
|
58
|
+
if value[1, 4] == 'time'
|
|
59
|
+
# FIXME: we lose the milliseconds here...
|
|
60
|
+
Time.parse value[6..-1]
|
|
61
|
+
else
|
|
62
|
+
YAML.load(value[1..-1])
|
|
63
|
+
end
|
|
57
64
|
elsif value.is_a? ArrayJavaProxy
|
|
58
65
|
value.to_a
|
|
59
66
|
else
|
data/lib/pacer/loader.rb
CHANGED
|
@@ -97,6 +97,7 @@ require 'pacer/transform/scatter'
|
|
|
97
97
|
require 'pacer/transform/has_count_cap'
|
|
98
98
|
require 'pacer/transform/sort_section'
|
|
99
99
|
require 'pacer/transform/payload'
|
|
100
|
+
require 'pacer/transform/lookup_ids'
|
|
100
101
|
|
|
101
102
|
require 'pacer/side_effect/aggregate'
|
|
102
103
|
require 'pacer/side_effect/as'
|
data/lib/pacer/pipe/loop_pipe.rb
CHANGED
|
@@ -7,8 +7,8 @@ module Pacer
|
|
|
7
7
|
def initialize(graph, vertex_extensions = [], edge_extensions = [])
|
|
8
8
|
super()
|
|
9
9
|
@graph = graph
|
|
10
|
-
@vertex_wrapper = Pacer::Wrappers::WrapperSelector.build :vertex, vertex_extensions || Set[]
|
|
11
|
-
@edge_wrapper = Pacer::Wrappers::WrapperSelector.build :edge, edge_extensions || Set[]
|
|
10
|
+
@vertex_wrapper = Pacer::Wrappers::WrapperSelector.build graph, :vertex, vertex_extensions || Set[]
|
|
11
|
+
@edge_wrapper = Pacer::Wrappers::WrapperSelector.build graph, :edge, edge_extensions || Set[]
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def getCurrentPath
|
|
@@ -8,7 +8,7 @@ module Pacer
|
|
|
8
8
|
@graph = graph
|
|
9
9
|
@element_type = element_type
|
|
10
10
|
@extensions = extensions || []
|
|
11
|
-
@wrapper = Pacer::Wrappers::WrapperSelector.build element_type, @extensions
|
|
11
|
+
@wrapper = Pacer::Wrappers::WrapperSelector.build graph, element_type, @extensions
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def getSideEffect
|
|
@@ -25,15 +25,15 @@ module Pacer::Routes
|
|
|
25
25
|
size ||= target_graph.bulk_job_size
|
|
26
26
|
counter = 0
|
|
27
27
|
target_graph.transaction(nesting: true) do |commit, rollback|
|
|
28
|
+
print "Bulk job ->" if Pacer.verbose?
|
|
28
29
|
each_slice(size) do |slice|
|
|
29
|
-
print counter if Pacer.verbose?
|
|
30
|
+
print " #{counter}" if Pacer.verbose?
|
|
30
31
|
counter += size
|
|
31
32
|
slice.each do |element|
|
|
32
33
|
yield element
|
|
33
34
|
end
|
|
34
35
|
commit.call
|
|
35
36
|
end
|
|
36
|
-
print '.' if Pacer.verbose?
|
|
37
37
|
end
|
|
38
38
|
ensure
|
|
39
39
|
puts '!' if Pacer.verbose?
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'awesome_print'
|
|
3
|
+
rescue LoadError
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
# Fix the way ap indents hashes:
|
|
7
|
+
|
|
8
|
+
# for awesome_print <= 0.4.0
|
|
9
|
+
class AwesomePrint
|
|
10
|
+
# for awesome_print >= 1.0.0
|
|
11
|
+
#class AwesomePrint::Formatter
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
# Format a hash. If @options[:indent] if negative left align hash keys.
|
|
15
|
+
#------------------------------------------------------------------------------
|
|
16
|
+
def awesome_hash(h)
|
|
17
|
+
return "{}" if h == {}
|
|
18
|
+
|
|
19
|
+
keys = @options[:sorted_hash_keys] ? h.keys.sort { |a, b| a.to_s <=> b.to_s } : h.keys
|
|
20
|
+
data = keys.map do |key|
|
|
21
|
+
plain_single_line do
|
|
22
|
+
#[ @inspector.awesome(key), h[key] ]
|
|
23
|
+
[ awesome(key), h[key] ]
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
data = data.map do |key, value|
|
|
28
|
+
if @options[:multiline]
|
|
29
|
+
formatted_key = indent + key
|
|
30
|
+
else
|
|
31
|
+
formatted_key = key
|
|
32
|
+
end
|
|
33
|
+
indented do
|
|
34
|
+
#formatted_key << colorize(" => ", :hash) << @inspector.awesome(value)
|
|
35
|
+
formatted_key << colorize(" => ", :hash) << awesome(value)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
if @options[:multiline]
|
|
39
|
+
"{\n" << data.join(",\n") << "\n#{outdent}}"
|
|
40
|
+
else
|
|
41
|
+
"{ #{data.join(', ')} }"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
data/lib/pacer/transform/join.rb
CHANGED
|
@@ -42,7 +42,7 @@ module Pacer
|
|
|
42
42
|
def initialize(from_graph, multi_graph)
|
|
43
43
|
super()
|
|
44
44
|
@from_graph = from_graph
|
|
45
|
-
@wrapper = Pacer::Wrappers::WrapperSelector.build
|
|
45
|
+
@wrapper = Pacer::Wrappers::WrapperSelector.build from_graph
|
|
46
46
|
@multi_graph = multi_graph || Pacer::MultiGraph.blank
|
|
47
47
|
@values_pipes = []
|
|
48
48
|
@current_keys = []
|
|
@@ -133,6 +133,20 @@ module Pacer
|
|
|
133
133
|
attr_accessor :existing_multi_graph, :key_route, :values_routes, :from_graph
|
|
134
134
|
attr_writer :join_on
|
|
135
135
|
|
|
136
|
+
# FIXME: the pipe changes the graph. This does not fit with the idea of immutable routes.
|
|
137
|
+
def graph
|
|
138
|
+
@graph or super
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def run!
|
|
142
|
+
super
|
|
143
|
+
@graph
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def graph=(g)
|
|
147
|
+
@graph = g
|
|
148
|
+
end
|
|
149
|
+
|
|
136
150
|
def key(&block)
|
|
137
151
|
self.key_route = Pacer::Route.block_branch(self, block)
|
|
138
152
|
self
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Pacer
|
|
2
|
+
module Routes
|
|
3
|
+
# TODO: this should only apply to ID routes...do we want to be that granular with route types?
|
|
4
|
+
module RouteOperations
|
|
5
|
+
# args is (optional) extensions followed by an (optional) options hash
|
|
6
|
+
def lookup_ids(*args)
|
|
7
|
+
if args.last.is_a? Hash
|
|
8
|
+
opts = args.pop
|
|
9
|
+
else
|
|
10
|
+
opts = {}
|
|
11
|
+
end
|
|
12
|
+
chain_route({transform: :lookup_ids, element_type: :vertex, extensions: args, wrapper: nil}.merge(opts))
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module Transform
|
|
18
|
+
module LookupIds
|
|
19
|
+
import com.tinkerpop.gremlin.pipes.transform.IdVertexPipe
|
|
20
|
+
import com.tinkerpop.gremlin.pipes.transform.IdEdgePipe
|
|
21
|
+
|
|
22
|
+
def attach_pipe(end_pipe)
|
|
23
|
+
fail ClientError, 'Can not look up elements without the graph' unless graph
|
|
24
|
+
if element_type == :vertex
|
|
25
|
+
pipe = IdVertexPipe.new graph.blueprints_graph
|
|
26
|
+
elsif element_type == :vertex
|
|
27
|
+
pipe = IdEdgePipe.new graph.blueprints_graph
|
|
28
|
+
else
|
|
29
|
+
fail ClientError, 'Can not look up elements without the element_type'
|
|
30
|
+
end
|
|
31
|
+
pipe.setStarts end_pipe
|
|
32
|
+
pipe
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/pacer/transform/path.rb
CHANGED
|
@@ -38,7 +38,9 @@ This is especially useful for graph traversals.
|
|
|
38
38
|
# #<E[40]:38-document-id-39>,
|
|
39
39
|
# #<V[39]>]
|
|
40
40
|
|
|
41
|
-
See
|
|
41
|
+
See:
|
|
42
|
+
:paths - for more details and general information about paths.
|
|
43
|
+
:arrays - for general operations that work on arrays or paths.
|
|
42
44
|
|
|
43
45
|
HELP
|
|
44
46
|
else
|
|
@@ -15,7 +15,7 @@ module Pacer
|
|
|
15
15
|
|
|
16
16
|
# The default comparator block is { |prev, current| prev == current }
|
|
17
17
|
def tree(&block)
|
|
18
|
-
wrapped.chain_route transform: :path_tree, element_type: :
|
|
18
|
+
wrapped.chain_route transform: :path_tree, element_type: :array, compare: block
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
end
|
data/lib/pacer/version.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
module Pacer
|
|
2
2
|
unless const_defined? :VERSION
|
|
3
|
-
VERSION = "1.
|
|
3
|
+
VERSION = "1.2.0"
|
|
4
4
|
|
|
5
5
|
JAR = "pacer-#{ VERSION }-standalone.jar"
|
|
6
6
|
JAR_PATH = "lib/#{ JAR }"
|
|
7
7
|
|
|
8
8
|
START_TIME = Time.now
|
|
9
9
|
|
|
10
|
-
BLUEPRINTS_VERSION = "2.
|
|
11
|
-
PIPES_VERSION = "2.
|
|
12
|
-
GREMLIN_VERSION = "2.
|
|
10
|
+
BLUEPRINTS_VERSION = "2.2.0"
|
|
11
|
+
PIPES_VERSION = "2.2.0"
|
|
12
|
+
GREMLIN_VERSION = "2.2.0"
|
|
13
13
|
end
|
|
14
14
|
end
|
|
@@ -31,7 +31,7 @@ module Pacer
|
|
|
31
31
|
def attach_pipe(end_pipe)
|
|
32
32
|
pipe = end_pipe
|
|
33
33
|
@section_visitors = (1..visitor_count).map do
|
|
34
|
-
pipe = Pacer::Pipes::SimpleVisitorPipe.new Pacer::Wrappers::WrapperSelector.build(element_type, extensions), graph
|
|
34
|
+
pipe = Pacer::Pipes::SimpleVisitorPipe.new Pacer::Wrappers::WrapperSelector.build(graph, element_type, extensions), graph
|
|
35
35
|
pipe.setStarts end_pipe if end_pipe
|
|
36
36
|
end_pipe = pipe
|
|
37
37
|
end
|
|
@@ -18,7 +18,7 @@ module Pacer::Wrappers
|
|
|
18
18
|
|
|
19
19
|
def wrapper_for(exts)
|
|
20
20
|
if exts
|
|
21
|
-
|
|
21
|
+
base_edge_wrapper.wrappers[exts] ||= build_edge_wrapper(exts)
|
|
22
22
|
else
|
|
23
23
|
fail Pacer::LogicError, "Extensions should not be nil"
|
|
24
24
|
end
|
|
@@ -31,7 +31,7 @@ module Pacer::Wrappers
|
|
|
31
31
|
protected
|
|
32
32
|
|
|
33
33
|
def build_edge_wrapper(exts)
|
|
34
|
-
build_extension_wrapper(exts, [:Route, :Edge],
|
|
34
|
+
build_extension_wrapper(exts, [:Route, :Edge], base_edge_wrapper)
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -48,11 +48,11 @@ module Pacer::Wrappers
|
|
|
48
48
|
def in_vertex(extensions = nil)
|
|
49
49
|
v = element.getVertex Pacer::Pipes::IN
|
|
50
50
|
if extensions.is_a? Enumerable
|
|
51
|
-
|
|
51
|
+
self.class.base_vertex_wrapper.wrapper_for(extensions).new graph, v
|
|
52
52
|
elsif extensions
|
|
53
|
-
|
|
53
|
+
self.class.base_vertex_wrapper.wrapper_for([extensions]).new graph, v
|
|
54
54
|
else
|
|
55
|
-
|
|
55
|
+
self.class.base_vertex_wrapper.new graph, v
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -61,11 +61,11 @@ module Pacer::Wrappers
|
|
|
61
61
|
def out_vertex(extensions = nil)
|
|
62
62
|
v = element.getVertex Pacer::Pipes::OUT
|
|
63
63
|
if extensions.is_a? Enumerable
|
|
64
|
-
|
|
64
|
+
self.class.base_vertex_wrapper.wrapper_for(extensions).new graph, v
|
|
65
65
|
elsif extensions
|
|
66
|
-
|
|
66
|
+
self.class.base_vertex_wrapper.wrapper_for([extensions]).new graph, v
|
|
67
67
|
else
|
|
68
|
-
|
|
68
|
+
self.class.base_vertex_wrapper.new graph, v
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -94,7 +94,7 @@ module Pacer::Wrappers
|
|
|
94
94
|
# Returns the element with a new simple wrapper.
|
|
95
95
|
# @return [EdgeWrapper]
|
|
96
96
|
def no_extensions
|
|
97
|
-
|
|
97
|
+
self.class.base_edge_wrapper.new graph, element
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
# Returns a human-readable representation of the edge using the
|
|
@@ -7,6 +7,16 @@ module Pacer::Wrappers
|
|
|
7
7
|
include Pacer::Core::Graph::ElementRoute
|
|
8
8
|
|
|
9
9
|
class << self
|
|
10
|
+
attr_accessor :caches
|
|
11
|
+
|
|
12
|
+
def base_vertex_wrapper
|
|
13
|
+
VertexWrapper
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def base_edge_wrapper
|
|
17
|
+
EdgeWrapper
|
|
18
|
+
end
|
|
19
|
+
|
|
10
20
|
def wrap(element, exts)
|
|
11
21
|
wrapper_for(exts).new(element.graph, element.element)
|
|
12
22
|
end
|
|
@@ -22,6 +32,7 @@ module Pacer::Wrappers
|
|
|
22
32
|
def clear_cache
|
|
23
33
|
VertexWrapper.clear_cache
|
|
24
34
|
EdgeWrapper.clear_cache
|
|
35
|
+
caches.each { |c| c.clear_cache } if caches
|
|
25
36
|
end
|
|
26
37
|
|
|
27
38
|
def route_conditions
|
|
@@ -18,7 +18,7 @@ module Pacer::Wrappers
|
|
|
18
18
|
|
|
19
19
|
def wrapper_for(exts)
|
|
20
20
|
if exts
|
|
21
|
-
|
|
21
|
+
base_vertex_wrapper.wrappers[exts.to_set] ||= build_vertex_wrapper(exts)
|
|
22
22
|
else
|
|
23
23
|
fail Pacer::LogicError, "Extensions should not be nil"
|
|
24
24
|
end
|
|
@@ -31,7 +31,7 @@ module Pacer::Wrappers
|
|
|
31
31
|
protected
|
|
32
32
|
|
|
33
33
|
def build_vertex_wrapper(exts)
|
|
34
|
-
build_extension_wrapper(exts, [:Route, :Vertex],
|
|
34
|
+
build_extension_wrapper(exts, [:Route, :Vertex], base_vertex_wrapper)
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -64,7 +64,7 @@ module Pacer::Wrappers
|
|
|
64
64
|
# Returns the element with a new simple wrapper.
|
|
65
65
|
# @return [VertexWrapper]
|
|
66
66
|
def no_extensions
|
|
67
|
-
|
|
67
|
+
self.class.base_vertex_wrapper.new graph, element
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# Checks that the given extensions can be applied to the vertex. If
|
|
@@ -3,13 +3,23 @@ module Pacer::Wrappers
|
|
|
3
3
|
import com.tinkerpop.blueprints.Vertex
|
|
4
4
|
import com.tinkerpop.blueprints.Edge
|
|
5
5
|
|
|
6
|
-
def self.build(element_type = nil, extensions = [])
|
|
7
|
-
if
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
def self.build(graph, element_type = nil, extensions = [])
|
|
7
|
+
if graph
|
|
8
|
+
if element_type == :vertex
|
|
9
|
+
graph.base_vertex_wrapper.wrapper_for extensions
|
|
10
|
+
elsif element_type == :edge
|
|
11
|
+
graph.base_edge_wrapper.wrapper_for extensions
|
|
12
|
+
else
|
|
13
|
+
new extensions
|
|
14
|
+
end
|
|
11
15
|
else
|
|
12
|
-
|
|
16
|
+
if element_type == :vertex
|
|
17
|
+
Pacer::Wrappers::VertexWrapper.wrapper_for extensions
|
|
18
|
+
elsif element_type == :edge
|
|
19
|
+
Pacer::Wrappers::EdgeWrapper.wrapper_for extensions
|
|
20
|
+
else
|
|
21
|
+
new extensions
|
|
22
|
+
end
|
|
13
23
|
end
|
|
14
24
|
end
|
|
15
25
|
|
|
@@ -20,16 +30,24 @@ module Pacer::Wrappers
|
|
|
20
30
|
@extensions = extensions
|
|
21
31
|
end
|
|
22
32
|
|
|
23
|
-
def wrapper(element)
|
|
24
|
-
if
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
33
|
+
def wrapper(graph, element)
|
|
34
|
+
if graph
|
|
35
|
+
if element.is_a? Vertex
|
|
36
|
+
self.vertex_wrapper ||= graph.base_vertex_wrapper.wrapper_for extensions
|
|
37
|
+
elsif element.is_a? Edge
|
|
38
|
+
self.edge_wrapper ||= graph.base_edge_wrapper.wrapper_for extensions
|
|
39
|
+
end
|
|
40
|
+
else
|
|
41
|
+
if element.is_a? Vertex
|
|
42
|
+
self.vertex_wrapper ||= Pacer::Wrappers::VertexWrapper.wrapper_for extensions
|
|
43
|
+
elsif element.is_a? Edge
|
|
44
|
+
self.edge_wrapper ||= Pacer::Wrappers::EdgeWrapper.wrapper_for extensions
|
|
45
|
+
end
|
|
28
46
|
end
|
|
29
47
|
end
|
|
30
48
|
|
|
31
49
|
def new(graph, element)
|
|
32
|
-
w = wrapper(element)
|
|
50
|
+
w = wrapper(graph, element)
|
|
33
51
|
if w
|
|
34
52
|
w.new graph, element
|
|
35
53
|
else
|
|
@@ -12,7 +12,7 @@ module Pacer
|
|
|
12
12
|
@extensions = back.extensions
|
|
13
13
|
element_type = back.element_type
|
|
14
14
|
end
|
|
15
|
-
@wrapper = WrapperSelector.build element_type, extensions
|
|
15
|
+
@wrapper = WrapperSelector.build graph, element_type, extensions
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def arity
|
|
@@ -20,14 +20,14 @@ module Pacer
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def compute(element)
|
|
23
|
-
e = wrapper.new graph, element
|
|
23
|
+
e = wrapper.new graph, element if element
|
|
24
24
|
block.call e
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
alias call compute
|
|
28
28
|
|
|
29
29
|
def call_with_args(element, *args)
|
|
30
|
-
e = wrapper.new graph, element
|
|
30
|
+
e = wrapper.new graph, element if element
|
|
31
31
|
block.call e, *args
|
|
32
32
|
end
|
|
33
33
|
|