Module: RestRead

Included in:
ActiveOrient::OrientDB
Defined in:
lib/rest/read.rb

Instance Method Summary collapse

Instance Method Details

#get_class_properties(o_class) ⇒ Object

Returns a JSON of the property of a class

ORD.create_vertex_class a:
ORD.get_class_properties A
 => {"name"=>"a", "superClass"=>"V", "superClasses"=>["V"], "alias"=>nil, "abstract"=>false, "strictmode"=>false, "clusters"=>[65, 66, 67, 68], "defaultCluster"=>65, "clusterSelection"=>"round-robin", "records"=>3}


55
56
57
58
59
60
61
62
# File 'lib/rest/read.rb', line 55

def get_class_properties o_class
ActiveOrient.db_pool.checkout do | conn |
  JSON.parse(conn["/class/#{ActiveOrient.database}/#{classname(o_class)}"].get)
end
rescue => e
  logger.error  e.message
  nil
end

#get_classes(*attributes) ⇒ Object

Returns an Array with (unmodified) Class-attribute-hash-Elements

»get_classes ‘name’, ‘superClass’« returns

[ {"name"=>"E", "superClass"=>""},
{"name"=>"OFunction", "superClass"=>""},
{"name"=>"ORole", "superClass"=>"OIdentity"}
(...)    ]


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/rest/read.rb', line 25

def get_classes *attributes
begin
  response = ActiveOrient.db_pool.checkout do | conn |
    conn["/database/#{ActiveOrient.database}"].get
  end
  if response.code == 200
    classes = JSON.parse(response.body)['classes']
    unless attributes.empty?
      classes.map{|y| y.select{|v,_| attributes.include?(v)}}
    else
      classes
    end
  else
    []
  end
  rescue Exception => e
    logger.progname = 'RestRead#GetClasses'
    logger.error{e.message}
  end
end

#get_databasesObject

Returns an Array with available Database-Names as Elements

ORD.get_databases
 => ["temp", "GratefulDeadConcerts", (...)]


9
10
11
12
13
14
# File 'lib/rest/read.rb', line 9

def get_databases

ActiveOrient.db_pool.checkout do | conn |
  JSON.parse(conn["/listDatabases"].get.body)['databases']
end
end

#get_record(rid) ⇒ Object Also known as: get_document

Retrieves a Record from the Database

The argument can either be a rid “#x:y” or a link “x:y”.

(to be specific: it must provide the methods rid? and to_orient, the latter must return the rid: “#[a}:b”.)

If no Record is found, nil is returned

The rid-cache is not used or updated



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
# File 'lib/rest/read.rb', line 92

def get_record rid
  begin
    logger.progname = 'RestRead#GetRecord'
    if rid.rid?

      response =  ActiveOrient.db_pool.checkout do | conn |
         conn["/document/#{ActiveOrient.database}/#{rid.to_orient[1..-1]}"].get
      end
      raw_data = JSON.parse(response.body) 
      #  ActiveOrient::Model.use_or_allocate( raw_data['@rid'] ) do 
      the_object=   ActiveOrient::Model.orientdb_class(name: raw_data['@class']).new raw_data
      ActiveOrient::Base.store_rid( the_object )   # update cache
    else
      logger.error { "Wrong parameter #{rid.inspect}. " }
      nil
    end
  rescue RestClient::InternalServerError => e
    if e.http_body.split(':').last =~ /was not found|does not exist in database/
      nil
    else
      logger.error { "Something went wrong" }
      logger.error { e.http_body.inspect }
      raise
    end
  rescue RestClient::ResourceNotFound => e
    logger.error { "RID: #{rid} ---> No Record present " }
    ActiveOrient::Model.remove_rid rid      #  remove rid from cache
    nil
  rescue NoMethodError => e
    logger.fatal { "---------------- Serious Trouble ----------------" }
    logger.fatal { "GetRecord  raw-data: #{raw_data}" }
    logger.error { "GetRecord  could not allocate Model-Instance" }
    logger.error { "is a model file required but missing?" }
    raise

  rescue Exception => e
    logger.error { "Something went wrong" }
    logger.error { "RID: #{rid} - #{e.message}" }
    raise
  end
end

#get_records(raw: false, query: nil, **args) ⇒ Object Also known as: get_documents

Retrieves Records from a query

If raw is specified, the JSON-Array is returned, e.g.

{"@type"=>"d", "@rid"=>"#15:1", "@version"=>1,    "@class"=>"DocumebntKlasse10", "con_id"=>343, "symbol"=>"EWTZ"}

Otherwise ActiveModel-Instances are created and returned. In this case cached data are used in favour and its not checked if the database contents have changed.



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/rest/read.rb', line 145

def get_records raw: false, query: nil, **args
  query = OrientSupport::OrientQuery.new(args) if query.nil?
  begin
    logger.progname = 'RestRead#GetRecords'
  response =  ActiveOrient.db_pool.checkout do | conn |
    url = "/query/#{ActiveOrient.database}/sql/" + query.compose(destination: :rest) + "/#{query.get_limit}"
    conn[URI.encode(url)].get
  end
  JSON.parse(response.body)['result'].map do |record|
   if raw
     record
     # query returns an anonymus class: Use the provided Block or the Dummy-Model MyQuery
   elsif record['@class'].blank?
     block_given? ? yield.new(record) : ActiveOrient::Model.orientdb_class(name: 'query' ).new( record )
   else
the_object = ActiveOrient::Model.orientdb_class(name: record['@class']).new record
ActiveOrient::Base.store_rid( the_object )   # update cache
#       end
   end
 end
 # returns an array of updated objects
   
  rescue RestClient::BadRequest  => e
    #puts e.inspect
 logger.error { "-"*30 }
 logger.error { "REST_READ#GET_RECORDS.URL ---> Wrong Query" }
 logger.error {  query.compose( destination: :rest).to_s }
 logger.error { "Fired Statement: #{url.to_s} " }
  response=""
  rescue RestClient::InternalServerError => e
    response = JSON.parse(e.response)['errors'].pop
 logger.error{ "Interbak Server ERROR" }
    logger.error{response['content'].split(':').last}
  rescue URI::InvalidURIError => e
    logger.error{"Invalid URI detected"}
    logger.error query.to_s
    logger.info{"Trying batch processing"}
    response = execute{ query.to_s}
    logger.info{"Success: to avoid this delay use ActiveOrient::Model#query_database instead"}
    response
  end
end


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

def print_class_properties o_class
  puts "Detected Properties for class #{classname(o_class)}"
  rp = get_class_properties o_class
  n = rp['name']
  if rp['properties'].nil?
    puts "No property available"
  else
    puts rp['properties'].map{|x| "\t"+[n+'.'+x['name'], x['type'],x['linkedClass']].compact.join("\t-> ")}.join("\n")
  end
rescue NoMethodError
  puts "Class #{o_class} not present in database"
end