class ActiveOrient::Base

Base class for tableless IB data Models, extends ActiveModel API

Attributes

metadata[R]

Used to read the metadata

Public Class Methods

attr_accessible(*args) click to toggle source
# File lib/base.rb, line 278
def self.attr_accessible *args
end
attr_protected(*args) click to toggle source

Noop methods mocking ActiveRecord::Base macros

# File lib/base.rb, line 275
def self.attr_protected *args
end
display_rid() click to toggle source
# File lib/base.rb, line 34
def self.display_rid
  @@rid_store
end
exclude_the_following_properties(*args) click to toggle source

# # def self.find *args # [] # end # (Experimental) Exclude some properties from loading via get, reload!, get_document, get_record

# File lib/base.rb, line 306
def self.exclude_the_following_properties *args
  puts "excluding #{args}"
@excluded =  (@excluded.is_a?( Array))?  @excluded + args : args
  puts "#{self.inspect} --> excluded #{@excluded}"
end
get_rid(rid) click to toggle source
# File lib/base.rb, line 56
def self.get_rid rid
  rid =  rid[1..-1] if rid[0]=='#'
  @@rid_store[rid] 
end
new(attributes = {}) click to toggle source

If a opts hash is given, keys are taken as attribute names, values as data. The model instance fields are then set automatically from the opts Hash.

# File lib/base.rb, line 101
def initialize attributes = {}, opts = {}
        logger.progname = "ActiveOrient::Base#initialize"
        @metadata = Hash.new # HashWithIndifferentAccess.new
        @d =  nil if RUBY_PLATFORM == 'java' && attributes.is_a?( Document )
        run_callbacks :initialize do
                if RUBY_PLATFORM == 'java' && attributes.is_a?( Document )
                        @d = attributes
                        attributes =  @d.values
                        @metadata[:class]      = @d.class_name
                        @metadata[:version]    = @d.version
                        @metadata[:cluster], @metadata[:record] = @d.rid[1,@d.rid.size].split(':')
                        puts "Metadata:  #{@metadata}"
                end

                # transform $current to :current and $current.mgr to :mgr
                 transformers = attributes.keys.map{|x|  [x, x[1..-1].split(".").last.to_sym] if x[0] == '$'}.compact
                 # transformers:  [ [original key, modified key] , [] ]
                 transformers.each do |a|
                         attributes[a.last] = attributes[a.first]
                         attributes.delete a.first
                 end

                attributes.keys.each do |att|
                        unless att[0] == "@" # @ identifies Metadata-attributes
                                unless self.class.instance_methods.detect{|x| x == att.to_sym}
                                        self.class.define_property att.to_sym, nil
                                else
                                        #logger.info{"Property #{att.to_s} NOT assigned"}
                                end
                        end
                end
                if attributes['@type'] == 'd'  # document via REST
                        @metadata[:type]       = attributes.delete '@type'
                        @metadata[:class]      = attributes.delete '@class'
                        @metadata[:version]    = attributes.delete '@version'
                        @metadata[:fieldTypes] = attributes.delete '@fieldTypes'
                        
                        if attributes.has_key?('@rid')
                                rid = attributes.delete '@rid'
                                cluster, record = rid[1 .. -1].split(':')
                                @metadata[:cluster] = cluster.to_i
                                @metadata[:record]  = record.to_i
                        end

                        if @metadata[:fieldTypes ].present? && (@metadata[:fieldTypes] =~ /=g/)
                                @metadata[:edges] = { :in => [], :out => [] }
                                edges = @metadata[:fieldTypes].split(',').find_all{|x| x=~/=g/}.map{|x| x.split('=').first}
                                #  puts "Detected EDGES: #{edges.inspect}"
                                edges.each do |edge|
                                        operator, *base_edge = edge.split('_')
                                        base_edge = base_edge.join('_')
                                        @metadata[:edges][operator.to_sym] << base_edge
                                end
                                #    unless self.class.instance_methods.detect{|x| x == base_edge}
                                #      ## define two methods: out_{Edge}/in_{Edge} -> edge.
                                #      self.class.define_property base_edge, nil
                                #      allocate_edge_method = -> (edge)  do
                                #        unless (ee=db.get_db_superclass(edge)) == "E"
                                #          allocate_edge_method[ee]
                                #          self.class.send :alias_method, base_edge.underscore, edge
                                #      ## define inherented classes, tooa
                                #

                                #    end
                                #  end
                        end
                end
                self.attributes = attributes # set_attribute_defaults is now after_init callback
        end
        #      puts "Storing #{self.rid} to rid-store"
        #      ActiveOrient::Base.store_rid( self ) do | cache_obj|
        #     cache_obj.reload! self
        #      end
