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