spec/query_spec.rb in rasti-db-1.4.0 vs spec/query_spec.rb in rasti-db-1.5.0
- old
+ new
@@ -1,22 +1,42 @@
require 'minitest_helper'
describe 'Query' do
before do
- 1.upto(10) { |i| db[:users].insert name: "User #{i}" }
+ 1.upto(10) do |i|
+ db[:users].insert name: "User #{i}"
+ db[:people].insert user_id: i,
+ document_number: i,
+ first_name: "Name #{i}",
+ last_name: "Last Name #{i}",
+ birth_date: Time.now
+ end
+
db[:posts].insert user_id: 2, title: 'Sample post', body: '...'
db[:posts].insert user_id: 1, title: 'Another post', body: '...'
db[:posts].insert user_id: 4, title: 'Best post', body: '...'
- end
- let(:users_query) { Rasti::DB::Query.new Users, db[:users] }
+ 1.upto(3) { |i| db[:categories].insert name: "Category #{i}" }
+
+ db[:comments].insert post_id: 1, user_id: 5, text: 'Comment 1'
+ db[:comments].insert post_id: 1, user_id: 7, text: 'Comment 2'
+ db[:comments].insert post_id: 2, user_id: 2, text: 'Comment 3'
- let(:posts_query) { Rasti::DB::Query.new Posts, db[:posts] }
+ db[:categories_posts].insert post_id: 1, category_id: 1
+ db[:categories_posts].insert post_id: 1, category_id: 2
+ db[:categories_posts].insert post_id: 2, category_id: 2
+ db[:categories_posts].insert post_id: 2, category_id: 3
+ db[:categories_posts].insert post_id: 3, category_id: 3
+ end
+
+ let(:users_query) { Rasti::DB::Query.new collection_class: Users, dataset: db[:users] }
- let(:comments_query) { Rasti::DB::Query.new Comments, db[:comments] }
+ let(:posts_query) { Rasti::DB::Query.new collection_class: Posts, dataset: db[:posts] }
+
+ let(:comments_query) { Rasti::DB::Query.new collection_class: Comments, dataset: db[:comments] }
it 'Count' do
users_query.count.must_equal 10
end
@@ -35,10 +55,65 @@
it 'Primary keys' do
users_query.primary_keys.must_equal db[:users].map { |u| u[:id] }
end
+ it 'Select attributes' do
+ posts_query.select_attributes(:id, :user_id).all.must_equal db[:posts].select(:id, :user_id).map { |r| Post.new r }
+ end
+
+ it 'Exclude attributes' do
+ posts_query.exclude_attributes(:body).all.must_equal db[:posts].select(:id, :user_id, :title).map { |r| Post.new r }
+ end
+
+ it 'All attributes' do
+ posts_query.exclude_attributes(:body).all_attributes.all.must_equal db[:posts].map { |r| Post.new r }
+ end
+
+ it 'Select graph attributes' do
+ person = Person.new db[:people].where(document_number: 2).select(:first_name, :last_name, :user_id).first
+
+ user = User.new db[:users].where(id: 2).select(:id).first.merge(person: person)
+
+ post = Post.new db[:posts].where(id: 1).first.merge(user: user)
+
+ posts_query.where(id: 1)
+ .graph('user.person')
+ .select_graph_attributes(user: [:id], 'user.person' => [:first_name, :last_name, :user_id])
+ .all
+ .must_equal [post]
+ end
+
+ it 'Exclude graph attributes' do
+ person = Person.new db[:people].where(document_number: 2).select(:document_number, :last_name, :user_id).first
+
+ user = User.new db[:users].where(id: 2).select(:id).first.merge(person: person)
+
+ post = Post.new db[:posts].where(id: 1).first.merge(user: user)
+
+ posts_query.where(id: 1)
+ .graph('user.person')
+ .exclude_graph_attributes(user: [:name], 'user.person' => [:first_name, :birth_date])
+ .all
+ .must_equal [post]
+ end
+
+ it 'All graph attributes' do
+ person = Person.new db[:people].where(document_number: 2).first
+
+ user = User.new db[:users].where(id: 2).select(:id).first.merge(person: person)
+
+ post = Post.new db[:posts].where(id: 1).first.merge(user: user)
+
+ posts_query.where(id: 1)
+ .graph('user.person')
+ .exclude_graph_attributes(user: [:name], 'user.person' => [:birth_date, :first_name, :last_name])
+ .all_graph_attributes('user.person')
+ .all
+ .must_equal [post]
+ end
+
it 'Map' do
users_query.map(&:name).must_equal db[:users].map(:name)
end
it 'Detect' do
@@ -94,16 +169,18 @@
it 'Graph' do
users_query.graph(:posts).where(id: 1).first.must_equal User.new(id: 1, name: 'User 1', posts: [Post.new(id: 2, user_id: 1, title: 'Another post', body: '...')])
end
- it 'Empty?' do
+ it 'Any?' do
users_query.empty?.must_equal false
users_query.any?.must_equal true
end
- it 'Any?' do
+ it 'Empty?' do
+ db[:comments].truncate
+
comments_query.empty?.must_equal true
comments_query.any?.must_equal false
end
it 'To String' do
@@ -124,32 +201,10 @@
end
describe 'Join' do
- before do
- 1.upto(10) do |i|
- db[:people].insert user_id: i,
- document_number: i,
- first_name: "Name #{i}",
- last_name: "Last Name #{i}",
- birth_date: Time.now
- end
-
- 1.upto(3) { |i| db[:categories].insert name: "Category #{i}" }
-
- db[:comments].insert post_id: 1, user_id: 5, text: 'Comment 1'
- db[:comments].insert post_id: 1, user_id: 7, text: 'Comment 2'
- db[:comments].insert post_id: 2, user_id: 2, text: 'Comment 3'
-
- db[:categories_posts].insert post_id: 1, category_id: 1
- db[:categories_posts].insert post_id: 1, category_id: 2
- db[:categories_posts].insert post_id: 2, category_id: 2
- db[:categories_posts].insert post_id: 2, category_id: 3
- db[:categories_posts].insert post_id: 3, category_id: 3
- end
-
it 'One to Many' do
users_query.join(:posts).where(title: 'Sample post').all.must_equal [User.new(id: 2, name: 'User 2')]
end
it 'Many to One' do
@@ -177,56 +232,38 @@
end
describe 'NQL' do
- before do
- 1.upto(10) do |i|
- db[:people].insert user_id: i,
- document_number: i,
- first_name: "Name #{i}",
- last_name: "Last Name #{i}",
- birth_date: Time.now
- end
-
- 1.upto(3) { |i| db[:categories].insert name: "Category #{i}" }
-
- db[:comments].insert post_id: 1, user_id: 5, text: 'Comment 1'
- db[:comments].insert post_id: 1, user_id: 7, text: 'Comment 2'
- db[:comments].insert post_id: 2, user_id: 2, text: 'Comment 3'
-
- db[:categories_posts].insert post_id: 1, category_id: 1
- db[:categories_posts].insert post_id: 1, category_id: 2
- db[:categories_posts].insert post_id: 2, category_id: 2
- db[:categories_posts].insert post_id: 2, category_id: 3
- db[:categories_posts].insert post_id: 3, category_id: 3
- end
-
it 'Invalid expression' do
error = proc { posts_query.nql('a + b') }.must_raise Rasti::DB::NQL::InvalidExpressionError
error.message.must_equal 'Invalid filter expression: a + b'
end
it 'Filter to self table' do
- people_query = Rasti::DB::Query.new People, db[:people]
-
- people_query.nql('user_id > 7')
- .map(&:user_id)
- .sort
- .must_equal [8, 9, 10]
+ posts_query.nql('user_id > 1')
+ .pluck(:user_id)
+ .sort
+ .must_equal [2, 4]
end
it 'Filter to join table' do
posts_query.nql('categories.name = Category 2')
- .map(&:id)
+ .pluck(:id)
.sort
.must_equal [1, 2]
end
it 'Filter to 2nd order relation' do
posts_query.nql('comments.user.person.document_number = 7')
- .map(&:id)
+ .pluck(:id)
.must_equal [1]
+ end
+
+ it 'Filter combined' do
+ posts_query.nql('(categories.id = 1 | categories.id = 3) & comments.user.person.document_number = 2')
+ .pluck(:id)
+ .must_equal [2]
end
end
end
\ No newline at end of file