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 <rpav / mephle.com>