end
remove_rid(obj) click to toggle source

removes an Item from the cache

obj has to provide a method rid

thus a string or a Model-Object is accepted

# File lib/base.rb, line 46
def self.remove_rid obj
                    if obj &.rid.present?
                    @@mutex.synchronize do 
                            @@rid_store.delete obj.rid     
                    end
                    else
                            logger.error "Cache entry not removed: #{obj} "
                    end
            end
reset_rid_store() click to toggle source
# File lib/base.rb, line 61
def self.reset_rid_store
  @@rid_store = Hash.new
end
store_rid(obj) click to toggle source

Stores the obj in the cache.

If the cache-value exists, it is updated by the data provided in obj and the cached obj is returned

# File lib/base.rb, line 72
def self.store_rid obj

                    @@mutex.synchronize do 
                            if obj.rid.present? && obj.rid.rid?
                                    if @@rid_store[obj.rid].present?
                                            @@rid_store[obj.rid].transfer_content from: obj
                                    else
                                            @@rid_store[obj.rid] =   obj
                                    end
                                    @@rid_store[obj.rid] 
                            else
                                    obj 
                            end
                    end
            end

Public Instance Methods

[](key) click to toggle source

ActiveModel-style read/write_attribute accessors

Autoload mechanism and data conversion are defined in the method “from_orient” of each class

# File lib/base.rb, line 210
                def [] key

                        iv = attributes[key]
                        if my_metadata( key: key) == "t"
                                # needed in case of
                                #  obj.date =  {some-date}
                                #  --> perfrom an action on the date without saving prior
                                case iv
                                when String
                                iv =~ /00:00:00/ ? Date.parse(iv) : DateTime.parse(iv) 
                                when Date, DateTime
                            iv
                                else
                                raise "incompatable type used: #{iv} (#{iv.class}) -- Date or DateTime required"     
                                end
                        elsif my_metadata( key: key) == "x"
                                iv = ActiveOrient::Model.autoload_object iv
                        elsif iv.is_a? Array
                                OrientSupport::Array.new( work_on: self, work_with: iv.from_orient){ key.to_sym }
                        elsif iv.is_a? Hash
#                               if iv.keys.include?("@class" )
#                               ActiveOrient::Model.orientdb_class( name: iv["@class"] ).new iv
#                               else
#                                       iv
                                OrientSupport::Hash.new( self, iv.from_orient){ key.to_sym }
        #                      end
                                #     elsif iv.is_a? RecordMap
                                #      iv
                                #       puts "RecordSet detected"
                        else
                                iv.from_orient
                        end
                end
[]=(key, val) click to toggle source
# File lib/base.rb, line 244
def []= key, val
        val = val.rid if val.is_a?( ActiveOrient::Model ) && val.rid.rid?
        attributes[key.to_sym] = case val
                                                                                                         when Array
                                                                                                                 if val.first.is_a?(Hash)
                                                                                                                         v = val.map{ |x| x }
                                                                                                                         OrientSupport::Array.new(work_on: self, work_with: v ){ key_to_sym }
                                                                                                                 else
                                                                                                                         OrientSupport::Array.new(work_on: self, work_with: val ){ key_to_sym }
                                                                                                                 end
                                                                                                         when Hash
                                                                                                                 if val.keys.include?("@class" )
                                                                                                                         OrientSupport::Array.new( work_on: self, work_with: val.from_orient){ key.to_sym }
                                                                                                                 else
                                                                                                                         OrientSupport::Hash.new( self, val  )
                                                                                                                 end
                                                                                                         else
                                                                                                                 val
                                                                                                         end
end
attributes() click to toggle source
# File lib/base.rb, line 183
def attributes
  @attributes ||= Hash.new # WithIndifferentAccess.new
end
attributes=(attrs) click to toggle source
# File lib/base.rb, line 187
def attributes= attrs
  attrs.keys.each{|key| self.send("#{key}=", attrs[key])}
end
my_metadata(key: nil, symbol: nil) click to toggle source
# File lib/base.rb, line 191
def my_metadata key: nil, symbol: nil
        if @metadata[:fieldTypes].present?  
                meta= Hash[ @metadata[:fieldTypes].split(',').map{|x| x.split '='} ]
                if key.present?
                        meta[key.to_s]
                elsif symbol.present?
                        meta.map{|x,y| x if y == symbol.to_s }.compact
                else
                        meta
                end
        end
end
update_attribute(key, value) click to toggle source
# File lib/base.rb, line 265
def update_attribute key, value
  @attributes[key] = value
end