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