mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-12-27 18:52:07 +08:00
set up queries for fetch samples and related objects
This commit is contained in:
parent
ccba5d3eb3
commit
370852d960
1 changed files with 145 additions and 0 deletions
145
lib/tasks/samples_to_repository_migration.rake
Normal file
145
lib/tasks/samples_to_repository_migration.rake
Normal file
|
@ -0,0 +1,145 @@
|
|||
namespace :samples_to_repository_migration do
|
||||
def prepare_repository(team, copy_num = 0)
|
||||
repository = Repository.new(
|
||||
name: copy_num > 0 ? "Samples (#{copy_num})" : 'Samples',
|
||||
team: team,
|
||||
created_by: team.created_by
|
||||
)
|
||||
return repository if repository.save
|
||||
prepare_repository(team, copy_num += 1)
|
||||
end
|
||||
|
||||
def prepare_text_value_custom_columns(team, repository)
|
||||
custom_columns_sql = <<-SQL
|
||||
SELECT * FROM custom_fields WHERE team_id = #{team.id}
|
||||
SQL
|
||||
# execute query
|
||||
custom_columns = ActiveRecord::Base.connection.execute(custom_columns_sql)
|
||||
|
||||
repository_columns = []
|
||||
custom_columns.each_with_index do |column, index|
|
||||
repository_column = RepositoryColumn.create(
|
||||
repository: repository,
|
||||
created_by_id: column.fetch('user_id') { repository.created_by_id },
|
||||
data_type: :RepositoryTextValue,
|
||||
name: column.fetch('name') { "Custom column (#{index})" },
|
||||
created_at: column.fetch('created_at') { DateTime.now },
|
||||
updated_at: column.fetch('updated_at') { DateTime.now }
|
||||
)
|
||||
repository_columns << repository_column
|
||||
end
|
||||
repository_columns
|
||||
end
|
||||
|
||||
def prepare_list_value_custom_columns_with_list_items(team, repository)
|
||||
sample_types_sql = <<-SQL
|
||||
SELECT name, created_by_id, last_modified_by_id
|
||||
FROM sample_types
|
||||
WHERE team_id = #{team.id}
|
||||
SQL
|
||||
sample_groups_sql = <<-SQL
|
||||
SELECT name, created_by_id, last_modified_by_id
|
||||
FROM sample_groups
|
||||
WHERE team_id = #{team.id}
|
||||
SQL
|
||||
# execute query
|
||||
sample_types = ActiveRecord::Base.connection.execute(sample_types_sql)
|
||||
sample_groups = ActiveRecord::Base.connection.execute(sample_groups_sql)
|
||||
|
||||
repository_columns = []
|
||||
|
||||
repository_columns << RepositoryColumn.create(
|
||||
repository: repository,
|
||||
created_by_id: repository.created_by_id,
|
||||
data_type: :RepositoryListValue,
|
||||
name: 'Sample group'
|
||||
)
|
||||
|
||||
repository_columns << RepositoryColumn.create(
|
||||
repository: repository,
|
||||
created_by_id: repository.created_by_id,
|
||||
data_type: :RepositoryListValue,
|
||||
name: 'Sample type'
|
||||
)
|
||||
|
||||
sample_groups.each_with_index do |item, index|
|
||||
RepositoryListItem.create(
|
||||
data: item.fetch('name') { "sample group item (#{index})" },
|
||||
created_by_id: item.fetch('created_by_id') { team.created_by_id },
|
||||
last_modified_by_id: item.fetch('last_modified_by_id') { team.created_by_id },
|
||||
repository_column: repository_columns.first,
|
||||
repository: repository
|
||||
)
|
||||
end
|
||||
|
||||
sample_types.each_with_index do |item, index|
|
||||
RepositoryListItem.create(
|
||||
data: item.fetch('name') { "sample group item (#{index})" },
|
||||
created_by_id: item.fetch('created_by_id') { team.created_by_id },
|
||||
last_modified_by_id: item.fetch('last_modified_by_id') { team.created_by_id },
|
||||
repository_column: repository_columns.last,
|
||||
repository: repository
|
||||
)
|
||||
end
|
||||
|
||||
repository_columns
|
||||
end
|
||||
|
||||
def get_sample_fields(sample_id)
|
||||
custom_sample_fields_sql = <<-SQL
|
||||
SELECT custom_fields.name AS column_name_reference,
|
||||
sample_custom_fields.value,
|
||||
sample_custom_fields.created_at,
|
||||
sample_custom_fields.updated_at
|
||||
FROM custom_fields
|
||||
INNER JOIN sample_custom_fields
|
||||
ON custom_fields.id = sample_custom_fields.custom_field_id
|
||||
WHERE sample_custom_fields.sample_id = #{sample_id}
|
||||
SQL
|
||||
ActiveRecord::Base.connection.execute(custom_sample_fields_sql)
|
||||
end
|
||||
|
||||
def get_assigned_sample_module(sample_id)
|
||||
assigned_samples_sql = <<-SQL
|
||||
SELECT my_module_id, assigned_by_id, assigned_on
|
||||
FROM sample_my_modules
|
||||
WHERE sample_my_modules.sample_id = #{sample_id}
|
||||
SQL
|
||||
ActiveRecord::Base.connection.execute(assigned_samples_sql)
|
||||
end
|
||||
|
||||
desc 'Migrates all data from samples to custom repository'
|
||||
task :run, [:last_id] => :environment do |_, args|
|
||||
params = { batch_size: 10 }
|
||||
if args.present? && args[:last_id].present?
|
||||
params[:start] = args[:last_id].to_i
|
||||
end
|
||||
Team.find_each(params) do |team|
|
||||
puts "******************************* \n\n\n\n"
|
||||
puts "Processing Team id => [#{team.id}] \n\n\n\n"
|
||||
puts '*******************************'
|
||||
|
||||
samples_sql = <<-SQL
|
||||
SELECT samples.id AS sample_id,
|
||||
samples.name AS sample_name,
|
||||
samples.user_id AS sample_created_by_id,
|
||||
samples.last_modified_by_id AS sample_last_modified_by_id,
|
||||
sample_types.name AS sample_type_name,
|
||||
sample_groups.name AS sample_group_name,
|
||||
sample_groups.color AS sample_group_color
|
||||
FROM samples
|
||||
JOIN sample_types ON samples.sample_type_id = sample_types.id
|
||||
JOIN sample_groups ON samples.sample_type_id = sample_groups.id
|
||||
WHERE samples.team_id = #{team.id}
|
||||
SQL
|
||||
|
||||
repository = prepare_repository(team)
|
||||
custom_columns = prepare_text_value_custom_columns(team, repository) +
|
||||
prepare_list_value_custom_columns_with_list_items(
|
||||
team,
|
||||
repository
|
||||
)
|
||||
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue