pacer 0.9.1.1-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/.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
|