# File lib/postgres_ext/active_record/relation/query_methods.rb, line 44 def all(opts, *rest) equality_to_function('ALL', opts, rest) end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 40 def any(opts, *rest) equality_to_function('ANY', opts, rest) end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 8 def contained_within(opts, *rest) substitute_comparisons(opts, rest, Arel::Nodes::ContainedWithin, 'contained_within') end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 12 def contained_within_or_equals(opts, *rest) substitute_comparisons(opts, rest, Arel::Nodes::ContainedWithinEquals, 'contained_within_or_equals') end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 16 def contains(opts, *rest) build_where_chain(opts, rest) do |rel| case rel when Arel::Nodes::In, Arel::Nodes::Equality column = left_column(rel) || column_from_association(rel) equality_for_hstore(rel) if column.type == :hstore if column.type == :hstore Arel::Nodes::ContainsHStore.new(rel.left, rel.right) elsif column.respond_to?(:array) && column.array Arel::Nodes::ContainsArray.new(rel.left, rel.right) else Arel::Nodes::ContainsINet.new(rel.left, rel.right) end else raise ArgumentError, "Invalid argument for .where.overlap(), got #{rel.class}" end end end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 36 def contains_or_equals(opts, *rest) substitute_comparisons(opts, rest, Arel::Nodes::ContainsEquals, 'contains_or_equals') end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 4 def overlap(opts, *rest) substitute_comparisons(opts, rest, Arel::Nodes::Overlap, 'overlap') end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 85 def build_where_chain(opts, rest, &block) where_value = @scope.send(:build_where, opts, rest).map(&block) @scope.references!(PredicateBuilder.references(opts)) if Hash === opts @scope.where_values += where_value @scope end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 58 def column_from_association(rel) if assoc = assoc_from_related_table(rel) column = assoc.klass.columns.find { |col| find_column(col, rel) } end end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 64 def equality_for_hstore(rel) new_right_name = rel.left.name.to_s if rel.right.respond_to?(:val) return if rel.right.val.is_a?(Hash) rel.right = Arel::Nodes.build_quoted({new_right_name => rel.right.val}, rel.left) else return if rel.right.is_a?(Hash) rel.right = {new_right_name => rel.right } end rel.left.name = rel.left.relation.name.to_sym rel.left.relation.name = rel.left.relation.engine.table_name end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 103 def equality_to_function(function_name, opts, rest) build_where_chain(opts, rest) do |rel| case rel when Arel::Nodes::Equality Arel::Nodes::Equality.new(rel.right, Arel::Nodes::NamedFunction.new(function_name, [rel.left])) else raise ArgumentError, "Invalid argument for .where.#{function_name.downcase}(), got #{rel.class}" end end end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 50 def find_column(col, rel) col.name == rel.left.name.to_s || col.name == rel.left.relation.name.to_s end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 54 def left_column(rel) rel.left.relation.engine.columns.find { |col| find_column(col, rel) } end
# File lib/postgres_ext/active_record/relation/query_methods.rb, line 92 def substitute_comparisons(opts, rest, arel_node_class, method) build_where_chain(opts, rest) do |rel| case rel when Arel::Nodes::In, Arel::Nodes::Equality arel_node_class.new(rel.left, rel.right) else raise ArgumentError, "Invalid argument for .where.#{method}(), got #{rel.class}" end end end