[Dbix-class] Explicit ASTs (ping nate)

David E. Wheeler david at kineticode.com
Tue Sep 5 01:46:29 CEST 2006


On Sep 4, 2006, at 15:54, Darren Duncan wrote:

> Well, I'm saying the return type here in the sense to what a SELECT
> conceptually returns.  By implementation-specific, I assume you mean
> what Perl data type is returned, since Perl 5 doesn't have a Table or
> Relation type.

Correct.

> My own impression of a best type of response is that an object is
> returned from which you can either get the resultset all at once, eg
> as an array of hashes, or you can enumerate through it one row at a
> time, etc, such as if you have a large result set that uses a cursor
> behind the scenes since it won't fit in RAM.

That's what most ORMs do, yes, though the iterator usually returns  
objects.

> But still, this matter is largely orthogonal to query syntax, unless
> your query can specify what kind of result you want to conceptually
> be given as a result, eg, all-at-once vs cursor handle.

I like cursors. I just wish that DBD::Pg supported them. :-(

> FYI, I'm writing some pseudo-SQL for each to help illustrate them;

<snip />

Nice, thanks.

> Well, I used the word "inspiration" on purpose.  The point is that
> you can use simpler operators that are used together without those
> operators being the same as any of the above (especially if some DBMS
> products don't easily support some of the above in isolation from a
> combination with others).  The important principle is breaking down
> the bigger problem into clearly defined and easier to use smaller
> ones.

Right, agreed.

> I will also take this moment to point out a brand new book by the
> same authors, which is "The Relational Database Dictionary".  This
> book is more of a pocket reference type thing at 122 pages, and is
> inexpensive.
>
> See: http://www.oreilly.com/catalog/relationaldb/index.html
>
> I've already ordered a copy for myself, today.

Ooh, nice.

>> Yes, but the syntax in pure Perl is hard; see my recent post on p5p
>> for details.
>
> That depends on how you do it.  There are various Perl idioms that  
> can be used.

Well, yes, but I want to do it with Perl expressions and operators,  
not with data structures.

> If you want to generate SQL or other non-Perl things from it, then
> you could make the input more AST-like in appearance.

Blech. Not fun for humans to use.

> If you want it to execute in Perl, you could replace some things with
> anonymous subroutines; eg, a WHERE clause is essentially like Perl's
> "grep" in structure, so you could take an anonymous sub ref that is
> invoked for each row, given that row as its argument, and it returns
> true or false based on whether the row matches its criteria.

Yep, that's what I'm doing, only I'm rewriting the code ref to a  
WHERE clause, rather than filtering the results through the code  
reference. It will look largely the same, though, to the user.  
Getting it just right is really hard, though.

> Note that my Set::Relation module will be taking the latter approach,
> while Rosetta will be taking the former approach.

Yes, we're going for a similar dichotomy here.

> If you don't want either of those approaches, then I don't know
> enough about Perl to do what you want, at least not without more
> prompting or help.

I'm looking at possibly introspecting a code ref without executing  
it, but I don't know enough about B or Perl's internals to do much  
with it yet…I'd be intereseted to see what you've come up with, Darren

Best,

David






More information about the Dbix-class mailing list