lib/ahoy/query_methods.rb in ahoy_matey-4.0.0 vs lib/ahoy/query_methods.rb in ahoy_matey-4.0.1

- old
+ new

@@ -6,31 +6,24 @@ def where_event(name, properties = {}) where(name: name).where_props(properties) end def where_props(properties) - relation = self + return all if properties.empty? + + relation = all if respond_to?(:columns_hash) column_type = columns_hash["properties"].type adapter_name = connection.adapter_name.downcase else adapter_name = "mongoid" end case adapter_name when "mongoid" - relation = where(Hash[properties.map { |k, v| ["properties.#{k}", v] }]) + relation = where(properties.to_h { |k, v| ["properties.#{k}", v] }) when /mysql/ - column = column_type == :json || connection.try(:mariadb?) ? "properties" : "CAST(properties AS JSON)" - properties.each do |k, v| - if v.nil? - v = "null" - elsif v == true - v = "true" - end - - relation = relation.where("JSON_UNQUOTE(JSON_EXTRACT(#{column}, ?)) = ?", "$.#{k}", v.as_json) - end + relation = relation.where("JSON_CONTAINS(properties, ?, '$') = 1", properties.to_json) when /postgres|postgis/ case column_type when :jsonb relation = relation.where("properties @> ?", properties.to_json) when :hstore @@ -43,10 +36,19 @@ end end else relation = relation.where("properties::jsonb @> ?", properties.to_json) end + when /sqlite/ + properties.each do |k, v| + relation = + if v.nil? + relation.where("JSON_EXTRACT(properties, ?) IS NULL", "$.#{k}") + else + relation.where("JSON_EXTRACT(properties, ?) = ?", "$.#{k}", v.as_json) + end + end else raise "Adapter not supported: #{adapter_name}" end relation end @@ -54,34 +56,38 @@ def group_prop(*props) # like with group props.flatten! - relation = self + relation = all if respond_to?(:columns_hash) column_type = columns_hash["properties"].type adapter_name = connection.adapter_name.downcase else adapter_name = "mongoid" end case adapter_name when "mongoid" raise "Adapter not supported: #{adapter_name}" when /mysql/ - column = column_type == :json || connection.try(:mariadb?) ? "properties" : "CAST(properties AS JSON)" props.each do |prop| quoted_prop = connection.quote("$.#{prop}") - relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(#{column}, #{quoted_prop}))") + relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(properties, #{quoted_prop}))") end when /postgres|postgis/ # convert to jsonb to fix # could not identify an equality operator for type json # and for text columns cast = [:jsonb, :hstore].include?(column_type) ? "" : "::jsonb" props.each do |prop| quoted_prop = connection.quote(prop) relation = relation.group("properties#{cast} -> #{quoted_prop}") + end + when /sqlite/ + props.each do |prop| + quoted_prop = connection.quote("$.#{prop}") + relation = relation.group("JSON_EXTRACT(properties, #{quoted_prop})") end else raise "Adapter not supported: #{adapter_name}" end relation