searchfields api parameter (#1054)

This commit is contained in:
Devin Howard 2017-01-28 16:53:54 -05:00 committed by GitHub
parent 952cf4e79f
commit a137c21d2d
2 changed files with 18 additions and 2 deletions

View file

@ -150,10 +150,21 @@ module Api
# override this method to explicitly set searchable columns # override this method to explicitly set searchable columns
def searchable_columns def searchable_columns
return @searchable_columns unless @searchable_columns.nil?
columns = resource_class.columns.select do |column| columns = resource_class.columns.select do |column|
column.type == :text || column.type == :string column.type == :text || column.type == :string
end 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 end
# thanks to http://stackoverflow.com/questions/4430578 # thanks to http://stackoverflow.com/questions/4430578
@ -162,7 +173,7 @@ module Api
safe_query = "%#{params[:q].gsub(/[%_]/, '\\\\\0')}%" safe_query = "%#{params[:q].gsub(/[%_]/, '\\\\\0')}%"
search_column = ->(column) { table[column].matches(safe_query) } 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? next search_column.call(column) if prev.nil?
search_column.call(column).or(prev) search_column.call(column).or(prev)
end end

View file

@ -4,3 +4,8 @@ queryParameters:
Search text columns for this string. A query of <code>"example"</code> will be passed to SQL as <code>LIKE %example%</code>. The searchable columns are: <pre><< searchFields >></pre> Search text columns for this string. A query of <code>"example"</code> will be passed to SQL as <code>LIKE %example%</code>. The searchable columns are: <pre><< searchFields >></pre>
required: false required: false
type: string 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