# frozen_string_literal: true
require 'faker'
require 'benchmark'
RSpec.describe :agg do
link :agg, from: :ree_dao
link :build_pg_connection, from: :ree_dao
after do
Ree.disable_irb_mode
end
before :all do
connection = build_pg_connection(ReeDaoAggTest::Db::DB_CONFIG)
connection.drop_table(:organizations, cascade: true) if connection.table_exists?(:organizations)
connection.drop_table(:users, cascade: true) if connection.table_exists?(:users)
connection.drop_table(:user_passports, cascade: true) if connection.table_exists?(:user_passports)
connection.drop_table(:books, cascade: true) if connection.table_exists?(:books)
connection.drop_table(:chapters, cascade: true) if connection.table_exists?(:chapters)
connection.drop_table(:avtorki, cascade: true) if connection.table_exists?(:avtorki)
connection.drop_table(:reviews, cascade: true) if connection.table_exists?(:reviews)
connection.drop_table(:review_authors, cascade: true) if connection.table_exists?(:review_authors)
connection.create_table :organizations do
primary_key :id
column :name, 'varchar(256)'
end
connection.create_table :users do
primary_key :id
column :name, 'varchar(256)'
column :age, :integer
foreign_key :organization_id, :organizations, null: false, on_delete: :cascade
end
connection.create_table :user_passports do
primary_key :id
foreign_key :user_id, :users, null: false, on_delete: :cascade
column :info, 'varchar(256)'
end
connection.create_table :books do
primary_key :id
foreign_key :user_id, :users, null: false, on_delete: :cascade
column :title, 'varchar(256)'
end
connection.create_table :chapters do
primary_key :id
foreign_key :book_id, :books, null: false, on_delete: :cascade
column :title, 'varchar(256)'
end
connection.create_table :reviews do
primary_key :id
foreign_key :book_id, :books, null: false, on_delete: :cascade
column :rating, :integer
end
connection.create_table :review_authors do
primary_key :id
foreign_key :review_id, :reviews, null: false, on_delete: :cascade
column :name, 'varchar(256)'
end
connection.create_table :avtorki do
primary_key :id
foreign_key :book_id, :books, null: false, on_delete: :cascade
column :name, 'varchar(256)'
end
connection.disconnect
end
require_relative 'ree_dao_agg_test'
class ReeDaoAggTest::AggUsers
include ReeDao::AggregateDSL
aggregate :agg_users do
link :users, from: :ree_dao_agg_test
link :organizations_dao, from: :ree_dao_agg_test
link :user_passports, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :chapters, from: :ree_dao_agg_test
link :authors, from: :ree_dao_agg_test
link :reviews, from: :ree_dao_agg_test
link :review_authors, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do |users_list|
belongs_to :organization
has_many :books do |books_list|
has_one :author
has_many :chapters
has_many :reviews, -> { reviews_opts } do |reviews_list|
has_one :review_author
field :review_calculatetable_field, -> { some_method(reviews_list) }
end
field :book_calculatetable_field, -> { change_book_titles(books_list) }
end
has_one :passport, -> { passport_opts }
has_one :custom_field, -> { custom_field_opts }
field :user_calculatetable_field, -> { some_method(users_list) }
end
end
private
def change_book_titles(books_list)
books_list.each do |book|
book.title = "#{book.title.upcase} changed"
end
end
def some_method(list)
list.each { _1.some_field = :some_value if _1.respond_to?(:some_field=) }
end
def passport_opts
{
foreign_key: :user_id,
scope: user_passports
}
end
def custom_field_opts
{
scope: books.where(title: "1984")
}
end
def reviews_opts
{ autoload_children: true }
end
end
class ReeDaoAggTest::AggUsersWithDto
include ReeDao::AggregateDSL
aggregate :agg_users_with_dto do
link :users, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :authors, from: :ree_dao_agg_test
link :chapters, from: :ree_dao_agg_test
link :organizations_dao, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do
belongs_to :organization
has_many :books, -> { books_opts } do
has_one :author, -> { author_opts }
has_many :chapters, -> { chapters_opts }
end
end
end
private
def books_opts
{
to_dto: -> (book) { ReeDaoAggTest::BookDto.new(book) },
setter: -> (item, child_index) {
item.set_books(child_index[item.id] || [])
}
}
end
def author_opts
{ to_dto: -> (author) { ReeDaoAggTest::AuthorDto.new(author) }}
end
def chapters_opts
{ to_dto: -> (chapter) { ReeDaoAggTest::ChapterDto.new(chapter) }}
end
end
class ReeDaoAggTest::AggUsersAutoloadBooksChildren
include ReeDao::AggregateDSL
aggregate :agg_users_autoload_books_children do
link :users, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :chapters, from: :ree_dao_agg_test
link :authors, from: :ree_dao_agg_test
link :reviews, from: :ree_dao_agg_test
link :review_authors, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do
belongs_to :organization
has_many :books, -> { books_opts } do
has_one :author
has_many :chapters
has_many :reviews do
has_one :review_author
end
end
end
end
private
def books_opts
{ autoload_children: true }
end
end
class ReeDaoAggTest::AggUsersAutoloadReviewsChildren
include ReeDao::AggregateDSL
aggregate :agg_users_autoload_reviews_children do
link :users, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :chapters, from: :ree_dao_agg_test
link :authors, from: :ree_dao_agg_test
link :reviews, from: :ree_dao_agg_test
link :review_authors, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do
belongs_to :organization
has_many :books do
has_one :author
has_many :chapters
has_many :reviews, -> { { autoload_children: true } } do
has_one :review_author
end
end
end
end
private
def reviews_opts
{ autoload_children: true }
end
end
class ReeDaoAggTest::AggUsersBlockTest
include ReeDao::AggregateDSL
aggregate :agg_users_block_test do
link :users, from: :ree_dao_agg_test
link :organizations_dao, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do
belongs_to :organization
has_many :books, -> { books_opts }
end
end
private
def books_opts
{
setter: -> (item, items_index) {
b = items_index[item.id].each { |b| b.title = "Changed" }
item.set_books(b)
}
}
end
end
class ReeDaoAggTest::AggUsersScopeMethodTest
include ReeDao::AggregateDSL
aggregate :agg_users_scope_method_test do
link :users, from: :ree_dao_agg_test
link :organizations_dao, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do |agg_list|
some_id = agg_list.first.id
title = "1984"
belongs_to :organization
has_many :books, -> { books_opts(title) }
has_many :active_books, books
end
end
private
def books_opts(title)
{ scope: books_scope(title) }
end
def books_scope(title)
books.where(title: title)
end
end
class ReeDaoAggTest::AggUsersOnlyDataset
include ReeDao::AggregateDSL
aggregate :agg_users_only_dataset do
link :users, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do
has_many :books, books.where(title: "1408")
end
end
end
class ReeDaoAggTest::AggUsersWithoutDao
include ReeDao::AggregateDSL
aggregate :agg_users_without_dao do
link :users, from: :ree_dao_agg_test
link :organizations_dao, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do
has_many :something
end
end
end
class ReeDaoAggTest::AggUsersOnlyExceptKeys
include ReeDao::AggregateDSL
aggregate :agg_users_only_except_keys do
link :users, from: :ree_dao_agg_test
link :organizations_dao, from: :ree_dao_agg_test
link :books, from: :ree_dao_agg_test
link :agg, from: :ree_dao
end
def call(ids_or_scope, **opts)
agg(users, ids_or_scope, **opts) do
belongs_to :organization
has_many :books
end
end
end
let(:agg_users) { ReeDaoAggTest::AggUsers.new }
let(:agg_users_block) { ReeDaoAggTest::AggUsersBlockTest.new }
let(:agg_users_scope_method) { ReeDaoAggTest::AggUsersScopeMethodTest.new }
let(:agg_users_autoload_books_children) { ReeDaoAggTest::AggUsersAutoloadBooksChildren.new }
let(:agg_users_autoload_reviews_children) { ReeDaoAggTest::AggUsersAutoloadReviewsChildren.new }
let(:agg_users_without_dao) { ReeDaoAggTest::AggUsersWithoutDao.new }
let(:agg_users_with_dto) { ReeDaoAggTest::AggUsersWithDto.new }
let(:agg_users_only_dataset) { ReeDaoAggTest::AggUsersOnlyDataset.new }
let(:user_agg_only_except_keys) { ReeDaoAggTest::AggUsersOnlyExceptCase.new }
let(:organizations) { ReeDaoAggTest::OrganizationsDao.new }
let(:users) { ReeDaoAggTest::Users.new }
let(:user_passports) { ReeDaoAggTest::UserPassports.new }
let(:books) { ReeDaoAggTest::Books.new }
let(:chapters) { ReeDaoAggTest::Chapters.new }
let(:authors) { ReeDaoAggTest::Authors.new }
let(:reviews) { ReeDaoAggTest::Reviews.new }
let(:review_authors) { ReeDaoAggTest::ReviewAuthors.new }
it {
organizations.delete_all
users.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user)
expect {
agg_users_without_dao.call(users.all)
}.to raise_error(ArgumentError)
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
passport_1 = ReeDaoAggTest::UserPassport.new(user_id: user_1.id, info: "some info")
user_passports.put(passport_1)
user_passports.put(ReeDaoAggTest::UserPassport.new(user_id: user_2.id, info: "another info"))
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
chapter = ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "beginning")
chapters.put(chapter)
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
authors.put(ReeDaoAggTest::Author.new(book_id: book_1.id, name: "George Orwell"))
review = ReeDaoAggTest::Review.new(book_id: book_1.id, rating: 10)
reviews.put(review)
reviews.put(ReeDaoAggTest::Review.new(book_id: book_1.id, rating: 7))
review_authors.put(ReeDaoAggTest::ReviewAuthor.new(review_id: review.id, name: "John Review"))
res = agg_users.call(
users.all,
only: [:books, :reviews],
except: [:review_author]
)
expect(res.first.books.first.reviews.first.review_author).to eq(nil)
}
it {
organizations.delete_all
users.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user)
expect {
agg_users_without_dao.call(users.all, only: [:books], except: [:books])
}.to raise_error(ArgumentError, "you can't use both :only and :except for \"books\" keys")
}
it {
organizations.delete_all
users.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
books.put(book_1)
authors.put(ReeDaoAggTest::Author.new(book_id: book_1.id, name: "George Orwell"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
res = agg_users_with_dto.call(
users.all,
to_dto: -> (user) {
ReeDaoAggTest::UserDto.new(
id: user.id,
name: user.name,
organization_id: user.organization_id,
full_name: user.name
)
}
)
book = res.first.books.first
expect(res.first.class).to eq(ReeDaoAggTest::UserDto)
expect(book.class).to eq(ReeDaoAggTest::BookDto)
expect(book.author.class).to eq(ReeDaoAggTest::AuthorDto)
expect(book.chapters.first.class).to eq(ReeDaoAggTest::ChapterDto)
}
it {
organizations.delete_all
users.delete_all
org = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(org)
user = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: org.id)
users.put(user)
book_1 = ReeDaoAggTest::Book.new(user_id: user.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user.id, title: "1408")
book_3 = ReeDaoAggTest::Book.new(user_id: user.id, title: "1408")
books.put(book_1)
books.put(book_2)
books.put(book_3)
res = agg_users_only_dataset.call(users.where(name: "John"))
user = res[0]
expect(user.books.map(&:title).uniq).to eq(["1408"])
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
passport_1 = ReeDaoAggTest::UserPassport.new(user_id: user_1.id, info: "some info")
user_passports.put(passport_1)
user_passports.put(ReeDaoAggTest::UserPassport.new(user_id: user_2.id, info: "another info"))
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
chapter = ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "beginning")
chapters.put(chapter)
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
authors.put(ReeDaoAggTest::Author.new(book_id: book_1.id, name: "George Orwell"))
review = ReeDaoAggTest::Review.new(book_id: book_1.id, rating: 10)
reviews.put(review)
reviews.put(ReeDaoAggTest::Review.new(book_id: book_1.id, rating: 7))
review_authors.put(ReeDaoAggTest::ReviewAuthor.new(review_id: review.id, name: "John Review"))
res = agg_users.call(
users.all,
chapters: -> (scope) { scope.ids(chapter.id) }
)
res_user = res[0]
expect(res_user.id).to eq(user_1.id)
expect(res_user.organization).to eq(organization)
expect(res_user.passport).to eq(passport_1)
expect(res_user.passport.info).to eq("some info")
expect(res_user.books.count).to eq(2)
expect(res_user.books.map(&:title)).to eq(["1984 changed", "1408 changed"])
expect(res_user.books[0].author.name).to eq("George Orwell")
expect(res_user.books[0].chapters.map(&:title)).to eq(["beginning"])
expect(res_user.books[0].reviews[0].review_author.name).to eq("John Review")
expect(res_user.custom_field).to_not eq(nil)
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
author_1 = ReeDaoAggTest::Author.new(book_id: book_1.id, name: "George Orwell")
author_2 = ReeDaoAggTest::Author.new(book_id: book_2.id, name: "Stephen King")
authors.put(author_1)
authors.put(author_2)
res = agg_users.call(
users.all
)
expect(res[0].books.first.author).to_not eq(nil)
authors.delete(author_1)
authors.delete(author_2)
res = agg_users.call(
users.all
)
expect(res[0].books[0].author).to eq(nil)
expect(res[0].books[1].author).to eq(nil)
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
res = agg_users.call(
users.all
)
expect(res[0].books).to_not eq([])
expect(res[1].books).to eq([])
books.delete(book_1)
books.delete(book_2)
res = agg_users.call(
users.all
)
expect(res[0].books).to eq([])
expect(res[1].books).to eq([])
}
it {
organizations.delete_all
users.delete_all
books.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
res = agg_users_scope_method.call(users.all)
res_user = res[0]
expect(res_user.id).to eq(user_1.id)
expect(res_user.organization).to eq(organization)
expect(res_user.books.count).to eq(1)
expect(res_user.active_books.count).to eq(2)
}
it {
organizations.delete_all
users.delete_all
books.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
expect {
agg_users_scope_method.call(users.where(name: "Another names"))
}.to_not raise_error
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user_1)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
res = agg_users.call(
users.all,
only: [:books, :chapters]
)
u = res[0]
expect(u.books.count).to eq(2)
expect(u.books[0].chapters.count).to_not eq(0)
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user_1)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
res = agg_users.call(
users.all,
only: [:books, :chapters]
)
u = res[0]
expect(u.books.count).to eq(2)
expect(u.books[0].chapters.count).to_not eq(0)
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user)
book = ReeDaoAggTest::Book.new(user_id: user.id, title: "1984")
books.put(book)
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book.id, title: "interlude"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book.id, title: "tragic ending"))
authors.put(ReeDaoAggTest::Author.new(book_id: book.id, name: "George Orwell"))
review = ReeDaoAggTest::Review.new(book_id: book.id, rating: 5)
reviews.put(review)
review_authors.put(ReeDaoAggTest::ReviewAuthor.new(review_id: review.id, name: "John"))
res = agg_users_autoload_books_children.call(
users.all,
only: [:books]
)
u = res[0]
expect(u.books).to_not eq(nil)
expect(u.books[0].chapters).to_not eq(nil)
expect(u.books[0].author).to_not eq(nil)
expect(u.books[0].reviews).to_not eq(nil)
expect(u.books[0].reviews[0].review_author).to eq(nil)
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user)
book = ReeDaoAggTest::Book.new(user_id: user.id, title: "1984")
books.put(book)
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book.id, title: "interlude"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book.id, title: "tragic ending"))
authors.put(ReeDaoAggTest::Author.new(book_id: book.id, name: "George Orwell"))
review = ReeDaoAggTest::Review.new(book_id: book.id, rating: 5)
reviews.put(review)
review_authors.put(ReeDaoAggTest::ReviewAuthor.new(review_id: review.id, name: "John"))
res = agg_users_autoload_reviews_children.call(
users.all,
only: [:books, :reviews]
)
u = res[0]
expect(u.books).to_not eq(nil)
expect(u.books[0].chapters).to eq(nil)
expect(u.books[0].author).to eq(nil)
expect(u.books[0].reviews).to_not eq(nil)
expect(u.books[0].reviews[0].review_author).to_not eq(nil)
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user_1)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
books.put(book_1)
res = agg_users_block.call(user_1.id)
u = res[0]
expect(u.books.map(&:title)).to eq(["Changed"])
}
it {
organizations.delete_all
users.delete_all
user_passports.delete_all
books.delete_all
chapters.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user_1)
book_1 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1984")
book_2 = ReeDaoAggTest::Book.new(user_id: user_1.id, title: "1408")
books.put(book_1)
books.put(book_2)
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "interlude"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_1.id, title: "tragic ending"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "beginning"))
chapters.put(ReeDaoAggTest::Chapter.new(book_id: book_2.id, title: "ending"))
res = agg_users.call(
users.all,
except: [:organization, :passport, :custom_field]
)
u = res[0]
expect(u.books.count).to eq(2)
expect(u.passport).to eq(nil)
expect(u.organization).to eq(nil)
expect(u.custom_field).to eq(nil)
}
it {
organizations.delete_all
users.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
ids = [user_1, user_2].map(&:id)
res = agg(users, ids)
expect(res.count).to eq(2)
}
it {
organizations.delete_all
users.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user_1)
res = agg(users, user_1.id)
expect(res.count).to eq(1)
}
it {
organizations.delete_all
users.delete_all
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user_1 = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
user_2 = ReeDaoAggTest::User.new(name: "Sam", age: 21, organization_id: organization.id)
users.put(user_1)
users.put(user_2)
res = agg(users, users.where(organization_id: organization.id))
expect(res.count).to eq(2)
}
context "when sync mode enabled" do
it {
organization = ReeDaoAggTest::Organization.new(name: "Test Org")
organizations.put(organization)
user = ReeDaoAggTest::User.new(name: "John", age: 33, organization_id: organization.id)
users.put(user)
allow(user).to receive(:some_field=)
expect(user).to receive(:some_field=).with(:some_value)
ENV['REE_DAO_SYNC_ASSOCIATIONS'] = "true"
res = agg_users.([user])
ENV.delete('REE_DAO_SYNC_ASSOCIATIONS')
}
end
end