Skip to content

Commit

Permalink
Add graph#temp_index, available regardless of native index support.
Browse files Browse the repository at this point in the history
Implemented in simple Ruby hashes. Use them in graph cloning when the index is temporary anyway.
  • Loading branch information
Darrick Wiebe committed Sep 20, 2012
1 parent b7be43c commit a7d63a2
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 9 deletions.
7 changes: 4 additions & 3 deletions lib/pacer/graph.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ module Pacer
end

require 'pacer/graph/graph_transactions_mixin'
require 'pacer/graph/pacer_graph.rb'
require 'pacer/graph/simple_encoder.rb'
require 'pacer/graph/yaml_encoder.rb'
require 'pacer/graph/pacer_graph'
require 'pacer/graph/simple_encoder'
require 'pacer/graph/yaml_encoder'
require 'pacer/graph/graph_ml'
require 'pacer/graph/hash_index'
29 changes: 29 additions & 0 deletions lib/pacer/graph/hash_index.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
module Pacer::Graph
class HashIndex
attr_reader :name, :type

def initialize(element_type, name)
@type = type
@name = name
@data = Hash.new do |h, k|
h[k] = Hash.new { |h, k| h[k] = Set[] }
end
end

def get(key, value)
Pacer::Pipes::EnumerablePipe.new data[key][value]
end

def put(key, value, element)
data[key][value] << element
end

def count(key, value)
data[key][value].count
end

private

attr_reader :data
end
end
21 changes: 19 additions & 2 deletions lib/pacer/graph/pacer_graph.rb
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ module Indices
# @option opts [true] :create create the index if it doesn't exist
# @return [Pacer::IndexMixin]
def index(name, type = nil, opts = {})
return unless features.supportsIndices
return temp_index(name, type, opts) unless features.supportsIndices
name = name.to_s
if type
type = index_class element_type type
Expand All @@ -281,14 +281,31 @@ def index(name, type = nil, opts = {})
end

def drop_index(idx)
return unless features.supportsIndices
return drop_temp_index(idx) unless features.supportsIndices
if idx.is_a? String or idx.is_a? Symbol
blueprints_graph.dropIndex idx
else
blueprints_graph.dropIndex idx.indexName
end
end

def temp_index(name, type = nil, opts = {})
@temp_indices ||= {}
idx = @temp_indices[name]
unless idx
if name and type and opts[:create]
idx = @temp_indices[name] = Pacer::Graph::HashIndex.new type, name
elsif opts[:create]
idx = Pacer::Graph::HashIndex.new type, nil
end
end
Pacer::Wrappers::IndexWrapper.new self, idx, idx.type if idx
end

def drop_temp_index(idx)
@temp_indices.delete idx.name
end

# Return an object that can be compared to the return value of
# Index#index_class.
def index_class(et)
Expand Down
6 changes: 3 additions & 3 deletions lib/pacer/wrappers/edge_wrapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ def delete!
#
# @raise [StandardError] If this the associated vertices don't exist and :create_vertices is not set
def clone_into(target_graph, opts = {})
e_idx = target_graph.index("tmp-e-#{graph.graph_id}", :edge, :create => true)
e_idx = target_graph.temp_index("tmp-e-#{graph.graph_id}", :edge, :create => true)
e = target_graph.edge(element_id)
unless e
e = e_idx.first('id', element_id)
Expand All @@ -139,7 +139,7 @@ def clone_into(target_graph, opts = {})
end
end
unless e
v_idx = target_graph.index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
iv = target_graph.vertex(in_vertex.element_id) || v_idx.first('id', in_vertex.element_id)
ov = target_graph.vertex(out_vertex.element_id) || v_idx.first('id', out_vertex.element_id)
if opts[:create_vertices]
Expand Down Expand Up @@ -168,7 +168,7 @@ def clone_into(target_graph, opts = {})
#
# @raise [StandardError] If this the associated vertices don't exist
def copy_into(target_graph)
v_idx = target_graph.index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
iv = v_idx.first('id', in_vertex.element_id) || target_graph.vertex(in_vertex.element_id)
ov = v_idx.first('id', out_vertex.element_id) || target_graph.vertex(out_vertex.element_id)

Expand Down
2 changes: 1 addition & 1 deletion lib/pacer/wrappers/vertex_wrapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ def delete!
# @yield [v] Optional block yields the vertex after it has been created.
# @return [Pacer::Wrappers::VertexWrapper] the new vertex
def clone_into(target_graph, opts = nil)
v_idx = target_graph.index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
v = target_graph.vertex(element_id) || v_idx.first('id', element_id)
unless v
v = target_graph.create_vertex element_id, properties
Expand Down

0 comments on commit a7d63a2

Please sign in to comment.