lib/ahoy/query_methods.rb in ahoy_matey-3.3.0 vs lib/ahoy/query_methods.rb in ahoy_matey-4.0.0
- old
+ new
@@ -17,52 +17,35 @@
end
case adapter_name
when "mongoid"
relation = where(Hash[properties.map { |k, v| ["properties.#{k}", v] }])
when /mysql/
- if column_type == :json
- properties.each do |k, v|
- if v.nil?
- v = "null"
- elsif v == true
- v = "true"
- end
-
- relation = relation.where("JSON_UNQUOTE(properties -> ?) = ?", "$.#{k}", v.as_json)
+ 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
- else
- properties.each do |k, v|
- # TODO cast to json instead
- relation = relation.where("properties REGEXP ?", "[{,]#{{k.to_s => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "").gsub("+", "\\\\+")}[,}]")
- end
+
+ relation = relation.where("JSON_UNQUOTE(JSON_EXTRACT(#{column}, ?)) = ?", "$.#{k}", v.as_json)
end
when /postgres|postgis/
- if column_type == :jsonb
+ case column_type
+ when :jsonb
relation = relation.where("properties @> ?", properties.to_json)
- elsif column_type == :json
+ when :hstore
properties.each do |k, v|
relation =
if v.nil?
- relation.where("properties ->> ? IS NULL", k.to_s)
- else
- relation.where("properties ->> ? = ?", k.to_s, v.as_json.to_s)
- end
- end
- elsif column_type == :hstore
- properties.each do |k, v|
- relation =
- if v.nil?
relation.where("properties -> ? IS NULL", k.to_s)
else
relation.where("properties -> ? = ?", k.to_s, v.to_s)
end
end
else
- properties.each do |k, v|
- # TODO cast to jsonb instead
- relation = relation.where("properties SIMILAR TO ?", "%[{,]#{{k.to_s => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "").gsub("+", "\\\\+")}[,}]%")
- end
+ relation = relation.where("properties::jsonb @> ?", properties.to_json)
end
else
raise "Adapter not supported: #{adapter_name}"
end
relation
@@ -82,20 +65,13 @@
end
case adapter_name
when "mongoid"
raise "Adapter not supported: #{adapter_name}"
when /mysql/
- if connection.try(:mariadb?)
- props.each do |prop|
- quoted_prop = connection.quote("$.#{prop}")
- relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(properties, #{quoted_prop}))")
- end
- else
- column = column_type == :json ? "properties" : "CAST(properties AS JSON)"
- props.each do |prop|
- quoted_prop = connection.quote("$.#{prop}")
- relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(#{column}, #{quoted_prop}))")
- end
+ 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}))")
end
when /postgres|postgis/
# convert to jsonb to fix
# could not identify an equality operator for type json
# and for text columns