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,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
|