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