pacer 0.9.1.1-java
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +8 -0
- data/.document +5 -0
- data/.gitignore +26 -0
- data/.rspec +1 -0
- data/.rvmrc +0 -0
- data/CONTRIBUTORS +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +24 -0
- data/README.md +187 -0
- data/Rakefile +49 -0
- data/autotest/discover.rb +1 -0
- data/bin/autospec +16 -0
- data/bin/autotest +16 -0
- data/bin/rake +16 -0
- data/bin/rcov +16 -0
- data/bin/rspec +16 -0
- data/bin/yard +16 -0
- data/bin/yardoc +16 -0
- data/lib/pacer/blueprints/extensions.rb +77 -0
- data/lib/pacer/blueprints/multi_graph.rb +121 -0
- data/lib/pacer/blueprints/ruby_graph.rb +199 -0
- data/lib/pacer/blueprints/tg.rb +100 -0
- data/lib/pacer/blueprints.rb +4 -0
- data/lib/pacer/core/graph/edges_route.rb +92 -0
- data/lib/pacer/core/graph/element_route.rb +171 -0
- data/lib/pacer/core/graph/graph_index_route.rb +48 -0
- data/lib/pacer/core/graph/graph_route.rb +55 -0
- data/lib/pacer/core/graph/mixed_route.rb +96 -0
- data/lib/pacer/core/graph/vertices_route.rb +220 -0
- data/lib/pacer/core/graph.rb +13 -0
- data/lib/pacer/core/route.rb +502 -0
- data/lib/pacer/core/side_effect.rb +11 -0
- data/lib/pacer/core.rb +8 -0
- data/lib/pacer/exceptions.rb +11 -0
- data/lib/pacer/extensions/block_filter_element.rb +22 -0
- data/lib/pacer/extensions.rb +6 -0
- data/lib/pacer/filter/block_filter.rb +31 -0
- data/lib/pacer/filter/collection_filter.rb +109 -0
- data/lib/pacer/filter/empty_filter.rb +70 -0
- data/lib/pacer/filter/future_filter.rb +68 -0
- data/lib/pacer/filter/index_filter.rb +30 -0
- data/lib/pacer/filter/loop_filter.rb +95 -0
- data/lib/pacer/filter/object_filter.rb +55 -0
- data/lib/pacer/filter/property_filter/edge_filters.rb +93 -0
- data/lib/pacer/filter/property_filter/filters.rb +269 -0
- data/lib/pacer/filter/property_filter.rb +111 -0
- data/lib/pacer/filter/random_filter.rb +13 -0
- data/lib/pacer/filter/range_filter.rb +104 -0
- data/lib/pacer/filter/uniq_filter.rb +12 -0
- data/lib/pacer/filter/where_filter/node_visitor.rb +280 -0
- data/lib/pacer/filter/where_filter.rb +47 -0
- data/lib/pacer/filter.rb +17 -0
- data/lib/pacer/function_resolver.rb +43 -0
- data/lib/pacer/graph/edge_mixin.rb +127 -0
- data/lib/pacer/graph/element_mixin.rb +202 -0
- data/lib/pacer/graph/graph_indices_mixin.rb +93 -0
- data/lib/pacer/graph/graph_mixin.rb +361 -0
- data/lib/pacer/graph/graph_transactions_mixin.rb +207 -0
- data/lib/pacer/graph/index_mixin.rb +30 -0
- data/lib/pacer/graph/vertex_mixin.rb +119 -0
- data/lib/pacer/graph.rb +14 -0
- data/lib/pacer/pipe/blackbox_pipeline.rb +48 -0
- data/lib/pacer/pipe/block_filter_pipe.rb +38 -0
- data/lib/pacer/pipe/collection_filter_pipe.rb +10 -0
- data/lib/pacer/pipe/cross_product_transform_pipe.rb +48 -0
- data/lib/pacer/pipe/enumerable_pipe.rb +30 -0
- data/lib/pacer/pipe/expandable_pipe.rb +63 -0
- data/lib/pacer/pipe/id_collection_filter_pipe.rb +33 -0
- data/lib/pacer/pipe/is_empty_pipe.rb +30 -0
- data/lib/pacer/pipe/is_unique_pipe.rb +61 -0
- data/lib/pacer/pipe/label_collection_filter_pipe.rb +21 -0
- data/lib/pacer/pipe/label_prefix_pipe.rb +21 -0
- data/lib/pacer/pipe/loop_pipe.rb +86 -0
- data/lib/pacer/pipe/map_pipe.rb +36 -0
- data/lib/pacer/pipe/never_pipe.rb +9 -0
- data/lib/pacer/pipe/process_pipe.rb +37 -0
- data/lib/pacer/pipe/property_comparison_pipe.rb +40 -0
- data/lib/pacer/pipe/ruby_pipe.rb +25 -0
- data/lib/pacer/pipe/simple_visitor_pipe.rb +43 -0
- data/lib/pacer/pipe/stream_sort_pipe.rb +84 -0
- data/lib/pacer/pipe/stream_uniq_pipe.rb +33 -0
- data/lib/pacer/pipe/type_filter_pipe.rb +22 -0
- data/lib/pacer/pipe/unary_transform_pipe.rb +59 -0
- data/lib/pacer/pipe/variable_store_iterator_wrapper.rb +26 -0
- data/lib/pacer/pipe/visitor_pipe.rb +67 -0
- data/lib/pacer/pipes.rb +61 -0
- data/lib/pacer/route/mixin/bulk_operations.rb +52 -0
- data/lib/pacer/route/mixin/route_operations.rb +107 -0
- data/lib/pacer/route/mixin/variable_route_module.rb +26 -0
- data/lib/pacer/route/mixins.rb +3 -0
- data/lib/pacer/route.rb +228 -0
- data/lib/pacer/routes.rb +6 -0
- data/lib/pacer/side_effect/aggregate.rb +31 -0
- data/lib/pacer/side_effect/counted.rb +30 -0
- data/lib/pacer/side_effect/group_count.rb +44 -0
- data/lib/pacer/side_effect/is_unique.rb +32 -0
- data/lib/pacer/side_effect/section.rb +25 -0
- data/lib/pacer/side_effect/visitor.rb +37 -0
- data/lib/pacer/side_effect.rb +11 -0
- data/lib/pacer/support/array_list.rb +28 -0
- data/lib/pacer/support/enumerable.rb +100 -0
- data/lib/pacer/support/hash.rb +9 -0
- data/lib/pacer/support/iterator_mixins.rb +110 -0
- data/lib/pacer/support/native_exception.rb +22 -0
- data/lib/pacer/support/proc.rb +16 -0
- data/lib/pacer/support.rb +10 -0
- data/lib/pacer/transform/cap.rb +50 -0
- data/lib/pacer/transform/gather.rb +9 -0
- data/lib/pacer/transform/has_count_cap.rb +41 -0
- data/lib/pacer/transform/join.rb +181 -0
- data/lib/pacer/transform/map.rb +23 -0
- data/lib/pacer/transform/path.rb +50 -0
- data/lib/pacer/transform/process.rb +23 -0
- data/lib/pacer/transform/scatter.rb +23 -0
- data/lib/pacer/transform/sort_section.rb +103 -0
- data/lib/pacer/transform/stream_sort.rb +21 -0
- data/lib/pacer/transform/stream_uniq.rb +21 -0
- data/lib/pacer/transform.rb +16 -0
- data/lib/pacer/utils/graph_analysis.rb +112 -0
- data/lib/pacer/utils/trie.rb +93 -0
- data/lib/pacer/utils/tsort.rb +65 -0
- data/lib/pacer/utils/y_files.rb +127 -0
- data/lib/pacer/utils.rb +10 -0
- data/lib/pacer/version.rb +13 -0
- data/lib/pacer/wrappers/edge_wrapper.rb +51 -0
- data/lib/pacer/wrappers/element_wrapper.rb +78 -0
- data/lib/pacer/wrappers/new_element.rb +106 -0
- data/lib/pacer/wrappers/vertex_wrapper.rb +51 -0
- data/lib/pacer/wrappers.rb +19 -0
- data/lib/pacer-0.9.1.1-standalone.jar +0 -0
- data/lib/pacer.rb +290 -0
- data/pacer.gemspec +30 -0
- data/pom/standalone.xml +22 -0
- data/pom.xml +124 -0
- data/samples/grateful-dead.xml +26380 -0
- data/samples/grateful_dead.rb +63 -0
- data/samples/profile.rb +15 -0
- data/spec/data/grateful-dead.xml +26380 -0
- data/spec/data/pacer.graphml +319 -0
- data/spec/pacer/blueprints/dex_spec.rb +172 -0
- data/spec/pacer/blueprints/neo4j_spec.rb +177 -0
- data/spec/pacer/blueprints/tg_spec.rb +128 -0
- data/spec/pacer/core/graph/edges_route_spec.rb +52 -0
- data/spec/pacer/core/graph/element_route_spec.rb +46 -0
- data/spec/pacer/core/graph/graph_route_spec.rb +94 -0
- data/spec/pacer/core/graph/vertices_route_spec.rb +169 -0
- data/spec/pacer/core/route_spec.rb +197 -0
- data/spec/pacer/filter/collection_filter_spec.rb +19 -0
- data/spec/pacer/filter/empty_filter_spec.rb +29 -0
- data/spec/pacer/filter/future_filter_spec.rb +97 -0
- data/spec/pacer/filter/loop_filter_spec.rb +31 -0
- data/spec/pacer/filter/property_filter_spec.rb +111 -0
- data/spec/pacer/filter/random_filter_spec.rb +17 -0
- data/spec/pacer/filter/uniq_filter_spec.rb +18 -0
- data/spec/pacer/filter/where_filter_spec.rb +93 -0
- data/spec/pacer/graph/edge_mixin_spec.rb +116 -0
- data/spec/pacer/graph/element_mixin_spec.rb +297 -0
- data/spec/pacer/graph/graph_mixin_spec.rb +538 -0
- data/spec/pacer/graph/index_mixin_spec.rb +0 -0
- data/spec/pacer/graph/vertex_mixin_spec.rb +192 -0
- data/spec/pacer/pipe/block_filter_pipe_spec.rb +0 -0
- data/spec/pacer/pipe/labels_filter_pipe_spec.rb +0 -0
- data/spec/pacer/pipe/ruby_pipe_spec.rb +0 -0
- data/spec/pacer/pipe/type_filter_pipe_spec.rb +0 -0
- data/spec/pacer/route/mixin/base_spec.rb +419 -0
- data/spec/pacer/route/mixin/bulk_operations_spec.rb +30 -0
- data/spec/pacer/route/mixin/route_operations_spec.rb +127 -0
- data/spec/pacer/support/array_list_spec.rb +0 -0
- data/spec/pacer/support/enumerable_spec.rb +115 -0
- data/spec/pacer/transform/join_spec.rb +138 -0
- data/spec/pacer/transform/path_spec.rb +54 -0
- data/spec/pacer/utils/tsort_spec.rb +89 -0
- data/spec/pacer/wrapper/edge_wrapper_spec.rb +33 -0
- data/spec/pacer/wrapper/element_wrapper_spec.rb +169 -0
- data/spec/pacer/wrapper/vertex_wrapper_spec.rb +33 -0
- data/spec/pacer_spec.rb +0 -0
- data/spec/spec_helper.rb +91 -0
- data/spec/support/contexts.rb +14 -0
- data/spec/support/graph_runner.rb +142 -0
- data/spec/support/matchers.rb +19 -0
- data/spec/support/use_transactions.rb +31 -0
- data/spec/tackle/simple_mixin.rb +21 -0
- data/spec/tackle/tinkerpop_graph_mixins.rb +60 -0
- metadata +364 -0
@@ -0,0 +1,199 @@
|
|
1
|
+
module Pacer
|
2
|
+
class RubyGraph
|
3
|
+
import com.tinkerpop.blueprints.pgm.Element
|
4
|
+
import com.tinkerpop.blueprints.pgm.Graph
|
5
|
+
|
6
|
+
include Graph
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
clear
|
10
|
+
end
|
11
|
+
|
12
|
+
def element_class
|
13
|
+
RubyElement
|
14
|
+
end
|
15
|
+
|
16
|
+
def vertex_class
|
17
|
+
RubyVertex
|
18
|
+
end
|
19
|
+
|
20
|
+
def edge_class
|
21
|
+
RubyEdge
|
22
|
+
end
|
23
|
+
|
24
|
+
def addVertex(id)
|
25
|
+
if id
|
26
|
+
v_id = id
|
27
|
+
else
|
28
|
+
v_id = next_id
|
29
|
+
end
|
30
|
+
raise Pacer::ElementExists if @vertices.key? v_id
|
31
|
+
@vertices[v_id] = vertex_class.new self, v_id
|
32
|
+
end
|
33
|
+
|
34
|
+
def getVertex(id)
|
35
|
+
@vertices[id]
|
36
|
+
end
|
37
|
+
|
38
|
+
def removeVertex(vertex)
|
39
|
+
@vertices.delete vertex.element_id
|
40
|
+
end
|
41
|
+
|
42
|
+
def getVertices
|
43
|
+
Pacer::Pipes::EnumerablePipe.new @vertices.values
|
44
|
+
end
|
45
|
+
|
46
|
+
def addEdge(id, outVertex, inVertex, label)
|
47
|
+
id ||= next_id
|
48
|
+
raise Pacer::ElementExists if @edges.key? id
|
49
|
+
@edges[id] = edge_class.new self, id, outVertex, inVertex, label
|
50
|
+
end
|
51
|
+
|
52
|
+
def getEdge(id)
|
53
|
+
@edges[id]
|
54
|
+
end
|
55
|
+
|
56
|
+
def removeEdge(edge)
|
57
|
+
@edges.delete edge.element_id
|
58
|
+
end
|
59
|
+
|
60
|
+
def getEdges
|
61
|
+
Pacer::Pipes::EnumerablePipe.new @edges.values
|
62
|
+
end
|
63
|
+
|
64
|
+
def clear
|
65
|
+
@vertices = {}
|
66
|
+
@edges = {}
|
67
|
+
@next_id = 0
|
68
|
+
end
|
69
|
+
|
70
|
+
def shutdown
|
71
|
+
clear
|
72
|
+
end
|
73
|
+
|
74
|
+
def ==(other)
|
75
|
+
other.equal? self
|
76
|
+
end
|
77
|
+
|
78
|
+
def supports_custom_element_ids?
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
def supports_automatic_indices?
|
83
|
+
false
|
84
|
+
end
|
85
|
+
|
86
|
+
def supports_manual_indices?
|
87
|
+
false
|
88
|
+
end
|
89
|
+
|
90
|
+
def supports_edge_indices?
|
91
|
+
false
|
92
|
+
end
|
93
|
+
|
94
|
+
include GraphExtensions
|
95
|
+
|
96
|
+
protected
|
97
|
+
|
98
|
+
def next_id
|
99
|
+
@next_id += 1
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class RubyElement
|
104
|
+
include com.tinkerpop.blueprints.pgm.Element
|
105
|
+
|
106
|
+
def initialize(graph, element_id)
|
107
|
+
@graph = graph
|
108
|
+
@element_id = element_id
|
109
|
+
@properties = {}
|
110
|
+
end
|
111
|
+
|
112
|
+
def getPropertyKeys
|
113
|
+
@properties.keys.to_hashset
|
114
|
+
end
|
115
|
+
|
116
|
+
def getProperty(key)
|
117
|
+
v = @properties[key.to_s]
|
118
|
+
if v.is_a? String
|
119
|
+
v.dup
|
120
|
+
else
|
121
|
+
v
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def setProperty(key, value)
|
126
|
+
@properties[key.to_s] = value
|
127
|
+
end
|
128
|
+
|
129
|
+
def removeProperty(key)
|
130
|
+
@properties.delete key.to_s
|
131
|
+
end
|
132
|
+
|
133
|
+
def getId
|
134
|
+
@element_id
|
135
|
+
end
|
136
|
+
|
137
|
+
protected
|
138
|
+
|
139
|
+
def extract_varargs_strings(labels)
|
140
|
+
if labels.first.is_a? ArrayJavaProxy
|
141
|
+
labels.first.map { |l| l.to_s }
|
142
|
+
else
|
143
|
+
labels
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
class RubyVertex < RubyElement
|
150
|
+
include com.tinkerpop.blueprints.pgm.Vertex
|
151
|
+
|
152
|
+
def getRawVertex
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
156
|
+
def getInEdges(*labels)
|
157
|
+
labels = extract_varargs_strings(labels)
|
158
|
+
edges = graph.getEdges.select { |e| e.getInVertex == self and (labels.empty? or labels.include? e.getLabel) }
|
159
|
+
Pacer::Pipes::EnumerablePipe.new edges
|
160
|
+
end
|
161
|
+
|
162
|
+
def getOutEdges(*labels)
|
163
|
+
labels = extract_varargs_strings(labels)
|
164
|
+
edges = graph.getEdges.select { |e| e.getOutVertex == self and (labels.empty? or labels.include? e.getLabel) }
|
165
|
+
Pacer::Pipes::EnumerablePipe.new edges
|
166
|
+
end
|
167
|
+
|
168
|
+
include VertexExtensions
|
169
|
+
end
|
170
|
+
|
171
|
+
class RubyEdge < RubyElement
|
172
|
+
include com.tinkerpop.blueprints.pgm.Edge
|
173
|
+
|
174
|
+
def initialize(graph, id, out_vertex, in_vertex, label)
|
175
|
+
super(graph, id)
|
176
|
+
@out_vertex = out_vertex
|
177
|
+
@in_vertex = in_vertex
|
178
|
+
@label = label.to_s
|
179
|
+
end
|
180
|
+
|
181
|
+
def getRawEdge
|
182
|
+
self
|
183
|
+
end
|
184
|
+
|
185
|
+
def getLabel()
|
186
|
+
@label
|
187
|
+
end
|
188
|
+
|
189
|
+
def getOutVertex()
|
190
|
+
@out_vertex
|
191
|
+
end
|
192
|
+
|
193
|
+
def getInVertex()
|
194
|
+
@in_vertex
|
195
|
+
end
|
196
|
+
|
197
|
+
include EdgeExtensions
|
198
|
+
end
|
199
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module Pacer
|
2
|
+
import com.tinkerpop.blueprints.pgm.impls.tg.TinkerGraph
|
3
|
+
import com.tinkerpop.blueprints.pgm.impls.tg.TinkerVertex
|
4
|
+
import com.tinkerpop.blueprints.pgm.impls.tg.TinkerEdge
|
5
|
+
import com.tinkerpop.blueprints.pgm.impls.tg.TinkerElement
|
6
|
+
import com.tinkerpop.blueprints.pgm.impls.tg.TinkerIndex
|
7
|
+
|
8
|
+
# Create a new TinkerGraph. If path is given, import the GraphML data from
|
9
|
+
# the file specified.
|
10
|
+
def self.tg(path = nil)
|
11
|
+
graph = TinkerGraph.new
|
12
|
+
if path
|
13
|
+
graph.import(path)
|
14
|
+
end
|
15
|
+
graph
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
# Extend the java class imported from blueprints.
|
20
|
+
class TinkerGraph
|
21
|
+
include GraphMixin
|
22
|
+
include GraphIndicesMixin
|
23
|
+
include GraphTransactionsStub
|
24
|
+
include ManagedTransactionsMixin
|
25
|
+
include Pacer::Core::Route
|
26
|
+
include Pacer::Core::Graph::GraphRoute
|
27
|
+
include Pacer::Core::Graph::GraphIndexRoute
|
28
|
+
|
29
|
+
def element_class
|
30
|
+
TinkerElement
|
31
|
+
end
|
32
|
+
|
33
|
+
def vertex_class
|
34
|
+
TinkerVertex
|
35
|
+
end
|
36
|
+
|
37
|
+
def edge_class
|
38
|
+
TinkerEdge
|
39
|
+
end
|
40
|
+
|
41
|
+
# Override to return an enumeration-friendly array of vertices.
|
42
|
+
def get_vertices
|
43
|
+
getVertices.iterator.to_route(:graph => self, :element_type => :vertex)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Override to return an enumeration-friendly array of edges.
|
47
|
+
def get_edges
|
48
|
+
getEdges.iterator.to_route(:graph => self, :element_type => :edge)
|
49
|
+
end
|
50
|
+
|
51
|
+
def ==(other)
|
52
|
+
other.class == self.class and other.object_id == self.object_id
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
class TinkerIndex
|
58
|
+
include IndexMixin
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
# Extend the java class imported from blueprints.
|
63
|
+
class TinkerVertex
|
64
|
+
include Pacer::Core::Graph::VerticesRoute
|
65
|
+
include ElementMixin
|
66
|
+
include VertexMixin
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
# Extend the java class imported from blueprints.
|
71
|
+
class TinkerEdge
|
72
|
+
include Pacer::Core::Graph::EdgesRoute
|
73
|
+
include ElementMixin
|
74
|
+
include EdgeMixin
|
75
|
+
|
76
|
+
def in_vertex(extensions = nil)
|
77
|
+
v = inVertex
|
78
|
+
v.graph = graph
|
79
|
+
if extensions.is_a? Enumerable
|
80
|
+
v.add_extensions extensions
|
81
|
+
elsif extensions
|
82
|
+
v.add_extensions [extensions]
|
83
|
+
else
|
84
|
+
v
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def out_vertex(extensions = nil)
|
89
|
+
v = outVertex
|
90
|
+
v.graph = graph
|
91
|
+
if extensions.is_a? Enumerable
|
92
|
+
v.add_extensions extensions
|
93
|
+
elsif extensions
|
94
|
+
v.add_extensions [extensions]
|
95
|
+
else
|
96
|
+
v
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Pacer::Core::Graph
|
2
|
+
|
3
|
+
# Basic methods for routes that contain only edges.
|
4
|
+
module EdgesRoute
|
5
|
+
import com.tinkerpop.pipes.transform.OutVertexPipe
|
6
|
+
import com.tinkerpop.pipes.transform.InVertexPipe
|
7
|
+
import com.tinkerpop.pipes.transform.BothVerticesPipe
|
8
|
+
|
9
|
+
include ElementRoute
|
10
|
+
|
11
|
+
# Extends the route with out vertices from this route's matching edges.
|
12
|
+
#
|
13
|
+
# @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
|
14
|
+
# @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
|
15
|
+
# @return [VerticesRoute]
|
16
|
+
def out_v(*filters, &block)
|
17
|
+
Pacer::Route.property_filter(chain_route(:element_type => :vertex,
|
18
|
+
:pipe_class => OutVertexPipe,
|
19
|
+
:route_name => 'outV'),
|
20
|
+
filters, block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Extends the route with in vertices from this route's matching edges.
|
24
|
+
#
|
25
|
+
# @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
|
26
|
+
# @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
|
27
|
+
# @return [VerticesRoute]
|
28
|
+
def in_v(*filters, &block)
|
29
|
+
Pacer::Route.property_filter(chain_route(:element_type => :vertex,
|
30
|
+
:pipe_class => InVertexPipe,
|
31
|
+
:route_name => 'inV'),
|
32
|
+
filters, block)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Extends the route with both in and oud vertices from this route's matching edges.
|
36
|
+
#
|
37
|
+
# @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
|
38
|
+
# @yield [VertexMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
|
39
|
+
# @return [VerticesRoute]
|
40
|
+
def both_v(*filters, &block)
|
41
|
+
Pacer::Route.property_filter(chain_route(:element_type => :vertex,
|
42
|
+
:pipe_class => BothVerticesPipe,
|
43
|
+
:route_name => 'bothV'),
|
44
|
+
filters, block)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Extend route with the additional edge label, property and block filters.
|
48
|
+
#
|
49
|
+
# @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
|
50
|
+
# @yield [EdgeMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
|
51
|
+
# @return [EdgesRoute]
|
52
|
+
def e(*filters, &block)
|
53
|
+
filter(*filters, &block)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Return an route to all edge labels for edges emitted from this
|
57
|
+
# route.
|
58
|
+
#
|
59
|
+
# @return [Core::Route]
|
60
|
+
def labels
|
61
|
+
chain_route(:pipe_class => com.tinkerpop.pipes.transform.LabelPipe,
|
62
|
+
:route_name => 'labels',
|
63
|
+
:element_type => :object)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns a hash of in vertices with an array of associated out vertices.
|
67
|
+
#
|
68
|
+
# See #subgraph for a more useful method.
|
69
|
+
#
|
70
|
+
# @return [Hash]
|
71
|
+
def to_h
|
72
|
+
inject(Hash.new { |h,k| h[k]=[] }) do |h, edge|
|
73
|
+
h[edge.out_vertex] << edge.in_vertex
|
74
|
+
h
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# The element type of this route for this graph implementation.
|
79
|
+
#
|
80
|
+
# @return [element_type(:edge)] The actual type varies based on
|
81
|
+
# which graph is in use.
|
82
|
+
def element_type
|
83
|
+
graph.element_type(:edge)
|
84
|
+
end
|
85
|
+
|
86
|
+
protected
|
87
|
+
|
88
|
+
def id_pipe_class
|
89
|
+
com.tinkerpop.pipes.transform.IdEdgePipe
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
module Pacer::Core::Graph
|
2
|
+
|
3
|
+
# Basic methods for routes shared between all route types that emit
|
4
|
+
# routes: {VerticesRoute}, {EdgesRoute} and {MixedRoute}
|
5
|
+
module ElementRoute
|
6
|
+
|
7
|
+
# Attach a filter to the current route.
|
8
|
+
#
|
9
|
+
# @param [Array<Hash, extension>, Hash, extension] filter see {Pacer::Route#property_filter}
|
10
|
+
# @yield [ElementMixin(Extensions::BlockFilterElement)] filter proc, see {Pacer::Route#property_filter}
|
11
|
+
# @return [ElementRoute] the same type and extensions as the source route.
|
12
|
+
def filter(*filters, &block)
|
13
|
+
Pacer::Route.property_filter(self, filters, block)
|
14
|
+
end
|
15
|
+
|
16
|
+
# v is undefined for edge routes.
|
17
|
+
# @see VerticesRoute
|
18
|
+
# @see GraphRoute
|
19
|
+
def v(*filters)
|
20
|
+
raise Pacer::UnsupportedOperation, "Can't get vertices for this route type."
|
21
|
+
end
|
22
|
+
|
23
|
+
# Undefined for vertex routes.
|
24
|
+
# @see EdgesRoute
|
25
|
+
# @see GraphRoute
|
26
|
+
def e(*filters, &block)
|
27
|
+
raise Pacer::UnsupportedOperation, "Can't get edges for this route type."
|
28
|
+
end
|
29
|
+
|
30
|
+
# Attach a transform that emits the properties of the elements
|
31
|
+
# rather than the elements themselves.
|
32
|
+
# @return [Core::Route]
|
33
|
+
def properties
|
34
|
+
map { |v| v.properties }
|
35
|
+
end
|
36
|
+
|
37
|
+
# Create a new TinkerGraph based on the paths of all matching elements.
|
38
|
+
#
|
39
|
+
# @return [TinkerGraph] the subgraph
|
40
|
+
def subgraph
|
41
|
+
paths.subgraph
|
42
|
+
end
|
43
|
+
|
44
|
+
# Delete all matching elements.
|
45
|
+
def delete!
|
46
|
+
uniq.bulk_job { |e| e.delete! }
|
47
|
+
end
|
48
|
+
|
49
|
+
# Stores the result of the current route in a new route so it will not need
|
50
|
+
# to be recalculated.
|
51
|
+
# @return [ElementRoute] with the same type and extensions as the
|
52
|
+
# source route
|
53
|
+
def result(name = nil)
|
54
|
+
element_ids.to_a.id_to_element_route(:based_on => self, :name => name)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Accepts a string or symbol to return an array of matching properties, or
|
58
|
+
# an integer to return the element at the given offset, or a range to
|
59
|
+
# return all elements between the offsets within the range.
|
60
|
+
# @overload [](prop)
|
61
|
+
# @param [String, Symbol] prop map each element to a single property
|
62
|
+
# @return [Core::Route]
|
63
|
+
# @overload [](properties)
|
64
|
+
# @param [Array<String, Symbol>] properties map each element to a set of properties
|
65
|
+
# @return [Core::Route]
|
66
|
+
# @overload [](offset)
|
67
|
+
# @param [Fixnum] offset narrow the result to a single element at the given position in the results
|
68
|
+
# @return [ElementRoute] with the same type and extensions as the source route
|
69
|
+
# @overload [](range)
|
70
|
+
# @param [Range] range narrow the result to a subset of elements in positions corresponding to the range
|
71
|
+
# @return [ElementRoute] with the same type and extensions as the source route
|
72
|
+
def [](prop_or_subset)
|
73
|
+
case prop_or_subset
|
74
|
+
when String, Symbol
|
75
|
+
chain_route(:element_type => :object,
|
76
|
+
:pipe_class => Pacer::Pipes::PropertyPipe,
|
77
|
+
:pipe_args => [prop_or_subset.to_s])
|
78
|
+
when Fixnum
|
79
|
+
range(prop_or_subset, prop_or_subset)
|
80
|
+
when Range
|
81
|
+
range(prop_or_subset.begin, prop_or_subset.end)
|
82
|
+
when Array
|
83
|
+
if prop_or_subset.all? { |i| i.is_a? String or i.is_a? Symbol }
|
84
|
+
map do |element|
|
85
|
+
prop_or_subset.collect { |i| element.getProperty(i.to_s) }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Map each element to a property but filter out elements that do not
|
92
|
+
# have the given property.
|
93
|
+
# @param [#to_s] name the property name
|
94
|
+
# @return [Core::Route]
|
95
|
+
def property?(name)
|
96
|
+
chain_route(:element_type => :object,
|
97
|
+
:pipe_class => Pacer::Pipes::PropertyPipe,
|
98
|
+
:pipe_args => [name.to_s, true])
|
99
|
+
end
|
100
|
+
|
101
|
+
# Attach a route to the element id for each element emitted by the
|
102
|
+
# route.
|
103
|
+
#
|
104
|
+
# @return [Core::Route]
|
105
|
+
def element_ids
|
106
|
+
chain_route :element_type => :object, :pipe_class => Pacer::Pipes::IdPipe
|
107
|
+
end
|
108
|
+
|
109
|
+
def clone_into(target_graph, opts = {})
|
110
|
+
bulk_job(nil, target_graph) do |element|
|
111
|
+
element.clone_into(target_graph, opts)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def copy_into(target_graph, opts = {})
|
116
|
+
bulk_job(nil, target_graph) { |element| element.copy_into(target_graph, opts) }
|
117
|
+
end
|
118
|
+
|
119
|
+
def build_index(index, index_key = nil, property = nil, create = true)
|
120
|
+
index_name = index
|
121
|
+
unless index.is_a? com.tinkerpop.blueprints.pgm.Index
|
122
|
+
index = graph.index_name index.to_s
|
123
|
+
end
|
124
|
+
sample_element = first
|
125
|
+
unless index
|
126
|
+
if sample_element
|
127
|
+
if create
|
128
|
+
index = graph.createManualIndex index_name, graph.element_type(sample_element)
|
129
|
+
else
|
130
|
+
raise "No index found for #{ index } on #{ graph }" unless index
|
131
|
+
end
|
132
|
+
else
|
133
|
+
return nil
|
134
|
+
end
|
135
|
+
end
|
136
|
+
index_key ||= index.index_name
|
137
|
+
property ||= index_key
|
138
|
+
if block_given?
|
139
|
+
bulk_job do |element|
|
140
|
+
value = yield(element)
|
141
|
+
index.put(index_key, value, element.element) if value
|
142
|
+
end
|
143
|
+
else
|
144
|
+
bulk_job do |element|
|
145
|
+
value = element[property]
|
146
|
+
index.put(index_key, value, element.element) if value
|
147
|
+
end
|
148
|
+
end
|
149
|
+
index
|
150
|
+
end
|
151
|
+
|
152
|
+
protected
|
153
|
+
|
154
|
+
# Determines which iterator mixin is applied to the iterator when #each is called
|
155
|
+
def configure_iterator(iter)
|
156
|
+
if wrapper
|
157
|
+
iter.extend Pacer::Core::Route::IteratorWrapperMixin
|
158
|
+
iter.wrapper = wrapper
|
159
|
+
iter.extensions = @extensions if @extensions.any?
|
160
|
+
iter.graph = graph
|
161
|
+
elsif extensions and extensions.any?
|
162
|
+
iter.extend Pacer::Core::Route::IteratorExtensionsMixin
|
163
|
+
iter.extensions = extensions
|
164
|
+
iter.graph = graph
|
165
|
+
else
|
166
|
+
iter.extend Pacer::Core::Route::IteratorMixin
|
167
|
+
iter.graph = graph
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Pacer::Core::Graph
|
2
|
+
|
3
|
+
# This module adds indexed route methods to the basic graph classes returned from the
|
4
|
+
# blueprints library.
|
5
|
+
module GraphIndexRoute
|
6
|
+
# Returns a new route to all graph vertices. Standard filter options.
|
7
|
+
def v(*filters, &block)
|
8
|
+
filters = Pacer::Route.filters(filters)
|
9
|
+
route = indexed_route(:vertex, filters, block)
|
10
|
+
if route
|
11
|
+
route
|
12
|
+
else
|
13
|
+
super(filters, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns a new route to all graph edges. Standard filter options.
|
18
|
+
def e(*filters, &block)
|
19
|
+
filters = Pacer::Route.edge_filters(filters)
|
20
|
+
route = indexed_route(:edge, filters, block)
|
21
|
+
if route
|
22
|
+
route
|
23
|
+
else
|
24
|
+
super(filters, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_accessor :choose_best_index
|
29
|
+
attr_accessor :search_manual_indices
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def indexed_route(element_type, filters, block)
|
34
|
+
filters.graph = self
|
35
|
+
filters.indices = graph.getIndices
|
36
|
+
filters.choose_best_index = choose_best_index != false
|
37
|
+
filters.search_manual_indices = search_manual_indices
|
38
|
+
idx, key, value = filters.best_index(element_type)
|
39
|
+
if idx and key
|
40
|
+
route = chain_route :back => self, :element_type => element_type, :filter => :index, :index => idx, :key => key, :value => value
|
41
|
+
Pacer::Route.property_filter(route, filters, block)
|
42
|
+
elsif filters.route_modules.any?
|
43
|
+
mod = filters.route_modules.shift
|
44
|
+
Pacer::Route.property_filter(mod.route(self), filters, block)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Pacer::Core::Graph
|
2
|
+
|
3
|
+
# This module adds route methods to the basic graph classes returned from the
|
4
|
+
# blueprints library.
|
5
|
+
module GraphRoute
|
6
|
+
import com.tinkerpop.pipes.transform.VerticesPipe
|
7
|
+
import com.tinkerpop.pipes.transform.EdgesPipe
|
8
|
+
|
9
|
+
# Returns a new route to all graph vertices. Standard filter options.
|
10
|
+
def v(*filters, &block)
|
11
|
+
filters = Pacer::Route.filters(filters)
|
12
|
+
route = chain_route :element_type => :vertex,
|
13
|
+
:pipe_class => VerticesPipe,
|
14
|
+
:route_name => 'GraphV'
|
15
|
+
Pacer::Route.property_filter(route, filters, block)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns a new route to all graph edges. Standard filter options.
|
19
|
+
def e(*filters, &block)
|
20
|
+
filters = Pacer::Route.edge_filters(filters)
|
21
|
+
route = chain_route :element_type => :edge,
|
22
|
+
:pipe_class => EdgesPipe,
|
23
|
+
:route_name => 'GraphE'
|
24
|
+
Pacer::Route.property_filter(route, filters, block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def filter(*args)
|
28
|
+
raise 'Not implemented'
|
29
|
+
end
|
30
|
+
|
31
|
+
# Specialization of result simply returns self.
|
32
|
+
def result
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
# The graph itself is as root as you can get.
|
37
|
+
def root?
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def graph
|
42
|
+
# This must be defined here to overwrite the #graph method in Route.
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def ==(other)
|
47
|
+
equal?(other)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Don't try to inspect the graph data when inspecting.
|
51
|
+
def hide_elements
|
52
|
+
true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|