Usare le regexp nei query SQLite
Spesso mi trovo in una situazione con SQLite dove mi servirebbe usare una regular expression.
Un esempio recente e' stato quando stavo implementando un sistema di autocomplete. Volevo solo quei risultati che avessero il termine cercato all'inizio di un parola.
Cioe', cercando 'all', volevo trovare 'allegato', ma non 'pallone'.
Di default in SQLite non c'e' un operatore REGEXP, o meglio, c'e' ma non e' implementato (http://www.sqlite.org/lang_expr.html#regexp).
Ho trovato un articolo che spiega come implementare l'operatore REGEXP in Ruby:
- http://stephen-veit.blogspot.com/2009/03/implementing-regexp-in-sqlite3.html.
Purtroppo il codice nell'articolo non funzionava per incompatibilita' con l'interfaccia Rails 2.3.x per SQLite - dove ActiveRecord::ConnectionAdapters::SQLite3Adapter.initialize() prende 3 parametri, non 2.
Per far funzionare REGEXP, ho aggiunto quanto segue nel file 'config/initializers/sqlite3_regexp.rb':
require 'active_record/connection_adapters/sqlite3_adapter'
class ActiveRecord::ConnectionAdapters::SQLite3Adapter
def initialize(db, logger, config)
super
db.create_function('regexp', 2) do |func, pattern, expression|
regexp = Regexp.new(pattern.to_s, Regexp::IGNORECASE)
if expression.to_s.match(regexp)
func.result = 1
else
func.result = 0
end
end
end
end