Sha256: a2961f1b22dfeeaa981a0fe0779b1c6ddc81863458178caa3a1d4bf23013246a
Contents?: true
Size: 1.78 KB
Versions: 1
Compression:
Stored size: 1.78 KB
Contents
require 'activesupport' class SolrQuery AND = ' AND ' OR = ' OR ' def self.escape( str ) str.to_s.gsub(/([!+\-\(\)\{\}\[\]^\"\~\*\?\:\\])/, '\\\\\1') end def self.create( operator = AND ) solr_query = new yield solr_query solr_query.to_s( operator ) end attr_reader :conditions def initialize @conditions = [] @stream = [ [] ] end def union( &block ) do_operation( OR, &block ) end def intersection( &block ) do_operation( AND, &block ) end def push( condition ) stream.push( condition ) end def stream @stream[-1] end def condition( field, value, args = [] ) return if value.blank? escaping = !args.include?( :raw ) if args.include?(:not) stream.push("NOT(#{field}:#{quote(escape(value, escaping))})") else stream.push("#{field}:#{quote(escape(value, escaping))}") end end def term( value, escaping = true ) return if value.to_s.strip.blank? stream.push( escape(value, escaping) ) end def like( value, escaping = true ) "#{quote(escape(value.downcase, escaping))}*" end def to_s( operator = AND ) stream.join( operator ) end protected def parenthesize( str ) "( #{str} )" end def do_operation( op ) solr_query = SolrQuery.new @stream << solr_query yield generated = @stream.pop.to_s( op ) stream.push(parenthesize(generated)) if generated.present? end def escape( str, escaping = true ) if escaping self.class.escape( str ) else str end end def quote( str ) if str.to_s.index(' ') "\"#{str}\"" elsif str.to_s.index(':') str.gsub(':', ' ') else str end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
cyx-solr_query-0.2.0 | lib/solr_query.rb |