def to_ber
case @op
when :eq
if @right == "*"
@left.to_s.to_ber_contextspecific 7
elsif @right =~ /[\*]/
ary = @right.split( /[\*]+/ )
final_star = @right =~ /[\*]$/
initial_star = ary.first == "" and ary.shift
seq = []
unless initial_star
seq << ary.shift.to_ber_contextspecific(0)
end
n_any_strings = ary.length - (final_star ? 0 : 1)
n_any_strings.times {
seq << ary.shift.to_ber_contextspecific(1)
}
unless final_star
seq << ary.shift.to_ber_contextspecific(2)
end
[@left.to_s.to_ber, seq.to_ber].to_ber_contextspecific 4
else
[@left.to_s.to_ber, unescape(@right).to_ber].to_ber_contextspecific 3
end
when :ge
[@left.to_s.to_ber, unescape(@right).to_ber].to_ber_contextspecific 5
when :le
[@left.to_s.to_ber, unescape(@right).to_ber].to_ber_contextspecific 6
when :and
ary = [@left.coalesce(:and), @right.coalesce(:and)].flatten
ary.map {|a| a.to_ber}.to_ber_contextspecific( 0 )
when :or
ary = [@left.coalesce(:or), @right.coalesce(:or)].flatten
ary.map {|a| a.to_ber}.to_ber_contextspecific( 1 )
when :not
[@left.to_ber].to_ber_contextspecific 2
else
raise "unimplemented search filter"
end
end