active-orient 0.42 → 0.79

Sign up to get free protection for your applications and to get access to all the features.
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,154 @@
1
+ # Active Orient and Rails
2
+
3
+ The usage of Orientdb via ActiveOrient in Rails requires just a few steps.
4
+ Based on a Rails 5 installation
5
+
6
+ ```ruby
7
+ rvm install 2.4
8
+ rvm use 2.4
9
+ gem install bundler
10
+ gem install nokogiri
11
+ gem install rails
12
+ rails -v # Rails 5.0.1
13
+
14
+ ```
15
+
16
+ create your working directory and initialize the system
17
+
18
+ ```ruby
19
+ mkdir rails_project; cd rails_project
20
+ rails new -OCT .
21
+ ```
22
+ This initializes a Rails-Stack, without active-record, action-cable and the test-suite.
23
+ (We will use rspec later)
24
+
25
+ This can be checked by inspecting «/config/application.rb «
26
+
27
+ ```ruby
28
+ rails s puma
29
+ ```
30
+ should work at this stage.
31
+
32
+ ## Modify the Gemfile
33
+ Inform rails to use orientdb and active-orient
34
+
35
+ ```
36
+ echo " gem 'active-orient' , :path => '/home/your_cloned_active_orient_path/activeorient' " >> Gemfile
37
+ # or
38
+
39
+ echo " gem 'active-orient' , :git => 'https://github.com/topofocus/active-orient.git' " >> Gemfile
40
+
41
+ ```
42
+
43
+ Run the bundler
44
+
45
+ ```
46
+ bundle install & bundle update
47
+ ```
48
+ ## Copy Initializer and Configuration Files
49
+ change to the base-dir of the gem
50
+ --> bundle show active-orient
51
+ then copy
52
+
53
+ * rails/activeorient.rb to config/initializers in the rails-project dir
54
+ * rails/connect.yml to config in the rails project
55
+ * rails/config.yml to config in the rails project
56
+
57
+ and modify the yml-files accordingly.
58
+ (Depending on your settings, you might have to adjust tab-levels)
59
+
60
+
61
+ The database is present in the rails console, and
62
+ ```ruby
63
+ rails c
64
+ puts ActiveOrient:show_classes
65
+
66
+ V.count
67
+ V.first
68
+ E.count
69
+
70
+ ```
71
+ should display details.
72
+
73
+
74
+ **Notice** The spring-facility is running in the background. Stop the server prior reloading
75
+ the console ( ./bin/spring stop ).
76
+
77
+ ## Model-files
78
+ The final step is to generate Model-Files.
79
+
80
+ In «/config/config.yml» the «:model_dir»-var points to
81
+ the location of the model-files. The default is 'lib/orient'. Change to your needs.
82
+ Don't use the app directory, as its autoloaded too early.
83
+
84
+ Upon startup, present model-classes are destroyed and overridden by present files in the autoload directory.
85
+
86
+ After envoking the rails console, the logfile displays sucessfully loaded and missing files, ie.
87
+
88
+ ```
89
+ 14.01.(08:28:45) INFO->ModelClass#RequireModelFile:..:model-file not present: /home/topo/workspace/orient-rails/lib/orient/followed_by.rb
90
+ 14.01.(08:28:45) INFO->ModelClass#RequireModelFile:..:/home/topo/workspace/orient-rails/lib/orient/v.rb sucessfully loaded
91
+ ```
92
+
93
+ ## Model-file Example
94
+
95
+ To query the GratefulDeadConcerts Database, «v.rb» hosts the essential model methods.
96
+ As always, use «def self.{method}« for class methods and simply «def {method}» for methods working on the record level.
97
+
98
+ ```
99
+ 1 class V
100
+ 2 def self.artists **attributes
101
+ 3 names 'artist', **attributes
102
+ 4 end
103
+ 5
104
+ 6 def self.songs **attributes
105
+ 7 names 'song', **attributes
106
+ 8 end
107
+ 9
108
+ 10 def self.types
109
+ 11 oo = OrientSupport::OrientQuery
110
+ 12 this_query = oo.new distinct: [:type, :a ] # --> "select distinct( type ) as a "
111
+ 13 query_database( this_query ).a # returns an array of types, i.e. ["artist", "song"]
112
+ 14 end
113
+ 15 private
114
+ 16 def self.names type, sort: :asc, limit: 20, skip: 0
115
+ 17 puts "in names"
116
+ 18 oo = OrientSupport::OrientQuery
117
+ 19 query_database oo.new( where: {type: type },
118
+ 20 order: { name: sort } ,
119
+ 21 limit: limit ,
120
+ 22 skip: skip )
121
+ 23 end
122
+ 24 end
123
+
124
+ ```
125
+
126
+ Now
127
+
128
+ ```ruby
129
+ V.types
130
+ V.artists limit: 15, skip: 34, sort: :desc
131
+ ```
132
+ queries the database, fetches 15 artists.
133
+
134
+ ## Routing
135
+
136
+ for now, restful routing has some restrictions.
137
+
138
+ Rails-routing is depending on the "id"-attribute. Even if this is remapped to rid, the ressources-entries in "config/routes.rb" have to be modified by
139
+
140
+ ```ruiby
141
+ resources :{controller}, id: /[^\/]+/
142
+ ```
143
+ this enables the usage of id: "xx:yy"
144
+
145
+ In the controller the record is fetched as usual:
146
+ ```ruby
147
+ def show
148
+ @{your coice} = {ActiveOrient-Model-Class}.autoload_object params[:id]
149
+ end
150
+ ```
151
+
152
+
153
+
154
+
@@ -0,0 +1,32 @@
1
+
2
+ ## This is an init-script intented to be copied to
3
+ ## rails-root/config/initializers
4
+
5
+ ## Integrate a namespaced model
6
+ #module HC
7
+ #
8
+ #end
9
+ #
10
+ #Hc = HC
11
+ #ActiveOrient::Model.keep_models_without_file = false
12
+ #ActiveOrient::Init.define_namespace { HC }
13
+ #ActiveOrient::OrientDB.new preallocate: true
14
+ #
15
+ # class ActiveOrient::Model
16
+ # def self.namespace_prefix
17
+ # ""
18
+ # end
19
+ # end
20
+ #
21
+ # At the end: include everything which is not yet allocated to some namespaced model
22
+ ActiveOrient::Init.connect
23
+ ActiveOrient::Model.keep_models_without_file = true
24
+
25
+ ActiveOrient::OrientDB.new preallocate: true
26
+
27
+
28
+
29
+
30
+
31
+
32
+
@@ -0,0 +1,10 @@
1
+ ---
2
+ :active_orient:
3
+ ## Namespace: Prefix of Model-Objects. :self -> ActiveOrient::Model::{name}
4
+ ## :object => No Prefix
5
+ ## :active_orient => ActiveOrient::{name}
6
+ :namespace: :object
7
+ ## model_dir: Path to model-files relative to the root of the application
8
+ ## ie. app/model or model
9
+ :model_dir: 'lib/orient'
10
+
@@ -0,0 +1,17 @@
1
+ ---
2
+ :orientdb:
3
+ :server: localhost # 172.28.50.109
4
+ :port: 2480
5
+ :logger: stdout # 'file' or 'stdout'
6
+ :database:
7
+ :development: GratefulDeadConcerts
8
+ :production: hcn_data
9
+ :test: temp
10
+ :admin:
11
+ :user: root
12
+ :pass: root
13
+ :auth:
14
+ :user: root
15
+ :pass: root
16
+
17
+ # hfx: 101
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active-orient
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.42'
4
+ version: '0.79'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hartmut Bischoff
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-01-02 00:00:00.000000000 Z
11
+ date: 2019-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,31 +42,45 @@ dependencies:
42
42
  name: activesupport
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '4.2'
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '4.2'
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activemodel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rest-client
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - "~>"
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
- version: '1.8'
75
+ version: '0'
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - "~>"
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
- version: '1.8'
69
- description: Persistent ORM for OrientDB, based on ActiveModel
82
+ version: '0'
83
+ description: Persistent ORM for OrientDB(V.3), based on ActiveModel. Rails 5 compatible
70
84
  email:
