active-orient 0.42 → 0.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/Gemfile +13 -5
  4. data/Guardfile +12 -4
  5. data/README.md +67 -280
  6. data/VERSION +1 -1
  7. data/active-orient.gemspec +6 -5
  8. data/bin/active-orient-0.6.gem +0 -0
  9. data/bin/active-orient-console +85 -0
  10. data/config/boot.rb +72 -1
  11. data/config/config.yml +10 -0
  12. data/config/connect.yml +9 -4
  13. data/examples/books.rb +92 -40
  14. data/examples/streets.rb +89 -85
  15. data/examples/test_commands.rb +97 -0
  16. data/examples/test_commands_2.rb +59 -0
  17. data/examples/test_commands_3.rb +55 -0
  18. data/examples/test_commands_4.rb +33 -0
  19. data/examples/time_graph.md +162 -0
  20. data/lib/active-orient.rb +75 -9
  21. data/lib/base.rb +238 -169
  22. data/lib/base_properties.rb +68 -60
  23. data/lib/class_utils.rb +226 -0
  24. data/lib/database_utils.rb +98 -0
  25. data/lib/init.rb +79 -0
  26. data/lib/java-api.rb +442 -0
  27. data/lib/jdbc.rb +211 -0
  28. data/lib/model/custom.rb +26 -0
  29. data/lib/model/edge.rb +70 -0
  30. data/lib/model/model.rb +134 -0
  31. data/lib/model/the_class.rb +607 -0
  32. data/lib/model/the_record.rb +266 -0
  33. data/lib/model/vertex.rb +236 -0
  34. data/lib/orientdb_private.rb +48 -0
  35. data/lib/other.rb +371 -0
  36. data/lib/railtie.rb +68 -0
  37. data/lib/rest/change.rb +147 -0
  38. data/lib/rest/create.rb +279 -0
  39. data/lib/rest/delete.rb +134 -0
  40. data/lib/rest/operations.rb +211 -0
  41. data/lib/rest/read.rb +171 -0
  42. data/lib/rest/rest.rb +112 -0
  43. data/lib/rest_disabled.rb +24 -0
  44. data/lib/support/logging.rb +38 -0
  45. data/lib/support/orient.rb +196 -0
  46. data/lib/support/orientquery.rb +469 -0
  47. data/rails.md +154 -0
  48. data/rails/activeorient.rb +32 -0
  49. data/rails/config.yml +10 -0
  50. data/rails/connect.yml +17 -0
  51. metadata +65 -24
  52. data/active-orient-0.4.gem +0 -0
  53. data/active-orient-0.41.gem +0 -0
  54. data/lib/model.rb +0 -468
  55. data/lib/orient.rb +0 -98
  56. data/lib/query.rb +0 -88
  57. data/lib/rest.rb +0 -1059
  58. data/lib/support.rb +0 -372
  59. data/test.rb +0 -4
  60. data/usecase.md +0 -91
@@ -0,0 +1,48 @@
1
+ module OrientDbPrivate
2
+ private
3
+
4
+ def translate_property_hash field, type: nil, linked_class: nil, **args
5
+ type = type.presence || args[:propertyType].presence || args[:property_type]
6
+ linked_class = linked_class.presence || args[:linkedClass] || args[:other_class]
7
+ if type.present?
8
+ if linked_class.nil?
9
+ {field => {propertyType: type.to_s.upcase}}
10
+ else
11
+ {field => {propertyType: type.to_s.upcase, linkedClass: classname(linked_class)}}
12
+ end
13
+ end
14
+ end
15
+
16
+ def property_uri this_classname
17
+ if block_given?
18
+ "property/#{@database}/#{this_classname}/" << yield
19
+ else
20
+ "property/#{@database}/#{this_classname}"
21
+ end
22
+ end
23
+
24
+ def self.simple_uri *names
25
+ names.each do |name|
26
+ m_name = ("#{name.to_s}_uri").to_sym
27
+ define_method(m_name) do |&b|
28
+ if b
29
+ "#{name.to_s}/#{@database}/#{b.call}"
30
+ else
31
+ "#{name.to_s}/#{@database}"
32
+ end # branch
33
+ end
34
+ end
35
+ end
36
+
37
+ def self.sql_uri *names
38
+ names.each do |name|
39
+ define_method(("#{name.to_s}_sql_uri").to_sym) do
40
+ "#{name.to_s}/#{@database}/sql/"
41
+ end
42
+ end
43
+ end
44
+
45
+ simple_uri :database, :document, :class, :batch, :function
46
+ sql_uri :command, :query
47
+
48
+ end
@@ -0,0 +1,371 @@
1
+
2
+ class Array
3
+ # Class extentions to manage to_orient and from_orient
4
+ def to_orient
5
+ map( &:to_orient) # .join(',')
6
+ end
7
+
8
+ def to_or
9
+ "["+ map( &:to_or).join(', ')+"]"
10
+ end
11
+
12
+ def from_orient
13
+ map &:from_orient
14
+ end
15
+
16
+ def to_human
17
+ map &:to_human
18
+ end
19
+ # used to enable
20
+ # def abc *key
21
+ # where key is a Range, an comma separated List or an item
22
+ # aimed to support #compose_where
23
+ def analyse # :nodoc:
24
+ if first.is_a?(Range)
25
+ first
26
+ elsif size ==1
27
+ first
28
+ else
29
+ self
30
+ end
31
+
32
+ end
33
+ end
34
+
35
+ class Symbol
36
+ def to_a
37
+ [ self ]
38
+ end
39
+ # symbols are masked with ":{symbol}:"
40
+ def to_orient
41
+ ":"+self.to_s+":"
42
+ end
43
+ def to_or
44
+ "'"+self.to_orient+"'"
45
+ end
46
+
47
+ # inserted to prevent error message while initialising a model-recorda
48
+ =begin
49
+ 2.6.1 :008 > ii.first.attributes
50
+ => {:zwoebelkuchen=>[7, 9, 9, 7, 8, 8, 3, 6, 9, ":zt:", ":zt:", ":zg:", ":zg:", ":tzu:", ":grotte:"], :created_at=>Wed, 27 Mar 2019 14:59:45 +0000}
51
+ 2.6.1 :009 > ii.first.send :zwoebelkuchen
52
+ key zwoebelkuchen
53
+ iv [7, 9, 9, 7, 8, 8, 3, 6, 9, ":zt:", ":zt:", ":zg:", ":zg:", ":tzu:", ":grotte:"]
54
+ 27.03.(15:00:36)ERROR->MethodMissing -> Undefined method: coerce -- Args: [Wed, 27 Mar 2019 14:59:45 +0000]
55
+ 27.03.(15:00:36)ERROR-> The Message undefined method `coerce' for :zt:Symbol
56
+ 27.03.(15:00:36)ERROR-> /home/dev/topo/activeorient/lib/support/orient.rb:129:in `block in method_missing'
57
+ /home/dev/topo/activeorient/lib/support/orient.rb:129:in `map'
58
+ /home/dev/topo/activeorient/lib/support/orient.rb:129:in `method_missing'
59
+ /home/ubuntu/.rvm/gems/ruby-2.6.1/gems/activesupport-5.2.2.1/lib/active_support/core_ext/date/calculations.rb:140:in `<=>'
60
+ /home/ubuntu/.rvm/gems/ruby-2.6.1/gems/activesupport-5.2.2.1/lib/active_support/core_ext/date/calculations.rb:140:in `compare_with_coercion'
61
+ /home/ubuntu/.rvm/gems/ruby-2.6.1/gems/activesupport-5.2.2.1/lib/active_support/core_ext/date_time/calculations.rb:208:in `<=>'
62
+ /home/dev/topo/activeorient/lib/support/orient.rb:36:in `=='
63
+ /home/dev/topo/activeorient/lib/support/orient.rb:36:in `key'
64
+ /home/dev/topo/activeorient/lib/support/orient.rb:36:in `initialize'
65
+ /home/dev/topo/activeorient/lib/base.rb:216:in `new'
66
+ /home/dev/topo/activeorient/lib/base.rb:216:in `[]'
67
+ /home/dev/topo/activeorient/lib/base_properties.rb:110:in `block in define_property_methods'
68
+ (irb):9:in `irb_binding'
69
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb/workspace.rb:85:in `eval'
70
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb/workspace.rb:85:in `evaluate'
71
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb/context.rb:385:in `evaluate'
72
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb.rb:493:in `block (2 levels) in eval_input'
73
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb.rb:647:in `signal_status'
74
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb.rb:490:in `block in eval_input'
75
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb/ruby-lex.rb:246:in `block (2 levels) in each_top_level_statement'
76
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb/ruby-lex.rb:232:in `loop'
77
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb/ruby-lex.rb:232:in `block in each_top_level_statement'
78
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb/ruby-lex.rb:231:in `catch'
79
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb/ruby-lex.rb:231:in `each_top_level_statement'
80
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb.rb:489:in `eval_input'
81
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb.rb:428:in `block in run'
82
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb.rb:427:in `catch'
83
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb.rb:427:in `run'
84
+ /home/ubuntu/.rvm/rubies/ruby-2.6.1/lib/ruby/2.6.0/irb.rb:383:in `start'
85
+ ./active-orient-console:51:in `<main>'
86
+ =end
87
+
88
+ def coerce a #nodoc#
89
+ nil
90
+ end
91
+ end
92
+
93
+ class Object
94
+ def from_orient
95
+ self
96
+ end
97
+
98
+ def to_orient
99
+ self
100
+ end
101
+ end
102
+
103
+
104
+ class Date
105
+ def to_orient
106
+ if RUBY_PLATFORM == 'java'
107
+ java.util.Date.new( year-1900, month-1, day , 0, 0 , 0 ) ## Jahr 0 => 1900
108
+ else
109
+ self
110
+ end
111
+ end
112
+ end
113
+
114
+
115
+ class Numeric
116
+
117
+ def to_or
118
+ # "#{self.to_s}"
119
+ self
120
+ end
121
+
122
+ def to_a
123
+ [ self ]
124
+ end
125
+ end
126
+
127
+ class String
128
+ def capitalize_first_letter
129
+ self.sub(/^(.)/) { $1.capitalize }
130
+ end
131
+ ### as_json has unexpected side-effects, needs further consideration
132
+ # def as_json o=nil
133
+ # if rid?
134
+ # rid
135
+ # else
136
+ # super o
137
+ # end
138
+ # end
139
+
140
+ def where **args
141
+ if rid?
142
+ from_orient.where **args
143
+ end
144
+ end
145
+
146
+ def from_orient
147
+ if rid?
148
+ ActiveOrient::Model.autoload_object self
149
+ elsif
150
+ self =~ /^:.*:$/
151
+ self[1..-2].to_sym
152
+ else
153
+ self
154
+ end
155
+ end
156
+
157
+ alias expand from_orient
158
+ # if the string contains "#xx:yy" omit quotes
159
+ def to_orient
160
+ rid? ? "#"+rid : self # return the string (not the quoted string. this is to_or)
161
+ end
162
+
163
+ # a rid is either #nn:nn or nn:nn
164
+ def rid?
165
+ self =~ /\A[#]{,1}[0-9]{1,}:[0-9]{1,}\z/
166
+ end
167
+
168
+ # return a valid rid (format: "nn:mm") or nil
169
+ def rid
170
+ self["#"].nil? ? self : self[1..-1] if rid?
171
+ end
172
+
173
+ def to_classname
174
+ if self[0] == '$'
175
+ self[1..-1]
176
+ else
177
+ self
178
+ end
179
+ end
180
+
181
+ def to_or
182
+ quote
183
+ end
184
+
185
+ def to_a
186
+ [ self ]
187
+ end
188
+
189
+ def quote
190
+ str = self.dup
191
+ if str[0, 1] == "'" && str[-1, 1] == "'"
192
+ self
193
+ else
194
+ last_pos = 0
195
+ while (pos = str.index("'", last_pos))
196
+ str.insert(pos, "\\") if pos > 0 && str[pos - 1, 1] != "\\"
197
+ last_pos = pos + 1
198
+ end
199
+ "'#{str}'"
200
+ end
201
+ end
202
+
203
+ def coerce a #nodoc#
204
+ nil
205
+ end
206
+
207
+ def to_human
208
+ self
209
+ end
210
+ end
211
+
212
+ class Hash #WithIndifferentAccess
213
+
214
+ # converts "abc" => {anything} to :abc => {anything}
215
+ # converts "nn" => {anything} to nn => {anything}
216
+ def to_orient # converts hast from activeorient to db
217
+ substitute_hash = {} # HashWithIndifferentAccess.new
218
+ # puts "here to hash"
219
+ #keys.each{|k| puts self[k].inspect}
220
+ keys.each do |k|
221
+ orient_k = case k
222
+ when Numeric
223
+ k
224
+ when Symbol, String
225
+ k.to_s
226
+ else
227
+ nil
228
+ end
229
+ substitute_hash[orient_k] = self[k].to_orient
230
+ end
231
+ substitute_hash
232
+ end
233
+
234
+ def from_orient # converts hash from db to activeorient
235
+ #puts "here hash.from_orient --> #{self.inspect}"
236
+ if keys.include?("@class" )
237
+ ActiveOrient::Model.orientdb_class( name: self["@class"] ).new self
238
+ else
239
+ substitute_hash = Hash.new
240
+ keys.each do |k|
241
+ orient_k = if k.to_s.to_i.to_s == k.to_s
242
+ k.to_i
243
+ else
244
+ k.to_sym
245
+ end
246
+
247
+ substitute_hash[orient_k] = self[k].from_orient
248
+ end
249
+ substitute_hash
250
+ end
251
+ end
252
+
253
+ # converts a hash to a string appropiate to include in raw queries
254
+ def to_or
255
+ "{ " + to_orient.map{|k,v| "#{k.to_s.to_or}: #{v.to_or}"}.join(',') + "}"
256
+ end
257
+ ## needs testing!!
258
+ # def as_json o=nli
259
+ # #puts "here hash"
260
+ # substitute_hash = Hash.new
261
+ # keys.each{|k| substitute_hash[k] = self[k].as_json}
262
+ # substitute_hash
263
+ # end
264
+ # def nested_under_indifferent_access
265
+ # HashWithIndifferentAccess.new self
266
+ # self
267
+ # end
268
+ end
269
+
270
+ #class RecordList
271
+ # def from_orient
272
+ # map &:from_orient
273
+ # end
274
+ #end
275
+ if RUBY_PLATFORM == 'java'
276
+
277
+ ## JavaMath:.BigDecimal does not premit mathematical operations
278
+ ## We convert it to RubyBigDecimal to represent it (if present in the DB) and upon loading from the DB
279
+
280
+ class Java::JavaMath::BigDecimal
281
+ def to_f
282
+ BigDecimal.new self.to_s
283
+ end
284
+
285
+ def from_orient
286
+ BigDecimal.new self.to_s
287
+ end
288
+
289
+ end
290
+ class Java::ComOrientechnologiesOrientCoreDbRecordRidbag::ORidBag
291
+ def from_orient
292
+ to_a.from_orient
293
+ end
294
+ end
295
+
296
+ class Java::ComOrientechnologiesOrientCoreDbRecord::OTrackedList
297
+ # class RecordList
298
+ # Basisklasse
299
+ # Java::ComOrientechnologiesOrientCoreDbRecord::ORecordLazyList
300
+ # Methode get(Index): gibt das Dokument (Java::ComOrientechnologiesOrientCoreRecordImpl::ODocument) zurück
301
+ ## base = ActiveOrient::Model::Base.first
302
+ ## base.document.first_list
303
+ # => #<OrientDB::RecordList:[#21:0, #22:0, #23:0, #24:0, #21:1, #22:1, #23:1, #24:1, #21:2, #22:2]>
304
+ ## base.first_list.get(3)
305
+ # => <OrientDB::Document:first_list:#24:0 second_list:#<OrientDB::RecordList:[#27:17, #28:17, #25:18, #26:18, #27:18, #28:18, #25:19, #26:19, #27:19, #28:19]> label:3>
306
+ ## base.first_list[3]
307
+ # => #<ActiveOrient::Model::FirstList:0x18df26a1 (...)
308
+ ## base.first_list[3].second_list[5]
309
+ # => #<ActiveOrient::Model::SecondList: (...)
310
+ ## base.first_list.get(3).second_list.get(5)
311
+ # => <OrientDB::Document:second_list:#28:18 label:5>
312
+ #
313
+ def from_orient
314
+ map &:from_orient
315
+ self
316
+ end
317
+ def to_orient
318
+ self
319
+ end
320
+
321
+ #def add value
322
+ # puts "ASDSD"
323
+ #end
324
+ #
325
+ def to_a
326
+ super.map &:from_orient
327
+ end
328
+ def first
329
+ super.from_orient
330
+ end
331
+ def last
332
+ super.from_orient
333
+ end
334
+ def [] val
335
+ super.from_orient
336
+
337
+ end
338
+
339
+ def << value
340
+ #put "I will perform the insert"
341
+ value = value.document if value.is_a?( ActiveOrient::Model ) && value.document.present?
342
+ add value
343
+ #save
344
+
345
+ end
346
+ end
347
+
348
+ class Java::ComOrientechnologiesOrientCoreDbRecord::OTrackedMap
349
+ def from_orient
350
+
351
+ # puts self.inspect
352
+ # puts self.keys.inspect
353
+ HashWithIndifferentAccess.new(self)
354
+ # Kernel.exit
355
+ # map &:from_orient
356
+ # to_a.from_orient
357
+ end
358
+
359
+ end
360
+ class Java::JavaUtil::Date
361
+ def from_orient
362
+ Date.new(year+1900, month+1, date )
363
+ end
364
+ def to_orient
365
+ self
366
+ end
367
+ end
368
+
369
+
370
+ end
371
+
@@ -0,0 +1,68 @@
1
+
2
+ module ActiveOrient
3
+ class Railtie < Rails::Railtie
4
+ puts "Railtie included!!"
5
+ initializer 'active_orient.logger' do
6
+ ActiveSupport.on_load(:active_orient) do
7
+ ActiveOrient::Base.logger = Rails.logger
8
+ ActiveOrient::OrientDB.logger = Rails.logger
9
+ #self.logger ||= Rails.logger
10
+ end
11
+ end
12
+
13
+
14
+ initializer 'active_orient.initialize_database_access' do
15
+ # config.active_orient = ActiveSupport::OrderedOptions.new
16
+ begin
17
+ config_file = Rails.root.join('config', 'config.yml')
18
+ configyml = YAML.load_file( config_file )[:active_orient]
19
+ connect_file = Rails.root.join('config', 'connect.yml')
20
+ connectyml = YAML.load_file( connect_file )[:orientdb][:admin]
21
+ databaseyml = YAML.load_file( connect_file )[:orientdb][:database]
22
+ rescue Errno::ENOENT => e
23
+ Rails.logger.error{ "config/connect.yml/config.yml not present" }
24
+ puts "config/***yml not present"
25
+ Rails.logger.error{ "Using defaults to connect database-server" }
26
+ puts "Using defaults to connect database-server"
27
+ end
28
+ ## Rails.root is a Pathname, as well as model_dir
29
+ ActiveOrient::Model.model_dir = Rails.root.join configyml.present? ? configyml[:model_dir] : "app/model"
30
+
31
+ # set the database
32
+ ActiveOrient.database = databaseyml[Rails.env.to_sym] || 'temp'
33
+
34
+ # don't allocate models if no file is provided
35
+ ActiveOrient::Model.keep_models_without_file = false
36
+
37
+ if connectyml.present? and connectyml[:user].present? and connectyml[:pass].present?
38
+ ActiveOrient.default_server= { user: connectyml[:user], password: connectyml[:pass] ,
39
+ server: 'localhost', port: 2480 }
40
+ end
41
+ ActiveOrient::Init.define_namespace namespace: :object
42
+ ::DB = ::ORD = ActiveOrient::OrientDB.new preallocate: true
43
+
44
+ end
45
+
46
+ # We're not doing migrations (yet)
47
+ config.send(:app_generators).orm :active_orient, migration: false
48
+ console do
49
+ Rails.logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
50
+ puts '_'*45
51
+ puts "ORD points to the REST-Instance, Database: #{ActiveOrient.database}"
52
+ puts "DB is the API-Instance of the database, DB.db gets the DB-Api-base " if RUBY_PLATFORM == 'java'
53
+
54
+ puts '-'* 45
55
+ ns= case ActiveOrient::Model.namespace
56
+ when Object
57
+ "No Prefix, just ClassName#CamelCase"
58
+ else
59
+ ActiveOrient::Model.namespace.to_s + "{ClassName.camelcase}"
60
+ end
61
+ puts "Namespace for model-classes : #{ns}"
62
+ puts "Present Classes (Hierarchy) "
63
+
64
+ puts ::ORD.class_hierarchy.to_yaml
65
+ puts ActiveOrient::show_classes
66
+ end
67
+ end
68
+ end