[Haskell-cafe] A Query Language for Haskell Terms
Alex Jacobson
alex at alexjacobson.com
Wed Jun 27 04:32:16 EDT 2007
Titto,
Have you looked at HAppS.DBMS.IxSet? Right now it provides a generic
way to query indexed sets.
If you want to take a shot at making the queries serializable, I don't
think it would be that difficult (but I have not tried so YMMV).
-Alex-
Pasqualino 'Titto' Assini wrote:
> Hi,
>
> I am writing a Web application using HAppS.
>
> As all HAppS apps, it represents its internal state as a Haskell term (HAppS
> automagically provides persistence and transactions).
>
> It is a neat and efficient solution, you can write your data model entirely in
> Haskell and, at least for read-only transactions (queries) it will be operate
> as fast as possible as all data is in memory (if your transactions modify the
> application state, the transactions has to be recorded on disk to make it
> persistent, but this is pretty fast too).
>
> One major component, however seem to be missing, if we are effectively using
> Haskell as an in-memory database where is the "SQL for Haskell": a generic
> query language for Haskell terms?
>
> There are three basic functions that every web app has to provide, and all of
> them could be provided by a generic "Haskell SQL":
> -- query the application state
> -- transform (possibly monadically) the application state : the result of the
> query is the new state
> -- access control: what an user can see is what is returned by an internal
> access control query
>
> The availabilty of such a language would be a major boost for Haskell-based
> web applications as every application could be accessed via the same API, the
> only difference being the underlying application-specific data model.
>
>
> So my question is: what ready-made solutions are there in this space, if any?
>
> And if there are none, how would you proceed to design/implement such a
> language?
>
>
>
> The basic requirements, in decreasing order of importance, are:
>
> -- Safe, it must be possible to guarantee that a query:
> --- cannot cause a system crash
> --- completes by a fixed time of time
> --- uses a 'reasonable' amount of space
> --- cannot perform any unsafe operation (IO, or any unallowed read/write of
> the application state)
>
> -- Expressive (simple queries should be simple, complex queries should be
> possible)
>
> -- Simple to implement
>
> -- Efficient:
> --- Repeated queries should be executed efficiently time-wise (it is
> acceptable for queries to be executed inefficiently the first time) and all
> should be space-efficient, so it should not do unnecessary copying.
>
> -- User friendly:
> --- Simple to use for non-haskeller
> --- Short queries
>
> Ah, I almost forgot, it should also be able to make a good espresso.
>
>
> The problem can be broken in two parts:
>
> 1) How to implement generic queries on nested terms in Haskell?
>
> 2) How to map the queries, written as a string, to the internal Haskell query
>
>
> Regarding the first point, I am aware of with the following options:
> - SYB (Data.Generics..)
> - Oleg's Zipper
> - (Nested) list comprehensions (that are being extended with SQL-like order by
> and group by operators)
>
> Being rather new to Haskell all these options are rather unfamiliar so I would
> appreciate any advice on what should be preferred and why.
>
>
>
> Regarding the second point:
>
> The simplest solution would be to avoid the problem entirely by using Haskell
> directly as the query language.
>
> This is the LambdaBot way: queries are Haskell
> expression, compiled in a limited environment (a module with a fixed set of
> imports, no TH).
>
> Lambdabot avoids problems by executing the expression on a separate process in
> a OS-enforced sandbox that can be as restrictive as required (especially
> using something like SELinux).
>
> However, to get the query to execute efficiently it would probably have to be
> executed in a GHC thread and I am not sure how safe that would be.
>
> Looking at the discussion at
> http://haskell.org/haskellwiki/Safely_running_untrusted_Haskell_code
> it seems clear that there are many open issues.
>
> For example, how would I enforce limits on the space used by the query?
>
> So, it would probably be better to define a separate query
> language that is less expressive but more controllable than full Haskell, but
> what form should that take?
>
>
>
> Any suggestion/tip/reference is very welcome,
>
> titto
>
>
>
>
>
>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list