! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays combinators constructors db2
db2.private db2.sqlite.lib db2.statements db2.utils destructors
-kernel make math.parser sequences strings ;
+kernel make math.parser sequences strings assocs ;
IN: db2.fql
TUPLE: fql-statement sql in out ;
M: insert normalize-fql ( insert -- insert )
[ [ ?1array ] ?when ] change-names ;
+TUPLE: update tables keys values where order-by limit ;
+CONSTRUCTOR: update ( tables keys values where -- obj ) ;
+M: update normalize-fql ( insert -- insert )
+ [ [ ?1array ] ?when ] change-tables
+ [ [ ?1array ] ?when ] change-keys
+ [ [ ?1array ] ?when ] change-values
+ [ [ ?1array ] ?when ] change-order-by ;
+
+TUPLE: delete tables where order-by limit ;
+CONSTRUCTOR: delete ( tables keys values where -- obj ) ;
+M: delete normalize-fql ( insert -- insert )
+ [ [ ?1array ] ?when ] change-tables
+ [ [ ?1array ] ?when ] change-order-by ;
+
TUPLE: select names from where group-by order-by offset limit ;
CONSTRUCTOR: select ( names from -- obj ) ;
M: select normalize-fql ( select -- select )
} cleave
] "" make >>sql ;
+M: update expand-fql*
+ [ fql-statement new ] dip
+ [
+ {
+ [ "update " % tables>> ", " join % ]
+ [
+ " set " % [ keys>> ] [ values>> ] bi
+ zip [ ", " % ] [ first2 [ % ] dip " = " % % ] interleave
+ ]
+ ! [ " " % from>> ", " join % ]
+ [ where>> [ " where " % [ expand-fql % ] when* ] when* ]
+ [ order-by>> [ " order by " % ", " join % ] when* ]
+ [ limit>> [ " limit " % # ] when* ]
+ } cleave
+ ] "" make >>sql ;
+
+M: delete expand-fql*
+ [ fql-statement new ] dip
+ [
+ {
+ [ "delete from " % tables>> ", " join % ]
+ [ where>> [ " where " % [ expand-fql % ] when* ] when* ]
+ [ order-by>> [ " order by " % ", " join % ] when* ]
+ [ limit>> [ " limit " % # ] when* ]
+ } cleave
+ ] "" make >>sql ;
+
M: select expand-fql*
[ fql-statement new ] dip
[
} cleave
] "" make >>sql ;
-
M: fql-statement sql-command ( sql -- )
sql>> sql-command ;