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.
Files changed (184) hide show
  1. data/.autotest +8 -0
  2. data/.document +5 -0
  3. data/.gitignore +26 -0
  4. data/.rspec +1 -0
  5. data/.rvmrc +0 -0
  6. data/CONTRIBUTORS +5 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +24 -0
  9. data/README.md +187 -0
  10. data/Rakefile +49 -0
  11. data/autotest/discover.rb +1 -0
  12. data/bin/autospec +16 -0
  13. data/bin/autotest +16 -0
  14. data/bin/rake +16 -0
  15. data/bin/rcov +16 -0
  16. data/bin/rspec +16 -0
  17. data/bin/yard +16 -0
  18. data/bin/yardoc +16 -0
  19. data/lib/pacer/blueprints/extensions.rb +77 -0
  20. data/lib/pacer/blueprints/multi_graph.rb +121 -0
  21. data/lib/pacer/blueprints/ruby_graph.rb +199 -0
  22. data/lib/pacer/blueprints/tg.rb +100 -0
  23. data/lib/pacer/blueprints.rb +4 -0
  24. data/lib/pacer/core/graph/edges_route.rb +92 -0
  25. data/lib/pacer/core/graph/element_route.rb +171 -0
  26. data/lib/pacer/core/graph/graph_index_route.rb +48 -0
  27. data/lib/pacer/core/graph/graph_route.rb +55 -0
  28. data/lib/pacer/core/graph/mixed_route.rb +96 -0
  29. data/lib/pacer/core/graph/vertices_route.rb +220 -0
  30. data/lib/pacer/core/graph.rb +13 -0
  31. data/lib/pacer/core/route.rb +502 -0
  32. data/lib/pacer/core/side_effect.rb +11 -0
  33. data/lib/pacer/core.rb +8 -0
  34. data/lib/pacer/exceptions.rb +11 -0
  35. data/lib/pacer/extensions/block_filter_element.rb +22 -0
  36. data/lib/pacer/extensions.rb +6 -0
  37. data/lib/pacer/filter/block_filter.rb +31 -0
  38. data/lib/pacer/filter/collection_filter.rb +109 -0
  39. data/lib/pacer/filter/empty_filter.rb +70 -0
  40. data/lib/pacer/filter/future_filter.rb +68 -0
  41. data/lib/pacer/filter/index_filter.rb +30 -0
  42. data/lib/pacer/filter/loop_filter.rb +95 -0
  43. data/lib/pacer/filter/object_filter.rb +55 -0
  44. data/lib/pacer/filter/property_filter/edge_filters.rb +93 -0
  45. data/lib/pacer/filter/property_filter/filters.rb +269 -0
  46. data/lib/pacer/filter/property_filter.rb +111 -0
  47. data/lib/pacer/filter/random_filter.rb +13 -0
  48. data/lib/pacer/filter/range_filter.rb +104 -0
  49. data/lib/pacer/filter/uniq_filter.rb +12 -0
  50. data/lib/pacer/filter/where_filter/node_visitor.rb +280 -0
  51. data/lib/pacer/filter/where_filter.rb +47 -0
  52. data/lib/pacer/filter.rb +17 -0
  53. data/lib/pacer/function_resolver.rb +43 -0
  54. data/lib/pacer/graph/edge_mixin.rb +127 -0
  55. data/lib/pacer/graph/element_mixin.rb +202 -0
  56. data/lib/pacer/graph/graph_indices_mixin.rb +93 -0
  57. data/lib/pacer/graph/graph_mixin.rb +361 -0
  58. data/lib/pacer/graph/graph_transactions_mixin.rb +207 -0
  59. data/lib/pacer/graph/index_mixin.rb +30 -0
  60. data/lib/pacer/graph/vertex_mixin.rb +119 -0
  61. data/lib/pacer/graph.rb +14 -0
  62. data/lib/pacer/pipe/blackbox_pipeline.rb +48 -0
  63. data/lib/pacer/pipe/block_filter_pipe.rb +38 -0
  64. data/lib/pacer/pipe/collection_filter_pipe.rb +10 -0
  65. data/lib/pacer/pipe/cross_product_transform_pipe.rb +48 -0
  66. data/lib/pacer/pipe/enumerable_pipe.rb +30 -0
  67. data/lib/pacer/pipe/expandable_pipe.rb +63 -0
  68. data/lib/pacer/pipe/id_collection_filter_pipe.rb +33 -0
  69. data/lib/pacer/pipe/is_empty_pipe.rb +30 -0
  70. data/lib/pacer/pipe/is_unique_pipe.rb +61 -0
  71. data/lib/pacer/pipe/label_collection_filter_pipe.rb +21 -0
  72. data/lib/pacer/pipe/label_prefix_pipe.rb +21 -0
  73. data/lib/pacer/pipe/loop_pipe.rb +86 -0
  74. data/lib/pacer/pipe/map_pipe.rb +36 -0
  75. data/lib/pacer/pipe/never_pipe.rb +9 -0
  76. data/lib/pacer/pipe/process_pipe.rb +37 -0
  77. data/lib/pacer/pipe/property_comparison_pipe.rb +40 -0
  78. data/lib/pacer/pipe/ruby_pipe.rb +25 -0
  79. data/lib/pacer/pipe/simple_visitor_pipe.rb +43 -0
  80. data/lib/pacer/pipe/stream_sort_pipe.rb +84 -0
  81. data/lib/pacer/pipe/stream_uniq_pipe.rb +33 -0
  82. data/lib/pacer/pipe/type_filter_pipe.rb +22 -0
  83. data/lib/pacer/pipe/unary_transform_pipe.rb +59 -0
  84. data/lib/pacer/pipe/variable_store_iterator_wrapper.rb +26 -0
  85. data/lib/pacer/pipe/visitor_pipe.rb +67 -0
  86. data/lib/pacer/pipes.rb +61 -0
  87. data/lib/pacer/route/mixin/bulk_operations.rb +52 -0
  88. data/lib/pacer/route/mixin/route_operations.rb +107 -0
  89. data/lib/pacer/route/mixin/variable_route_module.rb +26 -0
  90. data/lib/pacer/route/mixins.rb +3 -0
  91. data/lib/pacer/route.rb +228 -0
  92. data/lib/pacer/routes.rb +6 -0
  93. data/lib/pacer/side_effect/aggregate.rb +31 -0
  94. data/lib/pacer/side_effect/counted.rb +30 -0
  95. data/lib/pacer/side_effect/group_count.rb +44 -0
  96. data/lib/pacer/side_effect/is_unique.rb +32 -0
  97. data/lib/pacer/side_effect/section.rb +25 -0
  98. data/lib/pacer/side_effect/visitor.rb +37 -0
  99. data/lib/pacer/side_effect.rb +11 -0
  100. data/lib/pacer/support/array_list.rb +28 -0
  101. data/lib/pacer/support/enumerable.rb +100 -0
  102. data/lib/pacer/support/hash.rb +9 -0
  103. data/lib/pacer/support/iterator_mixins.rb +110 -0
  104. data/lib/pacer/support/native_exception.rb +22 -0
  105. data/lib/pacer/support/proc.rb +16 -0
  106. data/lib/pacer/support.rb +10 -0
  107. data/lib/pacer/transform/cap.rb +50 -0
  108. data/lib/pacer/transform/gather.rb +9 -0
  109. data/lib/pacer/transform/has_count_cap.rb +41 -0
  110. data/lib/pacer/transform/join.rb +181 -0
  111. data/lib/pacer/transform/map.rb +23 -0
  112. data/lib/pacer/transform/path.rb +50 -0
  113. data/lib/pacer/transform/process.rb +23 -0
  114. data/lib/pacer/transform/scatter.rb +23 -0
  115. data/lib/pacer/transform/sort_section.rb +103 -0
  116. data/lib/pacer/transform/stream_sort.rb +21 -0
  117. data/lib/pacer/transform/stream_uniq.rb +21 -0
  118. data/lib/pacer/transform.rb +16 -0
  119. data/lib/pacer/utils/graph_analysis.rb +112 -0
  120. data/lib/pacer/utils/trie.rb +93 -0
  121. data/lib/pacer/utils/tsort.rb +65 -0
  122. data/lib/pacer/utils/y_files.rb +127 -0
  123. data/lib/pacer/utils.rb +10 -0
  124. data/lib/pacer/version.rb +13 -0
  125. data/lib/pacer/wrappers/edge_wrapper.rb +51 -0
  126. data/lib/pacer/wrappers/element_wrapper.rb +78 -0
  127. data/lib/pacer/wrappers/new_element.rb +106 -0
  128. data/lib/pacer/wrappers/vertex_wrapper.rb +51 -0
  129. data/lib/pacer/wrappers.rb +19 -0
  130. data/lib/pacer-0.9.1.1-standalone.jar +0 -0
  131. data/lib/pacer.rb +290 -0
  132. data/pacer.gemspec +30 -0
  133. data/pom/standalone.xml +22 -0
  134. data/pom.xml +124 -0
  135. data/samples/grateful-dead.xml +26380 -0
  136. data/samples/grateful_dead.rb +63 -0
  137. data/samples/profile.rb +15 -0
  138. data/spec/data/grateful-dead.xml +26380 -0
  139. data/spec/data/pacer.graphml +319 -0
  140. data/spec/pacer/blueprints/dex_spec.rb +172 -0
  141. data/spec/pacer/blueprints/neo4j_spec.rb +177 -0
  142. data/spec/pacer/blueprints/tg_spec.rb +128 -0
  143. data/spec/pacer/core/graph/edges_route_spec.rb +52 -0
  144. data/spec/pacer/core/graph/element_route_spec.rb +46 -0
  145. data/spec/pacer/core/graph/graph_route_spec.rb +94 -0
  146. data/spec/pacer/core/graph/vertices_route_spec.rb +169 -0
  147. data/spec/pacer/core/route_spec.rb +197 -0
  148. data/spec/pacer/filter/collection_filter_spec.rb +19 -0
  149. data/spec/pacer/filter/empty_filter_spec.rb +29 -0
  150. data/spec/pacer/filter/future_filter_spec.rb +97 -0
  151. data/spec/pacer/filter/loop_filter_spec.rb +31 -0
  152. data/spec/pacer/filter/property_filter_spec.rb +111 -0
  153. data/spec/pacer/filter/random_filter_spec.rb +17 -0
  154. data/spec/pacer/filter/uniq_filter_spec.rb +18 -0
  155. data/spec/pacer/filter/where_filter_spec.rb +93 -0
  156. data/spec/pacer/graph/edge_mixin_spec.rb +116 -0
  157. data/spec/pacer/graph/element_mixin_spec.rb +297 -0
  158. data/spec/pacer/graph/graph_mixin_spec.rb +538 -0
  159. data/spec/pacer/graph/index_mixin_spec.rb +0 -0
  160. data/spec/pacer/graph/vertex_mixin_spec.rb +192 -0
  161. data/spec/pacer/pipe/block_filter_pipe_spec.rb +0 -0
  162. data/spec/pacer/pipe/labels_filter_pipe_spec.rb +0 -0
  163. data/spec/pacer/pipe/ruby_pipe_spec.rb +0 -0
  164. data/spec/pacer/pipe/type_filter_pipe_spec.rb +0 -0
  165. data/spec/pacer/route/mixin/base_spec.rb +419 -0
  166. data/spec/pacer/route/mixin/bulk_operations_spec.rb +30 -0
  167. data/spec/pacer/route/mixin/route_operations_spec.rb +127 -0
  168. data/spec/pacer/support/array_list_spec.rb +0 -0
  169. data/spec/pacer/support/enumerable_spec.rb +115 -0
  170. data/spec/pacer/transform/join_spec.rb +138 -0
  171. data/spec/pacer/transform/path_spec.rb +54 -0
  172. data/spec/pacer/utils/tsort_spec.rb +89 -0
  173. data/spec/pacer/wrapper/edge_wrapper_spec.rb +33 -0
  174. data/spec/pacer/wrapper/element_wrapper_spec.rb +169 -0
  175. data/spec/pacer/wrapper/vertex_wrapper_spec.rb +33 -0
  176. data/spec/pacer_spec.rb +0 -0
  177. data/spec/spec_helper.rb +91 -0
  178. data/spec/support/contexts.rb +14 -0
  179. data/spec/support/graph_runner.rb +142 -0
  180. data/spec/support/matchers.rb +19 -0
  181. data/spec/support/use_transactions.rb +31 -0
  182. data/spec/tackle/simple_mixin.rb +21 -0
  183. data/spec/tackle/tinkerpop_graph_mixins.rb +60 -0
  184. 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