class ConceptQL::Operators::Read

Public Instance Methods

domains(db) click to toggle source
# File lib/conceptql/operators/read.rb, line 26
def domains(db)
  codes_by_domain(db).keys
end
query(db) click to toggle source
# File lib/conceptql/operators/read.rb, line 16
def query(db)
  ops = codes_by_domain(db).map do |domain, codes|
    klasses[domain].new(self.nodifier, *codes)
  end

  streams = ops.map { |op| op.evaluate(db) }

  streams.inject { |q, query| q.union(query, all: true) }.from_self
end

Private Instance Methods

codes_by_domain(db) click to toggle source
# File lib/conceptql/operators/read.rb, line 32
def codes_by_domain(db)
  @codes_by_domain ||= get_codes_by_domain(db)
end
get_codes_by_domain(db) click to toggle source
# File lib/conceptql/operators/read.rb, line 36
def get_codes_by_domain(db)
  return { observation: arguments } if db.is_a?(::Sequel::Mock)
  codes_and_mapping_types = db[:source_to_concept_map]
    .where(source_code: arguments, source_vocabulary_id: 17)
    .select_map([:source_code, :mapping_type])

  doms_and_codes = codes_and_mapping_types.group_by(&:last).each_with_object({}) do |(mapping_type, codes_and_maps), doms|
    dom = mapping_type_to_domain(mapping_type)
    doms[dom] ||= []
    doms[dom] += codes_and_maps.map(&:first)
  end

  leftovers = arguments - doms_and_codes.flat_map { |k, v| v }
  doms_and_codes[:observation] ||= []
  doms_and_codes[:observation] += leftovers
  doms_and_codes
end
klasses() click to toggle source
# File lib/conceptql/operators/read.rb, line 67
def klasses
  @klasses ||= {
    condition_occurrence: ReadCondition,
    procedure_occurrence: ReadProcedure,
    drug_exposure: ReadDrug,
    observation: ReadObservation
  }
end
mapping_type_to_domain(mapping_type) click to toggle source
# File lib/conceptql/operators/read.rb, line 54
def mapping_type_to_domain(mapping_type)
  case mapping_type.downcase.to_sym
  when :condition
    :condition_occurrence
  when :procedure
    :procedure_occurrence
  when :drug
    :drug_exposure
  else
    :observation
  end
end