Merge branch 'master' of git://factorcode.org/git/factor
commit
3b84332399
|
@ -168,7 +168,7 @@ M: db <select-by-slots-statement> ( tuple class -- statement )
|
||||||
number>string " limit " swap 3append
|
number>string " limit " swap 3append
|
||||||
] curry change-sql drop ;
|
] curry change-sql drop ;
|
||||||
|
|
||||||
: make-query ( tuple query -- tuple' )
|
: make-query* ( tuple query -- tuple' )
|
||||||
dupd
|
dupd
|
||||||
{
|
{
|
||||||
[ group>> [ drop ] [ do-group ] if-empty ]
|
[ group>> [ drop ] [ do-group ] if-empty ]
|
||||||
|
@ -177,8 +177,8 @@ M: db <select-by-slots-statement> ( tuple class -- statement )
|
||||||
[ offset>> [ do-offset ] [ drop ] if* ]
|
[ offset>> [ do-offset ] [ drop ] if* ]
|
||||||
} 2cleave ;
|
} 2cleave ;
|
||||||
|
|
||||||
M: db <query> ( tuple class query -- tuple )
|
M: db make-query ( tuple class query -- tuple )
|
||||||
[ <select-by-slots-statement> ] dip make-query ;
|
[ <select-by-slots-statement> ] dip make-query* ;
|
||||||
|
|
||||||
! select ID, NAME, SCORE from EXAM limit 1 offset 3
|
! select ID, NAME, SCORE from EXAM limit 1 offset 3
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ M: db <count-statement> ( tuple class groups -- statement )
|
||||||
\ query new
|
\ query new
|
||||||
swap >>group
|
swap >>group
|
||||||
[ [ "select count(*) from " 0% 0% where-clause ] query-make ]
|
[ [ "select count(*) from " 0% 0% where-clause ] query-make ]
|
||||||
dip make-query ;
|
dip make-query* ;
|
||||||
|
|
||||||
: create-index ( index-name table-name columns -- )
|
: create-index ( index-name table-name columns -- )
|
||||||
[
|
[
|
||||||
|
|
|
@ -236,6 +236,17 @@ TUPLE: exam id name score ;
|
||||||
exam boa ;
|
exam boa ;
|
||||||
|
|
||||||
: test-intervals ( -- )
|
: test-intervals ( -- )
|
||||||
|
[
|
||||||
|
exam "EXAM"
|
||||||
|
{
|
||||||
|
{ "idd" "ID" +db-assigned-id+ }
|
||||||
|
{ "named" "NAME" TEXT }
|
||||||
|
{ "score" "SCORE" INTEGER }
|
||||||
|
} define-persistent
|
||||||
|
] [
|
||||||
|
seq>> { "idd" "named" } =
|
||||||
|
] must-fail-with
|
||||||
|
|
||||||
exam "EXAM"
|
exam "EXAM"
|
||||||
{
|
{
|
||||||
{ "id" "ID" +db-assigned-id+ }
|
{ "id" "ID" +db-assigned-id+ }
|
||||||
|
@ -499,3 +510,17 @@ string-encoding-test "STRING_ENCODING_TEST" {
|
||||||
\ ensure-table must-infer
|
\ ensure-table must-infer
|
||||||
\ create-table must-infer
|
\ create-table must-infer
|
||||||
\ drop-table must-infer
|
\ drop-table must-infer
|
||||||
|
|
||||||
|
: test-queries ( -- )
|
||||||
|
[ ] [ exam ensure-table ] unit-test
|
||||||
|
! [ ] [ T{ exam f f "Kyle" 100 } insert-tuple ] unit-test
|
||||||
|
! [ ] [ T{ exam f f "Stan" 80 } insert-tuple ] unit-test
|
||||||
|
! [ ] [ T{ exam f f "Kenny" 60 } insert-tuple ] unit-test
|
||||||
|
! [ ] [ T{ exam f f "Cartman" 41 } insert-tuple ] unit-test
|
||||||
|
[ ] [ 10 [ random-exam insert-tuple ] times ] unit-test
|
||||||
|
! [ ] [ T{ exam { name "Kenny" } } >query ] unit-test
|
||||||
|
! [ ] [ query ] unit-test
|
||||||
|
;
|
||||||
|
|
||||||
|
: test-db ( -- )
|
||||||
|
"tuples-test.db" temp-file sqlite-db make-db db-open db set ;
|
||||||
|
|
|
@ -3,11 +3,44 @@
|
||||||
USING: arrays assocs classes db kernel namespaces
|
USING: arrays assocs classes db kernel namespaces
|
||||||
classes.tuple words sequences slots math accessors
|
classes.tuple words sequences slots math accessors
|
||||||
math.parser io prettyprint db.types continuations
|
math.parser io prettyprint db.types continuations
|
||||||
destructors mirrors ;
|
destructors mirrors sets ;
|
||||||
IN: db.tuples
|
IN: db.tuples
|
||||||
|
|
||||||
|
TUPLE: query tuple group order offset limit ;
|
||||||
|
|
||||||
|
: <query> ( -- query ) \ query new ;
|
||||||
|
|
||||||
|
GENERIC: >query ( object -- query )
|
||||||
|
|
||||||
|
M: query >query ;
|
||||||
|
|
||||||
|
M: tuple >query <query> swap >>tuple ;
|
||||||
|
|
||||||
|
! returns a sequence of prepared-statements
|
||||||
|
HOOK: create-sql-statement db ( class -- object )
|
||||||
|
HOOK: drop-sql-statement db ( class -- object )
|
||||||
|
|
||||||
|
HOOK: <insert-db-assigned-statement> db ( class -- object )
|
||||||
|
HOOK: <insert-user-assigned-statement> db ( class -- object )
|
||||||
|
HOOK: <update-tuple-statement> db ( class -- object )
|
||||||
|
HOOK: <delete-tuples-statement> db ( tuple class -- object )
|
||||||
|
HOOK: <select-by-slots-statement> db ( tuple class -- tuple )
|
||||||
|
HOOK: <count-statement> db ( tuple class groups -- statement )
|
||||||
|
HOOK: make-query db ( tuple class query -- statement )
|
||||||
|
|
||||||
|
HOOK: insert-tuple* db ( tuple statement -- )
|
||||||
|
|
||||||
|
ERROR: no-slots-named class seq ;
|
||||||
|
: check-columns ( class columns -- )
|
||||||
|
tuck
|
||||||
|
[ [ first ] map ]
|
||||||
|
[ "slots" word-prop [ name>> ] map ] bi* diff
|
||||||
|
[ drop ] [ no-slots-named ] if-empty ;
|
||||||
|
|
||||||
: define-persistent ( class table columns -- )
|
: define-persistent ( class table columns -- )
|
||||||
>r dupd "db-table" set-word-prop dup r>
|
pick dupd
|
||||||
|
check-columns
|
||||||
|
[ dupd "db-table" set-word-prop dup ] dip
|
||||||
[ relation? ] partition swapd
|
[ relation? ] partition swapd
|
||||||
dupd [ spec>tuple ] with map
|
dupd [ spec>tuple ] with map
|
||||||
"db-columns" set-word-prop
|
"db-columns" set-word-prop
|
||||||
|
@ -33,21 +66,6 @@ SYMBOL: sql-counter
|
||||||
: next-sql-counter ( -- str )
|
: next-sql-counter ( -- str )
|
||||||
sql-counter [ inc ] [ get ] bi number>string ;
|
sql-counter [ inc ] [ get ] bi number>string ;
|
||||||
|
|
||||||
! returns a sequence of prepared-statements
|
|
||||||
HOOK: create-sql-statement db ( class -- object )
|
|
||||||
HOOK: drop-sql-statement db ( class -- object )
|
|
||||||
|
|
||||||
HOOK: <insert-db-assigned-statement> db ( class -- object )
|
|
||||||
HOOK: <insert-user-assigned-statement> db ( class -- object )
|
|
||||||
HOOK: <update-tuple-statement> db ( class -- object )
|
|
||||||
HOOK: <delete-tuples-statement> db ( tuple class -- object )
|
|
||||||
HOOK: <select-by-slots-statement> db ( tuple class -- tuple )
|
|
||||||
TUPLE: query group order offset limit ;
|
|
||||||
HOOK: <query> db ( tuple class query -- statement' )
|
|
||||||
HOOK: <count-statement> db ( tuple class groups -- n )
|
|
||||||
|
|
||||||
HOOK: insert-tuple* db ( tuple statement -- )
|
|
||||||
|
|
||||||
GENERIC: eval-generator ( singleton -- object )
|
GENERIC: eval-generator ( singleton -- object )
|
||||||
|
|
||||||
: resulting-tuple ( exemplar-tuple row out-params -- tuple )
|
: resulting-tuple ( exemplar-tuple row out-params -- tuple )
|
||||||
|
@ -121,13 +139,14 @@ GENERIC: eval-generator ( singleton -- object )
|
||||||
[ [ bind-tuple ] [ query-tuples ] 2bi ] with-disposal ;
|
[ [ bind-tuple ] [ query-tuples ] 2bi ] with-disposal ;
|
||||||
|
|
||||||
: query ( tuple query -- tuples )
|
: query ( tuple query -- tuples )
|
||||||
[ dup dup class ] dip <query> do-select ;
|
[ dup dup class ] dip make-query do-select ;
|
||||||
|
|
||||||
|
|
||||||
: select-tuples ( tuple -- tuples )
|
: select-tuples ( tuple -- tuples )
|
||||||
dup dup class <select-by-slots-statement> do-select ;
|
dup dup class <select-by-slots-statement> do-select ;
|
||||||
|
|
||||||
: select-tuple ( tuple -- tuple/f )
|
: select-tuple ( tuple -- tuple/f )
|
||||||
dup dup class \ query new 1 >>limit <query> do-select
|
dup dup class \ query new 1 >>limit make-query do-select
|
||||||
[ f ] [ first ] if-empty ;
|
[ f ] [ first ] if-empty ;
|
||||||
|
|
||||||
: do-count ( exemplar-tuple statement -- tuples )
|
: do-count ( exemplar-tuple statement -- tuples )
|
||||||
|
|
Loading…
Reference in New Issue