From a137c21d2d0402f0916df055a6c6ec91bb932494 Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Sat, 28 Jan 2017 16:53:54 -0500 Subject: [PATCH] searchfields api parameter (#1054) --- app/controllers/api/v2/restful_controller.rb | 15 +++++++++++++-- doc/api/traits/searchable.raml | 5 +++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v2/restful_controller.rb b/app/controllers/api/v2/restful_controller.rb index 68d6a63f..d09f4cc0 100644 --- a/app/controllers/api/v2/restful_controller.rb +++ b/app/controllers/api/v2/restful_controller.rb @@ -150,10 +150,21 @@ module Api # override this method to explicitly set searchable columns def searchable_columns + return @searchable_columns unless @searchable_columns.nil? + columns = resource_class.columns.select do |column| column.type == :text || column.type == :string end - columns.map(&:name) + @searchable_columns = columns.map(&:name) + end + + # e.g. ?q=test&searchfields=name,desc + def searchfields + return searchable_columns if params[:searchfields].blank? + + searchfields = params[:searchfields].split(',') + searchfields.select! { |f| searchable_columns.include?(f.to_sym) } + searchfields.empty? ? searchable_columns : searchfields end # thanks to http://stackoverflow.com/questions/4430578 @@ -162,7 +173,7 @@ module Api safe_query = "%#{params[:q].gsub(/[%_]/, '\\\\\0')}%" search_column = ->(column) { table[column].matches(safe_query) } - condition = searchable_columns.reduce(nil) do |prev, column| + condition = searchfields.reduce(nil) do |prev, column| next search_column.call(column) if prev.nil? search_column.call(column).or(prev) end diff --git a/doc/api/traits/searchable.raml b/doc/api/traits/searchable.raml index fb7700a9..83cfbfb4 100644 --- a/doc/api/traits/searchable.raml +++ b/doc/api/traits/searchable.raml @@ -4,3 +4,8 @@ queryParameters: Search text columns for this string. A query of "example" will be passed to SQL as LIKE %example%. The searchable columns are:
<< searchFields >>
required: false type: string + searchfields: + description: | + A comma-seperated list of columns to search. For instance, to search a topic's name and description (but not link field) for the string "cognition", you could use `?q=cognition&searchfields=name,desc`. + required: false + type: string