Skip to content

Commit

Permalink
Merge 1d26cc9 into ab76fb6
Browse files Browse the repository at this point in the history
  • Loading branch information
diegosenarruzza committed Oct 20, 2020
2 parents ab76fb6 + 1d26cc9 commit 5fb153d
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 22 deletions.
10 changes: 4 additions & 6 deletions lib/rasti/db/query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class Query
def initialize(environment:, collection_class:, dataset:, relations_graph:nil)
@environment = environment
@collection_class = collection_class
@dataset = dataset
@dataset = dataset.qualify collection_class.collection_name
@relations_graph = relations_graph || Relations::Graph.new(environment, collection_class)
end

Expand Down Expand Up @@ -74,11 +74,9 @@ def graph(*relations)

def join(*relations)
graph = Relations::Graph.new environment, collection_class, relations

ds = graph.add_joins(dataset)
.distinct
.select_all(collection_class.collection_name)


ds = graph.add_joins(dataset).distinct

build_query dataset: ds
end

Expand Down
22 changes: 11 additions & 11 deletions spec/collection_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -537,28 +537,28 @@
case sql

when 'SELECT users.* FROM schema_1.users',
'SELECT users.* FROM schema_1.users WHERE (id IN (2, 1))'
'SELECT users.* FROM schema_1.users WHERE (users.id IN (2, 1))'
[
{id: 1},
{id: 2}
]

when 'SELECT posts.* FROM schema_1.posts',
'SELECT posts.* FROM schema_1.posts WHERE (user_id IN (1, 2))'
'SELECT posts.* FROM schema_1.posts WHERE (posts.user_id IN (1, 2))'
[
{id: 3, user_id: 1, language_id: 1},
{id: 4, user_id: 2, language_id: 2}
]

when 'SELECT comments.* FROM schema_1.comments WHERE (post_id IN (3, 4))'
when 'SELECT comments.* FROM schema_1.comments WHERE (comments.post_id IN (3, 4))'
[
{id: 5, user_id: 2, post_id: 3},
{id: 6, user_id: 1, post_id: 3},
{id: 7, user_id: 1, post_id: 4},
{id: 8, user_id: 2, post_id: 4}
]

