Skip to content

Instantly share code, notes, and snippets.

@paul
Created January 28, 2009 22:56
Show Gist options
  • Save paul/54237 to your computer and use it in GitHub Desktop.
Save paul/54237 to your computer and use it in GitHub Desktop.
# As an exercise, come up with a ruby-way to specify
# a set of search conditions for this SQL:
# simple or
# WHERE name = 'Dan' OR name = 'Paul'
# nested or, plus duplicating field names
# WHERE name = 'Paul' AND ( age < 18 OR age > 21 )
# not ( and don't say != )
# WHERE NOT name = 'Paul'
# Some of these might not work, I'm just brainstorming, and soliciting ideas
# prefix
Model.all(and(:name => "Paul", or(:age => lt(18), :age => gt(21))
# expressions
Model.all( c(:name => "Paul").and(c(:age => lt(18)).or(:age => gt(21))) )
# ambition-style
Model.all( name == "Paul" && ( age < 18 || age > 21 ) )
# Hashes. Assumes a plain hash is AND'ed
Model.all( :name => "Paul",
:or => { :age => [lt(18), gt(21)] } )
# Custom parser
Model.all( " name = 'Paul' AND ( age < 18 OR age > 21 ) " )
# super-prefix
Model.all eq(:name, 'Paul').or(lt(:age, 18), gt(:age, 21))
# namelessjon
Model.all( { :name => 'Paul' }, {:age => 21, :name => 'Joe'} )
# lisp-y afrench
Model.all( :conditions => [:and, [:eql, :name, 'Paul'], [:or, [:lt, :age, 18], [:gt, :age, 21]]] )
# EZ-Where style
Model.all( c { :name == "Dan" } | c { :name == "Paul" } )
Model.all( c { :name == "Paul" } + ( c { :age < 18 } | c { :age > 21 } ) )
Model.all( - c { :name == "Paul" } )
# Sam's Arrays:
Model.all( [ :name => 'Dan' ].or([:name => 'Paul']) )
Model.all( :name => 'Paul', [ :age => lt(18) ].or([ :age => gt(21) ]) )
# And for reference, here's how it will get represented internally.
Operation.new(:or,
Comparison.new(:eql, :name, "Dan"),
Comparison.new(:eql, :name, "Paul")
)
Operation.new(:and,
Comparison.new(:eql, :name, "Paul"),
Operation.new(:or,
Comparison.new(:lt, :age, 18),
Comparison.new(:gt, :age, 21)
)
)
Operation.new(:not,
Comparison.new(:eql, :name, "Paul")
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment