Sha256: f37ec81b81ce1616d395dcdac416bb625ee37965faab801bac09914931694714
Contents?: true
Size: 1.43 KB
Versions: 2
Compression:
Stored size: 1.43 KB
Contents
class Wallaby::ActiveRecord::ModelOperator::Querier def initialize(model_decorator) @model_decorator = model_decorator @model_class = @model_decorator.model_class end def search(params) text_keywords, field_keywords = extract params query = @model_class.where nil query = text_search text_keywords, query query = field_search field_keywords, query query end protected def extract(params) all_keywords = (params[:q] || '').split(' ').compact field_keywords = all_keywords.select{ |v| v.split(':').length == 2 } [ all_keywords - field_keywords, field_keywords ] end def text_search(keywords, query) return query if keywords.blank? queries = text_fields.inject([]) do |queries, field_name| likes = keywords.map do |keyword| [ "UPPER(#{ field_name }) LIKE ?", "%#{ keyword.upcase }%" ] end queries << [ "(#{ likes.map(&:first).join ' AND ' })", likes.map(&:last) ] end query.where queries.map(&:first).join(' OR '), *queries.map(&:last).flatten end def field_search(keywords, query) return query if keywords.blank? hashed_queries = Wallaby::Utils.to_hash(keywords.map{ |v| v.split ':' }) query.where hashed_queries end def text_fields @model_decorator.fields.select do |field_name, metadata| @model_decorator.index_field_names.include?(field_name) && %w( string text citext ).include?(metadata[:type]) end.keys end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
wallaby-4.1.6 | lib/adaptors/wallaby/active_record/model_operator/querier.rb |
wallaby-5.0.1 | lib/adaptors/wallaby/active_record/model_operator/querier.rb |