Class: Dratools::RunRecordCollector

Inherits:
Object
  • Object
show all
Defined in:
lib/dratools/run_record_collector.rb

Overview

BioProject などの上位レコードから DDBJ sra-run レコードを集める。

Constant Summary collapse

TRAVERSABLE_XREF_TYPES =
[
  DdbjRecordFields::SRA_RUN_RESOURCE_TYPE,
  DdbjRecordFields::SRA_EXPERIMENT_RESOURCE_TYPE,
  DdbjRecordFields::SRA_SAMPLE_RESOURCE_TYPE,
  DdbjRecordFields::SRA_STUDY_RESOURCE_TYPE,
  DdbjRecordFields::SRA_SUBMISSION_RESOURCE_TYPE,
  DdbjRecordFields::BIOPROJECT_RESOURCE_TYPE,
  DdbjRecordFields::BIOSAMPLE_RESOURCE_TYPE
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(client:) ⇒ RunRecordCollector

Returns a new instance of RunRecordCollector.



22
23
24
# File 'lib/dratools/run_record_collector.rb', line 22

def initialize(client:)
  @client = client
end

Instance Method Details

#collect_run_records(ddbj_record, seen_keys = Set.new) ⇒ Object



26
27
28
# File 'lib/dratools/run_record_collector.rb', line 26

def collect_run_records(ddbj_record, seen_keys = Set.new)
  explore(ddbj_record, seen_keys: seen_keys).run_records
end

#explore(ddbj_record, seen_keys: Set.new, relation: TraversalNode::ROOT_RELATION, tolerant: false, direct_run_fetch_limit: nil) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/dratools/run_record_collector.rb', line 30

def explore(ddbj_record, seen_keys: Set.new, relation: TraversalNode::ROOT_RELATION,
            tolerant: false, direct_run_fetch_limit: nil)
  node = node_from_record(ddbj_record, relation: relation)
  return node if run_record?(ddbj_record)

  xrefs = ddbj_record.fetch(DdbjRecordFields::DB_XREFS_KEY, [])
  run_xrefs = xrefs.select { |xref| sra_run_xref?(xref) }
  if (lightweight_children = lightweight_direct_run_nodes(run_xrefs, direct_run_fetch_limit))
    node.children.concat(lightweight_children)
    return node
  end

  direct_children = explore_run_xrefs(
    run_xrefs,
    seen_keys,
    tolerant: tolerant,
    direct_run_fetch_limit: direct_run_fetch_limit
  )
  if direct_children.any? { |child| child.run? || child.run_records.any? }
    node.children.concat(direct_children)
    return node
  end

  node.children.concat(
    recursive_children(ddbj_record, xrefs, seen_keys, tolerant, direct_run_fetch_limit)
  )
  node
end