when 'SELECT languages.* FROM schema_2.languages WHERE (id IN (1, 2))'
when 'SELECT languages.* FROM schema_2.languages WHERE (languages.id IN (1, 2))'
[
{id: 1},
{id: 2}
Expand Down Expand Up @@ -663,7 +663,7 @@
stub_users.where(id: [1,2]).limit(1).order(:name).all

stub_db.sqls.must_equal [
'SELECT users.* FROM schema_1.users WHERE (id IN (1, 2)) ORDER BY name LIMIT 1'
'SELECT users.* FROM schema_1.users WHERE (users.id IN (1, 2)) ORDER BY users.name LIMIT 1'
]
end

Expand All @@ -673,21 +673,21 @@
stub_db.sqls.must_equal [
'SELECT posts.* FROM schema_1.posts',
'SELECT categories.*, categories_posts.post_id AS source_foreign_key FROM schema_1.categories INNER JOIN schema_1.categories_posts ON (schema_1.categories_posts.category_id = schema_1.categories.id) WHERE (categories_posts.post_id IN (3, 4))',
'SELECT comments.* FROM schema_1.comments WHERE (post_id IN (3, 4))',
'SELECT users.* FROM schema_1.users WHERE (id IN (2, 1))',
'SELECT posts.* FROM schema_1.posts WHERE (user_id IN (1, 2))',
'SELECT comments.* FROM schema_1.comments WHERE (comments.post_id IN (3, 4))',
'SELECT users.* FROM schema_1.users WHERE (users.id IN (2, 1))',
'SELECT posts.* FROM schema_1.posts WHERE (posts.user_id IN (1, 2))',
'SELECT categories.*, categories_posts.post_id AS source_foreign_key FROM schema_1.categories INNER JOIN schema_1.categories_posts ON (schema_1.categories_posts.category_id = schema_1.categories.id) WHERE (categories_posts.post_id IN (3, 4))',
'SELECT languages.* FROM schema_2.languages WHERE (id IN (1, 2))',
'SELECT languages.* FROM schema_2.languages WHERE (languages.id IN (1, 2))',
'SELECT people.*, languages_people.language_id AS source_foreign_key FROM schema_1.people INNER JOIN schema_1.languages_people ON (schema_1.languages_people.document_number = schema_1.people.document_number) WHERE (languages_people.language_id IN (1, 2))',
'SELECT users.* FROM schema_1.users WHERE (id IN (1, 2))'
'SELECT users.* FROM schema_1.users WHERE (users.id IN (1, 2))'
]
end

it 'Join' do
stub_posts.join('user.person').where(document_number: 'document_1').all

stub_db.sqls.must_equal [
"SELECT DISTINCT posts.* FROM schema_1.posts INNER JOIN schema_1.users AS user ON (user.id = posts.user_id) INNER JOIN schema_1.people AS user__person ON (user__person.user_id = user.id) WHERE (document_number = 'document_1')"
"SELECT DISTINCT posts.* FROM schema_1.posts INNER JOIN schema_1.users AS user ON (user.id = posts.user_id) INNER JOIN schema_1.people AS user__person ON (user__person.user_id = user.id) WHERE (posts.document_number = 'document_1')"
]
end

Expand Down
24 changes: 19 additions & 5 deletions spec/query_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@
end

it 'To String' do
users_query.where(id: [1,2,3]).order(:name).to_s.must_equal '#<Rasti::DB::Query: "SELECT * FROM `users` WHERE (`id` IN (1, 2, 3)) ORDER BY `name`">'
users_query.where(id: [1,2,3]).order(:name).to_s.must_equal '#<Rasti::DB::Query: "SELECT `users`.* FROM `users` WHERE (`users`.`id` IN (1, 2, 3)) ORDER BY `users`.`name`">'
end

describe 'Named queries' do
Expand All @@ -257,19 +257,19 @@
describe 'Join' do

it 'One to Many' do
users_query.join(:posts).where(title: 'Sample post').all.must_equal [User.new(id: 2, name: 'User 2')]
users_query.join(:posts).where(Sequel[:posts][:title] => 'Sample post').all.must_equal [User.new(id: 2, name: 'User 2')]
end

it 'Many to One' do
posts_query.join(:user).where(name: 'User 4').all.must_equal [Post.new(id: 3, user_id: 4, title: 'Best post', body: '...', language_id: 1)]
posts_query.join(:user).where(Sequel[:user][:name] => 'User 4').all.must_equal [Post.new(id: 3, user_id: 4, title: 'Best post', body: '...', language_id: 1)]
end

it 'One to One' do
users_query.join(:person).where(document_number: 'document_1').all.must_equal [User.new(id: 1, name: 'User 1')]
users_query.join(:person).where(Sequel[:person][:document_number] => 'document_1').all.must_equal [User.new(id: 1, name: 'User 1')]
end

it 'Many to Many' do
posts_query.join(:categories).where(name: 'Category 3').order(:id).all.must_equal [
posts_query.join(:categories).where(Sequel[:categories][:name] => 'Category 3').order(:id).all.must_equal [
Post.new(id: 2, user_id: 1, title: 'Another post', body: '...', language_id: 1),
Post.new(id: 3, user_id: 4, title: 'Best post', body: '...', language_id: 1),
]
Expand All @@ -283,6 +283,20 @@
.must_equal [Post.new(id: 1, user_id: 2, title: 'Sample post', body: '...', language_id: 1)]
end

it 'Excluded attributes permanents excluded when join' do
posts_query.join(:user)
.exclude_attributes(:body)
.where(Sequel[:user][:name] => 'User 4')
.all
.must_equal [Post.new(id: 3, title: 'Best post', user_id: 4, language_id: 1)]

posts_query.exclude_attributes(:body)
.join(:user)
.where(Sequel[:user][:name] => 'User 4')
.all
.must_equal [Post.new(id: 3, title: 'Best post', user_id: 4, language_id: 1)]
end

describe 'Multiple data sources' do

it 'One to Many' do
Expand Down

0 comments on commit 5fb153d

Please sign in to comment.