arcadedb 0.4 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1855060886e9837ef486e44f07155ae99cd242f76aceccb8a7bf4c2ab515eca0
4
- data.tar.gz: d99f2a402eba561fcf851a3838b3bec7eee58f1a788ab9fc7e2ce1208c33611a
3
+ metadata.gz: 7d7f1f29472b0fb31734654c9456ec5bdfb31cd42fd46b658139ac840691c6f6
4
+ data.tar.gz: 4c1c95707c8e2c528654f2a7509b1b6943ef9615fe203c81cd421d52636dcac7
5
5
  SHA512:
6
- metadata.gz: 78936dfe0069d531c1bcfd6191f0269ed84a44cd8e0321a37ef9d569048ff8a20d38d0a221d0b0b93f3e64f39d61a758d2978545beec86d27baf5836c3cdbf4a
7
- data.tar.gz: 6ff4e9242c74887935074ed60810b144a08ad2dad7a6d3374bc0216f74873abb6a1b6f66428a2ed6e7fa9f49dec3ee07ebbe5cc64488744829f76eb037db286c
6
+ metadata.gz: f54746f04760ebfbc8c1588e66fb0bb52e820eef83df564e3563e37219835ff86c93e5b3d2e2a7617452218938c30a5aabff099361d0fd829890e2ac83411fc8
7
+ data.tar.gz: 0f8bf3623302c5204ca56552fb41694bfd506c493dc72463b8000e66c82aacddb7f42188f41508c84e9fc5bf93fa78e42e4235ed904982b97d38a4a5c8d4ff40
data/CHANGELOG.md CHANGED
@@ -15,5 +15,19 @@ All notable changes to this project will be documented in this file.
15
15
  ## 0.4.0 - 2023.10.28
16
16
  - completely remove pg-stuff
17
17
  - substitute typhoreous with HTTPX
18
- - include dry::monards to process raw-data
19
18
 
19
+ ## 0.4.1 - 2023.10.31
20
+ - redesign of transactions.
21
+ - Type.execute performs non idempotent queries in a (nested) transaction
22
+ - Type.transmit performs non idempotent queries
23
+ - Type.query performs idempotent queries
24
+ - Type.create returns a rid
25
+ - Type.insert returns a type-object
26
+ - Vertex.nodes supports conditions on edges
27
+ - Vertex.in, Vertex.out Vertex.inE, Vertex.outE support depth as second parameter
28
+ - IRuby-Support. Formatted output for Base-Objects
29
+
30
+ ## 0.5.0 - 2023-12-12
31
+ - Arcade::Match simple match-statement generator
32
+ - return to Arcade::QueryError messages instead of HTTPX::HTTPError
33
+ - The ProjectRoot Const is used to read configuration files (Changed from Arcade::ProjectRoot)
data/Gemfile.lock CHANGED
@@ -1,10 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- arcadedb (0.4)
4
+ arcadedb (0.4.1)
5
5
  dry-configurable
6
6
  dry-core
7
- dry-monads
8
7
  dry-schema
9
8
  dry-struct
10
9
  httpx
@@ -12,9 +11,7 @@ PATH
12
11
  GEM
13
12
  remote: https://rubygems.org/
14
13
  specs:
15
- ast (2.4.2)
16
14
  awesome_print (1.9.2)
17
- base64 (0.1.1)
18
15
  coderay (1.1.3)
19
16
  concurrent-ruby (1.2.2)
20
17
  diff-lcs (1.5.0)
@@ -30,10 +27,6 @@ GEM
30
27
  concurrent-ruby (~> 1.0)
31
28
  dry-core (~> 1.0, < 2)
32
29
  zeitwerk (~> 2.6)
33
- dry-monads (1.6.0)
34
- concurrent-ruby (~> 1.0)
35
- dry-core (~> 1.0, < 2)
36
- zeitwerk (~> 2.6)
37
30
  dry-schema (1.13.3)
38
31
  concurrent-ruby (~> 1.0)
39
32
  dry-configurable (~> 1.0, >= 1.0.1)
@@ -72,11 +65,9 @@ GEM
72
65
  guard-compat (~> 1.1)
