Simple way to turn "foo and bar" to "+foo +bar"

I want to add a slightly hacky feature into my boolean mysql search
which lets users write ‘foo and bar’, which is then translated into
‘+foo +bar’ (ie both ‘foo’ and ‘bar’ must be present) before being
passed to the search. Similarly, “foo and bar and snafu” should be
translated into “+foo +bar +snafu”.

I’m sure there must be a simple way to do this but i’m new to ruby and
have got bogged down in loads of nested ifs and exceptions already.

Can anyone help with an elegant solution?

thanks
max

On Dec 14, 10:48 am, Max W. [email protected] wrote:

I want to add a slightly hacky feature into my boolean mysql search
which lets users write ‘foo and bar’, which is then translated into
‘+foo +bar’ (ie both ‘foo’ and ‘bar’ must be present) before being
passed to the search. Similarly, “foo and bar and snafu” should be
translated into “+foo +bar +snafu”.

I’m sure there must be a simple way to do this but i’m new to ruby and
have got bogged down in loads of nested ifs and exceptions already.

Can anyone help with an elegant solution?

I feel like there’s a more elegant one-pass regexp, but I haven’t the
time to think much on it. So:

phrases = [
“foo”,
“foo or bar”,
“foo and bar”,
“foo and bar and snafu”
]

phrases.each{ |phrase|
result = phrase.dup
:go while result.gsub!( /+?(\S+)\sand\s(\S+)/, ‘+\1 +\2’ )
puts “#{phrase.inspect} → #{result.inspect}”
}

#=> “foo” → “foo”
#=> “foo or bar” → “foo or bar”
#=> “foo and bar” → “+foo +bar”
#=> “foo and bar and snafu” → “+foo +bar +snafu”

Hi max,

How about…

irb(main):001:0> “foo and bar”.sub(/(foo) and (bar)/, “+#{$1} +#{$2}”)
=> “+foo +bar”
irb(main):002:0> “foo and bar”.sub(/(foo) and (bar)/, ‘+\1 +\2’)
=> “+foo +bar”
irb(main):003:0> “foo and bar and snafu”.sub(/(foo) and (bar) and
(snafu)/, ‘+\1 +\2 +\3’)
=> “+foo +bar +snafu”

or

irb(main):004:0> “foo and bar and snafu”.gsub(/(\w+)\s+and/,
‘+\1’).sub(/(\w+)$/, ‘+\1’)
=> “+foo +bar +snafu”

On Dec 14, 2007, at 2:48 PM, Max W. wrote:

I want to add a slightly hacky feature into my boolean mysql search
which lets users write ‘foo and bar’, which is then translated into
‘+foo +bar’ (ie both ‘foo’ and ‘bar’ must be present) before being
passed to the search. Similarly, “foo and bar and snafu” should be
translated into “+foo +bar +snafu”.

I’m sure there must be a simple way to do this but i’m new to ruby and
have got bogged down in loads of nested ifs and exceptions already.

Can anyone help with an elegant solution?

“foo and bar and baz”.split(/\s+and\s+/i).map{|s| “+#{s}”}.join(’ ')

thanks
max

regards,

On Sat, 15 Dec 2007 03:19:22 +0900, Rolando A. [email protected]
wrote:

Can anyone help with an elegant solution?

“foo and bar and baz”.split(/\s+and\s+/i).map{|s| “+#{s}”}.join(’ ')

I think this one is best.

-mental

On Sat, 15 Dec 2007 02:48:46 +0900, Max W.
[email protected] wrote:

I want to add a slightly hacky feature into my boolean mysql search
which lets users write ‘foo and bar’, which is then translated into
‘+foo +bar’ (ie both ‘foo’ and ‘bar’ must be present) before being
passed to the search. Similarly, “foo and bar and snafu” should be
translated into “+foo +bar +snafu”.

I’m sure there must be a simple way to do this but i’m new to ruby and
have got bogged down in loads of nested ifs and exceptions already.

Can anyone help with an elegant solution?

query = “foo and bar and baz”
nil while query.sub!(/+*(\w+)\s+and\s+(\w+)/, ‘+\1 +\2’)
puts query

-mental

Do you need to worry about phrases?

Something like:

require ‘pp’
f = “foo and bar AND north dakota”
result = f.split(/\s+and\s+/i).inject(’’) {|memo, obj| memo +
"+(#{obj}) "}.strip
pp result

=> “+(foo) +(bar) +(north dakota)”

I could not resist, so a slight mod :wink:

“+” << “foo and bar and baz”.split(/\s+and\s+/i).join(’ +’)

irb(main):001:0> “+” << “foo and bar and baz”.split(/\s+and\s+/i).join(’
+’)
=> “+foo +bar +baz”

Johnny P

just pass in the delimeter…

test.rb:
and_str = “foo and bar AND baz”
pipe_str = “foo|bar| baz”

def translate(str, del)
  str.split(/\s*#{del}\s*/i).map{|s| "+#{s}"}.join(' ')
end

puts translate(and_str, 'and')
puts translate(pipe_str, '\|')

On Dec 14, 11:22 am, MenTaLguY [email protected] wrote:

On Sat, 15 Dec 2007 03:19:22 +0900, Rolando A. [email protected] wrote:

Can anyone help with an elegant solution?

“foo and bar and baz”.split(/\s+and\s+/i).map{|s| “+#{s}”}.join(’ ')

I think this one is best.

It’s elegant, but it assumes that the search phrase always has “and”.
Although not originally specified either way, that seems like an
unlikely assumption. But then, I don’t know the problem domain.

Awesome, thanks a lot everyone!

max