Added ArvadosModel.search_for_user to perform full-text search on a model.
authorTim Pierce <twp@curoverse.com>
Mon, 10 Feb 2014 21:15:51 +0000 (16:15 -0500)
committerTim Pierce <twp@curoverse.com>
Wed, 12 Feb 2014 18:56:31 +0000 (13:56 -0500)
services/api/app/models/arvados_model.rb
services/api/app/models/collection.rb
services/api/app/models/group.rb
services/api/app/models/human.rb
services/api/app/models/job.rb
services/api/app/models/job_task.rb
services/api/app/models/link.rb
services/api/app/models/log.rb
services/api/app/models/pipeline_instance.rb
services/api/app/models/specimen.rb
services/api/app/models/trait.rb

index 5cbfd58bd032a5dff12d8944d10b728505c52ab9..4e406de9d5c55b538b7f41ca1b3f3271ea3e4234 100644 (file)
@@ -45,13 +45,31 @@ class ArvadosModel < ActiveRecord::Base
     end.compact
   end
 
-  # is_searchable returns 'true' if a model is subject to full-text
-  # search through the workbench.  Models which are searchable should
-  # return true.
-  def is_searchable
+  # searchable? indicates whether a model is subject to full-text
+  # search through the workbench.  Models which include data that is
+  # interesting to a full-text search (e.g. Collection, Specimen, Trait)
+  # should override this to return 'true'.
+  def self.searchable?
     false
   end
 
+  # search all "searchable" columns of this table for query_str.
+  def self.search_for_user(user, query_str)
+    return [] unless self.searchable?
+    ilikes = []
+    ilike_params = []
+    self.searchable_columns.each do |column|
+      ilikes << "#{table_name}.#{column} ilike ?"
+      ilike_params << "%#{query_str}%"
+    end
+    if ilikes.empty?
+      return []
+    else
+      query_conditions = [ ilikes.join(' or ') ] + ilike_params
+      return self.readable_by(user).where(query_conditions)
+    end
+  end
+
   def eager_load_associations
     self.class.columns.each do |col|
       re = col.name.match /^(.*)_kind$/
index c6ecee38fd36b16a18d958e98cb3f3c5894eed47..76bc3a0eb2e8d98cd7c6ce2e88e8c3cde00a4e6c 100644 (file)
@@ -8,7 +8,7 @@ class Collection < ArvadosModel
     t.add :files
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 
index 7a1c9fbb97f5ad994decb52c9adeb919951c0b76..e98921850bac25efaaaea38eba0749c1be22a890 100644 (file)
@@ -8,7 +8,7 @@ class Group < ArvadosModel
     t.add :description
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 end
index a87a041cf19bb1a31036378db3ced2bdf3ddce07..5e0abb5c66c8eddf6f1246616eb030c8959f1e92 100644 (file)
@@ -8,7 +8,7 @@ class Human < ArvadosModel
     t.add :properties
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 end
index 7c06142559fda07da45ada343982afbd7b976d0a..a48341867772649620ab353b487105137514bf74 100644 (file)
@@ -38,7 +38,7 @@ class Job < ArvadosModel
     t.add :log_buffer
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 
index 03310cc88bc6193d8a2b55b50ca63d6b0260c76e..611848d1c32bb3ff73b8db7c29b39d812bcaa358 100644 (file)
@@ -17,7 +17,7 @@ class JobTask < ArvadosModel
     t.add :success
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 
index 3c701bf58fa00e015b7816f1ab8eeb2e28ddd1d0..0db41c77725d2a49d318c79554608b7cbe9539b0 100644 (file)
@@ -29,7 +29,7 @@ class Link < ArvadosModel
     super
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 
index 3e523959dff4819b0da3865d084ad2ab168c5495..5b2e0279ec3158039e109e480592a7f19303bfe3 100644 (file)
@@ -16,7 +16,7 @@ class Log < ArvadosModel
     t.add :info
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 
index 5df8756197c5d6ff9ef625a5f39dabda392fde7f..a46085e16757a903dbb3d0dcb730b63095cfaf22 100644 (file)
@@ -21,7 +21,7 @@ class PipelineInstance < ArvadosModel
     t.add :properties
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 
index 37de071519e6a46a4399593472e907eb54606b0d..5b9e819d5562a68ad2be798ff7c9fbbee2cbfe8e 100644 (file)
@@ -9,7 +9,7 @@ class Specimen < ArvadosModel
     t.add :properties
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 
index ff3db80e25e264999e3505cd49b0cfa6cf7652fc..53c62a70813d579715db9f26f23761618db5bf29 100644 (file)
@@ -9,7 +9,7 @@ class Trait < ArvadosModel
     t.add :properties
   end
 
-  def is_searchable
+  def self.searchable?
     true
   end
 end