73
66
  rspec (>= 2.99.0, < 4.0)
74
67
  http-2-next (1.0.1)
75
- httpx (1.0.2)
68
+ httpx (1.1.0)
76
69
  http-2-next (>= 1.0.1)
77
70
  ice_nine (0.11.2)
78
- json (2.6.3)
79
- language_server-protocol (3.17.0.3)
80
71
  listen (3.8.0)
81
72
  rb-fsevent (~> 0.10, >= 0.10.3)
82
73
  rb-inotify (~> 0.9, >= 0.9.10)
@@ -86,10 +77,6 @@ GEM
86
77
  notiffany (0.1.3)
87
78
  nenv (~> 0.1)
88
79
  shellany (~> 0.0)
89
- parallel (1.23.0)
90
- parser (3.2.2.4)
91
- ast (~> 2.4.1)
92
- racc
93
80
  pastel (0.8.0)
94
81
  tty-color (~> 0.5)
95
82
  pry (0.14.2)
@@ -97,16 +84,12 @@ GEM
97
84
  method_source (~> 1.0)
98
85
  psych (5.1.1.1)
99
86
  stringio
100
- racc (1.7.1)
101
- rainbow (3.1.1)
102
87
  rake (13.0.6)
103
88
  rb-fsevent (0.11.2)
104
89
  rb-inotify (0.10.1)
105
90
  ffi (~> 1.0)
106
91
  rdoc (6.5.0)
107
92
  psych (>= 4.0.0)
108
- regexp_parser (2.8.2)
109
- rexml (3.2.6)
110
93
  rspec (3.12.0)
111
94
  rspec-core (~> 3.12.0)
112
95
  rspec-expectations (~> 3.12.0)
@@ -131,21 +114,6 @@ GEM
131
114
  diff-lcs (>= 1.2.0, < 2.0)
132
115
  rspec-support (~> 3.12.0)
133
116
  rspec-support (3.12.1)
134
- rubocop (1.57.1)
135
- base64 (~> 0.1.1)
136
- json (~> 2.3)
137
- language_server-protocol (>= 3.17.0)
138
- parallel (~> 1.10)
139
- parser (>= 3.2.2.4)
140
- rainbow (>= 2.2.2, < 4.0)
141
- regexp_parser (>= 1.8, < 3.0)
142
- rexml (>= 3.2.5, < 4.0)
143
- rubocop-ast (>= 1.28.1, < 2.0)
144
- ruby-progressbar (~> 1.7)
145
- unicode-display_width (>= 2.4.0, < 3.0)
146
- rubocop-ast (1.29.0)
147
- parser (>= 3.2.1.0)
148
- ruby-progressbar (1.13.0)
149
117
  sdoc (2.6.1)
150
118
  rdoc (>= 5.0)
151
119
  shellany (0.0.1)
@@ -168,7 +136,6 @@ DEPENDENCIES
168
136
  guard
169
137
  guard-rspec
170
138
  pastel
171
- pry
172
139
  rake (~> 13.0)
173
140
  rb-inotify
174
141
  rspec
@@ -177,7 +144,6 @@ DEPENDENCIES
177
144
  rspec-given
178
145
  rspec-its
179
146
  rspec-legacy_formatters
180
- rubocop
181
147
  sdoc
182
148
  terminal-table
183
149
  zeitwerk