71
85
  - topofocus@gmail.com
72
86
  executables: []
@@ -80,23 +94,51 @@ files:
80
94
  - LICENSE
81
95
  - README.md
82
96
  - VERSION
83
- - active-orient-0.4.gem
84
- - active-orient-0.41.gem
85
97
  - active-orient.gemspec
98
+ - bin/active-orient-0.6.gem
99
+ - bin/active-orient-console
86
100
  - config/boot.rb
101
+ - config/config.yml
87
102
  - config/connect.yml
88
103
  - examples/books.rb
89
104
  - examples/streets.rb
105
+ - examples/test_commands.rb
106
+ - examples/test_commands_2.rb
107
+ - examples/test_commands_2.rb~
108
+ - examples/test_commands_3.rb
109
+ - examples/test_commands_4.rb
110
+ - examples/time_graph.md
90
111
  - lib/active-orient.rb
91
112
  - lib/base.rb
92
113
  - lib/base_properties.rb
93
- - lib/model.rb
94
- - lib/orient.rb
95
- - lib/query.rb
96
- - lib/rest.rb
97
- - lib/support.rb
98
- - test.rb
99
- - usecase.md
114
+ - lib/class_utils.rb
115
+ - lib/database_utils.rb
116
+ - lib/init.rb
117
+ - lib/java-api.rb
118
+ - lib/jdbc.rb
119
+ - lib/model/custom.rb
120
+ - lib/model/edge.rb
121
+ - lib/model/model.rb
122
+ - lib/model/the_class.rb
123
+ - lib/model/the_record.rb
124
+ - lib/model/vertex.rb
125
+ - lib/orientdb_private.rb
126
+ - lib/other.rb
127
+ - lib/railtie.rb
128
+ - lib/rest/change.rb
129
+ - lib/rest/create.rb
130
+ - lib/rest/delete.rb
131
+ - lib/rest/operations.rb
132
+ - lib/rest/read.rb
133
+ - lib/rest/rest.rb
134
+ - lib/rest_disabled.rb
135
+ - lib/support/logging.rb
136
+ - lib/support/orient.rb
137
+ - lib/support/orientquery.rb
138
+ - rails.md
139
+ - rails/activeorient.rb
140
+ - rails/config.yml
141
+ - rails/connect.yml
100
142
  homepage: https://github.com/topofocus/active-orient
