On 2011-10-11 23:31, Andrei Alexandrescu wrote:
On 10/11/11 3:05 PM, Jacob Carlborg wrote:
If we're talking use cases and high level interfaces I would go with
something like:
[snip]
I recommend that everyone take a good look at ActiveRecord in Ruby on
Rails:

http://guides.rubyonrails.org/active_record_querying.html
http://guides.rubyonrails.org/association_basics.html
http://guides.rubyonrails.org/active_record_validations_callbacks.html

I confess the example you gave looks very foreign to me. From consulting
http://guides.rubyonrails.org/active_record_querying.html, I see Ruby's
active records esentially recode relational algebra in Ruby (as for the
constructs the equivalent SQL is shown).

Yes, exactly. The point is to have as much as possible in functions instead of string literals and have a more Ruby like API than an SQL looking API.

connection.select("*").from("users");

instead of

connection.execute("select * from users")

Then they wrap everything in an object oriented API.

For a variety of reasons, this would be tenuous in D. One simple reason
is that e.g. lambdas don't offer access to textual representation, which
would be necessary to translate lambda-based conditions into SQL text.

ActiveRecord doesn't support these lambda-based conditions out of the box. It is possible with the help of plugins, which uses a Ruby parser to get things done.

I though that it might be possible to do in D, without the use of a parser. Take this for example:

Post.where(p => p.title == "asd")

"p" would be some kind of object/struct that overloads opDispatch. The opDispatch method would return an object/struct that overloads opCmp and opEquals. opCmp/opEquals would then return an object/struct that have recorded the comparison. The "where" method can then translate it in to raw SQL.

To this to work opCmp/opEquals need to be able to return a struct or an object, I don't know if this is possible.

I might be narrow-minded, but I thought we're still looking at writing
and executing good old SQL code.


Andrei

That would of course still be needed. I would consider that interface sit in the middle layer, above the lower driver level and below a higher ORM like level.

Everyone is of course free to choose at which layer they want to interface with the database.

--
/Jacob Carlborg

Reply via email to