Class: Ansr::Blacklight::Arel::Visitors::QueryBuilder

Inherits:
Arel::Visitors::QueryBuilder
  • Object
show all
Includes:
RequestBuilders
Defined in:
lib/ansr_blacklight/arel/visitors/query_builder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(table) ⇒ QueryBuilder

Returns a new instance of QueryBuilder.



6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 6

def initialize(table)
  super(table)
  @solr_request = Ansr::Blacklight::Solr::Request.new
  table.configure_fields.each do |k,v|
    unless v[:select].blank?
      v[:select].each do |sk, sv|
        key = "f.#{k}.#{sk}".to_sym
        @solr_request[key] = sv
      end
    end
  end
end

Instance Attribute Details

#solr_requestObject (readonly)

Returns the value of attribute solr_request.



4
5
6
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 4

def solr_request
  @solr_request
end

Instance Method Details

#field(field_name) ⇒ Object



81
82
83
84
85
86
87
88
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 81

def field(field_name)
  return unless field_name
  old = query_opts[:fields] ? Array(query_opts[:fields]) : []
  field_names = (old + Array(field_name)).uniq
  if field_names[0]
    query_opts[:fields] = field_names[1] ? field_names : field_names[0]
  end
end

#filter_field(field_name) ⇒ Object



90
91
92
93
94
95
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 90

def filter_field(field_name)
  return unless field_name
  old = solr_request[:"facet.field"] ? Array(solr_request[:"facet.field"]) : []
  fields = Array(field_name).delete_if {|x| old.include? x}
  solr_request.append_facet_fields(fields)
end

#from(value) ⇒ Object



72
73
74
75
76
77
78
79
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 72

def from(value)
  if value.respond_to? :name
    solr_request.path = value.name
  else
    solr_request.path = value.to_s
  end
  self.table=value if (value.is_a? Ansr::Arel::BigTable)
end

#multiple?(field_key) ⇒ Boolean

determines whether multiple values should accumulate or overwrite in merges

Returns:

  • (Boolean)


25
26
27
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 25

def multiple?(field_key)
  true
end

#order(*arel_nodes) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 167

def order(*arel_nodes)
  direction = nil
  nodes = []
  arel_nodes.inject(nodes) do |c, n|
    if ::Arel::Nodes::Ordering === n
      c << n
    elsif n.is_a? String
      _ns = n.split(',')
      _ns.each do |_n| 
        _p = _n.split(/\s+/)
        if (_p[1])
          _p[1] = _p[1].downcase.to_sym
        else
          _p[1] = :asc
        end
        c << table[_p[0].to_sym].send(_p[1])
      end
    end
    c
  end
  nodes.each do |node|
    if ::Arel::Nodes::Ordering === node
      if solr_request[:sort_by]
        solr_request[:sort_by] = Array[solr_request[:sort_by]] << node.expr.name
      else
        solr_request[:sort_by] = node.expr.name
      end
      direction = :asc if (::Arel::Nodes::Ascending === node and direction)
      direction = :desc if (::Arel::Nodes::Descending === node)
    end
  end
  solr_request[:sort_order] = direction if direction
end

#query_optsObject



20
21
22
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 20

def query_opts
	solr_request
end

#visit_Ansr_Arel_Nodes_Facet(object, attribute) ⇒ Object



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 124

def visit_Ansr_Arel_Nodes_Facet(object, attribute)
  name = object.expr
  name = name.name if name.respond_to? :name
  default = false
  if name == ::Arel.star
    prefix = "facet."
    default = true
  else
    filter_field(name.to_sym) unless default
    solr_request.append_facet_fields(name.to_sym) unless default
    prefix = "f.#{name}.facet."
  end
  # there's got to be a helper for this
  if object.pivot
    solr_request.append_facet_pivot with_ex_local_param(object.ex, object.pivot.join(","))
  elsif object.query
    solr_request.append_facet_query object.query.map { |k, x| with_ex_local_param(object.ex, x[:fq]) }
  else
    object.opts.each do |att, value|
      solr_request["#{prefix}#{att.to_s}".to_sym] = value.to_s unless att == :ex
    end
    solr_request.append_facet_fields with_ex_local_param(object.ex, name.to_sym) unless default
  end
end

#visit_Ansr_Arel_Nodes_Highlight(object, attribute) ⇒ Object



158
159
160
161
162
163
164
165
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 158

