Sha256: 2f0c7b15d84740151930b926cb1215b0580d2855c88ca092a91333f6beca2493

Contents?: true

Size: 1.57 KB

Versions: 63

Compression:

Stored size: 1.57 KB

Contents

require 'active_support/inflector'

class Neo4j::Node
  # The wrapping process is what transforms a raw CypherNode or EmbeddedNode from Neo4j::Core into a healthy ActiveNode (or ActiveRel) object.
  module Wrapper
    # this is a plugin in the neo4j-core so that the Ruby wrapper will be wrapped around the Neo4j::Node objects
    def wrapper
      found_class = class_to_wrap
      return self if not found_class

      found_class.new.tap do |wrapped_node|
        wrapped_node.init_on_load(self, self.props)
      end
    end

    def class_to_wrap
      load_classes_from_labels
      Neo4j::ActiveNode::Labels.model_for_labels(labels).tap do |model_class|
        Neo4j::Node::Wrapper.populate_constants_for_labels_cache(model_class, labels)
      end
    end

    private

    def load_classes_from_labels
      labels.each { |label| Neo4j::Node::Wrapper.constant_for_label(label) }
    end

    # Only load classes once for performance
    CONSTANTS_FOR_LABELS_CACHE = {}

    def self.constant_for_label(label)
      CONSTANTS_FOR_LABELS_CACHE[label] || CONSTANTS_FOR_LABELS_CACHE[label] = constantized_label(label)
    end

    def self.constantized_label(label)
      "#{association_model_namespace}::#{label}".constantize
    rescue NameError
      nil
    end

    def self.populate_constants_for_labels_cache(model_class, labels)
      labels.each do |label|
        CONSTANTS_FOR_LABELS_CACHE[label] = model_class if CONSTANTS_FOR_LABELS_CACHE[label].nil?
      end
    end

    def self.association_model_namespace
      Neo4j::Config.association_model_namespace_string
    end
  end
end

Version data entries

63 entries across 63 versions & 2 rubygems

Version Path
neo4j-6.0.0.rc.2 lib/neo4j/active_node/node_wrapper.rb
neo4j-6.0.0.rc.1 lib/neo4j/active_node/node_wrapper.rb
neo4j-6.0.0.alpha.12 lib/neo4j/active_node/node_wrapper.rb