module Sequel::Plugins::PgArrayAssociations::DatasetMethods

Private Instance Methods

many_to_pg_array_association_filter_expression(op, ref, obj) click to toggle source

Support filtering by many_to_pg_array associations using a subquery.

    # File lib/sequel/plugins/pg_array_associations.rb
522 def many_to_pg_array_association_filter_expression(op, ref, obj)
523   pk = ref.qualify(model.table_name, ref.primary_key)
524   key = ref[:key]
525   # :nocov:
526   expr = case obj
527   # :nocov:
528   when Sequel::Model
529     if (assoc_pks = obj.get_column_value(key)) && !assoc_pks.empty?
530       Sequel[pk=>assoc_pks.to_a]
531     end
532   when Array
533     if (assoc_pks = obj.map{|o| o.get_column_value(key)}.flatten.compact.uniq) && !assoc_pks.empty?
534       Sequel[pk=>assoc_pks]
535     end
536   when Sequel::Dataset
537     obj.select(ref.qualify(obj.model.table_name, ref[:key_column]).as(:key)).from_self.where{{pk=>any(:key)}}.select(1).exists
538   end
539   expr = Sequel::SQL::Constants::FALSE unless expr
540   expr = add_association_filter_conditions(ref, obj, expr)
541   association_filter_handle_inversion(op, expr, [pk])
542 end
pg_array_to_many_association_filter_expression(op, ref, obj) click to toggle source

Support filtering by pg_array_to_many associations using a subquery.

    # File lib/sequel/plugins/pg_array_associations.rb
545 def pg_array_to_many_association_filter_expression(op, ref, obj)
546   key = ref.qualify(model.table_name, ref[:key_column])
547   # :nocov:
548   expr = case obj
549   # :nocov:
550   when Sequel::Model
551     if pkv = obj.get_column_value(ref.primary_key_method)
552       Sequel.pg_array_op(key).contains(Sequel.pg_array([pkv], ref.array_type))
553     end
554   when Array
555     if (pkvs = obj.map{|o| o.get_column_value(ref.primary_key_method)}.compact) && !pkvs.empty?
556       Sequel.pg_array(key).overlaps(Sequel.pg_array(pkvs, ref.array_type))
557     end
558   when Sequel::Dataset
559     Sequel.function(:coalesce, Sequel.pg_array_op(key).overlaps(obj.select{array_agg(ref.qualify(obj.model.table_name, ref.primary_key))}), Sequel::SQL::Constants::FALSE)
560   end
561   expr = Sequel::SQL::Constants::FALSE unless expr
562   expr = add_association_filter_conditions(ref, obj, expr)
563   association_filter_handle_inversion(op, expr, [key])
564 end