data/README.md CHANGED
@@ -5,7 +5,7 @@ Ruby Interface to a [Arcade Database](https://arcadedb.com/).
5
5
  The program utilizes the HTTP-JSON API to direct database queries to an ArcadeDB server.
6
6
  The server's response is then mapped to an ORM (Object-Relational Mapping) based on DRY::Struct.
7
7
  Each database type is represented by a dedicated Model Class, where complex queries are encapsulated.
8
- The program also includes a Query-Preprocessor for constructing custom queries in ruby fashion.
8
+ The program also includes a Query-Preprocessor and Match-statment generator for constructing custom queries in ruby fashion.
9
9
 
10
10
  ***ArcadeDB internally uses `Arcade` as primary namespace****
11
11
 
@@ -13,11 +13,18 @@ The program also includes a Query-Preprocessor for constructing custom queries
13
13
 
14
14
  A running AracdeDB-Instance. [Quick-Start-Guide](https://docs.arcadedb.com/#Quick-Start-Docker).
15
15
 
16
- [ArcadeDB V 22.10.1](https://github.com/ArcadeData/arcadedb/releases/tag/22.10.1)ff is supported
16
+ ## New Project
17
17
 
18
- ## Config
19
-
20
- Edit the file `arcade.yml` and provide suitable databases for test, development and production environment.
18
+ ```
19
+ mkdir project && cd project
20
+ bundle init
21
+ bundle add arcadedb
22
+ bundle add pastel # for console output
23
+ mkdir model
24
+ mkdir bin
25
+ ```
26
+ copy `https://github.com/topofocus/arcadedb/blob/main/bin/console` to the `bin` directory
27
+ copy `https://github.com/topofocus/arcadedb/blob/main/arcade.yml` to the project root and modify to your needs
21
28
 
22
29
  ## Console
23
30
 
@@ -25,9 +32,19 @@ To start an interactive console, a script is provided in the bin-directory.
25
32
  ```
26
33
  $ cd bin && ./console.rb t ( or "d" or "p" for Test, Development and Production environment)
27
34
 
28
- **Database definitions (model-files) of the test-suite are included!**
35
+ **in Test environment Database definitions (model-files) of the test-suite are included!**
29
36
  ```
30
37
 
38
+ ## Add to a project
39
+ Just require it in your program:
40
+ ```ruby
41
+ require "arcade"
42
+ ```
43
+ ## Config
44
+
45
+ Add a file `arcade.yml` at the root of your program or in the `config`-dir and provide suitable databases for test, development and production environment.
46
+
47
+
31
48
  ## Examples & Specs
32
49
 
33
50
  The `example` directory contains documented sample files for typical usecases
@@ -39,14 +56,13 @@ The `spec`-files in the rspec-test-suite-section are worth reading, too.
39
56
  The adapter uses a 3 layer concept.
40
57
 
41
58
  Top-Layer : `Arcade::Base`-Model-Objects.
42
- They operate similar to ActiveRecord Model Objects but are based on [Dry-Struct](https://dry-rb.org/gems/dry-struct/1.0/).
59
+ Similar to ActiveRecord Model Objects but based on [Dry-Struct](https://dry-rb.org/gems/dry-struct/1.0/).
43
60
 
44
61
  ```ruby
45
62
  # Example model file /model/demo/user.rb
46
63
  module Demo
47
- class Person < Arcade::Vertex
64
+ class User < Arcade::Vertex
48
65
  attribute :name, Types::Nominal::String
49
- timestamps true
50
66
 
51
67
  def grandparents
52
68
  db.query( "select in('is_family') from #{rid} ") &.allocate_model
@@ -58,14 +74,14 @@ __END__
58
74
  CREATE INDEX on demo_user( name ) UNIQUE
59
75
  ```
60
76
 
61
- Only the `name` attribute is declared. Timestamps (created & updated attributes) are included, too
77
+ Only the `name` attribute is declared.
62
78
 
63
- `Demo::User.create_type` creates the type and executes the database-commands after __END__.
79
+ `Demo::User.create_type` creates the type and executes provided database-commands after __END__.
64
80
 
65
- Other properties are schemaless.
81
+ Other properties are schemaless, but have to be declared in the model-file.
66
82
 
67
83
  ```ruby
68
- Person.create name: "Hubert", age: 35
84
+ Person.insert name: "Hubert", age: 35
69
85
  Person.update set: { age: 36 }, where: { name: 'Hubert' }
70
86
  persons = Person.where "age > 40"
71
87
  persons.first.update age: 37
@@ -75,9 +91,66 @@ Person.all
75
91
  Person.delete all: true || where: age: 56 , ...
76
92
  ```
77
93
 
94
+ ### Nodes and Traverse
95
+
96
+ `ArcadeDB` wraps common queries of bidirectional connected vertices.
97
+
98
+ Suppose
99
+ ```ruby
100
+ m = Person.create name: 'Hubert', age: '25'
101
+ f = Person.create name: 'Pauline', age: '28'
102
+ m.assign via: IsMarriedTo, vertex: f , divorced: false
103
+
104
+ ```
105
+ This creates the simple graph
106
+ > Hubert --- is_married_to --> Pauline
107
+ > |
108
+ > -- divorced (attribute on the edge)
109
+
110
+ This can be queried through
111
+
112
+ ```ruby
113
+ hubert = Person.find name: 'Hubert'
114
+ pauline = hubert.nodes( :out, via: IsMarriedTo ).first
115
+ # or simply
116
+ pauline = hubert.out.first
117
+
118
+ ```
119
+ Conditions may be set, to.
120
+ ```ruby
121
+ hubert.nodes( :out, via: IsMarriedTo, where: "age < 30" )
122
+ ```
123
+ gets all wives of hubert, who are younger then 30 years.
124
+ or
125
+ ```ruby
126
+ Person.nodes( :outE, via: IsMarriedTo, where: { divorced: false } )
127
+
128
+ ```
129
+ gets all wives where the divorced-condition, which is set on the edge, is false.
130
+
131
+ ## Query
132
+
78
133
  A **Query Preprocessor** is implemented. Its adapted from ActiveOrient. The [documentation](https://github.com/topofocus/active-orient/wiki/OrientQuery)
79
134
  is still valid, however the class has changed to `Arcade::Query`.
80
135
 
136
+ ## Match
137
+
138
+ A simple **Match Statement Generator** is provided for convenience. As the [declarative syntax](https://github.com/ArcadeData/arcadedb-docs/blob/main/src/main/asciidoc/sql/SQL-Match.adoc) seems to be very intuitive, a preprocessor should not be
139
+ necessary. With the help of some ruby magic, the creation of match-statements is simply an no-brainer.
140
+
141
+ ```ruby
142
+ a = Arcade::Match.new( type: Person, as: :persons)
143
+ .out( IsMarriedTo )
144
+ .node( where: 'age < 30')
145
+ a.to_s
146
+ => Match { type: person, as: persons }.out('is_married_to'){ where: ( age < 30) } RETURN persons
147
+
148
+ a.execute.select_results # sends the statement to the database and returns Arcade Objects.
149
+ ```
150
+
151
+ Arcade::Match-objects can be used as `from:` argument to Arcade::Query-Statements, thus hybrid queries are
152
+ easily constructed without extensive string-manipulations.
153
+
81
154
  The **second Layer** handles Database-Requests.
82
155
  In its actual implementation, these requests are delegated to the HTTP/JSON-API.
83
156
 
@@ -90,20 +163,18 @@ DB = Arcade::Init.db
90
163
  $ DB.get nn, mm # returns a Aracde:Base object
91
164
  # rid is either "#11:10:" or two numbers
92
165
  $ DB.query querystring # returns either an Array of results (as Hash)
93
- $ DB.execute { querystring } #
166
+ $ DB.execute { querystring } # execute a non idempotent query within a (nested) transaction
94
167
  $ DB.create <name>, attribute: value .... # Creates a new <Document | Vertex> and returns the rid
95
168
  # Operation is performed as Database-Transaction and is rolled back on error
96
- $ DB.insert <name>, attribute: value .... # Inserts a new <Document | Vertex> and returns the rid
169
+ $ DB.insert <name>, attribute: value .... # Inserts a new <Document | Vertex> and returns the new object
97
170
  $ DB.create_edge <name>, from: <rid> or [rid, rid, ..] , to: <rid> or [rid, rid, ..]
98
171
 
99
- DB.query " Select from person where age > 40 "
100
- DB.execute { " Update person set name='Hubert' return after $current where age = 36 " }
101
172
  ```
102
173
 
103
174
  **Convert database input to Arcade::Base Models**
104
175
 
105
176
  Either `DB.query` or `DB.execute` return the raw JSON-input from the database. It can always converted to model-objects by chaining
106
- `allocatet_model`.
177
+ `allocate_model` or `select_result`.
107
178
 
108
179
  ```ruby
109
180
  $ DB.query "select from my_names limit 1"
@@ -217,20 +288,24 @@ Select a range of nodes and perform a mathematical operation
217
288
  -=> select median(note_count) from ( traverse out(connects) from #52:0 while $depth < 100 ) where $depth>=50
218
289
  => {:"median(note_count)"=>75.5 }
219
290
  ```
220
- ## Include in your own project
221
291
 
222
- Until a gem is released, first clone the project and set up your project environment
292
+ ### Transactions
293
+
294
+ Database-Transactions are largely encapsulated
295
+
296
+ ```
297
+ db = Arcade::Init.db
298
+ db.begin_transaction
299
+
300
+ { perform insert, update, query, etc tasks in the database }
301
+
302
+ db.commit
303
+
304
+ # or
305
+
306
+ db.rollback
307
+
223
308
  ```
224
- mkdir workspace && cd workspace
225
- git clone https://github.com/topofocus/arcadedb
226
- mkdir my-project && cd my-project
227
- bundle init
228
- cat "gem arcadedb, path='../arcadedb' " >> Gemfile
229
- bundle install && bundle upate
230
- cp ../arcadedb/config.yml .
231
- mkdir bin
232
- cp ../arcadedb/bin/console bin/
233
- ````
234
309
 
235
310
 
236
311
  ## Contributing
data/arcade.yml CHANGED
@@ -3,20 +3,20 @@
3
3
  :test:
4
4
  dbname: playground
5
5
  user: root
6
- pass: topo1focus
6
+ pass: ***
7
7
  :development:
8
8
  dbname: devel
9
9
  user: root
10
- pass: topo1focus
10
+ pass: ***
11
11
  :production:
12
12
  dbname: production
13
13
  user: root
14
- pass: topo1focus
14
+ pass: ***
15
15
  :admin:
16
16
  :host: 10.247.8.109
17
17
  :port: 2480
18
18
  :user: root
19
- :pass: topo1focus
19
+ :pass: ***
20
20
  :logger: stdout # 'file' or 'stdout'
21
21
  :namespace: Arcade # Default Namespace
22
22
  :autoload: true # load model if a link is detected in a record
data/bin/console CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
- ## loads the active-orient environment
2
+ ## loads the arcadeDB environment
3
3
  ## and starts an interactive shell
4
4
  ##
5
- ## Parameter:
5
+ ## Parameter:
6
6
  ## production (p)
7
7
  ## development (d) [default]
8
8
  ## test (t)
9
9
  require 'bundler/setup'
10
- require 'terminal-table'
10
+ #require 'terminal-table'
11
11
  require 'zeitwerk'
12
12
  require 'pastel'
13
13
  require 'arcade'
@@ -66,10 +66,6 @@ def browse db: Arcade::Api.databases.first , extended: false
66
66
  end
67
67
 
68
68
 
69
-
70
-
71
-
72
-
73
69
  include Arcade
74
70
 
75
71
  def help
@@ -106,21 +102,25 @@ end
106
102
 
107
103
  help
108
104
  e= ARGV.empty? ? :development : ARGV.last.downcase.to_sym
109
- ## load test model files
110
- #require "#{__dir__}/../spec/model_helper"
111
-
112
105
  loader = Zeitwerk::Loader.new
113
- loader.push_dir ("#{__dir__}/../spec/model")
106
+ if e.to_s[0] == 't'
107
+ loader.push_dir ("#{__dir__}/../spec/model")
108
+ else
109
+ loader.push_dir ("#{__dir__}/../lib/model")
110
+
111
+ end
114
112
  loader.setup
115
113
  puts "DB = Arcade::Database-instance"
116
114
  DB = Arcade::Init.connect e
117
115
  #require 'pry'
116
+ #if e.to_s[0] == 't'
117
+ # DB.create_type :document, 'test_document'
118
+ # DB.create_type :vertex, :test_vertex
119
+ #
120
+ #end
118
121
  require 'irb'
119
122
  ARGV.clear
120
- #begin
123
+
121
124
  IRB.start(__FILE__)
122
- #rescue ArgumentError => e
123
- # puts e
124
- ## retry
125
- #end
125
+
126
126
  #Pry.start(__FILE__)