lib/neoid/node.rb in neoid-0.0.2 vs lib/neoid/node.rb in neoid-0.0.5.alpha
- old
+ new
@@ -9,77 +9,153 @@
end
def neo_subref_node
@_neo_subref_node ||= begin
Neoid::logger.info "Node#neo_subref_node #{neo_subref_rel_type}"
-
- subref_node_query = Neoid.ref_node.outgoing(neo_subref_rel_type)
- if subref_node_query.to_a.blank?
- node = Neography::Node.create(type: self.name, name: neo_subref_rel_type)
- Neography::Relationship.create(
- neo_subref_rel_type,
- Neoid.ref_node,
- node
- )
- else
- node = subref_node_query.first
- end
-
+ gremlin_query = <<-GREMLIN
+ q = g.v(0).out(neo_subref_rel_type);
+
+ subref = q.hasNext() ? q.next() : null;
+
+ if (!subref) {
+ subref = g.addVertex([name: neo_subref_rel_type, type: name]);
+ g.addEdge(g.v(0), subref, neo_subref_rel_type);
+ }
+
+ g.createManualIndex(neo_index_name, Vertex.class);
+
+ subref
+ GREMLIN
+
+ Neoid.logger.info "subref query:\n#{gremlin_query}"
+
+ node = Neography::Node.load(Neoid.db.execute_script(gremlin_query, neo_subref_rel_type: neo_subref_rel_type, name: self.name, neo_index_name: self.neo_index_name))
+
node
end
end
+
+ def neo_search(term, options = {})
+ Neoid.search(self, term, options)
+ end
end
module InstanceMethods
def neo_find_by_id
Neoid::logger.info "Node#neo_find_by_id #{self.class.neo_index_name} #{self.id}"
Neoid.db.get_node_index(self.class.neo_index_name, :ar_id, self.id)
+ rescue Neography::NotFoundException
+ nil
end
def neo_create
+ return unless Neoid.enabled?
+
data = self.to_neo.merge(ar_type: self.class.name, ar_id: self.id)
data.reject! { |k, v| v.nil? }
node = Neography::Node.create(data)
- Neography::Relationship.create(
- self.class.neo_subref_node_rel_type,
- self.class.neo_subref_node,
- node
- )
-
+ retires = 2
+ begin
+ Neography::Relationship.create(
+ self.class.neo_subref_node_rel_type,
+ self.class.neo_subref_node,
+ node
+ )
+ rescue
+ # something must've happened to the cached subref node, reset and retry
+ @_neo_subref_node = nil
+ retires -= 1
+ retry if retires > 0
+ end
+
Neoid.db.add_node_to_index(self.class.neo_index_name, :ar_id, self.id, node)
Neoid::logger.info "Node#neo_create #{self.class.name} #{self.id}, index = #{self.class.neo_index_name}"
+
+ neo_search_index
node
end
+ def neo_update
+ Neoid.db.set_node_properties(neo_node, self.to_neo)
+ neo_search_index
+ end
+
+ def neo_search_index
+ return if self.class.neoid_config.search_options.blank? || (
+ self.class.neoid_config.search_options.index_fields.blank? &&
+ self.class.neoid_config.search_options.fulltext_fields.blank?
+ )
+
+ Neoid.ensure_default_fulltext_search_index
+
+ Neoid.db.add_node_to_index(DEFAULT_FULLTEXT_SEARCH_INDEX_NAME, 'ar_type', self.class.name, neo_node.neo_id)
+
+ self.class.neoid_config.search_options.fulltext_fields.each do |field, options|
+ Neoid.db.add_node_to_index(DEFAULT_FULLTEXT_SEARCH_INDEX_NAME, "#{field}_fulltext", neo_helper_get_field_value(field, options), neo_node.neo_id)
+ end
+
+ self.class.neoid_config.search_options.index_fields.each do |field, options|
+ Neoid.db.add_node_to_index(DEFAULT_FULLTEXT_SEARCH_INDEX_NAME, field, neo_helper_get_field_value(field, options), neo_node.neo_id)
+ end
+
+ neo_node
+ end
+
+ def neo_helper_get_field_value(field, options = {})
+ if options[:block]
+ options[:block].call
+ else
+ self.send(field) rescue (raise "No field #{field} for #{self.class.name}")
+ end
+ end
+
def neo_load(node)
Neography::Node.load(node)
end
def neo_node
_neo_representation
end
def neo_destroy
return unless neo_node
+ Neoid.db.remove_node_from_index(DEFAULT_FULLTEXT_SEARCH_INDEX_NAME, neo_node)
+
Neoid.db.remove_node_from_index(self.class.neo_index_name, neo_node)
neo_node.del
+ _reset_neo_representation
end
+
+ def neo_after_relationship_remove(relationship)
+ relationship.neo_destroy
+ end
+
+ def neo_before_relationship_through_remove(record)
+ rel_model, foreign_key_of_owner, foreign_key_of_record = Neoid.config[:relationship_meta_data][self.class.name.to_s][record.class.name.to_s]
+ rel_model = rel_model.to_s.constantize
+ @__neo_temp_rels ||= {}
+ @__neo_temp_rels[record] = rel_model.where(foreign_key_of_owner => self.id, foreign_key_of_record => record.id).first
+ end
+
+ def neo_after_relationship_through_remove(record)
+ @__neo_temp_rels.each { |record, relationship| relationship.neo_destroy }
+ @__neo_temp_rels.delete(record)
+ end
end
def self.included(receiver)
- receiver.extend Neoid::ModelAdditions::ClassMethods
- receiver.send :include, Neoid::ModelAdditions::InstanceMethods
+ receiver.send :include, Neoid::ModelAdditions
receiver.extend ClassMethods
receiver.send :include, InstanceMethods
+ Neoid.node_models << receiver
- receiver.neo_subref_node # ensure
-
receiver.after_create :neo_create
+ receiver.after_update :neo_update
receiver.after_destroy :neo_destroy
end
end
-end
\ No newline at end of file
+end