Class: SearchCopGrammar::Attributes::Collection

Inherits:
Object
  • Object
show all
Defined in:
lib/search_cop_grammar/attributes.rb

Constant Summary collapse

INCLUDED_OPERATORS =
[:matches, :eq, :not_eq, :gt, :gteq, :lt, :lteq].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(query_info, key) ⇒ Collection

Returns a new instance of Collection.



10
11
12
13
14
15
# File 'lib/search_cop_grammar/attributes.rb', line 10

def initialize(query_info, key)
  raise(SearchCop::UnknownColumn, "Unknown column #{key}") unless query_info.scope.reflection.attributes[key]

  @query_info = query_info
  @key = key
end

Instance Attribute Details

#keyObject (readonly)

Returns the value of attribute key.



6
7
8
# File 'lib/search_cop_grammar/attributes.rb', line 6

def key
  @key
end

#query_infoObject (readonly)

Returns the value of attribute query_info.



6
7
8
# File 'lib/search_cop_grammar/attributes.rb', line 6

def query_info
  @query_info
end

Instance Method Details

#==(other) ⇒ Object



21
22
23
# File 'lib/search_cop_grammar/attributes.rb', line 21

def ==(other)
  other.is_a?(self.class) && [query_info.model, key] == [query_info.model, other.key]
end

#alias_for(name) ⇒ Object



84
85
86
# File 'lib/search_cop_grammar/attributes.rb', line 84

def alias_for(name)
  (query_info.scope.reflection.aliases[name] && name) || klass_for(name).table_name
end

#attribute_for(attribute_definition) ⇒ Object



88
89
90
91
92
93
94
95
96
97
# File 'lib/search_cop_grammar/attributes.rb', line 88

def attribute_for(attribute_definition)
  query_info.references.push attribute_definition

  table, column = attribute_definition.split(".")
  klass = klass_for(table)

  raise(SearchCop::UnknownAttribute, "Unknown attribute #{attribute_definition}") unless klass.columns_hash[column]

  Attributes.const_get(klass.columns_hash[column].type.to_s.classify).new(klass, alias_for(table), column, options)
end

#attributesObject



61
62
63
# File 'lib/search_cop_grammar/attributes.rb', line 61

def attributes
  @attributes ||= query_info.scope.reflection.attributes[key].collect { |attribute_definition| attribute_for attribute_definition }
end

#compatible?(value) ⇒ Boolean

Returns:



53
54
55
# File 'lib/search_cop_grammar/attributes.rb', line 53

def compatible?(value)
  attributes.all? { |attribute| attribute.compatible? value }
end

#eql?(other) ⇒ Boolean

Returns:



17
18
19
# File 'lib/search_cop_grammar/attributes.rb', line 17

def eql?(other)
  self == other
end

#fulltext?Boolean

Returns:



49
50
51
# File 'lib/search_cop_grammar/attributes.rb', line 49

def fulltext?
  (query_info.scope.reflection.options[key] || {})[:type] == :fulltext
end

#generator(generator, value) ⇒ Object



35
36
37
38
39
# File 'lib/search_cop_grammar/attributes.rb', line 35

def generator(generator, value)
  attributes.collect! do |attribute|
    SearchCopGrammar::Nodes::Generator.new(attribute, generator: generator, value: value)
  end.inject(:or)
end

#generator_for(name) ⇒ Object



99
100
101
# File 'lib/search_cop_grammar/attributes.rb', line 99

def generator_for(name)
  generators[name]
end

#generatorsObject



107
108
109
# File 'lib/search_cop_grammar/attributes.rb', line 107

def generators
  query_info.scope.reflection.generators
end

#hashObject



25
26
27
# File 'lib/search_cop_grammar/attributes.rb', line 25

def hash
  [query_info.model, key].hash
end

#klass_for(name) ⇒ Object



74
75
76
77
78
79
80
81
82
# File 'lib/search_cop_grammar/attributes.rb', line 74

def klass_for(name)
  alias_value = query_info.scope.reflection.aliases[name]

  return alias_value if alias_value.is_a?(Class)

  value = alias_value || name

  klass_for_association(value) || value.classify.constantize
end

#klass_for_association(name) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/search_cop_grammar/attributes.rb', line 65

def klass_for_association(name)
  reflections = query_info.model.reflections

  return reflections[name].klass if reflections[name]
  return reflections[name.to_sym].klass if reflections[name.to_sym]

  nil
end

#matches(value) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/search_cop_grammar/attributes.rb', line 41

def matches(value)
  if fulltext?
    SearchCopGrammar::Nodes::MatchesFulltext.new self, value.to_s
  else
    attributes.collect! { |attribute| attribute.matches value }.inject(:or)
  end
end

#optionsObject



57
58
59
# File 'lib/search_cop_grammar/attributes.rb', line 57

def options
  query_info.scope.reflection.options[key]
end

#valid_operator?(operator) ⇒ Boolean

Returns:



103
104
105
# File 'lib/search_cop_grammar/attributes.rb', line 103

def valid_operator?(operator)
  (INCLUDED_OPERATORS + generators.keys).include?(operator)
end