class SequenceServer::Database

Model Database’s eigenclass as a collection of Database objects.

Public Class Methods

[](ids) click to toggle source
# File lib/sequenceserver/database.rb, line 141
def [](ids)
  ids = Array ids
  collection.values_at(*ids)
end
all() click to toggle source
# File lib/sequenceserver/database.rb, line 150
def all
  collection.values
end
clear() click to toggle source

Intended to be used only for testing.

# File lib/sequenceserver/database.rb, line 258
def clear
  collection.clear
end
collection=(databases) click to toggle source
# File lib/sequenceserver/database.rb, line 133
def collection=(databases)
  databases.each do |db|
    collection[db.id] = db
  end
end
each(&block) click to toggle source
# File lib/sequenceserver/database.rb, line 178
def each(&block)
  all.each(&block)
end
first() click to toggle source

Intended to be used only for testing.

# File lib/sequenceserver/database.rb, line 253
def first
  all.first
end
group_by(&block) click to toggle source
# File lib/sequenceserver/database.rb, line 186
def group_by(&block)
  all.group_by(&block)
end
ids() click to toggle source
# File lib/sequenceserver/database.rb, line 146
def ids
  collection.keys
end
include?(path) click to toggle source
# File lib/sequenceserver/database.rb, line 182
def include?(path)
  collection.include? Digest::MD5.hexdigest path
end
retrieve(loci) click to toggle source

Retrieve given loci from the databases we have.

loci to retrieve are specified as a String:

"accession_1,accession_2:start-stop,accession_3"

Return value is a FASTA format String containing sequences in the same order in which they were requested. If an accession could not be found, a commented out error message is included in place of the sequence. Sequences are retrieved from the first database in which the accession is found. The returned sequences can, thus, be incorrect if accessions are not unique across all database (admins should make sure of that).

# File lib/sequenceserver/database.rb, line 206
def retrieve(loci)
  # Exit early if loci is nil.
  return unless loci

  # String -> Array
  # We may have empty string if loci contains a double comma as a result
  # of typo (remember - loci is external input). These are eliminated.
  loci = loci.split(',').delete_if(&:empty?)

  # Each database is searched for each locus. For each locus, search is
  # terminated on the first database match.
  # NOTE: This can return incorrect sequence if the sequence ids are
  # not unique across all databases.
  seqs = loci.map do |locus|
    # Get sequence id and coords. coords may be nil. accession can't
    # be.
    accession, coords = locus.split(':')

    # Initialise a variable to store retrieved sequence.
    seq = nil

    # Go over each database looking for this accession.
    each do |database|
      # Database lookup  will return a string if given accession is
      # present in the database, nil otherwise.
      seq = database.retrieve(accession, coords)
      # Found a match! Terminate iteration returning the retrieved
      # sequence.
      break if seq
    end

    # If accession was not present in any database, insert an error
    # message in place of the sequence. The line starts with '#'
    # and should be ignored by BLAST (not tested).
    unless seq
      seq = "# ERROR: #{locus} not found in any database"
    end

    # Return seq.
    seq
  end

  # Array -> String
  seqs.join("\n")
end
to_json() click to toggle source
# File lib/sequenceserver/database.rb, line 190
def to_json
  collection.values.to_json
end
tree() { |db, last| ... } click to toggle source
# File lib/sequenceserver/database.rb, line 154
def tree
  all.each_with_object({}) do |db, data|
    data[db.type] ||= []
    use_parent = '#'
    db.categories.each_with_index do |entry, index|
      parent = index.zero? ? '#' : db.categories[0..(index - 1)].join('-')
      use_id = db.categories[0..index].join('-')
      element = { id: use_id, parent: parent, text: entry }
      data[db.type] << element unless data[db.type].include?(element)
      use_parent = use_id
    end

    data[db.type] <<
      {
        id: db.id,
        parent: use_parent,
        text: db.title,
        icon: 'glyphicon glyphicon-file'
      }

    yield(db, data[db.type].last) if block_given?
  end
end

Private Class Methods

collection() click to toggle source
# File lib/sequenceserver/database.rb, line 129
def collection
  @collection ||= {}
end