Sha256: 70a1713d09c1b6341b8d9fc8262bba0679fcd3d4013d6e6367a9b937140f4a44

Contents?: true

Size: 1.65 KB

Versions: 39

Compression:

Stored size: 1.65 KB

Contents

# frozen_string_literal: true

require_dependency "renalware/pathology"
require "sql/index_case_stmt"

module Renalware
  module Pathology
    class ObservationDescriptionsByCodeQuery
      def initialize(relation: ObservationDescription, codes:)
        @relation = relation
        @codes = Array(codes)
      end

      # Executes SQL that looks like this:
      #   SELECT "pathology_observation_descriptions".* FROM "pathology_observation_descriptions"
      #   WHERE "pathology_observation_descriptions"."code" IN ('HGB', 'MCV', 'MCH',...
      #   ORDER BY CASE code
      #     WHEN 'HGB' THEN 0
      #     WHEN 'MCV' THEN 1
      #     WHEN 'MCH' THEN 2
      #     ...
      #   END
      # and returns results that look like this:
      #   [
      #     #<Renalware::Pathology::ObservationDescription id: 767, code: "HGB", name: "HGB">,
      #     #<Renalware::Pathology::ObservationDescription id: 1058, code: "MCV", name: "MCV">,
      #     #<Renalware::Pathology::ObservationDescription id: 1055, code: "MCH", name: "MCH">,
      #     ...
      #   ]
      def call
        stmt = SQL::IndexedCaseStmt.new(:code, @codes) # Generate a CASE statement for ordering
        records = @relation.where(code: @codes).order(stmt.generate)
        verify_all_records_found(records)
        records
      end

      private

      def verify_all_records_found(records)
        found_codes = records.map(&:code)

        # TODO: Bug? Shouldn't this be @codes - found_codes?
        missing_records = found_codes - @codes
        if missing_records.present?
          raise ActiveRecord::RecordNotFound, "Missing records for #{missing_records}"
        end
      end
    end
  end
end

Version data entries

39 entries across 39 versions & 1 rubygems

Version Path
renalware-core-2.0.51 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.50 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.48 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.47 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.46 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.45 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.44 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.43 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.42 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.41 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.40 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.39 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.38 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.37 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.36 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.35 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.34 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.33 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.32 app/models/renalware/pathology/observation_descriptions_by_code_query.rb
renalware-core-2.0.31 app/models/renalware/pathology/observation_descriptions_by_code_query.rb