Class: Ansr::Blacklight::Arel::Visitors::QueryBuilder
- Inherits:
-
Arel::Visitors::QueryBuilder
- Object
- Arel::Visitors::QueryBuilder
- Ansr::Blacklight::Arel::Visitors::QueryBuilder
- Includes:
- RequestBuilders
- Defined in:
- lib/ansr_blacklight/arel/visitors/query_builder.rb
Instance Attribute Summary collapse
-
#solr_request ⇒ Object
readonly
Returns the value of attribute solr_request.
Instance Method Summary collapse
- #field(field_name) ⇒ Object
- #filter_field(field_name) ⇒ Object
- #from(value) ⇒ Object
-
#initialize(table) ⇒ QueryBuilder
constructor
A new instance of QueryBuilder.
-
#multiple?(field_key) ⇒ Boolean
determines whether multiple values should accumulate or overwrite in merges.
- #order(*arel_nodes) ⇒ Object
- #query_opts ⇒ Object
- #visit_Ansr_Arel_Nodes_Facet(object, attribute) ⇒ Object
- #visit_Ansr_Arel_Nodes_Highlight(object, attribute) ⇒ Object
- #visit_Ansr_Arel_Nodes_ProjectionTraits(object, attribute) ⇒ Object
- #visit_Ansr_Arel_Nodes_Spellcheck(object, attribute) ⇒ Object
- #visit_Arel_Nodes_Equality(object, attribute) ⇒ Object
- #visit_Arel_Nodes_Group(object, attribute) ⇒ Object
- #visit_Arel_Nodes_Grouping(object, attribute) ⇒ Object
- #visit_Arel_Nodes_Limit(object, attribute) ⇒ Object
- #visit_Arel_Nodes_NotEqual(object, attribute) ⇒ Object
- #visit_Arel_Nodes_Offset(object, attribute) ⇒ Object
- #visit_Arel_Nodes_Or(object, attribute) ⇒ Object
- #visit_Arel_Nodes_TableAlias(object, attribute) ⇒ Object
- #visit_Arel_SqlLiteral(n, attribute) ⇒ Object
- #visit_String(o, a) ⇒ Object
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_request ⇒ Object (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
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_opts ⇒ Object
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 |