Sha256: 48f9c18b02f0b98190442ede29bb301fa0e36c2ccc1bb2f338f09f28dfdae21b

Contents?: true

Size: 1.44 KB

Versions: 1

Compression:

Stored size: 1.44 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, escaping = true )
    return if value.blank?
    stream.push("#{field}:#{escape(value, escaping)}")
  end
  
  def term( value, escaping = true )
    return if value.to_s.strip.blank?
    stream.push( escape(value, escaping) )
  end
  
  def like( value, escaping = true )
    "#{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
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
cyx-solr_query-0.1.0 lib/solr_query.rb