Sha256: e4de9059e9b10c35b865eb04a4a912a6db33dde1fcdb9ab87a50664d930925ca

Contents?: true

Size: 1.13 KB

Versions: 3

Compression:

Stored size: 1.13 KB

Contents

module ActiveHouse
  module Unionable
    extend ActiveSupport::Concern

    included do
      private

      def build_union_query_part
        "UNION ALL\n#{@unions.values.map(&:to_query).join("\n")}" unless @unions.values.empty?
      end
    end

    def initialize(*)
      @unions = {}
      super
    end

    def union(name, query)
      query = query.all if query.is_a?(ActiveHouse::Model)
      raise ArgumentError, 'argument must be model or query object' unless query.is_a?(ActiveHouse::Query)
      new_unions = @unions.map { |n, q| [n, q.dup] }.to_h
      new_unions[name] = query.dup
      chain_query unions: new_unions
    end

    def update_union(name)
      raise ArgumentError, "can't find union by name #{name}" unless @unions.key?(name)
      new_union = yield union_for(name)
      union(name, new_union)
    end

    def union_for(name)
      raise ArgumentError, "can't find union by name #{name}" unless @unions.key?(name)
      @unions[name].dup
    end

    def except_union(name)
      new_unions = @unions.map { |n, q| [n, q.dup] }.to_h
      new_unions.delete(name)
      chain_query unions: new_unions
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
active_house-0.4.0 lib/active_house/unionable.rb
active_house-0.3.2 lib/active_house/unionable.rb
active_house-0.3.1 lib/active_house/unionable.rb