Class: ActiveOrient::Base

Inherits:
Object show all
Extended by:
ActiveModel::Callbacks, ActiveModel::Naming
Includes:
ActiveModel::Serialization, ActiveModel::Serializers::JSON, ActiveModel::Validations, Conversions, OrientDB
Defined in:
lib/base.rb

Overview

Base class for tableless IB data Models, extends ActiveModel API

Direct Known Subclasses

Model

Constant Summary collapse

@@rid_store =

Every Rest::Base-Object is stored in the @@rid_store

The Objects are just references to the @@rid_store.
Any Change of the Object is thus synchonized to any allocated variable.
Hash.new

Constants included from OrientDB

OrientDB::DocumentDatabase, OrientDB::DocumentDatabasePool, OrientDB::DocumentDatabasePooled, OrientDB::GraphDatabase, OrientDB::IndexType, OrientDB::OClassImpl, OrientDB::OTraverse, OrientDB::PropertyImpl, OrientDB::RemoteStorage, OrientDB::SQLCommand, OrientDB::SQLSynchQuery, OrientDB::Schema, OrientDB::SchemaProxy, OrientDB::SchemaType, OrientDB::ServerAdmin, OrientDB::User, OrientDB::UsingJava

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attributes = {}, opts = {}) ⇒ Base

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.



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/base.rb', line 91

def initialize attributes = {}, opts = {}
  logger.progname = "ActiveOrient::Base#initialize"
   = Hash.new # HashWithIndifferentAccess.new
  @d =  nil
  run_callbacks :initialize do
    if RUBY_PLATFORM == 'java' && attributes.is_a?( Document )
      @d = attributes
      attributes =  @d.values
      [:class]      = @d.class_name
      [:version]    = @d.version
      [:cluster], [: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
      [:type]       = attributes.delete '@type'
      [:class]      = attributes.delete '@class'
      [:version]    = attributes.delete '@version'
      [:fieldTypes] = attributes.delete '@fieldTypes'
      
      if attributes.has_key?('@rid')
        rid = attributes.delete '@rid'
        cluster, record = rid[1 .. -1].split(':')
        [:cluster] = cluster.to_i
        [:record]  = record.to_i
      end

      if [:fieldTypes ].present? && ([:fieldTypes] =~ /=g/)
        [:edges] = { :in => [], :out => [] }
        edges = [: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('_')
          [: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

Instance Attribute Details

#metadataObject (readonly)

Used to read the metadata



24
25
26
# File 'lib/base.rb', line 24

def 
  
end

Class Method Details

.attr_accessible(*args) ⇒ Object



258
259
# File 'lib/base.rb', line 258

def self.attr_accessible *args
end

.attr_protected(*args) ⇒ Object

Noop methods mocking ActiveRecord::Base macros



255
256
# File 'lib/base.rb', line 255

def self.attr_protected *args
end

.belongs_to(model, *args) ⇒ Object

ActiveRecord::Base association API mocks



263
264
265
# File 'lib/base.rb', line 263

def self.belongs_to model, *args # :nodoc:
  attr_accessor model
end

.display_ridObject



33
34
35
# File 'lib/base.rb', line 33

def self.display_rid
  @@rid_store
end

.exclude_the_following_properties(*args) ⇒ Object

Exclude some properties from loading via get, reload!, get_document, get_record



285
286
287
288
289
# File 'lib/base.rb', line 285

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) ⇒ Object



49
50
51
52
# File 'lib/base.rb', line 49

def self.get_rid rid
  rid =  rid[1..-1] if rid[0]=='#'
  @@rid_store[rid] 
end

.has_many(models, *args) ⇒ Object

:nodoc:



271
272
273
274
275
276
# File 'lib/base.rb', line 271

def self.has_many models, *args  # :nodoc:
  attr_accessor models
  define_method(models) do
    self.instance_variable_get("@#{models}") || self.instance_variable_set("@#{models}", [])
  end
end

.has_one(model, *args) ⇒ Object

:nodoc:



267
268
269
# File 'lib/base.rb', line 267

def self.has_one model, *args   # :nodoc:
  attr_accessor model
end

.remove_rid(obj) ⇒ Object

removes an Item from the cache

obj has to provide a method #rid

thus a string or a Model-Object is accepted



45
46
47
# File 'lib/base.rb', line 45

def self.remove_rid obj
  @@rid_store.delete obj.rid if obj.rid.present?
end

.reset_rid_storeObject



54
55
56
# File 'lib/base.rb', line 54

def self.reset_rid_store
  @@rid_store = Hash.new
end

.serialize(*properties) ⇒ Object

ActiveRecord::Base misc



292
293
# File 'lib/base.rb', line 292

def self.serialize *properties # :nodoc:
end

.store_rid(obj) ⇒ Object

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



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/base.rb', line 65

def self.store_rid obj
  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
  nil 
  end
end

Instance Method Details

#[](key) ⇒ Object

ActiveModel-style read/write_attribute accessors

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


200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/base.rb', line 200

def [] key

  iv = attributes[key]
  if ( key: key) == "t"
    iv =~ /00:00:00/ ? Date.parse(iv) : DateTime.parse(iv)
  elsif ( 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) ⇒ Object



224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# File 'lib/base.rb', line 224

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 )
                             else
                               OrientSupport::Array.new(work_on: self, work_with: val )
                             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

#attributesObject



173
174
175
# File 'lib/base.rb', line 173

def attributes
  @attributes ||= Hash.new # WithIndifferentAccess.new
end

#attributes=(attrs) ⇒ Object



177
178
179
# File 'lib/base.rb', line 177

def attributes= attrs
  attrs.keys.each{|key| self.send("#{key}=", attrs[key])}
end

ActiveModel API (for serialization)



168
169
170
171
# File 'lib/base.rb', line 168

def included_links
  meta= Hash[ [:fieldTypes].split(',').map{|x| x.split '='} ]
  meta.map{|x,y| x if y=='x'}.compact
end

#my_metadata(key: nil, symbol: nil) ⇒ Object



181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/base.rb', line 181

def  key: nil, symbol: nil
  if [:fieldTypes].present?  
    meta= Hash[ [: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

#to_modelObject

:nodoc:



249
250
251
# File 'lib/base.rb', line 249

def to_model   # :nodoc:
  self
end

#update_attribute(key, value) ⇒ Object



245
246
247
# File 'lib/base.rb', line 245

def update_attribute key, value
  @attributes[key] = value
end