# encoding: utf-8 module XapianDb module Adapters # base class for all adapters. # This adapter does the following: # - adds the class method search(expression) to an indexed class # @author Gernot Kogler class BaseAdapter class << self # Implement the class helper methods # @param [Class] klass The class to add the helper methods to def add_class_helper_methods_to(klass) klass.class_eval do # Add a method to search models of this class # Options: # - :order (Array) Accepts an array of attribute names for sorting # - :sort_decending (Boolean) Allows to reverse the sorting define_singleton_method(:search) do |expression, options={}| # return an empty search if no search expression is given return XapianDb.database.search(nil) if expression.nil? || expression.strip.empty? options = {:sort_decending => false}.merge options class_scope = "indexed_class:#{klass.name.downcase}" if options[:order] attr_names = [options[:order]].flatten blueprint = XapianDb::DocumentBlueprint.blueprint_for klass sort_indices = attr_names.map {|attr_name| blueprint.value_index_for(attr_name)} options[:sort_indices] = attr_names.map {|attr_name| blueprint.value_index_for(attr_name)} end result = XapianDb.database.search "#{class_scope} and (#{expression})", options # Remove the class scope from the spelling suggestion (if any) unless result.spelling_suggestion.empty? scope_length = "#{class_scope} and (".size result.spelling_suggestion = result.spelling_suggestion.slice scope_length..-2 end result end end end end end end end