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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ed8d14a983f8e3d067830ef41396d2cef289b46b
4
- data.tar.gz: f848a337d6b4cd07e591d902402547f1f225b01f
2
+ SHA256:
3
+ metadata.gz: 7aeeeec320281d1ed65f73145b3d3008890c3ab46c480b480157cd2cd08dbace
4
+ data.tar.gz: 11d73a72a7510e5e6d8c93677504923141e78dd192ede941e4a042d4225f8dac
5
5
  SHA512:
6
- metadata.gz: 4616d3587af1744fc6047b9aab929ae60911248029c310329c27cc36e3a545ed33c77fbe3d1f90b1b29346bf779dbe643497293d79618d06b3f6f950b6b6c464
7
- data.tar.gz: 56a0f4ead290409aae2fde9e7af73d546cab19b3762d5d64d6bf4215ea23d2f71025c716a959f746a180125cb4c12c2e9cac492efd57ef3e2148c8a517e30a80
6
+ metadata.gz: c88ddae001fbdfbeba888d579235eb84d579f5e61c53591e4ef5cd1802a47c41f9e40d929c6f294a6b11a44f777ea41eb5b8f598342c15d72a2654eb273fc0d2
7
+ data.tar.gz: '0984f9cb17fe34c58047ad1e1144786f17bc5a760e2df883c4a9c8588eebd73cba7933b80d6c4a681c00927a791e986ca99303ae8fb9178c6705c652342b1842'
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ *~
data/Gemfile CHANGED
@@ -1,15 +1,23 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec
3
- gem 'activesupport' , "~>4.2"
4
- gem 'activemodel'
5
- gem 'rest-client' # , :git => 'git://github.com/rest-client/rest-client.git'
6
- gem 'nokogiri', '~> 1.6.6' #, :git => 'git://github.com/sparklemotion/nokogiri.git'
3
+ gem 'activesupport' # , "~>4.2"
4
+ gem 'activemodel' #, "~>4.2"
5
+ #gem 'activemodel-serializers-xml'
6
+ gem 'rest-client' , :git => 'https://github.com/rest-client/rest-client.git'
7
+ #gem 'nokogiri', '~> 1.6.6' #, :git => 'git://github.com/sparklemotion/nokogiri.git'
8
+ #gem 'orientdb' , :path => '/home/topo/orientdb-jruby' , :platforms => :jruby
9
+ gem 'sdoc'
10
+ #gem 'orientdb' , :git => 'git://github.com/topofocus/orientdb-jruby.git', :branch => '2.1.2', :platforms => :jruby
7
11
  group :development, :test do
12
+ gem "awesome_print"
8
13
  gem "rspec"
14
+ gem 'rspec-legacy_formatters'
9
15
  gem 'rspec-its'
16
+ gem 'rspec-given'
10
17
  gem 'rspec-collection_matchers'
11
18
  gem 'rspec-context-private'
12
- gem 'guard'
19
+ # gem 'guard-jruby-rspec', :platforms => :jruby, :git => 'git://github.com/jkutner/guard-jruby-rspec.git'
20
+ gem 'guard'#, :platforms => :ruby
13
21
  gem 'guard-rspec'
14
22
  ## gem 'database_cleaner'
15
23
  gem 'rb-inotify'
data/Guardfile CHANGED
@@ -1,7 +1,6 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
-
4
- guard :rspec, cmd: "bundle exec rspec" do
3
+ def fire
5
4
  require "ostruct"
6
5
 
7
6
  # Generic Ruby apps
@@ -12,10 +11,19 @@ guard :rspec, cmd: "bundle exec rspec" do
12
11
 
13
12
 
14
13
  watch(%r{^spec/.+_spec\.rb$})
15
- watch(%r{^spec/usecase/(.+).rb$})
14
+ # watch(%r{^spec/usecase/(.+)\.rb$})
16
15
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
16
+ # watch(%r{^examples/time_graph/spec/(.+)_spec\.rb$})
17
+ watch('examples/time_graph/spec/create_time_spec.rb')
17
18
  watch('spec/spec_helper.rb') { "spec" }
18
19
 
19
- watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
20
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
20
21
  end
21
22
 
23
+
24
+ interactor :simple
25
+ if RUBY_PLATFORM == 'java'
26
+ guard( 'jruby-rspec') {fire} #', :spec_paths => ["spec"]
27
+ else
28
+ guard( :rspec, cmd: "bundle exec rspec") { fire }
29
+ end
data/README.md CHANGED
@@ -1,325 +1,112 @@
1
1
  # ActiveOrient
