pacer 0.9.1.1-java

Sign up to get free protection for your applications and to get access to all the features.
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