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.
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”
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”
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(’ ')
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
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.