[Dbix-class] Explicit ASTs (ping nate)
Darren Duncan
darren at DarrenDuncan.net
Sun Sep 3 04:12:15 CEST 2006
At 5:31 PM -0700 9/2/06, David E. Wheeler wrote:
>On Sep 2, 2006, at 13:53, Matt S Trout wrote:
>
>> DWIM AST -> explicit AST -> SQL
>
>Agreed. This way, the AST does not have to be specific to any one
>back end (PostgreSQL, SQLite, MySQL, LDAP, a object iterator, etc.).
>
>This is also what I was thinking, as I've been trying to work out a
>DWIM query mini language that's just Perl and lexes itself into an
>AST that can then be passed to some other module to actually do
>something with.
From my experience with working on Set::Relation and the Rosetta DBMS
(and the now defunct SQL::Routine), if you *really* want to have an
explicit AST that says exactly what you mean, is expressive enough
for 99+% of any real-world uses, and is very portable, you
essentially have to define a whole turing complete language,
including the basics (which is what I am doing).
It also helps to, on one hand, abstract away any differences in the
syntax for invoking built-in operators (eg, '=', 'AND', 'LIKE') and
user-defined operators (stored functions / procedures), so that
syntax-wise, user-defined operators are simply extensions to the
language. But at the same time, it is very useful to have the
concept of name-spaces (loosely analagous to SQL schemas and/or
packages). Have a pre-defined namespace for built-ins, eg, System::,
and another for user-defined functions, eg, User::, and use these
everywhere in the AST. Then almost all things in the AST are simply
expressions involving function calls, each of which takes zero or
more arguments and returns a value. All parts of a SELECT statement
can also be composed in this format. I suggest making the arguments
named as well, so they are better self-documenting. Note that the
names you use in the built-ins under System:: don't have to look the
same as the SQL analogs, especially when different DBMSs aren't the
same as each other in those regards.
You'll also want to explicitly define a type system, and you'll want
at least the Boolean type.
I'll write more on this later if it is helpful.
-- Darren Duncan
More information about the Dbix-class
mailing list