2
2
  Use OrientDB to persistently store dynamic Ruby-Objects and use database queries to manage even very large
3
- datasets.
3
+ datasets. **OrientDB Version 3 is required**
4
4
 
5
- The Package ist tested with Ruby 2.2.1 and Orientdb 2.1.
5
+ For changes from Version OrientDB 2.2 -> [Wiki](../..//wiki/Changes-2.2--to------3.0)
6
+ ### Quick Start
6
7
 
8
+ You need a ruby 2.5/2.6 Installation and a working OrientDB-Instance (Version 3.0.17 or above).
7
9
 
8
- To start you need a ruby 2.x Installation and a working OrientDB-Instance.
9
- Install the Gem the usual way
10
-
11
- For a quick start, go to the home directory of the package and start an irb-session
12
-
13
- ```ruby
14
- require 'bundler/setup'
15
- require 'active-orient'
10
+ - clone the project,
11
+ - run bundle install ; bundle update,
12
+ - update config/connect.yml,
13
+ - create the documentation:
14
+ ```
15
+ sdoc . -w2 -x spec -x example
16
+ ```
17
+ and point the browser to ~/active-orient/doc/index.htm
18
+
19
+ - read the [Wiki](./../../wiki/Initialisation)
20
+ - and start an irb-session by calling
16
21
  ```
17
-
18
- First, the Database-Server has to be specified. Then we can connect to a database.
19
- Assuming, the server is located on localhost, we just define »default-server«
20
- ```ruby
21
- ActiveOrient::OrientDB.default_server= { user: 'your user', password: 'your password' }
22
-
23
-
24
- r = ActiveOrient::OrientDB.new database: 'First'
25
- => I, [2015-08-18T09:49:18.858758 #88831] INFO -- OrientDB#Connect: Connected to database First
26
- => #<ActiveOrient::OrientDB:0x000000048d0488 @res=#<RestClient::Resource:0x00000004927288
27
- @url="http://localhost:2480", @block=nil,
28
- @options={:user=>"xx", :password=>"***"}>, @database="First", @classes=[]>
22
+ cd bin
23
+ ./active-orient-console t)est # or d)develpoment, p)roduction environment as defined in config/connect.ym
29
24
  ```
30
25
 
31
- »r« is the Database-Instance itself. Obviously the database is empty.
26
+ ### Philosophy
32
27
 
33
28
 
34
- Let's create some classes
35
-
36
- ```ruby
37
- M = r.open_class 'classname' #
38
- M = r.create_class 'classname' # creates or opens a basic document-class
39
- M = r.create_vertex_class 'classname' # creates or opens a vertex-class
40
- M = r.create_edge_class 'classname' # creates or opens an edge-class, providing bidirectional links between documents
29
+ OrientDB is basicly an Object-Database. It shares the concept of Inheritance with OO-Languages, like Ruby.
30
+
31
+ Upon initialisation `ActiveOrient`reads the complete structure of the database, creates corresponding ruby-classes (including inheritance) and then loads user defined methods from the `Model Directory`. A separate schema definition is not neccessary.
41
32
 
42
- r.delete_class M # universal removal-of-the-class-method
43
- ```
33
+ `ActiveOrient`queries the OrientDB-Database, provides a cache to speed things up and provides handy methods to simplify the work with OrientDB. Like Active-Record it represents the "M" Part of the MCV-Design-Pattern. There is explicit Namespace support. Its philosophie resembles the [Hanami Project](https://github.com/hanami/hanami).
44
34
 
45
35
 
46
- »M« is the ActiveOrient::Model-Class itself, a constant pointing to the class-definition of the ruby-class.
47
- Its a shortcut for »ActiveOrient::Model::{Classname} and is reused if defined elsewhere.
48
36
 
49
- If a schema is used, properties can be created and retrieved as well
50
- ```ruby
51
- r.create_properties( M ) do
52
- { symbol: { propertyType: 'STRING' },
53
- con_id: { propertyType: 'INTEGER' },
54
- details: { propertyType: 'LINK', linkedClass: 'Contracts' }
55
- }
56
37
 
57
- r.get_class_properties M
58
- ```
59
- or
60
- ```ruby
61
- M.create_property 'symbol'
62
- M.create_property 'con_id', type: 'integer'
63
- M.create_property 'details', type: 'link', other_class: 'Contracts'
38
+ #### CRUD
39
+ The CRUD-Process (create, read = query, update and remove) is performed as
40
+ ```ruby
41
+ # create the class
42
+ ORD.create_class :m
43
+ # create a record
44
+ M.create name: 'Hugo', age: 46, interests: [ 'swimming', 'biking', 'reading' ]
45
+ # query the database
46
+ hugo = M.where( name: 'Hugo' ).first
47
+ # update the dataset
48
+ hugo.update father: M.create( name: "Volker", age: 76 ) # we create an internal link
49
+ hugo.father.name # --> volker
50
+ # change array elements
51
+ hugo.interests << "dancing" # --> [ 'swimming', 'biking', 'reading', 'dancing' ]
52
+ M.remove hugo
53
+ M.delete_class # removes the class from OrientDB and deletes the ruby-object-definition
64
54
  ```
55
+
65
56
 
66
57
  #### Active Model interface
67
-
68
- Every OrientDB-Database-Class is mirrord as Ruby-Class. The Class itself is defined by
69
- ```ruby
70
- M = r.create_class 'classname'
71
- M = r.create_class { superclass_name: 'classname' }
72
- Vertex = r.create_vertex_class 'classname'
73
- Edge = r.create_edge_class 'classname'
74
- ```
75
- and is of TYPE ActiveOrient::Model::{classname}
76
58
 
77
- As for ActiveRecord-Tables, the Class itself provides methods to inspect and to filter datasets form the database.
59
+ As for ActiveRecord-Tables, the Model-class itself provides methods to inspect and filter datasets form the database.
78
60
 
79
61
  ```ruby
80
62
  M.all
81
63
  M.first
82
64
  M.last
83
- ```
84
- returns an Array containing all Documents/Edges of the Class; the first and the last Record.
85
- ```ruby
86
- M.where town: 'Berlin'
87
- ```
88
- performs a query on the class and returns the result as Array
65
+ M.where town: 'Berlin'
66
+ M.like "name = G*"
89
67
 
90
- ```ruby
91
68
  M.count where: { town: 'Berlin' }
92
69
  ```
93
- gets the number of datasets fullfilling the search-criteria. Any parameter defining a valid
94
- SQL-Query in Orientdb can be provided to the count, where, first and last-method.
70
+ »count« gets the number of datasets fulfilling the search-criteria. Any parameter defining a valid SQL-Query in Orientdb can be provided to the »count«, »where«, »first« and »last«-method.
95
71
 
96
- A »normal« Query is submitted via
72
+ A »normal« Query is submitted via
97
73
  ```ruby
98
- M.get_documents projection: { projection-parameter }
99
- distinct: { some parameters }
100
- where: { where-parameter }
101
- order: { sorting-parameters }
102
- group_by: { one grouping-parameter}
103
- unwind:
104
- skip:
105
- limit:
74
+ M.get_records projection: { projection-parameter },
75
+ distinct: { some parameters },
76
+ where: { where-parameter },
77
+ order: { sorting-parameters },
78
+ group_by: { one grouping-parameter},
79
+ unwind: ,
80
+ skip: ,
81
+ limit:
106
82
 
107
83
  # or
108
- query = OrientSupport::OrientQuery.new {paramter}
109
- M.get_documents query: query
84
+ query = OrientSupport::OrientQuery.new {paramter}
85
+ M.query_database query
110
86
 
111
87
  ```
112
88
 
113
- Basic graph-support:
114
-
115
-
116
-
89
+ To update several records, a class-method »update_all« is defined.
117
90
  ```ruby
118
- vertex_1 = Vertex.create color: "blue"
119
- vertex_2 = Vertex.create flower: "rose"
120
- Edge.create_edge attributes: { :birthday => Date.today }, from: vertex_1, to: vertex_2
91
+ M.update_all connected: false # add a property »connected» to each record
92
+ M.update_all set:{ connected: true }, where: "symbol containsText 'S'"
121
93
  ```
122
- connects the vertices and assigns the attributes to the edge
123
-
124
-
125
- #### Links
126
-
127
- A record in a database-class is defined by a »rid«. Every Model-Object comes with a handy »link«-method.
128
-
129
- In OrientDB links are used to realise unidirectional 1:1 and 1:n relationships.
130
94
 
131
- ActiveOrient autoloads Model-objects when they are accessed. As a consequence,
132
- if an Object is stored in Cluster 30 and id 2, then "#30:2" fully qualifies the ActiveOrient::Model object.
95
+ Graph-support:
133
96
 
134
97
  ```ruby
135
- TestLinks = r.create_class 'Test_link_class'
136
- TestBase = r.create_class 'Test_base_class'
137
-
138
- link_document = TestLinks.create att: 'one attribute'
139
- base_document = TestBase.create base: 'my_base', single_link: link_document
140
- ```
141
- base_document.single_link just contains the rid. When accessed, the ActiveOrient::Model::Testlinkclass-object is autoloaded and
142
- ``` ruby
143
- base_document.single_link.att
98
+ ORD.create_vertex_class :the_vertex
99
+ ORD.create_edge_class :the_edge
100
+ vertex_1 = TheVertex.create color: "blue"
101
+ vertex_2 = TheVertex.create flower: "rose"
102
+ TheEdge.create_edge attributes: {:birthday => Date.today }, from: vertex_1, to: vertex_2
144
103
  ```
145
- reads the stored content of link_document.
146
-
147
- To store a list of links to other Database-Objects a simple Array is allocated
148
- ``` ruby
149
- # predefined linkmap-properties
150
- base_document = TestBase.create links: []
151
- ( 0 .. 20 ).each{ |y| base_document.links << TestLinks.create nr: y }
152
- end
153
- #or in schemaless-mode
154
- base_document = TestBase.create links: (0..20).map{|y| TestLinks.create nr: y }
104
+ It connects the vertices and assigns the attributes to the edge.
155
105
 
106
+ To query a graph, SQL-like-Queries and Match-statements can be used (see below).
156
107
 
157
- ```
158
- base_document.links behaves like a ruby-array.
159
-
160
- If you got an undirectional graph
108
+ #### Other Documents
161
109
 
162
- a --> b ---> c --> d
110
+ - [Rails 5-Integration](./rails.md)
163
111
 
164
- the graphelements can be explored by joining the objects ( a.b.c.d ), or (a.b[5].c[9].d )
165
112
 
166
- #### Edges
167
-
168
- Edges are easily handled
169
- ```ruby
170
- Vertex = r.create_vertex_class 'd1'
171
- Eedge = r.create_edge_class 'e1'
172
-
173
- start = Vertex.create something: 'nice'
174
- the_end = Vertex.create something: 'not_nice'
175
- the_edge = Edge.create_edge attributes: { transform_to: 'very bad' },
176
- from: start,
177
- to: the_end
178
-
179
- (...)
180
- the_edge.delete
181
- ```
182
-
183
- There is a basic support for traversals throught a graph.
184
- The Edges are accessed by their names (downcase).
185
-
186
- ```ruby
187
- start.e1[0]
188
- --> #<ActiveOrient::Model::E1:0x000000041e4e30
189
- @metadata={"type"=>"d", "class"=>"E1", "version"=>60, "fieldTypes"=>"out=x,in=x",
190
- "cluster"=>16, "record"=>43},
191
- @attributes={"out"=>"#31:23", "in"=>"#31:15", "transform_to"=>"very bad" }>
192
- ```
193
- The Attributes "in" and "out" can be used to move across the graph
194
- ```ruby
195
- start.e1[0].out.something
196
- ---> "not_nice
197
- start.e1[0].in.something
198
- ---> "nice
199
- ```
200
- #### Queries
201
- Contrary to traditional SQL-based Databases OrientDB handles subqueries very efficient.
202
- In addition, OrientDB supports precompiled statements (let-Blocks).
203
-
204
- ActiveOrient is equipped with a simple QueryGenerator: ActiveSupport::OrientQuery.
205
- It works in two modi: a comprehensive and a subsequent one
206
- ```ruby
207
-
208
- q = OrientSupport::OrientQuery.new
209
- q.from = Vertex
210
- q.where << a: 2
211
- q.where << 'b > 3 '
212
- q.distinct = :profession
213
- q.order = { :name => :asc }
214
-
215
- ```
216
- is equivalent to
217
- ```ruby
218
- q = OrientSupport::OrientQuery.new from: Vertex ,
219
- where: [{ a: 2 }, 'b > 3 '],
220
- distinct: :profession,
221
- order: { :name => :asc }
222
- q.to_s
223
- => select distinct( profession ) from Vertex where a = 2 and b > 3 order by name asc
224
- ```
225
- Both modes can be mixed.
226
-
227
- If subqueries are nessesary, they can be introduced as OrientSupport::OrientQuery or as »let-block«.
228
- ```ruby
229
- q = OrientSupport::OrientQuery.new from: 'ModelQuery'
230
- q.let << "$city = adress.city"
231
- q.where = "$city.country.name = 'Italy' OR $city.country.name = 'France'"
232
- q.to_s
233
- => select from ModelQuery let $city = adress.city where $city.country.name = 'Italy' OR $city.country.name = 'France'
234
- ```
235
- or
236
- ```ruby
237
- q = OrientSupport::OrientQuery.new
238
- q.let << { a: OrientSupport::OrientQuery.new( from: '#5:0' ) }
239
- q.let << { b: OrientSupport::OrientQuery.new( from: '#5:1' ) }
240
- q.let << '$c= UNIONALL($a,$b) '
241
- q.projection << 'expand( $c )'
242
- q.to_s
243
- => select expand( $c ) let $a = ( select from #5:0 ), $b = ( select from #5:1 ), $c= UNIONALL($a,$b)
244
- ```
245
-
246
-
247
-
248
-
249
- #### Execute SQL-Commands
250
- Sql-commands can be executed as batch
251
-
252
- The ActiveOrient::Query-Class provides a Query-Stack and an Records-Array which keeps the results.
253
- The ActiveOrient::Query-Class acts as Parent-Class for aggregated Records (without a @rid), which are ActiveOrient::Model::Myquery Objects. If a Query returns a database-record, the correct ActiveOrient::Model-Class is instantiated.
254
-
255
- ```ruby
256
- ach = ActiveOrient::Query.new
257
-
258
- ach.queries << 'create class Contracts ABSTRACT'
259
- ach.queries << 'create property Contracts.subcategory link'
260
- ach.queries << 'create property Contracts.details link'
261
- ach.queries << 'create class Stocks extends Contracts'
262
- ach.queries << 'create class Futures extends Contracts'
263
- result = ach.execute_queries transaction: false
264
-
265
-
266
-
267
- ```
268
- queries the database as demonstrated above. In addition, the generated query itself is added to the »queries«-Stack and the result can be found in sample_query.records.
269
-
270
- This feature can be used as a substitute for simple functions
271
-
272
- ```ruby
273
- roq = ActiveOrient::Query.new
274
- roq.queries =["select name, categories.subcategories.contracts from Industries where name containstext …'ial'"]
275
- roq.execute_queries.each{|x| puts x.name, x.categories.inspect }
276
- --> Basic Materials [["#21:1"]]
277
- --> Financial [["#21:2"]]
278
- --> Industrial [["#23:0", "#23:1"]]
279
- ```
280
-
281
- OrientDB supports the execution of SQL-Batch-Commands.
282
- ( http://orientdb.com/docs/2.0/orientdb.wiki/SQL-batch.html )
283
- This is supported simply by using a Array as Argument for ActiveOrient::Query.queries
284
-
285
- Therefor complex queries can be simplified using database-variables
286
- ```ruby
287
- ach = ActiveOrient::Query.new
288
- ach.queries << [ "select expand( contracts ) from Openinterest"
289
- "let con = select expand( contracts ) from Openinterest; ",
290
- "...", ... ]
291
- result = ach.execute_queries
292
- ```
293
-
294
- The contract-documents are accessible with
295
- ```ruby
296
- r.get_document '21:1'
297
- --><Stocks: con_id: 77680640 currency: EUR details: #18:1 exchange: SMART local_symbol: BAS
298
- primary_exchange: IBIS subcategory: #14:1 symbol: BAS>
299
- ```
300
- or
301
- ```ruby
302
- my_query = ActiveOrient::Query.new
303
- ['Contracts', 'Industries', 'Categories', 'Subcategories'].each do |table|
304
- my_query.queries = [ "select count(*) from #{table}"]
305
-
306
- count = my_query.execute_queries
307
- # count=> [#<ActiveOrient::Model::Myquery:0x00000003b317c8
308
- # @metadata={"type"=>"d", "class"=>nil, "version"=>0, "fieldTypes"=>"count=l"},
309
- # @attributes={"count"=>4 } ] --> an Array with one Element, therefor count.pop
310
- puts "Table #{table} \t #{count.pop.count} Datasets "
311
- end
312
- -->Table Contracts 56 Datasets
313
- -->Table Industries 8 Datasets
314
- -->Table Categories 22 Datasets
315
- -->Table Subcategories 35 Datasets
316
-
317
- ```
318
-
319
- Note that the fetched Object is of type »Stocks« (ActiveOrient::Model::Stocks).
320
-
321
- The ActiveOrient-API documentation can be found here: https://github.com/orientechnologies/orientdb-docs/wiki/OrientDB-ActiveOrient
322
- and the ActiveModel-documentation is here: http://www.rubydoc.info/gems/activemodel
323
-
324
-
325
-