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,127 @@
|
|
1
|
+
module Pacer
|
2
|
+
# This module is mixed into the raw Blueprints Edge class from any
|
3
|
+
# graph implementation.
|
4
|
+
#
|
5
|
+
# Adds more convenient/rubyish methods and adds support for extensions
|
6
|
+
# to some methods where needed.
|
7
|
+
module EdgeMixin
|
8
|
+
# Add extensions to this edge.
|
9
|
+
#
|
10
|
+
# If any extension has a Edge module within it, this edge will
|
11
|
+
# be extended with the extension's Edge module.
|
12
|
+
#
|
13
|
+
# @see Core::Route#add_extension
|
14
|
+
#
|
15
|
+
# @param [[extensions]] exts the extensions to add
|
16
|
+
# @return [Pacer::Wrappers::EdgeWrapper] this edge wrapped up and including
|
17
|
+
# the extensions
|
18
|
+
def add_extensions(exts)
|
19
|
+
if exts.any?
|
20
|
+
Wrappers::EdgeWrapper.wrap(self, exts)
|
21
|
+
else
|
22
|
+
self
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# The incoming vertex for this edge.
|
27
|
+
# @return [Pacer::VertexMixin]
|
28
|
+
def in_vertex(extensions = nil)
|
29
|
+
v = getInVertex
|
30
|
+
v.graph = graph
|
31
|
+
if extensions
|
32
|
+
v.add_extensions extensions
|
33
|
+
else
|
34
|
+
v
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def label
|
39
|
+
getLabel
|
40
|
+
end
|
41
|
+
|
42
|
+
# The outgoing vertex for this edge.
|
43
|
+
# @return [Pacer::VertexMixin]
|
44
|
+
def out_vertex(extensions = nil)
|
45
|
+
v = getOutVertex
|
46
|
+
v.graph = graph
|
47
|
+
if extensions
|
48
|
+
v.add_extensions extensions
|
49
|
+
else
|
50
|
+
v
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns a human-readable representation of the edge using the
|
55
|
+
# standard ruby console representation of an instantiated object.
|
56
|
+
# @return [String]
|
57
|
+
def inspect
|
58
|
+
"#<E[#{element_id}]:#{display_name}>"
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns the display name of the edge.
|
62
|
+
# @return [String]
|
63
|
+
def display_name
|
64
|
+
if graph and graph.edge_name
|
65
|
+
graph.edge_name.call self
|
66
|
+
else
|
67
|
+
"#{ out_vertex.element_id }-#{ getLabel }-#{ in_vertex.element_id }"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Deletes the edge from its graph.
|
72
|
+
def delete!
|
73
|
+
graph.removeEdge element
|
74
|
+
end
|
75
|
+
|
76
|
+
# Clones this edge into the target graph.
|
77
|
+
#
|
78
|
+
# This differs from the {#copy_into} in that it tries to set
|
79
|
+
# the new element_id the same as the original element_id.
|
80
|
+
#
|
81
|
+
# @param [Pacer::GraphMixin] target_graph
|
82
|
+
# @param [Hash] opts
|
83
|
+
# @option opts :create_vertices [true] Create the vertices
|
84
|
+
# associated to this edge if they don't already exist.
|
85
|
+
# @yield [e] Optional block yields the edge after it has been created.
|
86
|
+
# @return [Pacer::EdgeMixin] the new edge
|
87
|
+
#
|
88
|
+
# @raise [StandardError] If this the associated vertices don't exist and :create_vertices is not set
|
89
|
+
def clone_into(target_graph, opts = {})
|
90
|
+
e_idx = target_graph.index_name("tmp:e:#{graph.to_s}", :edge, :create => true)
|
91
|
+
e = target_graph.edge(element_id) || e_idx.get('id', element_id).first
|
92
|
+
unless e
|
93
|
+
v_idx = target_graph.index_name("tmp:v:#{graph.to_s}", :vertex, :create => true)
|
94
|
+
iv = target_graph.vertex(in_vertex.element_id) || v_idx.get('id', in_vertex.element_id).first
|
95
|
+
ov = target_graph.vertex(out_vertex.element_id) || v_idx.get('id', out_vertex.element_id).first
|
96
|
+
if opts[:create_vertices]
|
97
|
+
iv ||= in_vertex.clone_into target_graph
|
98
|
+
ov ||= out_vertex.clone_into target_graph
|
99
|
+
end
|
100
|
+
raise 'vertices not found' if not iv or not ov
|
101
|
+
e = target_graph.create_edge(element_id, iv, ov, label, properties)
|
102
|
+
e_idx.put('id', element_id, e)
|
103
|
+
yield e if block_given?
|
104
|
+
end
|
105
|
+
e
|
106
|
+
end
|
107
|
+
|
108
|
+
# Copies this edge into the target graph with the next available
|
109
|
+
# edge id.
|
110
|
+
#
|
111
|
+
# @param [Pacer::GraphMixin] target_graph
|
112
|
+
# @yield [e] Optional block yields the edge after it has been created.
|
113
|
+
# @return [Pacer::EdgeMixin] the new edge
|
114
|
+
#
|
115
|
+
# @raise [StandardError] If this the associated vertices don't exist
|
116
|
+
def copy_into(target_graph)
|
117
|
+
v_idx = target_graph.index_name("tmp:v:#{graph.to_s}", :vertex, :create => true)
|
118
|
+
iv = v_idx.get('id', in_vertex.element_id).first || target_graph.vertex(in_vertex.element_id)
|
119
|
+
ov = v_idx.get('id', out_vertex.element_id).first || target_graph.vertex(out_vertex.element_id)
|
120
|
+
|
121
|
+
raise 'vertices not found' if not iv or not ov
|
122
|
+
e = target_graph.create_edge nil, iv, ov, label, properties
|
123
|
+
yield e if block_given?
|
124
|
+
e
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
module Pacer
|
2
|
+
# This module is mixed into the raw Blueprints Edge and Vertex classes
|
3
|
+
# from any graph implementation.
|
4
|
+
#
|
5
|
+
# Adds more convenient/rubyish methods and adds support for extensions
|
6
|
+
# to some methods where needed.
|
7
|
+
module ElementMixin
|
8
|
+
class << self
|
9
|
+
protected
|
10
|
+
def included(target)
|
11
|
+
target.send :include, Enumerable unless target.is_a? Enumerable
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Which extensions does this element have?
|
16
|
+
# @return [Set[extensions]]
|
17
|
+
def extensions
|
18
|
+
Set[]
|
19
|
+
end
|
20
|
+
|
21
|
+
# See {Core::Graph::VerticesRoute#v}
|
22
|
+
# @return [Route]
|
23
|
+
def v(*args)
|
24
|
+
route = super
|
25
|
+
if args.empty? and not block_given?
|
26
|
+
route.add_extensions extensions
|
27
|
+
end
|
28
|
+
route
|
29
|
+
end
|
30
|
+
|
31
|
+
# See {Core::Graph::EdgesRoute#e}
|
32
|
+
# @return [Route]
|
33
|
+
def e(*args)
|
34
|
+
route = super
|
35
|
+
if args.empty? and not block_given?
|
36
|
+
route.add_extensions extensions
|
37
|
+
end
|
38
|
+
route
|
39
|
+
end
|
40
|
+
|
41
|
+
# For internal use only.
|
42
|
+
#
|
43
|
+
# Specify the graph the element belongs to.
|
44
|
+
def graph=(graph)
|
45
|
+
@graph = graph
|
46
|
+
end
|
47
|
+
|
48
|
+
# The graph the element belongs to.
|
49
|
+
#
|
50
|
+
# Used to help prevent objects from different graphs from being
|
51
|
+
# accidentally associated, as well as to get graph-specific data for
|
52
|
+
# the element.
|
53
|
+
#
|
54
|
+
# @return [GraphMixin]
|
55
|
+
def graph
|
56
|
+
@graph
|
57
|
+
end
|
58
|
+
|
59
|
+
# Convenience method to retrieve a property by name.
|
60
|
+
#
|
61
|
+
# @param [#to_s] key the property name
|
62
|
+
# @return [Object]
|
63
|
+
def [](key)
|
64
|
+
if key.is_a? Array
|
65
|
+
key.map { |k| self[k] }
|
66
|
+
else
|
67
|
+
value = element.getProperty(key.to_s)
|
68
|
+
if graph
|
69
|
+
graph.decode_property(value)
|
70
|
+
else
|
71
|
+
value
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Convenience method to set a property by name to the given value.
|
77
|
+
# @param [#to_s] key the property name
|
78
|
+
# @param [Object] value the value to set the property to
|
79
|
+
def []=(key, value)
|
80
|
+
value = graph.encode_property(value) if graph
|
81
|
+
key = key.to_s
|
82
|
+
if value
|
83
|
+
if value != element.getProperty(key)
|
84
|
+
element.setProperty(key, value)
|
85
|
+
end
|
86
|
+
else
|
87
|
+
element.removeProperty(key) if element.getPropertyKeys.include? key
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Specialize result to return self for elements.
|
92
|
+
# @return [ElementMixin] self
|
93
|
+
def result(name = nil)
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
# Query whether the current node belongs to the given graph.
|
98
|
+
#
|
99
|
+
# @param [Object] g the object to compare to {#graph}
|
100
|
+
def from_graph?(g)
|
101
|
+
g.equal? graph
|
102
|
+
end
|
103
|
+
|
104
|
+
# Returns a hash of property values by name.
|
105
|
+
#
|
106
|
+
# @return [Hash]
|
107
|
+
def properties
|
108
|
+
element.getPropertyKeys.inject({}) { |h, name| h[name] = element.getProperty(name); h }
|
109
|
+
end
|
110
|
+
|
111
|
+
# Replace the element's properties with the given hash
|
112
|
+
#
|
113
|
+
# @param [Hash] props the element's new properties
|
114
|
+
def properties=(props)
|
115
|
+
(element.getPropertyKeys - props.keys.collect { |k| k.to_s }).each do |key|
|
116
|
+
element.removeProperty key
|
117
|
+
end
|
118
|
+
props.each do |key, value|
|
119
|
+
self[key] = value
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def property_keys
|
124
|
+
getPropertyKeys
|
125
|
+
end
|
126
|
+
|
127
|
+
# The id of the current element
|
128
|
+
# @return [Object] element id (type varies by graph implementation.
|
129
|
+
def element_id
|
130
|
+
element.getId
|
131
|
+
end
|
132
|
+
|
133
|
+
# Sort objects semi arbitrarily based on {VertexMixin#display_name}
|
134
|
+
# or {EdgeMixin#display_name}.
|
135
|
+
# @param other
|
136
|
+
#
|
137
|
+
# @return [Fixnum]
|
138
|
+
def <=>(other)
|
139
|
+
display_name.to_s <=> other.display_name.to_s
|
140
|
+
end
|
141
|
+
|
142
|
+
# Test equality to another object.
|
143
|
+
#
|
144
|
+
# Elements are equal if they are the same type and have the same id
|
145
|
+
# and the same graph, regardless of extensions.
|
146
|
+
#
|
147
|
+
# If the graphdb instantiates multiple copies of the same element
|
148
|
+
# this method will return true when comparing them.
|
149
|
+
#
|
150
|
+
# @see #eql?
|
151
|
+
# @param other
|
152
|
+
def ==(other)
|
153
|
+
if other.respond_to?(:element) and other.element.class == element.class and other.element_id == element_id
|
154
|
+
if graph and other.graph
|
155
|
+
other.graph == graph
|
156
|
+
else
|
157
|
+
true
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# Test object equality of the element instance.
|
163
|
+
#
|
164
|
+
# Wrappers/extensions (if any) are ignored, the underlying element
|
165
|
+
# only is compared
|
166
|
+
#
|
167
|
+
# If the graphdb instantiates multiple copies of the same element
|
168
|
+
# this method will return false when comparing them.
|
169
|
+
#
|
170
|
+
# @see #==
|
171
|
+
# @param other
|
172
|
+
def eql?(other)
|
173
|
+
if other.respond_to? :element
|
174
|
+
super(other.element)
|
175
|
+
else
|
176
|
+
super
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# Yields the element once or returns an enumerator if no block is
|
181
|
+
# given. Follows Ruby conventions and is meant to be used along
|
182
|
+
# with the Enumerable mixin.
|
183
|
+
#
|
184
|
+
# @yield [ElementMixin] this element
|
185
|
+
# @return [Enumerator] only if no block is given
|
186
|
+
def each
|
187
|
+
if block_given?
|
188
|
+
yield self
|
189
|
+
else
|
190
|
+
[self].to_enum
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# Returns the underlying element. For unwrapped elements, returns
|
195
|
+
# self.
|
196
|
+
# @return [ElementMixin]
|
197
|
+
def element
|
198
|
+
self
|
199
|
+
end
|
200
|
+
alias no_extensions element
|
201
|
+
end
|
202
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Pacer
|
2
|
+
module GraphIndicesMixin
|
3
|
+
# Return an index by name.
|
4
|
+
#
|
5
|
+
# @param [#to_s] name of the index
|
6
|
+
# @param [:vertex, :edge, element type] type guarantees that the index returned is of the type specified.
|
7
|
+
# @param [Hash] opts
|
8
|
+
# @option opts [true] :create create the index if it doesn't exist
|
9
|
+
# @return [Pacer::IndexMixin]
|
10
|
+
def index_name(name, type = nil, opts = {})
|
11
|
+
name = name.to_s
|
12
|
+
if type
|
13
|
+
idx = getIndices.detect { |i| i.index_name == name and i.index_class == index_class(type) }
|
14
|
+
if idx.nil? and opts[:create]
|
15
|
+
idx = createManualIndex name, element_type(type)
|
16
|
+
end
|
17
|
+
else
|
18
|
+
idx = getIndices.detect { |i| i.index_name == name }
|
19
|
+
end
|
20
|
+
idx.graph = self if idx
|
21
|
+
idx
|
22
|
+
end
|
23
|
+
|
24
|
+
# Drops and recreates an automatic index with the same keys.
|
25
|
+
#
|
26
|
+
# In some earlier graphdb versions it was possible to corrupt
|
27
|
+
# automatic indices. This method provided a fast way to recreate
|
28
|
+
# them.
|
29
|
+
#
|
30
|
+
# @param [Index] old_index this index will be dropped
|
31
|
+
# @return [Index] rebuilt index
|
32
|
+
def rebuild_automatic_index(old_index)
|
33
|
+
name = old_index.getIndexName
|
34
|
+
index_class = old_index.getIndexClass
|
35
|
+
keys = old_index.getAutoIndexKeys
|
36
|
+
drop_index name
|
37
|
+
build_automatic_index(name, index_class, keys)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Creates a new automatic index.
|
41
|
+
#
|
42
|
+
# @param [#to_s] name index name
|
43
|
+
# @param [:vertex, :edge, element type] et element type
|
44
|
+
# @param [[#to_s], nil] keys The keys to be indexed. If nil then
|
45
|
+
# index all keys
|
46
|
+
def build_automatic_index(name, et, keys = nil)
|
47
|
+
if keys and not keys.is_a? java.util.Set
|
48
|
+
set = java.util.HashSet.new
|
49
|
+
keys.each { |k| set.add k.to_s }
|
50
|
+
keys = set
|
51
|
+
end
|
52
|
+
index = createAutomaticIndex name.to_s, index_class(et), keys
|
53
|
+
index.graph = self
|
54
|
+
if index_class(et) == element_type(:vertex).java_class
|
55
|
+
v.bulk_job do |v|
|
56
|
+
Pacer::Utils::AutomaticIndexHelper.addElement(index, v)
|
57
|
+
end
|
58
|
+
else
|
59
|
+
e.bulk_job do |e|
|
60
|
+
Pacer::Utils::AutomaticIndexHelper.addElement(index, e)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
index
|
64
|
+
end
|
65
|
+
|
66
|
+
# Return an object that can be compared to the return value of
|
67
|
+
# Index#index_class.
|
68
|
+
def index_class(et)
|
69
|
+
element_type(et).java_class.to_java
|
70
|
+
end
|
71
|
+
|
72
|
+
# Does this graph allow me to create or modify automatic indices?
|
73
|
+
#
|
74
|
+
# Specific graphs may override this method to return false.
|
75
|
+
def supports_automatic_indices?
|
76
|
+
true
|
77
|
+
end
|
78
|
+
|
79
|
+
# Does this graph allow me to create or modify manual indices?
|
80
|
+
#
|
81
|
+
# Specific graphs may override this method to return false.
|
82
|
+
def supports_manual_indices?
|
83
|
+
true
|
84
|
+
end
|
85
|
+
|
86
|
+
# Does this graph support indices on edges?
|
87
|
+
#
|
88
|
+
# Specific graphs may override this method to return false.
|
89
|
+
def supports_edge_indices?
|
90
|
+
true
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|