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