X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/cb4efac6793d18892dde09c631895cb98c3df470..442a871e7f3476938d0ebb3adbe3b9a7742f03ad:/services/api/app/models/arvados_model.rb diff --git a/services/api/app/models/arvados_model.rb b/services/api/app/models/arvados_model.rb index ffcf091724..91c5a1923c 100644 --- a/services/api/app/models/arvados_model.rb +++ b/services/api/app/models/arvados_model.rb @@ -27,7 +27,6 @@ class ArvadosModel < ApplicationRecord after_create :log_create after_update :log_update after_destroy :log_destroy - after_find :convert_serialized_symbols_to_strings before_validation :normalize_collection_uuids before_validation :set_default_owner validate :ensure_valid_uuids @@ -117,6 +116,15 @@ class ArvadosModel < ApplicationRecord raise ArgumentError.new("#{colname} parameter cannot have non-string hash keys") end end + # Check JSONB columns that aren't listed on serialized_attributes + columns.select{|c| c.type == :jsonb}.collect{|j| j.name}.each do |colname| + if serialized_attributes.include? colname || raw_params[colname.to_sym].nil? + next + end + if has_nonstring_keys?(raw_params[colname.to_sym]) + raise ArgumentError.new("#{colname} parameter cannot have non-string hash keys") + end + end end ActionController::Parameters.new(raw_params).permit! end @@ -402,7 +410,7 @@ class ArvadosModel < ApplicationRecord end def logged_attributes - attributes.except(*Rails.configuration.unlogged_attributes) + attributes.except(*Rails.configuration.AuditLogs.UnloggedAttributes) end def self.full_text_searchable_columns @@ -411,9 +419,22 @@ class ArvadosModel < ApplicationRecord end.map(&:name) end + def self.full_text_coalesce + full_text_searchable_columns.collect do |column| + is_jsonb = self.columns.select{|x|x.name == column}[0].type == :jsonb + cast = (is_jsonb || serialized_attributes[column]) ? '::text' : '' + "coalesce(#{column}#{cast},'')" + end + end + + def self.full_text_trgm + "(#{full_text_coalesce.join(" || ' ' || ")})" + end + def self.full_text_tsvector parts = full_text_searchable_columns.collect do |column| - cast = serialized_attributes[column] ? '::text' : '' + is_jsonb = self.columns.select{|x|x.name == column}[0].type == :jsonb + cast = (is_jsonb || serialized_attributes[column]) ? '::text' : '' "coalesce(#{column}#{cast},'')" end "to_tsvector('english', substr(#{parts.join(" || ' ' || ")}, 0, 8000))" @@ -592,41 +613,6 @@ class ArvadosModel < ApplicationRecord false end - def self.has_symbols? x - if x.is_a? Hash - x.each do |k,v| - return true if has_symbols?(k) or has_symbols?(v) - end - elsif x.is_a? Array - x.each do |k| - return true if has_symbols?(k) - end - elsif x.is_a? Symbol - return true - elsif x.is_a? String - return true if x.start_with?(':') && !x.start_with?('::') - end - false - end - - def self.recursive_stringify x - if x.is_a? Hash - Hash[x.collect do |k,v| - [recursive_stringify(k), recursive_stringify(v)] - end] - elsif x.is_a? Array - x.collect do |k| - recursive_stringify k - end - elsif x.is_a? Symbol - x.to_s - elsif x.is_a? String and x.start_with?(':') and !x.start_with?('::') - x[1..-1] - else - x - end - end - def self.where_serialized(colname, value, md5: false) colsql = colname.to_s if md5 @@ -667,22 +653,6 @@ class ArvadosModel < ApplicationRecord self.class.serialized_attributes end - def convert_serialized_symbols_to_strings - # ensure_serialized_attribute_type should prevent symbols from - # getting into the database in the first place. If someone managed - # to get them into the database (perhaps using an older version) - # we'll convert symbols to strings when loading from the - # database. (Otherwise, loading and saving an object with existing - # symbols in a serialized field will crash.) - self.class.serialized_attributes.each do |colname, attr| - if self.class.has_symbols? attributes[colname] - attributes[colname] = self.class.recursive_stringify attributes[colname] - send(colname + '=', - self.class.recursive_stringify(attributes[colname])) - end - end - end - def foreign_key_attributes attributes.keys.select { |a| a.match(/_uuid$/) } end @@ -724,7 +694,7 @@ class ArvadosModel < ApplicationRecord end def self.uuid_like_pattern - "#{Rails.configuration.uuid_prefix}-#{uuid_prefix}-_______________" + "#{Rails.configuration.ClusterID}-#{uuid_prefix}-_______________" end def self.uuid_regex @@ -803,8 +773,8 @@ class ArvadosModel < ApplicationRecord end def is_audit_logging_enabled? - return !(Rails.configuration.max_audit_log_age.to_i == 0 && - Rails.configuration.max_audit_log_delete_batch.to_i > 0) + return !(Rails.configuration.AuditLogs.MaxAge.to_i == 0 && + Rails.configuration.AuditLogs.MaxDeleteBatch.to_i > 0) end def log_start_state