lib/sunspot/field.rb in sunspot-2.1.1 vs lib/sunspot/field.rb in sunspot-2.2.0

- old
+ new

@@ -80,22 +80,40 @@ # def more_like_this? !!@more_like_this end + # + # Whether the field was joined from another model. + # + # ==== Returns + # + # Boolean:: True if this field was joined from another model + # + def joined? + !!@joined + end + def hash indexed_name.hash end def eql?(field) - indexed_name == field.indexed_name + field.is_a?(self.class) && indexed_name == field.indexed_name end alias_method :==, :eql? private # + # Raise if an unknown option passed + # + def check_options(options) + raise ArgumentError, "Unknown field option #{options.keys.first.inspect} provided for field #{name.inspect}" unless options.empty? + end + + # # Determine the indexed name. If the :as option is given use that, otherwise # create the value based on the indexed_name of the type with additional # suffixes for multiple, stored, and more_like_this. # # ==== Returns @@ -105,11 +123,12 @@ def set_indexed_name(options) @indexed_name = if options[:as] options.delete(:as).to_s else - "#{@type.indexed_name(@name).to_s}#{'m' if multiple? }#{'s' if @stored}#{'v' if more_like_this?}" + name = options[:prefix] ? @name.to_s.sub(/^#{options[:prefix]}_/, '') : @name + "#{@type.indexed_name(name)}#{'m' if multiple? }#{'s' if @stored}#{'v' if more_like_this?}" end end end @@ -127,11 +146,12 @@ def initialize(name, options = {}) super(name, Type::TextType.instance, options) @multiple = true @boost = options.delete(:boost) @default_boost = options.delete(:default_boost) - raise ArgumentError, "Unknown field option #{options.keys.first.inspect} provided for field #{name.inspect}" unless options.empty? + + check_options(options) end def indexed_name "#{super}" end @@ -152,27 +172,53 @@ if (reference = options.delete(:references)).respond_to?(:name) reference.name elsif reference.respond_to?(:to_sym) reference.to_sym end - raise ArgumentError, "Unknown field option #{options.keys.first.inspect} provided for field #{name.inspect}" unless options.empty? - end + check_options(options) + end end + # + # JoinField encapsulates attributes from referenced models. + # Could be of any type + # class JoinField < Field #:nodoc: + attr_reader :default_boost, :target def initialize(name, type, options = {}) @multiple = !!options.delete(:multiple) + super(name, type, options) - @join_string = options.delete(:join_string) - raise ArgumentError, "Unknown field option #{options.keys.first.inspect} provided for field #{name.inspect}" unless options.empty? + + @prefix = options.delete(:prefix) + @join = options.delete(:join) + @clazz = options.delete(:clazz) + @target = options.delete(:target) + @default_boost = options.delete(:default_boost) + @joined = true + + check_options(options) end + def from + Sunspot::Setup.for(@target).field(@join[:from]).indexed_name + end + + def to + Sunspot::Setup.for(@clazz).field(@join[:to]).indexed_name + end + def local_params - "{!join #{@join_string}}" + "{!join from=#{from} to=#{to}}" end + def eql?(field) + super && target == field.target && from == field.from && to == field.to + end + + alias_method :==, :eql? end class TypeField #:nodoc: class <<self def instance