From b8eb5abd13b84a068a33b30fb928d87ed83f569d Mon Sep 17 00:00:00 2001
From: Doug Coleman <doug.coleman@gmail.com>
Date: Wed, 5 Mar 2008 20:56:40 -0600
Subject: [PATCH] before major query overhaul

---
 extra/db/sqlite/sqlite.factor       | 12 +++-----
 extra/db/tuples/tuples-tests.factor | 48 +++++++++++++++++++++++------
 2 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/extra/db/sqlite/sqlite.factor b/extra/db/sqlite/sqlite.factor
index 1524ee5a4f..643b42165d 100755
--- a/extra/db/sqlite/sqlite.factor
+++ b/extra/db/sqlite/sqlite.factor
@@ -142,6 +142,10 @@ M: sqlite-db <insert-assigned-statement> ( tuple -- statement )
     " where " 0%
     find-primary-key dup sql-spec-column-name 0% " = " 0% bind% ;
 
+: where-clause ( specs -- )
+    " where " 0%
+    [ " and " 0% ] [ dup sql-spec-column-name 0% " = " 0% bind% ] interleave ;
+
 M: sqlite-db <update-tuple-statement> ( class -- statement )
     [
         "update " 0%
@@ -174,13 +178,7 @@ M: sqlite-db <select-by-slots-statement> ( tuple class -- statement )
 
         " from " 0% 0%
         [ sql-spec-slot-name swap get-slot-named ] with subset
-        dup empty? [
-            drop
-        ] [
-            " where " 0%
-            [ ", " 0% ]
-            [ dup sql-spec-column-name 0% " = " 0% bind% ] interleave
-        ] if ";" 0%
+        dup empty? [ drop ] [ where-clause ] if ";" 0%
     ] sqlite-make ;
 
 M: sqlite-db modifier-table ( -- hashtable )
diff --git a/extra/db/tuples/tuples-tests.factor b/extra/db/tuples/tuples-tests.factor
index c9ceffe035..3a1e2c4f25 100755
--- a/extra/db/tuples/tuples-tests.factor
+++ b/extra/db/tuples/tuples-tests.factor
@@ -2,11 +2,12 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io.files kernel tools.test db db.tuples
 db.types continuations namespaces db.postgresql math
-prettyprint tools.walker db.sqlite calendar ;
+prettyprint tools.walker db.sqlite calendar
+math.intervals ;
 IN: db.tuples.tests
 
 TUPLE: person the-id the-name the-number the-real ts date time blob ;
-: <person> ( name age real -- person )
+: <person> ( name age real ts date time blob -- person )
     {
         set-person-the-name
         set-person-the-number
@@ -17,7 +18,7 @@ TUPLE: person the-id the-name the-number the-real ts date time blob ;
         set-person-blob
     } person construct ;
 
-: <assigned-person> ( id name number the-real -- obj )
+: <assigned-person> ( id name age real ts date time blob -- person )
     <person> [ set-person-the-id ] keep ;
 
 SYMBOL: person1
@@ -54,6 +55,12 @@ SYMBOL: person4
         }
     ] [ T{ person f } select-tuples ] unit-test
 
+    [
+        {
+            T{ person f 2 "johnny" 10 3.14 }
+        }
+    ] [ T{ person f f f 10 3.14 } select-tuples ] unit-test
+
 
     [ ] [ person1 get delete-tuple ] unit-test
     [ f ] [ T{ person f 1 } select-tuple ] unit-test
@@ -151,19 +158,18 @@ TUPLE: annotation n paste-id summary author mode contents ;
     ! [ ] [ annotation create-table ] unit-test
 ! ] with-db
 
-
 : test-sqlite ( quot -- )
     >r "tuples-test.db" resource-path sqlite-db r> with-db ;
 
 : test-postgresql ( -- )
     >r { "localhost" "postgres" "" "factor-test" } postgresql-db r> with-db ;
 
-
 [ native-person-schema test-tuples ] test-sqlite
 [ assigned-person-schema test-tuples ] test-sqlite
 
 TUPLE: serialize-me id data ;
-[
+
+: test-serialize ( -- )
     serialize-me "SERIALIZED"
     {
         { "id" "ID" +native-id+ }
@@ -175,7 +181,31 @@ TUPLE: serialize-me id data ;
     [ ] [ T{ serialize-me f f H{ { 1 2 } } } insert-tuple ] unit-test
     [
         { T{ serialize-me f 1 H{ { 1 2 } } } }
-    ] [ T{ serialize-me f 1 } select-tuples ] unit-test
-] test-sqlite
+    ] [ T{ serialize-me f 1 } select-tuples ] unit-test ;
 
-! [ make-native-person-table ] test-sqlite
+! [ test-serialize ] test-sqlite
+
+TUPLE: exam id name score ; 
+
+: test-ranges ( -- )
+    exam "EXAM"
+    {
+        { "id" "ID" +native-id+ }
+        { "name" "NAME" TEXT }
+        { "score" "SCORE" INTEGER }
+    } define-persistent
+    [ exam drop-table ] [ drop ] recover
+    [ ] [ exam create-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
+
+    [
+        T{ exam f 3 "Kenny" 60 }
+        T{ exam f 4 "Cartman" 41 }
+    ] [ T{ exam f 4 f T{ interval f { 0 t } { 70 t } } } select-tuples ] unit-test
+    ;
+
+! [ test-ranges ] test-sqlite