From: Ryan Pavlik Date: 2003-10-05T09:36:34+09:00 Subject: ANN: Criteria 1.1 Criteria ======== Updates ------- 1.1 - Feature: SQLTable now abstracts CREATE TABLE, INSERT, UPDATE, DELETE, and DROP TABLE. See the reference for details. Example: (tbl.bday == "2003/10/04").update(:age => tbl.age + 1) # => "UPDATE Person SET age = (Person.age + 1) WHERE # (Person.bday = '2003/10/04')" Feature: MysqlTable updated to support new SQLTable features. Also, #select_parse now parses output into Ruby types if specified with create(). Feature: Criterion superclass now uses #x? to generate Placeholder arguments, and #[] for parameterized queries. See reference for details. Example: TBL_AGE_RANGE = (tbl.age > tbl.x?) & (tbl.age < tbl.x?) TBL_AGE_RANGE.order_by = [:name, :age] TBL_AGE_RANGE[20, 30].select # => "SELECT * FROM Person WHERE ((Person.age > 20) AND # (Person.age < 30))" Bugfix: Selections from a FileTable query are now sorted even if the key is not part of the selection. Thanks to Brett Norris for finding this one. Description ----------- Criteria is a module for abstracting queries to various data sets. For instance, you might have a flat text file, or an array of Ruby objects, or a SQL database, and wish to perform the same query on any given source, without different versions of code for each. This module was inspired by the work of flgr (on #ruby-talk) on Junction, and the ENV.var work by h9k (also on #ruby-talk). Here are some examples: idx1 = SQLTable.new("orders") q1 = (idx1.price > idx1.paid) & (idx1.duedate < Time.now.to_i) q1.limit = 5 q1.order = :ASC q1.order_by = idx1.name, idx1.age puts q1.select # => SELECT * FROM orders WHERE ((orders.price > orders.paid) AND # (orders.duedate < 1062616643)) LIMIT 5 ORDER BY orders.name, # orders.age ASC The generic Table superclass with the same query: idx2 = Table.new q2 = (idx2.price > idx2.paid) & (idx2.duedate < Time.now.to_i) puts q2.inspect puts q1.inspect # => (& (> :price :paid) (< :duedate 1062616719)) # => (& (> :price :paid) (< :duedate 1062616719)) The very simple 'mysql' table included works like SQLTable, except it actually returns a MysqlRes for immediate use. There are other included table types as well. You can find Criteria at the following location: http://mephle.org/Criteria/ -- Ryan Pavlik