app/jobs/create_new_version.rb
class CreateNewVersion < ActiveJob::Base
def perform
ActiveRecord::Base.transaction do
old_version = Version.current_version
new_version = Version.create_new_version(:major)
process_existing_dsvs(old_version, new_version)
process_new_dsvs(new_version)
end
end
def process_existing_dsvs(old_version, new_version)
old_version.disease_source_variants.find_each do |old_dsv|
new_dsv = old_dsv.dup
new_dsv.version = new_version
new_dsv.tags = old_dsv.tags
new_dsv.save
end
end
private
def process_new_dsvs(new_version)
SubmittedVariant.where(status: 'accepted').find_each do |submitted_variant|
dsv_tags = extract_tags(submitted_variant.tags)
batch_tags = extract_tags(submitted_variant.batch.tags)
all_tags = (dsv_tags + batch_tags).uniq.map do |t|
Tag.where(name: t).first_or_create
end
dsv = DiseaseSourceVariant.where(
variant: get_variant(submitted_variant),
source: Source.find_by(pubmed_id: submitted_variant.pubmed_id),
disease: Disease.find_by(doid: submitted_variant.doid.gsub('DOID:', '')),
version: new_version,
).first_or_create do |v|
v.batch = submitted_variant.batch
end
current_tags = dsv.tags
dsv.tags = (current_tags + all_tags).uniq
if submitted_variant.meta.present?
current_meta = dsv.meta || {}
new_meta = JSON.parse(submitted_variant.meta) || {}
unless new_meta.empty?
dsv.meta = current_meta.merge({ submitted_variant.batch.name => new_meta })
end
end
dsv.save
submitted_variant.status = 'included'
submitted_variant.save
end
end
def extract_tags(string)
if string.present?
string.split(',')
.map(&:downcase)
.map(&:strip)
.reject(&:blank?)
else
[]
end
end
def get_variant(submitted_variant)
Variant.where(
cdna_change: submitted_variant.cdna_change,
variant: submitted_variant.variant,
strand: submitted_variant.strand,
location: get_location(submitted_variant),
variant_type: get_variant_type(submitted_variant),
transcript: get_transcript(submitted_variant),
gene: get_gene(submitted_variant),
mutation_type: get_mutation_type(submitted_variant),
amino_acid: get_amino_acid(submitted_variant),
).first_or_create do |variant|
#if this is the first time we've seen this variant, link it to the batch and generate an hgvs
variant.batch = submitted_variant.batch
variant.hgvs = DataFetchers::HGVS.get_hgvs_from_variant(variant)
variant.save
end
end
def get_location(submitted_variant)
Location.where(
chromosome: submitted_variant.chromosome,
reference_read: submitted_variant.reference,
start: submitted_variant.start,
stop: submitted_variant.stop,
reference_sequence_version: 'GRCh37'
).first_or_create
end
def get_variant_type(submitted_variant)
ref = submitted_variant.reference
var = submitted_variant.variant
name = if ref == '-'
'INS'
elsif var == '-'
'DEL'
elsif ref.size == 1 && var.size == 1
'SNV'
elsif ref.size == 2 && var.size == 2
'DNV'
else
'unknown'
end
VariantType.where(
name: name
).first_or_create
end
def get_transcript(submitted_variant)
Transcript.where(
name: submitted_variant.transcript,
source: 'ensembl',
version: '74_37'
).first_or_create
end
def get_gene(submitted_variant)
Gene.where(
name: submitted_variant.gene_symbol,
).first_or_create do |gene|
gene.ensembl_id = submitted_variant.ensembl_gene_id
end
end
def get_mutation_type(submitted_variant)
MutationType.where(
name: submitted_variant.mutation_type
).first_or_create
end
def get_amino_acid(submitted_variant)
AminoAcid.where(
name: submitted_variant.amino_acid_change
).first_or_create
end
end