101
143
  licenses:
102
144
  - MIT
@@ -109,16 +151,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
151
  requirements:
110
152
  - - ">="
111
153
  - !ruby/object:Gem::Version
112
- version: 2.2.0
154
+ version: '2.5'
113
155
  required_rubygems_version: !ruby/object:Gem::Requirement
114
156
  requirements:
115
157
  - - ">="
116
158
  - !ruby/object:Gem::Version
117
159
  version: '0'
118
160
  requirements: []
119
- rubyforge_project:
120
- rubygems_version: 2.4.6
161
+ rubygems_version: 3.0.1
121
162
  signing_key:
122
163
  specification_version: 4
123
- summary: Pure ruby client for OrientDB based on ActiveModel
164
+ summary: Pure ruby client for OrientDB(V.3) based on ActiveModel
124
165
  test_files: []
Binary file
Binary file
@@ -1,468 +0,0 @@
1
- class String
2
- def to_or
3
- "'#{self}'"
4
- end
5
- end
6
-
7
- class Numeric
8
- def to_or
9
- "#{self.to_s}"
10
- end
11
- end
12
- module ActiveOrient
13
-
14
- #require 'base'
15
- #require 'base_properties'
16
-
17
- class Model < ActiveOrient::Base
18
- include BaseProperties
19
-
20
- mattr_accessor :orientdb
21
- mattr_accessor :logger
22
- =begin
23
- orientdb_class is used to instantiate a ActiveOrient:Model:{class} by providing its name
24
- todo: implement object-inherence
25
- =end
26
- def self.orientdb_class name:
27
- klass = Class.new( self )
28
- name = name.to_s.camelize
29
- if self.send :const_defined?, name
30
- retrieved_class = self.send :const_get, name
31
- else
32
- new_class = self.send :const_set , name , klass
33
- new_class.orientdb = orientdb
34
- new_class # return_value
35
- end
36
- rescue NameError => e
37
- logger.error "Model:: Class name cannot be initialized"
38
- puts "klass: #{klass.inspect}"
39
- puts "name : #{name.inspect}"
40
- puts e.inspect
41
- end
42
-
43
- =begin
44
- ActiveOrient::Model.autoload_object "#00:00"
45
- either retrieves the object from the rid_store or loads it from the DB
46
-
47
- the rid_store is updated!
48
-
49
- to_do: fetch for version in the db and load the object if a change is detected
50
- =end
51
- def self.autoload_object link
52
- # puts "autoload_object #{link}"
53
- link_cluster_and_record = link[1,link.size].split(':').map &:to_i
54
- @@rid_store[link_cluster_and_record].presence || orientdb.get_document( link )
55
- end
56
-
57
-
58
- def self.superClass
59
- orientdb.get_classes( 'name', 'superClass').detect{|x| x["name"].downcase == new.class.to_s.downcase.split(':')[-1].to_s
60
- }['superClass']
61
- end
62
-
63
- def to_orient
64
- link
65
- end
66
- def from_orient
67
- self
68
- end
69
- =begin
70
- Returns just the name of the Class
71
- =end
72
- def classname
73
- self.class.to_s.split(':')[-1]
74
- end
75
-
76
- =begin
77
- If a Rest::Model-Object is included in a HashWidhtIndifferentAccess-Object, only the link is stored
78
- =end
79
- def nested_under_indifferent_access # :nodoc:
80
- link
81
- end
82
-
83
- # hard-coded orientdb-columns
84
- # prop :cluster, :version, :record, :fieldtypes
85
-
86
- # def default_attributes
87
- # super.merge cluster: 0
88
- # super.merge version: 0
89
- # super.merge record: 0
90
- # end
91
- def riid # :nodoc:
92
- [ @metadata[ :cluster ] , @metadata[ :record ] ]
93
- end
94
- =begin
95
- rid is used in the where-part of sql-queries
96
- =end
97
- def rid
98
- "#{@metadata[ :cluster ]}:#{@metadata[ :record ]}"
99
- rescue
100
- "0:0"
101
- end
102
- =begin
103
- link is used in any sql-commands
104
- eg . update #link set ...
105
- =end
106
- def link
107
- "##{rid}"
108
- end
109
-
110
-
111
- # def method_missing method, *args, &b
112
- # property= orientdb.get_class_properties( classname )['properties'].detect{|x| x.has_value? method.to_s }
113
- # puts "method_missing::property"
114
- # puts property.inspect
115
- # if property.present?
116
- # if property['type'] == 'LINKSET'
117
- # attributes[method] = OrientSupport::Array.new( self )
118
- # else
119
- # attributes[method] = ''
120
- # end
121
- # else
122
- # raise NoMethodError
123
- # end
124
- # end
125
- =begin
126
- Queries the database and fetches the count of datasets
127
-
128
- Any parameter that qualifies a database-query is suppoerted
129
- (see method get_documents)
130
- =end
131
- def self.count **args
132
- orientdb.count_documents from: self , **args
133
- end
134
- =begin
135
- Creates a new Instance of the Class with the applied attributes
136
- and returns the freshly instantiated Object
137
- =end
138
-
139
- def self.create properties = {}
140
- orientdb.create_or_update_document self, set: properties
141
- end
142
-
143
- def self.update_or_create set: {}, where:{} ,**args, &b
144
- orientdb.update_or_create_documents self , set: set, where: where , **args , &b
145
-
146
- end
147
-
148
- # historic method
149
- def self.new_document attributes: {} # :nodoc:
150
- orientdb.create_or_update_document self, set: attributes
151
- end
152
- =begin
153
- Create a Property in the Schema of the Class
154
- :call-seq:
155
- self.create_property( field (required) , type: 'string', linked_class: nil, index: nil) do
156
- index
157
- end
158
- =end
159
-
160
- def self.get_properties
161
- object = orientdb.get_class_properties self
162
- {:properties => object['properties'] , :indexes => object['indexes'] }
163
- end
164
-
165
- def self.create_property field, **keyword_arguments, &b
166
- orientdb.create_property self, field, **keyword_arguments, &b
167
- end
168
-
169
- def self.create_properties argument_hash, &b
170
- orientdb.create_properties self, argument_hash, &b
171
- end
172
-
173
- def self.create_link name, class_name
174
- orientdb.create_property self, name, type: 'link', linked_class: class_name
175
- end
176
- def self.create_linkset name, class_name
177
- orientdb.create_property self, name, type: 'linkset', linked_class: class_name
178
- end
179
- =begin
180
- Only if the Class inherents from »E«
181
- Instantiate a new Edge betwen two Vertices
182
-
183
- Parameter: unique: (true) In case of an existing Edge just update its Properties.
184
- The parameters »from« and »to« can take a list of model-records. Then subsequent edges are created.
185
- :call-seq:
186
- self.create_edge from: , to: , unique: false, attributes:{}
187
- =end
188
- def self.create_edge **keyword_arguments
189
- o=orientdb.nexus_edge self, **keyword_arguments
190
- [:from,:to].each{|y| keyword_arguments[y].is_a?(Array) ? keyword_arguments[y].each( &:reload! ): keyword_arguments[y].reload! }
191
- o # return_value
192
- end
193
- =begin
194
- QueryDatabase sends the Query, direct to the database.
195
- The result is not nessessary a Object of self.
196
- However, if the query does not return an array of Active::Model-Objects, then the entries become self
197
- =end
198
- def self.query_database query, set_from: true
199
- query.from self if set_from && query.is_a?( OrientSupport::OrientQuery ) && query.from.nil?
200
- sql_cmd = -> (command) { { type: "cmd", language: "sql", command: command } }
201
- orientdb.execute( self.to_s.split(':')[-1] ) do
202
- [ sql_cmd[ query.to_s ] ]
203
- end
204
- end
205
- def query q
206
- a= ActiveOrient::Query.new
207
- a.queries << q
208
- a.execute_queries
209
- end
210
- =begin
211
- Parameter projection:
212
-
213
- »select« is a method of enumeration, we use »projection:« to specify anything between »select« and »from«
214
- in the query-string.
215
-
216
- projection: a_string --> inserts the sting as it appears
217
- an OrientSupport::OrientQuery-Object --> performs a sub-query and uses the result for further querying though the given parameters.
218
-
219
- [ a, b, c ] --> "a , b , c " ( inserts a comma-separated list )
220
-
221
- { a: b, "sum(x) "=> f } --> "a as b, sum(x) as f" (renames properties and uses functions )
222
- Parameter distinct:
223
-
224
- Performs a Query like » select distinct( property ) [ as property ] from ...«
225
-
226
- distinct: :property --> the result is mapped to the property »distinct«.
227
-
228
- [ :property ] --> the result replaces the property
229
-
230
- { property: :some_name} --> the result is mapped to ModelInstance.some_name
231
-
232
- Parameter Order
233
-
234
- Sorts the result-set.
235
-
236
- If new properties are introduced via select:, distinct: etc
237
-
238
- Sorting takes place on these properties
239
-
240
- order: :property
241
- { property: asc, property: desc }
242
- [property, property, .. ] ( orderdirection is 'asc' )
243
-
244
-
245
- Further supported Parameter:
246
- group_by
247
- skip
248
- limit
249
- unwind
250
-
251
- see orientdb- documentation (https://orientdb.com/docs/last/SQL-Query.html)
252
-
253
- Parameter query:
254
- Instead of providing the parameter, the OrientSupport::OrientQuery can build and
255
- tested before the method-call. The OrientQuery-Object can be provided with the query-parameter
256
- i.e.
257
- q= OrientSupport::OrientQuery.new
258
- TestModel = r.open_class 'test_model'
259
- q.from TestModel
260
- q.where { name: 'Thomas' }
261
-
262
- count= TestModel.count query:q
263
- q.limit 10
264
- 0.step(count,10) do |x|
265
- q.skip = x
266
- puts TestModel.get_documents( query: q ).map{|x| x.adress }.join('\t')
267
- end
268
- prints a Table with 10 columns.
269
- =end
270
-
271
- def self.get_documents **args
272
- orientdb.get_documents( from: self, **args ){ self }
273
-
274
- end
275
- =begin
276
- Performs a query on the Class and returns an Array of ActiveOrient:Model-Records.
277
-
278
- Example:
279
- Log = r.open_class 'Log'
280
- Log.where priority: 'high'
281
- --> submited database-request: query/hc_database/sql/select from Log where priority = 'high'/-1
282
- => [ #<ActiveOrient::Model::Log:0x0000000480f7d8 @metadata={ ... }, ... ]
283
-
284
-
285
- =end
286
- def self.where attributes = {}
287
- q = OrientSupport::OrientQuery.new where: attributes
288
- query_database q
289
- end
290
- =begin
291
-
292
- removes the Model-Instance from the database
293
-
294
- returns true (successfully deleted) or false ( obj not deleted)
295
- =end
296
- def delete
297
-
298
- r= if is_edge?
299
- # returns the count of deleted edges
300
- orientdb.delete_edge rid
301
- else
302
- orientdb.delete_document rid
303
- end
304
- ActiveOrient::Base.remove_riid self if r # removes the obj from the rid_store
305
- r # true or false
306
- end
307
- =begin
308
- An Edge is defined
309
- * when inherented from the superclass »E» (formal definition)
310
- * if it has an in- and an out property
311
-
312
- Actually we just check the second term as we trust the constuctor to work properly
313
- =end
314
- def is_edge?
315
- attributes.keys.include?( 'in') && attributes.keys.include?('out')
316
- end
317
- # get enables loading of datasets if a link is followed
318
- # model_class.all.first.link.get
319
- def self.get rid
320
- orientdb.get_document rid
321
- end
322
- def self.all
323
- orientdb.get_documents from: self
324
- end
325
- def self.first where: {}
326
- orientdb.get_documents( from: self, where: where, limit: 1).pop
327
- end
328
-
329
- def self.last where: {}
330
- # debug:: orientdb.get_documents( self, order: { "@rid" => 'desc' }, limit: 1 ){ |x| puts x }.pop
331
- orientdb.get_documents( from: self, where: where, order: { "@rid" => 'desc' }, limit: 1 ).pop
332
- end
333
- =begin
334
- Convient update of the dataset by calling sql-patch
335
- The attributes are saved to the database.
336
- With the optional :set argument ad-hoc attributes can be defined
337
- obj = ActiveOrient::Model::Contracts.first
338
- obj.name = 'new_name'
339
- obj.update set: { yesterdays_event: 35 }
340
- =end
341
- def update set: {}
342
- attributes.merge!( set ) if set.present?
343
- result= orientdb.patch_document(rid) do
344
- attributes.merge( { '@version' => @metadata[ :version ], '@class' => @metadata[ :class ] } )
345
- end
346
- # returns a new instance of ActiveOrient::Model
347
- reload! ActiveOrient::Model.orientdb_class(name: classname).new( JSON.parse( result ))
348
- # instantiate object, update rid_store and reassign to self
349
-
350
- end
351
- =begin
352
- Overwrite the attributes with Database-Contents (or attributes provided by the updated_dataset.model-instance)
353
- =end
354
- def reload! updated_dataset=nil
355
- updated_dataset = orientdb.get_document( link) if updated_dataset.nil?
356
- @metadata[:version]= updated_dataset.version
357
- attributes = updated_dataset.attributes
358
- self # return_value (otherwise only the attributes would be returned)
359
- end
360
-
361
- def remove_item_from_property array, item=nil
362
- logger.progname = 'ActiveOrient::Model#RemoveItemFromProperty'
363
- execute_array = Array.new
364
- return unless attributes.has_key? array
365
- remove_execute_array = -> (it) do
366
- case it
367
- when ActiveOrient::Model
368
- execute_array << {type: "cmd", language: "sql", command: "update #{link} remove #{array} = #{it.link}"}
369
- when String
370
- execute_array << {type: "cmd", language: "sql", command: "update #{link} remove #{array} = '#{it}'"}
371
- when Numeric
372
- execute_array << {type: "cmd", language: "sql", command: "update #{link} remove #{array} = #{it}"}
373
- else
374
- logger.error { "Only Basic Formats supported . Cannot Serialize #{it.class} this way" }
375
- logger.error { "Try to load the array from the DB, modify it and update the hole record" }
376
- end
377
- end
378
-
379
- if block_given?
380
- items = yield
381
- items.each{|x| remove_execute_array[x]; self.attributes[array].delete( x ) }
382
- elsif item.present?
383
- remove_execute_array[item]
384
- a= attributes; a.delete item
385
- self.attributes[array].delete( item )
386
- end
387
- orientdb.execute do
388
- execute_array
389
- end
390
- reload!
391
-
392
- rescue RestClient::InternalServerError => e
393
- logger.error " Could not remove item in #{array} "
394
- logger.error e.inspect
395
- end
396
-
397
- =begin
398
- Convient method for populating embedded- or linkset-properties
399
-
400
- In both cases an array/ a collection is stored in the database.
401
-
402
- its called via
403
- model.add_item_to_property( linkset- or embedded property, Object_to_be_linked_to )
404
- or
405
- mode.add_items_to_property( linkset- or embedded property ) do
406
- Array_of_Objects_to_be_linked_to
407
- (actually, the objects must inherent from ActiveOrient::Model, Numeric, String)
408
- end
409
-
410
- to_do: use "<<" to add the item to the property
411
- =end
412
- def add_item_to_property array, item=nil
413
- logger.progname = 'ActiveOrient::Model#AddItem2Property'
414
- execute_array = Array.new
415
- self.attributes[array] = Array.new unless attributes[array].present?
416
- add_2_execute_array = -> (it) do
417
- case it
418
- when ActiveOrient::Model
419
- execute_array << {type: "cmd", language: "sql", command: "update #{link} add #{array} = #{it.link}"}
420
- when String
421
- execute_array << {type: "cmd", language: "sql", command: "update #{link} add #{array} = '#{it}'"}
422
- when Numeric
423
- execute_array << {type: "cmd", language: "sql", command: "update #{link} add #{array} = #{it}"}
424
- else
425
- logger.error { "Only Basic Formats supported . Cannot Serialize #{it.class} this way" }
426
- logger.error { "Try to load the array from the DB, modify it and update the hole record" }
427
- end
428
- end
429
-
430
- if block_given?
431
- items = yield
432
- items.each{|x| add_2_execute_array[x]; self.attributes[array] << x }
433
- elsif item.present?
434
- add_2_execute_array[item]
435
- self.attributes[array] << item
436
- end
437
- orientdb.execute do
438
- execute_array
439
- end
440
- reload!
441
-
442
- rescue RestClient::InternalServerError => e
443
- logger.error " Duplicate found in #{array} "
444
- logger.error e.inspect
445
- end
446
-
447
- alias add_items_to_property add_item_to_property
448
- ## historical aliases
449
- alias update_linkset add_item_to_property
450
- alias update_embedded add_item_to_property
451
- =begin
452
- Convient method for updating a linkset-property
453
- its called via
454
- model.update_linkset( linkset-property, Object_to_be_linked_to )
455
- or
456
- mode.update_linkset( linkset-property ) do
457
- Array_of_Objects_to_be_linked_to
458
- end
459
- =end
460
-
461
- #private
462
- def version
463
- @metadata[ :version ]
464
- end
465
-
466
- end # class
467
-
468
- end # module