def visit_Ansr_Arel_Nodes_Highlight(object, attribute)
  unless object.expr == false or object.expr == true
    solr_request[:hl] = object.expr.to_s
  end
  object.opts.each do |att, val|
    solr_request["hl.#{att.to_s}".to_sym] = val if att != :select
  end
end

#visit_Ansr_Arel_Nodes_ProjectionTraits(object, attribute) ⇒ Object



53
54
55
56
57
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 53

def visit_Ansr_Arel_Nodes_ProjectionTraits(object, attribute)
  solr_request[:wt] = object.wt if object.wt
  solr_request[:defType] = object.defType if object.defType
  visit(object.expr, attribute)
end

#visit_Ansr_Arel_Nodes_Spellcheck(object, attribute) ⇒ Object



149
150
151
152
153
154
155
156
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 149

def visit_Ansr_Arel_Nodes_Spellcheck(object, attribute)
  unless object.expr == false
    solr_request[:spellcheck] = object.expr.to_s
  end
  object.opts.each do |att, val|
    solr_request["spellcheck.#{att.to_s}".to_sym] = val if att != :select
  end
end

#visit_Arel_Nodes_Equality(object, attribute) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 97

def visit_Arel_Nodes_Equality(object, attribute)
  field_key = (object.left.respond_to? :expr) ? field_key_from_node(object.left.expr) : field_key_from_node(object.left)
  opts = {}
  opts.merge!(local_field_params(field_key))
  opts.merge!(object.left.config.fetch(:local,{})) if object.left.respond_to? :config
  if Ansr::Arel::Visitors::Filter === attribute or Ansr::Arel::Nodes::Filter === object.left
    add_filter_fq_to_solr(solr_request, f: {field_key => object.right}, opts: opts)
  else
    # check the table for configured fields
    add_query_to_solr(field_key, object.right, opts)
  end
end

#visit_Arel_Nodes_Group(object, attribute) ⇒ Object



120
121
122
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 120

def visit_Arel_Nodes_Group(object, attribute)
  solr_request[:group] = object.expr.to_s
end

#visit_Arel_Nodes_Grouping(object, attribute) ⇒ Object



116
117
118
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 116

def visit_Arel_Nodes_Grouping(object, attribute)
  visit object.expr, attribute
end

#visit_Arel_Nodes_Limit(object, attribute) ⇒ Object



201
202
203
204
205
206
207
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 201

def visit_Arel_Nodes_Limit(object, attribute)
  value = object.expr
  if value and (value = value.to_i)
    raise "Page size cannot be > 500 (#{value}" if value > 500
    solr_request[:rows] = value.to_s
  end
end

#visit_Arel_Nodes_NotEqual(object, attribute) ⇒ Object



110
111
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 110

def visit_Arel_Nodes_NotEqual(object, attribute)
end

#visit_Arel_Nodes_Offset(object, attribute) ⇒ Object



209
210
211
212
213
214
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 209

def visit_Arel_Nodes_Offset(object, attribute)
  value = object.expr
  if value
    solr_request[:start] = value.to_s
  end
end

#visit_Arel_Nodes_Or(object, attribute) ⇒ Object



113
114
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 113

def visit_Arel_Nodes_Or(object, attribute)
end

#visit_Arel_Nodes_TableAlias(object, attribute) ⇒ Object



43
44
45
46
47
48
49
50
51
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 43

def visit_Arel_Nodes_TableAlias(object, attribute)
  solr_request[:qt] = object.name.to_s
  opts = {qt: object.name.to_s}
  if (cf = table[object.name]).is_a? Ansr::Arel::ConfiguredField
    opts.merge!(cf.config.fetch(:query,{}))
  end
  solr_request.merge!(opts)
  visit object.relation, attribute
end

#visit_Arel_SqlLiteral(n, attribute) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 59

def visit_Arel_SqlLiteral(n, attribute)
  select_val = n.to_s.split(" AS ")
  if Ansr::Arel::Visitors::Filter === attribute
    solr_request.append_facet_fields(select_val[0].to_sym)
  else
    field(select_val[0].to_sym)
    if select_val[1]
      query_opts.aliases ||= {}
      query_opts.aliases[select_val[0]] = select_val[1]
    end
  end
end

#visit_String(o, a) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/ansr_blacklight/arel/visitors/query_builder.rb', line 29

def visit_String o, a
  case a
  when Ansr::Arel::Visitors::From
    query_opts.path = o
  when Ansr::Arel::Visitors::Filter
    filter_field(o.to_sym)
  when Ansr::Arel::Visitors::Order
    order(o)
  else
    raise "visited String \"#{o}\" with #{a.to_s}"
  end
end