Thomas Hurst wrote: > Demo: > # Token stream > irb(main):009:0> toks = analyser.simplify(tokenizer.tokenize("foo AND bar OR (wibble OR wobble NOT foo)")) > [#<NSearch::SubStringQuery:0x18a4a20 @substr="foo">, > :and, > #<NSearch::SubStringQuery:0x18a49f8 @substr="bar">, > :or, > :open, > #<NSearch::SubStringQuery:0x18a49a8 @substr="wibble">, > :or, > #<NSearch::SubStringQuery:0x18a4958 @substr="wobble">, > :and, > :not, > #<NSearch::SubStringQuery:0x18a4908 @substr="foo">, > :close] > > irb(main):010:0> analyser.rpnise(toks) > [#<NSearch::SubStringQuery:0x188a670 @substr="foo">, > #<NSearch::SubStringQuery:0x188a648 @substr="bar">, > :and, > #<NSearch::SubStringQuery:0x188a5f8 @substr="wibble">, > #<NSearch::SubStringQuery:0x188a5a8 @substr="wobble">, > #<NSearch::SubStringQuery:0x188a558 @substr="foo">, > :not, > :and, > :or, > :or] > > You can then follow the instructions, popping each SubStringQuery onto a > stack and popping them off on :and, :or and :not to build a tree of > query objects: > > #to_s > OR(OR(AND(NOT("foo"),"wobble"),"wibble"),AND("bar","foo")) > > #to_sql > (((NOT (Title LIKE "%foo%") AND Title LIKE "%wobble%") OR Title LIKE > "%wibble%") OR (Title LIKE "%bar%" AND Title LIKE "%foo%")) > > > I'd recommend against using Ruby's own Generator, btw; it uses callcc > and has a tendancy towards being slow and leaky. If you just need a > #next/#peek method, just turn it into an array and shove it in an > appropriate object which tracks the position. > That's pretty neat. I hadn't thought of using this stuff to generate SQL. I'll probably acually use that idea some day. And thanks for the bit about Generator. I'm currently looking through a computational script (ported from c++)--I could never figure out why it used all my ram within a few seconds, but it used Generators several thousand times. I'm rewriting parts of it now, and we'll see what happens. Dan