Class: Hotdog::Commands::Search::UnaryExpressionNode

Inherits:
ExpressionNode show all
Defined in:
lib/hotdog/commands/search.rb

Instance Method Summary collapse

Constructor Details

#initialize(op, expression) ⇒ UnaryExpressionNode



180
181
182
183
# File 'lib/hotdog/commands/search.rb', line 180

def initialize(op, expression)
  @op = op
  @expression = expression
end

Instance Method Details

#evaluate(environment) ⇒ Object



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/hotdog/commands/search.rb', line 184

def evaluate(environment)
  case @op
  when "!", "~", /\Anot\z/i
    values = @expression.evaluate(environment)
    if values.empty?
      environment.execute(<<-EOS).map { |row| row.first }
        SELECT DISTINCT host_id FROM hosts_tags;
      EOS
    else
      environment.execute(<<-EOS % values.map { "?" }.join(", "), values).map { |row| row.first }
        SELECT DISTINCT host_id FROM hosts_tags WHERE host_id NOT IN (%s);
      EOS
    end
  else
    raise(SyntaxError.new("unknown unary operator: #{@op}"))
  end
end