class Trample::Condition

Public Class Methods

new(attrs) click to toggle source
Calls superclass method
# File lib/trample/condition.rb, line 25
def initialize(attrs)
  attrs.merge!(single: true) if attrs[:name] == :keywords
  super(attrs)
end

Public Instance Methods

as_json(*opts) click to toggle source
# File lib/trample/condition.rb, line 52
def as_json(*opts)
  if single?
    values.first
  elsif range?
    {}.tap do |json|
      json[:from_eq] = from_eq if from_eq?
      json[:from]    = from if from?
      json[:to_eq]   = to_eq if to_eq?
      json[:to]      = to if to?
    end
  else
    { values: values, and: and? }
  end
end
blank?() click to toggle source
# File lib/trample/condition.rb, line 48
def blank?
  values.reject { |v| v == "" || v.nil? }.empty? && !range?
end
lookup_autocomplete() click to toggle source
# File lib/trample/condition.rb, line 30
def lookup_autocomplete
  if require_autocomplete_lookup?
    options = (lookup || {}).dup
    klass   = options.delete(:klass) || '::Trample::TextLookup'

    options.assert_valid_keys(:key, :label)

    options = options.merge({
      search_klass: search_klass,
      condition_name: name
    })

    lookup_instance = klass.to_s.constantize.new(options)

    self.values = lookup_instance.load(values) 
  end
end
runtime_query_name() click to toggle source
# File lib/trample/condition.rb, line 67
def runtime_query_name
  name = query_name
  return "#{name}.text_start"   if prefix?
  return "#{name}.text_middle"  if any_text?
  return "#{name}.analyzed"     if search_analyzed?
  return "#{name}.autocomplete" if autocomplete?
  name
end
to_query() click to toggle source
# File lib/trample/condition.rb, line 76
def to_query
  if range?
    to_range_query
  else
    _values      = values.dup.map { |v| v.is_a?(Hash) ? v.dup : v }
    user_queries = _values.select(&is_user_query)
    transformed  = transform_values(_values - user_queries)

    user_query_clause = derive_user_query_clause(user_queries)
    main_clause = derive_main_clause(transformed)

    if user_query_clause.present?
      { or: [ main_clause, user_query_clause ] }
    else
      main_clause
    end
  end
end

Private Instance Methods

anded?() click to toggle source
# File lib/trample/condition.rb, line 160
def anded?
  has_combinator? and !!self.and
end
derive_main_clause(transformed) click to toggle source
# File lib/trample/condition.rb, line 114
def derive_main_clause(transformed)
  if prefix?
    to_prefix_query(transformed)
  elsif has_combinator?
    to_combinator_query(transformed)
  elsif exclusion?
    to_exclusion_query(transformed)
  else
    {runtime_query_name => transformed}
  end
end
derive_user_query_clause(user_queries) click to toggle source
# File lib/trample/condition.rb, line 104
def derive_user_query_clause(user_queries)
  if user_queries.length > 0
    user_queries.each { |q| q.delete(:user_query) }
    condition = Condition.new(user_query.merge(values: user_queries))
    condition.to_query
  else
    {}
  end
end
exclusion?() click to toggle source
# File lib/trample/condition.rb, line 156
def exclusion?
  not attributes[:not].nil?
end
from?() click to toggle source
# File lib/trample/condition.rb, line 172
def from?
  !!self.from
end
from_eq?() click to toggle source
# File lib/trample/condition.rb, line 180
def from_eq?
  !!self.from_eq
end
has_autocomplete_keys?(entries) click to toggle source
# File lib/trample/condition.rb, line 144
def has_autocomplete_keys?(entries)
  multiple? and entries.any? { |e| e.is_a?(Hash) }
end
has_combinator?() click to toggle source
# File lib/trample/condition.rb, line 148
def has_combinator?
  not attributes[:and].nil?
end
has_user_queries?(entries) click to toggle source
# File lib/trample/condition.rb, line 132
def has_user_queries?(entries)
  entries.any?(&is_user_query)
end
is_user_query() click to toggle source
# File lib/trample/condition.rb, line 136
def is_user_query
  ->(entry) { entry.is_a?(Hash) and !!entry[:user_query] }
end
multiple?() click to toggle source
# File lib/trample/condition.rb, line 164
def multiple?
  not single?
end
not?() click to toggle source
# File lib/trample/condition.rb, line 168
def not?
  !!self.not
end
pluck_autocomplete_keys(entries) click to toggle source
# File lib/trample/condition.rb, line 140
def pluck_autocomplete_keys(entries)
  entries.map { |v| v[:key] }
end
pluck_user_query_values!(values) click to toggle source
# File lib/trample/condition.rb, line 126
def pluck_user_query_values!(values)
  user_queries = values.select(&is_user_query)
  values.reject!(&is_user_query)
  [values, user_queries]
end
prefix?() click to toggle source
# File lib/trample/condition.rb, line 152
def prefix?
  !!prefix
end
require_autocomplete_lookup?() click to toggle source
# File lib/trample/condition.rb, line 227
def require_autocomplete_lookup?
  (values.present? && values.first.is_a?(Hash)) && 
    values.any? { |v| v[:text].blank? }
end
to?() click to toggle source
# File lib/trample/condition.rb, line 176
def to?
  !!self.to
end
to_combinator_query(vals, query_name_override = nil) click to toggle source
# File lib/trample/condition.rb, line 204
def to_combinator_query(vals, query_name_override = nil)
  if anded?
    {runtime_query_name => {all: vals}}
  else
    {runtime_query_name => vals}
  end
end
to_eq?() click to toggle source
# File lib/trample/condition.rb, line 184
def to_eq?
  !!self.to_eq
end
to_exclusion_query(vals) click to toggle source
# File lib/trample/condition.rb, line 196
def to_exclusion_query(vals)
  if not?
    {runtime_query_name => {not: vals}}
  else
    {runtime_query_name => vals}
  end
end
to_prefix_query(vals) click to toggle source
# File lib/trample/condition.rb, line 188
def to_prefix_query(vals)
  if has_combinator?
    to_combinator_query(vals)
  else
    {runtime_query_name => vals}
  end
end
to_range_query() click to toggle source
# File lib/trample/condition.rb, line 212
def to_range_query
  _from_eq = transform.call(self.from_eq) if from_eq?
  _to_eq   = transform.call(self.to_eq) if to_eq?
  _from    = transform.call(self.from) if from?
  _to      = transform.call(self.to) if to?

  hash = {}
  hash.merge!(gte: _from_eq) if _from_eq
  hash.merge!(gt: _from) if _from
  hash.merge!(lte: _to_eq) if _to_eq
  hash.merge!(lt: _to) if _to

  { runtime_query_name => hash }
end
transform_values(entries) click to toggle source
# File lib/trample/condition.rb, line 97
def transform_values(entries)
  entries = pluck_autocomplete_keys(entries) if has_autocomplete_keys?(entries)
  entries.map(&:downcase!) if search_analyzed?
  entries = entries.first if entries.length == 1
  entries
end