rasti-db 4.1.0 → 4.2.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: c26c0f818529ec0d1a752cf310c1d23cf235d2c8c83e13a62d8d61bc90b3b400
4
- data.tar.gz: 57022ffbb145a76ad9532d16a1ed890f31862f7fc6ad4cea6d40aae0490908ca
3
+ metadata.gz: fa10d65e8a9fbd3c311384e8806addd5c04b803405444717d6904282dbf9207c
4
+ data.tar.gz: 24f1e8801906634288e62ef7337da1179392e75203b08ae6f034b5f25256228e
5
5
  SHA512:
6
- metadata.gz: 94746821604273fdf6483d5410f8c73f4793901116478a17d3ecba6e7039705ecf8cf5b8ad0ccb30adb294d052ff144c6d0fe5ca042ca1fd558e3caf5c45de62
7
- data.tar.gz: '0684ae374582f8cd633d44aacd720e80b3575e3ef8186de2252d9f73e17f03fe438a54a407127bb320f9ec8996f3f5dc71c99294b503c28797e34faf4c886f22'
6
+ metadata.gz: 04a6c1deb6afa47fae66203bec39d81926ac5e6435844593c321279423d6a8a5651178fc5769e58868f88286ae819ecfd7aa77785b2e6df82cd63096d12ee34f
7
+ data.tar.gz: 28ec23866d539f20163bff9449586060d1f943d022f10f72d2d4b4ff5f3fc8b9db97acbefa2482fcc262d0e51625bad603ea3861fbea7f47fe36382ce9da5821
@@ -0,0 +1,26 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ '**' ]
6
+ pull_request:
7
+ branches: [ '**' ]
8
+
9
+ jobs:
10
+ test:
11
+
12
+ name: Tests
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ matrix:
16
+ ruby-version: ['2.3', '2.4', '2.5', '2.6', '2.7', '3.0', 'jruby-9.2.9.0']
17
+
18
+ steps:
19
+ - uses: actions/checkout@v3
20
+ - name: Set up Ruby
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby-version }}
24
+ bundler-cache: true
25
+ - name: Run tests
26
+ run: bundle exec rake
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Rasti::DB
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/rasti-db.svg)](https://rubygems.org/gems/rasti-db)
4
- [![Build Status](https://travis-ci.org/gabynaiman/rasti-db.svg?branch=master)](https://travis-ci.org/gabynaiman/rasti-db)
4
+ [![CI](https://github.com/gabynaiman/rasti-db/actions/workflows/ci.yml/badge.svg)](https://github.com/gabynaiman/rasti-db/actions/workflows/ci.yml)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/gabynaiman/rasti-db/badge.svg?branch=master)](https://coveralls.io/github/gabynaiman/rasti-db?branch=master)
6
6
  [![Code Climate](https://codeclimate.com/github/gabynaiman/rasti-db.svg)](https://codeclimate.com/github/gabynaiman/rasti-db)
7
7
 
@@ -53,22 +53,24 @@ module Rasti
53
53
  build_query relations_graph: relations_graph.merge(excluded_attributes: excluded_attributes)
54
54
  end
55
55
 
56
+ def graph_queries(queries)
57
+ build_query relations_graph: relations_graph.merge(queries: queries)
58
+ end
59
+
56
60
  def all_graph_attributes(*relations)
57
61
  build_query relations_graph: relations_graph.with_all_attributes_for(relations)
58
62
  end
59
63
 
60
64
  def select_computed_attributes(*computed_attributes)
61
- ds = computed_attributes.inject(dataset) do |ds, name|
65
+ ds = computed_attributes.inject(dataset) do |inner_ds, name|
62
66
  computed_attribute = collection_class.computed_attributes[name]
63
- computed_attribute.apply_join(ds, environment).select_append(computed_attribute.identifier.as(name))
67
+ computed_attribute.apply_join(inner_ds, environment).select_append(computed_attribute.identifier.as(name))
64
68
  end
65
69
  build_query dataset: ds
66
70
  end
67
71
 
68
72
  def all
69
- with_graph(dataset.all).map do |row|
70
- collection_class.model.new row
71
- end
73
+ build_models dataset.all
72
74
  end
73
75
  alias_method :to_a, :all
74
76
 
@@ -114,13 +116,11 @@ module Rasti
114
116
  end
115
117
 
116
118
  def first
117
- row = dataset.first
118
- row ? build_model(row) : nil
119
+ build_model dataset.first
119
120
  end
120
121
 
121
122
  def last
122
- row = dataset.last
123
- row ? build_model(row) : nil
123
+ build_model dataset.last
124
124
  end
125
125
 
126
126
  def detect(*args, &block)
@@ -137,8 +137,8 @@ module Rasti
137
137
 
138
138
  raise NQL::InvalidExpressionError.new(filter_expression) if sentence.nil?
139
139
 
140
- ds = sentence.computed_attributes(collection_class).inject(dataset) do |ds, name|
141
- collection_class.computed_attributes[name].apply_join ds, environment
140
+ ds = sentence.computed_attributes(collection_class).inject(dataset) do |inner_ds, name|
141
+ collection_class.computed_attributes[name].apply_join inner_ds, environment
142
142
  end
143
143
  query = build_query dataset: ds
144
144
 
@@ -164,7 +164,21 @@ module Rasti
164
164
  end
165
165
 
166
166
  def build_model(row)
167
- collection_class.model.new with_graph(row)
167
+ row ? build_models([row]).first : nil
168
+ end
169
+
170
+ def build_models(rows)
171
+ with_graph(rows).map do |row|
172
+ collection_class.model.new slice_defined_attributes(row)
173
+ end
174
+ end
175
+
176
+ def slice_defined_attributes(row)
177
+ row.select { |k,_| defined_attributes.include? k }
178
+ end
179
+
180
+ def defined_attributes
181
+ @defined_attributes ||= collection_class.model.attribute_names.to_set
168
182
  end
169
183
 
170
184
  def chainable(&block)
@@ -205,4 +219,4 @@ module Rasti
205
219
 
206
220
  end
207
221
  end
208
- end
222
+ end
@@ -3,20 +3,22 @@ module Rasti
3
3
  module Relations
4
4
  class Graph
5
5
 
6
- def initialize(environment, collection_class, relations=[], selected_attributes={}, excluded_attributes={})
6
+ def initialize(environment, collection_class, relations=[], selected_attributes={}, excluded_attributes={}, queries={})
7
7
  @environment = environment
8
8
  @collection_class = collection_class
9
9
  @graph = build_graph relations,
10
10
  Hash::Indifferent.new(selected_attributes),
11
- Hash::Indifferent.new(excluded_attributes)
11
+ Hash::Indifferent.new(excluded_attributes),
12
+ Hash::Indifferent.new(queries)
12
13
  end
13
14
 
14
- def merge(relations:[], selected_attributes:{}, excluded_attributes:{})
15
+ def merge(relations:[], selected_attributes:{}, excluded_attributes:{}, queries: {})
15
16
  Graph.new environment,
16
17
  collection_class,
17
18
  (flat_relations | relations),
18
19
  flat_selected_attributes.merge(selected_attributes),
19
- flat_excluded_attributes.merge(excluded_attributes)
20
+ flat_excluded_attributes.merge(excluded_attributes),
21
+ flat_queries.merge(queries)
20
22
  end
21
23
 
22
24
  def with_all_attributes_for(relations)
@@ -30,16 +32,17 @@ module Rasti
30
32
  query.graph(*flat_relations)
31
33
  .select_graph_attributes(flat_selected_attributes)
32
34
  .exclude_graph_attributes(flat_excluded_attributes)
35
+ .graph_queries(flat_queries)
33
36
  end
34
37
 
35
38
  def fetch_graph(rows)
36
39
  return if rows.empty?
37
-
38
40
  graph.roots.each do |node|
39
41
  relation_of(node).fetch_graph environment,
40
42
  rows,
41
43
  node[:selected_attributes],
42
- node[:excluded_attributes] ,
44
+ node[:excluded_attributes],
45
+ node[:queries] ,
43
46
  subgraph_of(node)
44
47
  end
45
48
  end
@@ -76,33 +79,43 @@ module Rasti
76
79
  end
77
80
  end
78
81
 
82
+ def flat_queries
83
+ graph.each_with_object(Hash::Indifferent.new) do |node, hash|
84
+ hash[node.id] = node[:queries]
85
+ end
86
+ end
87
+
79
88
  def subgraph_of(node)
80
89
  relations = []
81
90
  selected = Hash::Indifferent.new
82
91
  excluded = Hash::Indifferent.new
92
+ queries = Hash::Indifferent.new
83
93
 
84
94
  node.descendants.each do |descendant|
85
95
  id = descendant.id[node[:name].length+1..-1]
86
96
  relations << id
87
97
  selected[id] = descendant[:selected_attributes]
88
98
  excluded[id] = descendant[:excluded_attributes]
99
+ queries[id] = descendant[:queries]
89
100
  end
90
101
 
91
102
  Graph.new environment,
92
103
  relation_of(node).target_collection_class,
93
104
  relations,
94
105
  selected,
95
- excluded
106
+ excluded,
107
+ queries
96
108
  end
97
109
 
98
- def build_graph(relations, selected_attributes, excluded_attributes)
110
+ def build_graph(relations, selected_attributes, excluded_attributes, queries)
99
111
  HierarchicalGraph.new.tap do |graph|
100
112
  flatten(relations).each do |relation|
101
113
  sections = relation.split('.')
102
114
 
103
115
  graph.add_node relation, name: sections.last.to_sym,
104
116
  selected_attributes: selected_attributes[relation],
105
- excluded_attributes: excluded_attributes[relation]
117
+ excluded_attributes: excluded_attributes[relation],
118
+ queries: queries[relation]
106
119
 
107
120
  if sections.count > 1
108
121
  parent_id = sections[0..-2].join('.')
@@ -126,4 +139,4 @@ module Rasti
126
139
  end
127
140
  end
128
141
  end
129
- end
142
+ end
@@ -19,9 +19,9 @@ module Rasti
19
19
  @relation_data_source_name ||= options[:relation_data_source_name] || source_collection_class.data_source_name
20
20
  end
21
21
 
22
- def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, relations_graph=nil)
22
+ def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, queries=nil, relations_graph=nil)
23
23
  pks = rows.map { |row| row[source_collection_class.primary_key] }
24
-
24
+
25
25
  if target_collection_class.data_source_name == relation_data_source_name
26
26
  target_data_source = environment.data_source_of target_collection_class
27
27
 
@@ -30,10 +30,14 @@ module Rasti
30
30
  .where(Sequel[relation_collection_name][source_foreign_key] => pks)
31
31
  .select_all(target_collection_class.collection_name)
32
32
 
33
- selected_attributes ||= target_collection_class.collection_attributes - excluded_attributes if excluded_attributes
34
- dataset = dataset.select(*selected_attributes.map { |a| Sequel[target_collection_class.collection_name][a] }) if selected_attributes
33
+ selected_attributes ||= target_collection_class.collection_attributes - excluded_attributes unless excluded_attributes.nil?
34
+ dataset = dataset.select(*selected_attributes.map { |a| Sequel[target_collection_class.collection_name][a] }) unless selected_attributes.nil?
35
+
36
+ query = Query.new collection_class: target_collection_class, dataset: dataset, environment: environment
37
+ query = queries.inject(query) { |new_query, sub_query| new_query.send(sub_query) } unless queries.nil?
38
+
39
+ join_rows = query.send(:dataset).select_append(Sequel[relation_collection_name][source_foreign_key].as(:source_foreign_key)).all
35
40
 
36
- join_rows = dataset.select_append(Sequel[relation_collection_name][source_foreign_key].as(:source_foreign_key)).all
37
41
  else
38
42
  relation_data_source = environment.data_source relation_data_source_name
39
43
 
@@ -42,8 +46,10 @@ module Rasti
42
46
  .select_hash_groups(target_foreign_key, source_foreign_key)
43
47
 
44
48
  query = target_collection_class.new environment
45
- query = query.exclude_attributes(*excluded_attributes) if excluded_attributes
46
- query = query.select_attributes(*selected_attributes) if selected_attributes
49
+ query = query.exclude_attributes(*excluded_attributes) unless excluded_attributes.nil?
50
+ query = query.select_attributes(*selected_attributes) unless selected_attributes.nil?
51
+
52
+ query = queries.inject(query) { |new_query, sub_query| new_query.send(sub_query) } unless queries.nil?
47
53
 
48
54
  join_rows = query.where(target_collection_class.primary_key => relation_index.keys).raw.flat_map do |row|
49
55
  relation_index[row[target_collection_class.primary_key]].map do |source_primary_key|
@@ -110,4 +116,4 @@ module Rasti
110
116
  end
111
117
  end
112
118
  end
113
- end
119
+ end
@@ -7,14 +7,18 @@ module Rasti
7
7
  @foreign_key ||= options[:foreign_key] || target_collection_class.foreign_key
8
8
  end
9
9
 
10
- def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, relations_graph=nil)
10
+ def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, queries=nil, relations_graph=nil)
11
11
  fks = rows.map { |row| row[foreign_key] }.uniq
12
12
 
13
13
  target_collection = target_collection_class.new environment
14
14
 
15
15
  query = target_collection.where(source_collection_class.primary_key => fks)
16
- query = query.exclude_attributes(*excluded_attributes) if excluded_attributes
17
- query = query.select_attributes(*selected_attributes) if selected_attributes
16
+
17
+ query = query.exclude_attributes(*excluded_attributes) unless excluded_attributes.nil?
18
+ query = query.select_attributes(*selected_attributes) unless selected_attributes.nil?
19
+
20
+ query = queries.inject(query) { |new_query, sub_query| new_query.send(sub_query) } unless queries.nil?
21
+
18
22
  query = relations_graph.apply_to query if relations_graph
19
23
 
20
24
  relation_rows = query.each_with_object({}) do |row, hash|
@@ -47,4 +51,4 @@ module Rasti
47
51
  end
48
52
  end
49
53
  end
50
- end
54
+ end
@@ -7,14 +7,17 @@ module Rasti
7
7
  @foreign_key ||= options[:foreign_key] || source_collection_class.foreign_key
8
8
  end
9
9
 
10
- def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, relations_graph=nil)
10
+ def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, queries=nil, relations_graph=nil)
11
11
  pks = rows.map { |row| row[source_collection_class.primary_key] }.uniq
12
12
 
13
13
  target_collection = target_collection_class.new environment
14
14
 
15
15
  query = target_collection.where(foreign_key => pks)
16
- query = query.exclude_attributes(*excluded_attributes) if excluded_attributes
17
- query = query.select_attributes(*selected_attributes) if selected_attributes
16
+ query = query.exclude_attributes(*excluded_attributes) unless excluded_attributes.nil?
17
+ query = query.select_attributes(*selected_attributes) unless selected_attributes.nil?
18
+
19
+ query = queries.inject(query) { |new_query, sub_query| new_query.send(sub_query) } unless queries.nil?
20
+
18
21
  query = relations_graph.apply_to query if relations_graph
19
22
 
20
23
  relation_rows = query.group_by(&foreign_key)
@@ -62,4 +65,4 @@ module Rasti
62
65
  end
63
66
  end
64
67
  end
65
- end
68
+ end
@@ -1,5 +1,5 @@
1
1
  module Rasti
2
2
  module DB
3
- VERSION = '4.1.0'
3
+ VERSION = '4.2.0'
4
4
  end
5
5
  end
@@ -19,10 +19,12 @@ Post = Rasti::DB::Model[:id, :title, :body, :user_id, :user, :comments, :cat
19
19
  Comment = Rasti::DB::Model[:id, :text, :user_id, :user, :post_id, :post, :tags]
20
20
  Category = Rasti::DB::Model[:id, :name, :posts]
21
21
  Person = Rasti::DB::Model[:document_number, :first_name, :last_name, :birth_date, :user_id, :user, :languages, :full_name]
22
- Language = Rasti::DB::Model[:id, :name, :people]
22
+ Language = Rasti::DB::Model[:id, :name, :people, :countries]
23
+ Country = Rasti::DB::Model[:id, :name, :population, :language_id]
23
24
 
24
25
 
25
26
  class Users < Rasti::DB::Collection
27
+
26
28
  one_to_many :posts
27
29
  one_to_many :comments
28
30
  one_to_one :person
@@ -41,14 +43,15 @@ class Users < Rasti::DB::Collection
41
43
  end
42
44
 
43
45
  class Posts < Rasti::DB::Collection
46
+
44
47
  many_to_one :user
45
48
  many_to_one :language
46
49
  many_to_many :categories
47
50
  one_to_many :comments
48
51
 
49
52
  query :created_by, ->(user_id) { where user_id: user_id }
50
-
51
- query :entitled do |title|
53
+
54
+ query :entitled do |title|
52
55
  where title: title
53
56
  end
54
57
 
@@ -61,6 +64,18 @@ class Posts < Rasti::DB::Collection
61
64
  end
62
65
  end
63
66
 
67
+ query :only_title do
68
+ chainable do
69
+ dataset.select(:title).select_append(:id, :user_id)
70
+ end
71
+ end
72
+
73
+ query :append_body do
74
+ chainable do
75
+ dataset.select_append(:body)
76
+ end
77
+ end
78
+
64
79
  computed_attribute :notice do
65
80
  Rasti::DB::ComputedAttribute.new Sequel.join([:title, ': ', :body])
66
81
  end
@@ -72,6 +87,7 @@ class Posts < Rasti::DB::Collection
72
87
  end
73
88
 
74
89
  class Comments < Rasti::DB::Collection
90
+
75
91
  many_to_one :user
76
92
  many_to_one :post
77
93
 
@@ -81,13 +97,17 @@ class Comments < Rasti::DB::Collection
81
97
  .select_all(:posts)
82
98
  .map { |row| Post.new row }
83
99
  end
100
+
84
101
  end
85
102
 
86
103
  class Categories < Rasti::DB::Collection
104
+
87
105
  many_to_many :posts
106
+
88
107
  end
89
108
 
90
109
  class People < Rasti::DB::Collection
110
+
91
111
  set_collection_name :people
92
112
  set_primary_key :document_number
93
113
  set_foreign_key :document_number
@@ -99,13 +119,23 @@ class People < Rasti::DB::Collection
99
119
  computed_attribute :full_name do |db|
100
120
  Rasti::DB::ComputedAttribute.new Sequel.join([:first_name, ' ', :last_name])
101
121
  end
122
+
102
123
  end
103
124
 
104
125
  class Languages < Rasti::DB::Collection
126
+
105
127
  set_data_source_name :custom
106
128
 
107
129
  many_to_many :people, collection: People, relation_data_source_name: :default
108
130
  one_to_many :posts
131
+ one_to_many :countries
132
+
133
+ end
134
+
135
+ class Countries < Rasti::DB::Collection
136
+
137
+ many_to_one :language
138
+
109
139
  end
110
140
 
111
141
 
@@ -114,7 +144,7 @@ class Minitest::Spec
114
144
  let(:users) { Users.new environment }
115
145
 
116
146
  let(:posts) { Posts.new environment }
117
-
147
+
118
148
  let(:comments) { Comments.new environment }
119
149
 
120
150
  let(:categories) { Categories.new environment }
@@ -123,16 +153,17 @@ class Minitest::Spec
123
153
 
124
154
  let(:languages) { Languages.new environment }
125
155
 
156
+ let(:countries) { Countries.new environment }
157
+
126
158
  let(:driver) { (RUBY_ENGINE == 'jruby') ? 'jdbc:sqlite::memory:' : {adapter: :sqlite} }
127
159
 
128
- let :environment do
160
+ let :environment do
129
161
  Rasti::DB::Environment.new default: Rasti::DB::DataSource.new(db),
130
162
  custom: Rasti::DB::DataSource.new(custom_db)
131
163
  end
132
164
 
133
165
  let :db do
134
166
  Sequel.connect(driver).tap do |db|
135
-
136
167
  db.create_table :users do
137
168
  primary_key :id
138
169
  String :name, null: false, unique: true
@@ -179,18 +210,22 @@ class Minitest::Spec
179
210
  primary_key [:language_id, :document_number]
180
211
  end
181
212
 
213
+ db.create_table :countries do
214
+ primary_key :id
215
+ String :name, null: false, unique: true
216
+ Integer :population, null: false
217
+ Integer :language_id, null: false, index: true
218
+ end
182
219
  end
183
220
  end
184
221
 
185
222
  let :custom_db do
186
223
  Sequel.connect(driver).tap do |db|
187
-
188
224
  db.create_table :languages do
189
225
  primary_key :id
190
226
  String :name, null: false, unique: true
191
227
  end
192
-
193
228
  end
194
229
  end
195
230
 
196
- end
231
+ end
data/spec/query_spec.rb CHANGED
@@ -32,6 +32,8 @@ describe 'Query' do
32
32
  db[:categories_posts].insert post_id: 2, category_id: 2
33
33
  db[:categories_posts].insert post_id: 2, category_id: 3
34
34
  db[:categories_posts].insert post_id: 3, category_id: 3
35
+
36
+ db[:countries].insert name: 'Argentina', population: 40000000, language_id: 1
35
37
  end
36
38
 
37
39
  let(:users_query) { Rasti::DB::Query.new collection_class: Users, dataset: db[:users], environment: environment }
@@ -44,6 +46,10 @@ describe 'Query' do
44
46
 
45
47
  let(:languages_query) { Rasti::DB::Query.new collection_class: Languages, dataset: custom_db[:languages], environment: environment }
46
48
 
49
+ let(:countries_query) { Rasti::DB::Query.new collection_class: Countries, dataset: db[:countries], environment: environment }
50
+
51
+ let(:categories_query) { Rasti::DB::Query.new collection_class: Categories, dataset: db[:categories], environment: environment }
52
+
47
53
  it 'Count' do
48
54
  users_query.count.must_equal 10
49
55
  end
@@ -142,6 +148,59 @@ describe 'Query' do
142
148
  .must_equal [post]
143
149
  end
144
150
 
151
+ it 'Graph with query many to one' do
152
+ comments_query.graph('post')
153
+ .graph_queries('post' => [:only_title])
154
+ .where(id: 1)
155
+ .all
156
+ .must_equal [
157
+ Comment.new(id: 1, text: 'Comment 1', user_id: 5, post_id: 1, post: Post.new(id: 1, user_id: 2, title: 'Sample post'), tags: [])
158
+ ]
159
+ end
160
+
161
+ it 'Graph with query one to many' do
162
+ users_query.graph('posts')
163
+ .graph_queries('posts' => [:only_title])
164
+ .where(id: 1)
165
+ .all
166
+ .must_equal [
167
+ User.new(id: 1, name: 'User 1', posts: [Post.new(user_id: 1, id: 2, title: 'Another post')])
168
+ ]
169
+ end
170
+
171
+ it 'Graph with query many to many' do
172
+ categories_query.graph('posts')
173
+ .graph_queries('posts' => [:only_title])
174
+ .where(id: 1)
175
+ .all
176
+ .must_equal [
177
+ Category.new(id: 1, name: 'Category 1', posts: [Post.new(user_id: 2, id: 1, title: 'Sample post')])
178
+ ]
179
+ end
180
+
181
+ it 'Graph with n queries' do
182
+ comments_query.graph('post')
183
+ .graph_queries('post' => [:only_title, :append_body])
184
+ .where(id: 1)
185
+ .all
186
+ .must_equal [
187
+ Comment.new(id: 1, text: 'Comment 1', user_id: 5, post_id: 1, post: Post.new(id: 1, user_id: 2, title: 'Sample post', body: '...'), tags: [])
188
+ ]
189
+
190
+ end
191
+
192
+ it 'Graph query missing must raise error' do
193
+ proc { posts_query.graph('comments.user')
194
+ .graph_queries('comments.user' => [:with_not_exists_query])
195
+ .all }.must_raise NoMethodError
196
+ end
197
+
198
+ it 'Graph with query params must raise error' do
199
+ proc { users_query.graph('posts')
200
+ .graph_queries('posts' => [:created_by])
201
+ .all }.must_raise ArgumentError
202
+ end
203
+
145
204
  describe 'Select computed attributes' do
146
205
  it 'With join' do
147
206
  db[:comments].insert post_id: 1, user_id: 5, text: 'Comment 4'
@@ -166,6 +225,25 @@ describe 'Query' do
166
225
  end
167
226
  end
168
227
 
228
+ describe 'Ignore undefined attributes' do
229
+
230
+ it 'First level' do
231
+ countries_query.raw.first.must_equal id: 1,
232
+ name: 'Argentina',
233
+ population: 40000000,
234
+ language_id: 1
235
+
236
+ [countries_query.detect(id: 1), countries_query.where(id: 1).order(:name).last, countries_query.all.first].each do |country|
237
+ country.must_equal Country.new(language_id: 1, id: 1, name: 'Argentina', population: 40000000)
238
+ end
239
+ end
240
+
241
+ it 'Graph nested' do
242
+ languages_query.graph(:countries).first.countries.must_equal [Country.new(language_id: 1, id: 1, name: 'Argentina', population: 40000000)]
243
+ end
244
+
245
+ end
246
+
169
247
  it 'Map' do
170
248
  users_query.map(&:name).must_equal db[:users].map(:name)
171
249
  end
@@ -553,4 +631,4 @@ describe 'Query' do
553
631
 
554
632
  end
555
633
 
556
- end
634
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rasti-db
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Naiman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-17 00:00:00.000000000 Z
11
+ date: 2024-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -294,10 +294,10 @@ extensions: []
294
294
  extra_rdoc_files: []
295
295
  files:
296
296
  - ".coveralls.yml"
297
+ - ".github/workflows/ci.yml"
297
298
  - ".gitignore"
298
299
  - ".ruby-gemset"
299
300
  - ".ruby-version"
300
- - ".travis.yml"
301
301
  - Gemfile
302
302
  - LICENSE.txt
303
303
  - README.md
data/.travis.yml DELETED
@@ -1,23 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.1
5
- - 2.2
6
- - 2.3
7
- - 2.4
8
- - 2.5
9
- - 2.6
10
- - 2.7
11
- - 3.0
12
- - jruby-9.2.9.0
13
- - ruby-head
14
- - jruby-head
15
-
16
- matrix:
17
- fast_finish: true
18
- allow_failures:
19
- - rvm: ruby-head
20
- - rvm: jruby-head
21
-
22
- jdk:
23
- - openjdk8