]> gitweb.factorcode.org Git - factor.git/commitdiff
db.tuples[{-docs,-tests}]: add reject-tuples
authorAlexander Iljin <ajsoft@yandex.ru>
Mon, 24 Dec 2018 22:54:36 +0000 (23:54 +0100)
committerDoug Coleman <doug.coleman@gmail.com>
Tue, 1 Jan 2019 20:23:40 +0000 (14:23 -0600)
basis/db/tuples/tuples-docs.factor
basis/db/tuples/tuples-tests.factor
basis/db/tuples/tuples.factor

index fecfdff3eeff042021c5cb43dce653e57986e90a..1d9d915b008b218e940d2fdbd0ea68ffa31011b7 100644 (file)
@@ -139,7 +139,18 @@ HELP: delete-tuples
 { $description "Uses the " { $snippet "tuple" } " as an exemplar object and deletes any objects that have the same slots set. If a slot is not " { $link f } ", then it is used to generate an SQL statement that deletes tuples." }
 { $warning "This word will delete your data." } ;
 
-{ insert-tuple update-tuple update-tuples delete-tuples } related-words
+HELP: reject-tuples
+{ $values
+     { "query/tuple" tuple }
+     { "quot" { $quotation ( tuple -- ? ) } } }
+{ $description "An SQL query is constructed from the slots of the exemplar tuple that are not " { $link f } ". The " { $snippet "quot" } " is applied to each tuple from the database that matches the query, and if it returns a true value, the row is deleted from the database."
+$nl
+"The word is equivalent to the following code:"
+{ $code "query/tuple select-tuples quot filter [ delete-tuples ] each" }
+"The difference is that " { $snippet "reject-tuples" } " handles query results one by one, thus avoiding the overhead of allocating the intermediate array of tuples, which " { $link select-tuples } " would do. This is important when processing large amounts of data in limited memory." }
+{ $warning "This word will delete your data." } ;
+
+{ insert-tuple update-tuple update-tuples delete-tuples reject-tuples } related-words
 
 HELP: each-tuple
 { $values
@@ -200,7 +211,10 @@ ARTICLE: "db-tuples-words" "High-level tuple/database words"
     update-tuples
 }
 "Deleting tuples:"
-{ $subsections delete-tuples }
+{ $subsections
+    delete-tuples
+    reject-tuples
+}
 "Querying tuples:"
 { $subsections
     each-tuple
index 275f47f89e78efb38bf495191fcba3607a66b6d8..90a8e0afa91ab568edbe214818de601d0dd74ad1 100644 (file)
@@ -690,6 +690,12 @@ select-me "select_me"
         ] update-tuples
         select-me new [ data>> ] collector [ each-tuple ] dip
         natural-sort
+    ] unit-test
+
+    [ { "test2" } ] [
+        select-me new [ data>> "test1" = ] reject-tuples
+        select-me new [ data>> ] collector [ each-tuple ] dip
+        natural-sort
     ] unit-test ;
 
 [ test-mapping ] test-sqlite
index 293a9b42e4f9b390f22444ec3922a3a4ff5898af..e4422eea89334a2b69d28f0d6759241bca6918d2 100644 (file)
@@ -163,3 +163,6 @@ ERROR: no-defined-persistent object ;
 
 : update-tuples ( query/tuple quot: ( tuple -- tuple'/f ) -- )
     '[ @ [ update-tuple ] when* ] each-tuple ; inline
+
+: reject-tuples ( query/tuple quot: ( tuple -- ? ) -- )
+    '[ dup @ [ delete-tuples ] [ drop ] if ] each-tuple ; inline