lib/fuzzily/searchable.rb in fuzzily-0.2.2 vs lib/fuzzily/searchable.rb in fuzzily-0.2.3
- old
+ new
@@ -14,14 +14,18 @@
private
def make_field_fuzzily_searchable(field, options={})
class_variable_defined?(:"@@fuzzily_searchable_#{field}") and return
- trigram_class_name = options.fetch(:class_name, 'Trigram')
- trigram_association = "trigrams_for_#{field}".to_sym
+ trigram_class_name = options.fetch(:class_name, 'Trigram')
+ trigram_association = "trigrams_for_#{field}".to_sym
update_trigrams_method = "update_fuzzy_#{field}!".to_sym
+ supports_bulk_inserts =
+ connection.class.name !~ /sqlite/i ||
+ connection.send(:sqlite_version) >= '3.7.11'
+
has_many trigram_association,
:class_name => trigram_class_name,
:as => :owner,
:conditions => { :fuzzy_field => field.to_s },
:dependent => :destroy,
@@ -53,18 +57,34 @@
data.scored_trigrams.each do |trigram, score|
inserts << sanitize_sql_array(['(?,?,?,?,?)', self.name, record.id, field.to_s, score, trigram])
end
end
+ # take care of quoting
+ c = trigram_class.connection
+ insert_sql = %Q{
+ INSERT INTO %s (%s, %s, %s, %s, %s)
+ VALUES
+ } % [
+ c.quote_table_name(trigram_class.table_name),
+ c.quote_column_name('owner_type'),
+ c.quote_column_name('owner_id'),
+ c.quote_column_name('fuzzy_field'),
+ c.quote_column_name('score'),
+ c.quote_column_name('trigram')
+ ]
+
trigram_class.transaction do
batch.each { |record| record.send(trigram_association).delete_all }
- trigram_class.connection.insert(%Q{
- INSERT INTO `#{trigram_class.table_name}`
- (`owner_type`, `owner_id`, `fuzzy_field`, `score`, `trigram`)
- VALUES
- #{inserts.join(", ")}
- })
+
+ if supports_bulk_inserts
+ trigram_class.connection.insert(insert_sql + inserts.join(", "))
+ else
+ inserts.each do |insert|
+ trigram_class.connection.insert(insert_sql + insert)
+ end
+ end
end
end
end
define_method update_trigrams_method do
@@ -80,8 +100,7 @@
end
class_variable_set(:"@@fuzzily_searchable_#{field}", true)
self
end
-
end
end