lib/neo4j/index.rb in neo4j-1.0.0.beta.8 vs lib/neo4j/index.rb in neo4j-1.0.0.beta.9
- old
+ new
@@ -12,21 +12,32 @@
module ClassMethods
extend Forwardable
def_delegators :@indexer, :index, :find, :index?, :index_type?, :clear_index_type, :rm_index_type, :add_index, :rm_index, :index_type_for, :index_name
- # Sets which indexer should be used for the given class.
+
+ # Sets which indexer should be used for the given node class
# Returns the old one if there was an old indexer.
- def indexer(clazz)
+ def node_indexer(clazz)
+ indexer(clazz, :node)
+ end
+
+ # Sets which indexer should be used for the given relationship class
+ # Returns the old one if there was an old indexer.
+ def rel_indexer(clazz)
+ indexer(clazz, :rel)
+ end
+
+ def indexer(clazz, type) #:nodoc:
old = @indexer
@@indexers ||= {}
if @@indexers.include?(clazz)
# we want to reuse an existing index
@indexer = @@indexers[clazz]
@indexer.include_trigger(self)
else
- @indexer = Indexer.new(clazz)
+ @indexer = Indexer.new(clazz, type)
@@indexers[clazz] = @indexer
end
old
end
end
@@ -82,13 +93,16 @@
end
class Indexer
attr_reader :index_name
- def initialize(clazz)
+ def initialize(clazz, type)
@index_name = clazz.to_s
+ # do we want to index nodes or relationships ?
+ @type = type
+
@indexes = {} # key = type, value = java neo4j index
@field_types = {} # key = field, value = type (e.g. :exact or :fulltext)
@triggered_by = clazz.to_s
end
@@ -172,11 +186,15 @@
end
def create_index_with(type)
db=Neo4j.started_db
index_config = lucene_config(type)
- db.lucene.node_index("#{@index_name}-#{type}", index_config)
+ if @type == :node
+ db.lucene.node_index("#{@index_name}-#{type}", index_config)
+ else
+ db.lucene.relationship_index("#{@index_name}-#{type}", index_config)
+ end
end
# ------------------------------------------------------------------
# Event Handling
@@ -184,20 +202,20 @@
def include_trigger(clazz)
@triggered_by << clazz.to_s unless @triggered_by.include?(clazz.to_s)
end
def trigger?(classname)
- @triggered_by.include?(classname || 'Neo4j::Node')
+ @triggered_by.include?(classname || (@type==:node ? 'Neo4j::Node' : 'Neo4j::Relationship'))
end
def on_node_created(node)
return unless trigger?(node['_classname'])
@field_types.keys.each {|field| add_index(node, field, node[field]) if node.property?(field)}
end
def on_node_deleted(node, old_props)
- return unless @triggered_by.include?(old_props['_classname'] || 'Neo4j::Node')
+ return unless trigger?(old_props['_classname'])
@field_types.keys.each {|field| rm_index(node, field, old_props[field]) if old_props[field]}
end
def on_property_changed(node, field, old_val, new_val)
return unless trigger?(node[:_classname]) && @field_types.include?(field)
@@ -205,9 +223,25 @@
rm_index(node, field, old_val) if old_val
# add index
add_index(node, field, new_val) if new_val
end
+
+ def on_rel_property_changed(rel, field, old_val, new_val)
+ # works exactly like for nodes
+ on_property_changed(rel, field, old_val, new_val)
+ end
+
+ def on_relationship_created(rel)
+ # works exactly like for nodes
+ on_node_created(rel)
+ end
+
+ def on_relationship_deleted(rel, old_props)
+ # works exactly like for nodes
+ on_node_deleted(rel, old_props)
+ end
+
end
end
end
\ No newline at end of file