pacer 1.3.1-java → 1.3.2-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/lib/pacer/core/graph/mixed_route.rb +4 -4
- data/lib/pacer/filter/future_filter.rb +1 -1
- data/lib/pacer/filter/loop_filter.rb +44 -3
- data/lib/pacer/filter/object_filter.rb +2 -1
- data/lib/pacer/filter/where_filter.rb +2 -2
- data/lib/pacer/loader.rb +1 -0
- data/lib/pacer/transform/branch.rb +127 -0
- data/lib/pacer/transform/path.rb +1 -1
- data/lib/pacer/version.rb +1 -1
- data/pom.xml +1 -1
- data/spec/pacer/filter/object_filter_spec.rb +29 -9
- data/spec/pacer/graph/pacer_graph_spec.rb +3 -3
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 941518faaec723674b8421588ee147d210b65b7a
|
4
|
+
data.tar.gz: 5624f8bf440519e6335d7f850d8cb0b3403c4d49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85df9faed211d24e9a2810867194a41494955d76e03918b99150b03720eb93c2c83e1d4832215424b7f30d07138d0226333c634782950cd31a1d903c42004585
|
7
|
+
data.tar.gz: 25b18a28d5f9f25ee014ae6ea3940dc0c6dce0abfebdab76414394252018aa6d8da58da5e5faf45eec324861e7d910a3f84344151a67b8da72b0b0a4157f0e01
|
data/.gitignore
CHANGED
@@ -7,7 +7,7 @@ module Pacer::Core::Graph
|
|
7
7
|
def v(*args, &block)
|
8
8
|
route = chain_route :element_type => :vertex,
|
9
9
|
:pipe_class => Pacer::Pipes::TypeFilterPipe,
|
10
|
-
:pipe_args =>
|
10
|
+
:pipe_args => Pacer::Vertex,
|
11
11
|
:wrapper => wrapper,
|
12
12
|
:extensions => extensions
|
13
13
|
Pacer::Route.property_filter(route, args, block)
|
@@ -17,7 +17,7 @@ module Pacer::Core::Graph
|
|
17
17
|
def e(*args, &block)
|
18
18
|
route = chain_route :element_type => :edge,
|
19
19
|
:pipe_class => Pacer::Pipes::TypeFilterPipe,
|
20
|
-
:pipe_args =>
|
20
|
+
:pipe_args => Pacer::Edge,
|
21
21
|
:wrapper => wrapper,
|
22
22
|
:extensions => extensions
|
23
23
|
Pacer::Route.property_filter(route, args, block)
|
@@ -68,13 +68,13 @@ module Pacer::Core::Graph
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def element_type
|
71
|
-
|
71
|
+
:mixed
|
72
72
|
end
|
73
73
|
|
74
74
|
# Calculate and save result.
|
75
75
|
def result(name = nil)
|
76
76
|
ids = collect do |element|
|
77
|
-
if element.is_a? Pacer::
|
77
|
+
if element.is_a? Pacer::Vertex
|
78
78
|
[:vertex, element.element_id]
|
79
79
|
else
|
80
80
|
[:edge, element.element_id]
|
@@ -5,6 +5,20 @@ module Pacer
|
|
5
5
|
chain_route :filter => :loop, :looping_route => block
|
6
6
|
end
|
7
7
|
|
8
|
+
def all(&block)
|
9
|
+
loop(&block).while do |e, depth|
|
10
|
+
if depth == 0
|
11
|
+
:loop
|
12
|
+
else
|
13
|
+
:loop_and_recur
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def deepest(&block)
|
19
|
+
loop(&block).deepest!
|
20
|
+
end
|
21
|
+
|
8
22
|
# Apply the given path fragment multiple times in succession. If a Range
|
9
23
|
# or Array of numbers is given, the results are a combination of the
|
10
24
|
# results from all of the specified repetition levels. That is useful if
|
@@ -145,18 +159,45 @@ HELP
|
|
145
159
|
self
|
146
160
|
end
|
147
161
|
|
162
|
+
# this could have concurrency problems if multiple instances of the same
|
163
|
+
# route
|
164
|
+
def deepest!
|
165
|
+
@deepest = true
|
166
|
+
self
|
167
|
+
end
|
168
|
+
|
148
169
|
protected
|
149
170
|
|
150
171
|
def attach_pipe(end_pipe)
|
151
|
-
|
172
|
+
if @deepest
|
173
|
+
control_block = deepest_control_block
|
174
|
+
elsif @control_block
|
175
|
+
control_block = @control_block
|
176
|
+
else
|
152
177
|
fail ClientError, 'No loop control block specified. Use either #while or #until after #loop.'
|
153
178
|
end
|
154
|
-
|
155
|
-
pipe = Pacer::Pipes::LoopPipe.new(graph, looping_pipe, @control_block)
|
179
|
+
pipe = Pacer::Pipes::LoopPipe.new(graph, looping_pipe, control_block)
|
156
180
|
pipe.setStarts(end_pipe) if end_pipe
|
157
181
|
pipe
|
158
182
|
end
|
159
183
|
|
184
|
+
def deepest_control_block
|
185
|
+
expando = Pacer::Pipes::ExpandablePipe.new
|
186
|
+
empty = java.util.ArrayList.new
|
187
|
+
expando.setStarts empty.iterator
|
188
|
+
control_pipe = looping_pipe
|
189
|
+
control_pipe.setStarts expando
|
190
|
+
proc do |el, depth|
|
191
|
+
control_pipe.reset
|
192
|
+
expando.add el.element
|
193
|
+
if control_pipe.hasNext
|
194
|
+
:loop
|
195
|
+
elsif depth > 0
|
196
|
+
:emit
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
160
201
|
def looping_pipe
|
161
202
|
Pacer::Route.pipeline(looping_route)
|
162
203
|
end
|
@@ -32,7 +32,8 @@ module Pacer
|
|
32
32
|
protected
|
33
33
|
|
34
34
|
def attach_pipe(end_pipe)
|
35
|
-
|
35
|
+
obj = if value.respond_to?(:element) then value.element else value end
|
36
|
+
pipe = ObjectFilterPipe.new(obj, negate ? Pacer::Pipes::NOT_EQUAL : Pacer::Pipes::EQUAL)
|
36
37
|
pipe.set_starts end_pipe if end_pipe
|
37
38
|
pipe
|
38
39
|
end
|
@@ -33,7 +33,7 @@ module Pacer
|
|
33
33
|
|
34
34
|
def where_statement=(str)
|
35
35
|
@where_statement = str
|
36
|
-
@
|
36
|
+
@parsed = @intermediate = nil
|
37
37
|
end
|
38
38
|
|
39
39
|
def parsed
|
@@ -49,7 +49,7 @@ module Pacer
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def build!
|
52
|
-
|
52
|
+
intermediate.build
|
53
53
|
end
|
54
54
|
|
55
55
|
protected
|
data/lib/pacer/loader.rb
CHANGED
@@ -80,6 +80,7 @@ require 'pacer/filter/block_filter'
|
|
80
80
|
require 'pacer/filter/object_filter'
|
81
81
|
require 'pacer/filter/random_filter'
|
82
82
|
|
83
|
+
require 'pacer/transform/branch'
|
83
84
|
require 'pacer/transform/cap'
|
84
85
|
require 'pacer/transform/stream_sort'
|
85
86
|
require 'pacer/transform/stream_uniq'
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module Pacer
|
2
|
+
module Core
|
3
|
+
module Route
|
4
|
+
def branch(&block)
|
5
|
+
route = chain_route transform: ::Pacer::Transform::Branch
|
6
|
+
route.add_block! &block
|
7
|
+
end
|
8
|
+
|
9
|
+
def cond(where, &block)
|
10
|
+
route = chain_route transform: ::Pacer::Transform::Branch
|
11
|
+
route.add_cond! where, &block
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Transform
|
17
|
+
module Branch
|
18
|
+
import com.tinkerpop.pipes.branch.CopySplitPipe;
|
19
|
+
import com.tinkerpop.pipes.branch.ExhaustMergePipe
|
20
|
+
import com.tinkerpop.pipes.branch.FairMergePipe
|
21
|
+
|
22
|
+
attr_accessor :branches, :split_pipe_class, :merge_pipe_class, :conds
|
23
|
+
|
24
|
+
def after_initialize
|
25
|
+
super
|
26
|
+
self.branches ||= []
|
27
|
+
self.conds ||= []
|
28
|
+
self.split_pipe_class ||= CopySplitPipe
|
29
|
+
self.merge_pipe_class ||= FairMergePipe
|
30
|
+
end
|
31
|
+
|
32
|
+
def clone(conf = {})
|
33
|
+
back.chain_route({transform: Branch,
|
34
|
+
branches: branches.clone,
|
35
|
+
element_type: element_type,
|
36
|
+
conds: conds.clone,
|
37
|
+
extensions: extensions.clone,
|
38
|
+
split_pipe_class: split_pipe_class,
|
39
|
+
merge_pipe_class: merge_pipe_class
|
40
|
+
}.merge(conf))
|
41
|
+
end
|
42
|
+
|
43
|
+
def branch(&block)
|
44
|
+
route = clone
|
45
|
+
route.add_block! &block
|
46
|
+
end
|
47
|
+
|
48
|
+
def cond(where, &block)
|
49
|
+
route = clone
|
50
|
+
route.add_cond! where, &block
|
51
|
+
end
|
52
|
+
|
53
|
+
def otherwise(&block)
|
54
|
+
where = "(#{ conds.compact.map { |c| "not (#{c})" }.join " and " })"
|
55
|
+
cond where, &block
|
56
|
+
end
|
57
|
+
|
58
|
+
def merge
|
59
|
+
route = clone
|
60
|
+
route.merge_pipe_class = FairMergePipe
|
61
|
+
route.chain_route transform: MergedBranch
|
62
|
+
end
|
63
|
+
|
64
|
+
def merge_exhaustive
|
65
|
+
route = clone
|
66
|
+
route.merge_pipe_class = ExhaustMergePipe
|
67
|
+
route.chain_route transform: MergedBranch
|
68
|
+
end
|
69
|
+
|
70
|
+
def add_block!(&block)
|
71
|
+
will_clone = false
|
72
|
+
branch = block.call(Pacer::Route.empty(self))
|
73
|
+
branches.push branch
|
74
|
+
conf = {}
|
75
|
+
|
76
|
+
exts = branches.
|
77
|
+
map { |b| b.extensions }.
|
78
|
+
map { |a| a ? a.to_set : Set[] }.
|
79
|
+
reduce { |r, e| r.intersection(e) }
|
80
|
+
if exts.to_a != config[:extensions]
|
81
|
+
conf[:extensions] = exts.to_a
|
82
|
+
end
|
83
|
+
|
84
|
+
types = branches.map { |b| b.element_type }.to_set
|
85
|
+
if types.length == 1
|
86
|
+
type = types.first
|
87
|
+
elsif types.difference([:vertex, :edge, :mixed]).empty?
|
88
|
+
type = :mixed
|
89
|
+
elsif types.difference([:path, :array]).empty?
|
90
|
+
type = :array
|
91
|
+
else
|
92
|
+
type = :object
|
93
|
+
end
|
94
|
+
if type != element_type
|
95
|
+
conf[:element_type] = type
|
96
|
+
end
|
97
|
+
if conf.empty?
|
98
|
+
self
|
99
|
+
else
|
100
|
+
clone conf
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def add_cond!(where, &block)
|
105
|
+
conds[branches.length] = where
|
106
|
+
add_block! do |r|
|
107
|
+
block.call r.where(where)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def attach_pipe(end_pipe)
|
112
|
+
branch_pipes = branches.map { |b| Pacer::Route.pipeline(b) }
|
113
|
+
split = split_pipe_class.new branch_pipes
|
114
|
+
split.setStarts end_pipe if end_pipe
|
115
|
+
merge = merge_pipe_class.new branch_pipes
|
116
|
+
merge.setStarts split
|
117
|
+
merge
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
module MergedBranch
|
122
|
+
# This just exists so that if I merge and then branch again,
|
123
|
+
# the new branches will be against the merged source.
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
data/lib/pacer/transform/path.rb
CHANGED
@@ -5,7 +5,7 @@ module Pacer
|
|
5
5
|
route = chain_route :transform => :path, :element_type => :path
|
6
6
|
if exts.any?
|
7
7
|
exts = exts.map { |e| Array.wrap(e) if e }
|
8
|
-
route.map(
|
8
|
+
route.map(element_type: :path) do |path|
|
9
9
|
path.zip(exts).map { |element, ext| ext ? element.add_extensions(ext) : element }
|
10
10
|
end
|
11
11
|
else
|
data/lib/pacer/version.rb
CHANGED
data/pom.xml
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
<!-- NOTE: the following properties are automatically updated based on the values in lib/pacer-neo4j/version.rb -->
|
9
9
|
<properties>
|
10
10
|
<blueprints.version>2.3.0</blueprints.version>
|
11
|
-
<gem.version>1.3.
|
11
|
+
<gem.version>1.3.2</gem.version>
|
12
12
|
<pipes.version>2.3.0</pipes.version>
|
13
13
|
<gremlin.version>2.3.0</gremlin.version>
|
14
14
|
</properties>
|
@@ -1,15 +1,35 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
Run.tg(:read_only) do
|
4
|
+
use_pacer_graphml_data(:read_only)
|
5
|
+
|
6
|
+
describe Pacer::Filter::ObjectFilter do
|
7
|
+
it '#is' do
|
8
|
+
[1, 2, 3, 2, 3].to_route.is(2).to_a.should == [2, 2]
|
9
|
+
end
|
7
10
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
+
it '#is_not' do
|
12
|
+
[1, 2, 3, 2, 3].to_route.is_not(2).to_a.should == [1, 3, 3]
|
13
|
+
end
|
14
|
+
|
15
|
+
it '#compact' do
|
16
|
+
[1, nil, 2, 3].to_route.compact.to_a.should == [1, 2, 3]
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#vertex filter' do
|
11
20
|
|
12
|
-
|
13
|
-
|
21
|
+
let (:filter_node) { graph.vertex 3 }
|
22
|
+
|
23
|
+
it "#is_not" do
|
24
|
+
all_nodes = graph.v.to_a.select { |n| n.getId != filter_node.getId }
|
25
|
+
graph.v.is_not(filter_node).to_a.should == all_nodes
|
26
|
+
end
|
27
|
+
|
28
|
+
it "#is" do
|
29
|
+
graph.v.is(filter_node).to_a.should == [filter_node]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
14
33
|
end
|
34
|
+
|
15
35
|
end
|
@@ -362,13 +362,13 @@ Run.all :read_write do
|
|
362
362
|
it 'should create a file that can be read back' do
|
363
363
|
graph.v.count.should == 2
|
364
364
|
graph.e.count.should == 2
|
365
|
-
Pacer::GraphML.export graph, 'tmp/graph_mixin_spec_export.graphml'
|
365
|
+
Pacer::GraphML.export graph, '/tmp/graph_mixin_spec_export.graphml'
|
366
366
|
graph2.e.delete!
|
367
367
|
graph2.v.delete!
|
368
368
|
graph2.v.count.should == 0
|
369
369
|
graph2.e.count.should == 0
|
370
|
-
Pacer::GraphML.import graph2, 'tmp/graph_mixin_spec_export.graphml'
|
371
|
-
puts File.read 'tmp/graph_mixin_spec_export.graphml'
|
370
|
+
Pacer::GraphML.import graph2, '/tmp/graph_mixin_spec_export.graphml'
|
371
|
+
puts File.read '/tmp/graph_mixin_spec_export.graphml'
|
372
372
|
graph2.v.count.should == 2
|
373
373
|
graph2.e.count.should == 2
|
374
374
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pacer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Darrick Wiebe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Pacer defines routes through a graph and then traverses them very quickly.
|
14
14
|
email: darrick@innatesoftware.com
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- lib/pacer/support/native_exception.rb
|
125
125
|
- lib/pacer/support/nil_class.rb
|
126
126
|
- lib/pacer/support/proc.rb
|
127
|
+
- lib/pacer/transform/branch.rb
|
127
128
|
- lib/pacer/transform/cap.rb
|
128
129
|
- lib/pacer/transform/flat_map.rb
|
129
130
|
- lib/pacer/transform/gather.rb
|
@@ -217,7 +218,7 @@ files:
|
|
217
218
|
- spec/support/use_transactions.rb
|
218
219
|
- spec/tackle/simple_mixin.rb
|
219
220
|
- spec/tackle/tinkerpop_graph_mixins.rb
|
220
|
-
- lib/pacer-1.3.
|
221
|
+
- lib/pacer-1.3.2-standalone.jar
|
221
222
|
homepage: http://github.com/pangloss/pacer
|
222
223
|
licenses:
|
223
224
|
- MIT
|