Add strongly-typed opt args
- Add between to CE - Return default db from calls if name is blank
This commit is contained in:
parent
7f98891ebd
commit
eab4cb80b0
@ -3,17 +3,10 @@ module RethinkDb.Driver.FSharp.RethinkBuilder
|
||||
|
||||
open RethinkDb.Driver
|
||||
open RethinkDb.Driver.Ast
|
||||
open RethinkDb.Driver.FSharp
|
||||
open RethinkDb.Driver.Net
|
||||
open System.Threading.Tasks
|
||||
|
||||
/// Options for RethinkDB indexes
|
||||
type IndexOption =
|
||||
/// Index multiple values in the given field
|
||||
| Multi
|
||||
/// Create a geospatial index
|
||||
| Geospatial
|
||||
|
||||
|
||||
/// Computation Expression builder for RethinkDB queries
|
||||
type RethinkBuilder<'T> () =
|
||||
|
||||
@ -31,6 +24,25 @@ type RethinkBuilder<'T> () =
|
||||
|
||||
member _.Yield _ = RethinkDB.R
|
||||
|
||||
// database/table identification
|
||||
|
||||
/// Specify a database for further commands
|
||||
[<CustomOperation "withDb">]
|
||||
member _.Db (expr : RethinkDB, db : string) = match db with "" -> expr.Db () | _ -> expr.Db db
|
||||
|
||||
/// Specify a table in the default database
|
||||
[<CustomOperation "withTable">]
|
||||
member _.TableInDefaultDb (expr : RethinkDB, table : string) = expr.Table table
|
||||
|
||||
/// Specify a table in a specific database
|
||||
[<CustomOperation "withTable">]
|
||||
member _.Table (db : Db, table : string) = db.Table table
|
||||
|
||||
/// Create an equality join with another table
|
||||
[<CustomOperation "eqJoin">]
|
||||
member _.EqJoin (expr : ReqlExpr, field : string, otherTable : string) =
|
||||
expr.EqJoin (field, RethinkDB.R.Table otherTable)
|
||||
|
||||
// meta queries (tables, indexes, etc.)
|
||||
|
||||
/// List all databases
|
||||
@ -46,16 +58,16 @@ type RethinkBuilder<'T> () =
|
||||
member _.TableList (r : RethinkDB) = r.TableList ()
|
||||
|
||||
/// List all tables for the specified database
|
||||
[<CustomOperation "tableListWithDb">]
|
||||
member _.TableListWithDb (r : RethinkDB, db : string) = r.Db(db).TableList ()
|
||||
[<CustomOperation "tableList">]
|
||||
member this.TableList (r : RethinkDB, db : string) = this.Db(r, db).TableList ()
|
||||
|
||||
/// Create a table in the default database
|
||||
[<CustomOperation "tableCreate">]
|
||||
member _.TableCreate (r : RethinkDB, table : string) = r.TableCreate table
|
||||
|
||||
/// Create a table in the default database
|
||||
[<CustomOperation "tableCreateWithDb">]
|
||||
member _.TableCreateWithDb (r : RethinkDB, table : string, db : string) = r.Db(db).TableCreate table
|
||||
[<CustomOperation "tableCreate">]
|
||||
member _.TableCreate (db : Db, table : string) = db.TableCreate table
|
||||
|
||||
/// List all indexes for a table
|
||||
[<CustomOperation "indexList">]
|
||||
@ -65,44 +77,35 @@ type RethinkBuilder<'T> () =
|
||||
[<CustomOperation "indexCreate">]
|
||||
member _.IndexCreate (tbl : Table, index : string) = tbl.IndexCreate index
|
||||
|
||||
/// Create an index for a table, specifying an optional argument
|
||||
[<CustomOperation "indexCreate">]
|
||||
member this.IndexCreate (tbl : Table, index : string, opts : IndexCreateOptArg list) =
|
||||
this.IndexCreate (tbl, index) |> IndexCreateOptArg.apply opts
|
||||
|
||||
/// Create an index for a table, using a function to calculate the index
|
||||
[<CustomOperation "indexCreate">]
|
||||
member _.IndexCreate (tbl : Table, index : string, f : ReqlExpr -> obj) = tbl.IndexCreate (index, ReqlFunction1 f)
|
||||
|
||||
/// Specify options for certain types of indexes
|
||||
[<CustomOperation "indexOption">]
|
||||
member _.IndexOption (idx : IndexCreate, opt : IndexOption) =
|
||||
idx.OptArg ((match opt with Multi -> "multi" | Geospatial -> "geo"), true)
|
||||
|
||||
// database/table identification
|
||||
|
||||
/// Specify a database for further commands
|
||||
[<CustomOperation "withDb">]
|
||||
member _.Db (expr : RethinkDB, db : string) = expr.Db db
|
||||
|
||||
/// Specify a table in the default database
|
||||
[<CustomOperation "withTable">]
|
||||
member _.TableInDefaultDb (expr : RethinkDB, table : string) = expr.Table table
|
||||
|
||||
/// Specify a table in a specific database
|
||||
[<CustomOperation "withTableInDb">]
|
||||
member _.Table (expr : RethinkDB, table : string, db : string) = expr.Db(db).Table table
|
||||
|
||||
/// Create an equality join with another table
|
||||
[<CustomOperation "eqJoin">]
|
||||
member _.EqJoin (expr : ReqlExpr, field : string, otherTable : string) =
|
||||
expr.EqJoin (field, RethinkDB.R.Table otherTable)
|
||||
|
||||
/// Create an index for a table, using a function to calculate the index
|
||||
[<CustomOperation "indexCreate">]
|
||||
member this.IndexCreate (tbl : Table, index : string, f : ReqlExpr -> obj, opts : IndexCreateOptArg list) =
|
||||
this.IndexCreate (tbl, index, f) |> IndexCreateOptArg.apply opts
|
||||
|
||||
// data retrieval / manipulation
|
||||
|
||||
/// Get a document from a table by its ID
|
||||
[<CustomOperation "get">]
|
||||
member _.Get (tbl : Table, key : obj) = tbl.Get key
|
||||
|
||||
/// Get all documents matching the given primary key value
|
||||
[<CustomOperation "getAll">]
|
||||
member _.GetAll (tbl : Table, keys : obj list) =
|
||||
tbl.GetAll (Array.ofList keys)
|
||||
|
||||
/// Get all documents matching the given index value
|
||||
[<CustomOperation "getAll">]
|
||||
member _.GetAll (tbl : Table, keys : obj list, index : string) =
|
||||
tbl.GetAll(Array.ofList keys).OptArg ("index", index)
|
||||
member this.GetAll (tbl : Table, keys : obj list, index : string) =
|
||||
this.GetAll(tbl, keys).OptArg ("index", index)
|
||||
|
||||
/// Skip a certain number of results
|
||||
[<CustomOperation "skip">]
|
||||
@ -120,19 +123,58 @@ type RethinkBuilder<'T> () =
|
||||
[<CustomOperation "filter">]
|
||||
member _.Filter (expr : ReqlExpr, field : string, value : obj) = expr.Filter (fieldsToMap [ field, value ])
|
||||
|
||||
/// Filter a query by a single field value, including an optional argument
|
||||
[<CustomOperation "filter">]
|
||||
member this.Filter (expr : ReqlExpr, field : string, value : obj, opt : FilterOptArg) =
|
||||
this.Filter (expr, field, value) |> FilterOptArg.apply opt
|
||||
|
||||
/// Filter a query by multiple field values
|
||||
[<CustomOperation "filter">]
|
||||
member _.Filter (expr : ReqlExpr, filter : (string * obj) list) = expr.Filter (fieldsToMap filter)
|
||||
|
||||
/// Filter a query by multiple field values, including an optional argument
|
||||
[<CustomOperation "filter">]
|
||||
member this.Filter (expr : ReqlExpr, filter : (string * obj) list, opt : FilterOptArg) =
|
||||
this.Filter (expr, filter) |> FilterOptArg.apply opt
|
||||
|
||||
/// Filter a query by a function
|
||||
[<CustomOperation "filter">]
|
||||
member _.Filter (expr : ReqlExpr, f : ReqlExpr -> obj) = expr.Filter (ReqlFunction1 f)
|
||||
|
||||
/// Filter a query by a function, including an optional argument
|
||||
[<CustomOperation "filter">]
|
||||
member this.Filter (expr : ReqlExpr, f : ReqlExpr -> obj, opt : FilterOptArg) =
|
||||
this.Filter (expr, f) |> FilterOptArg.apply opt
|
||||
|
||||
/// Filter a query by multiple functions (has the effect of ANDing them)
|
||||
[<CustomOperation "filter">]
|
||||
member _.Filter (expr : ReqlExpr, fs : (ReqlExpr -> obj) list) =
|
||||
fs |> List.fold (fun (e : ReqlExpr) f -> e.Filter (ReqlFunction1 f)) expr
|
||||
member _.Filter (expr : ReqlExpr, fs : (ReqlExpr -> obj) list) : Filter =
|
||||
(fs |> List.fold (fun (e : ReqlExpr) f -> e.Filter (ReqlFunction1 f)) expr) :?> Filter
|
||||
|
||||
/// Filter a query by multiple functions (has the effect of ANDing them), including an optional argument
|
||||
[<CustomOperation "filter">]
|
||||
member this.Filter (expr : ReqlExpr, fs : (ReqlExpr -> obj) list, opt : FilterOptArg) =
|
||||
this.Filter (expr, fs) |> FilterOptArg.apply opt
|
||||
|
||||
/// Filter a query using a JavaScript expression
|
||||
[<CustomOperation "filter">]
|
||||
member _.Filter (expr : ReqlExpr, js : string) = expr.Filter (Javascript js)
|
||||
|
||||
/// Filter a query using a JavaScript expression, including an optional argument
|
||||
[<CustomOperation "filter">]
|
||||
member this.Filter (expr : ReqlExpr, js : string, opt : FilterOptArg) =
|
||||
this.Filter (expr, js) |> FilterOptArg.apply opt
|
||||
|
||||
/// Filter a query by a range of values
|
||||
[<CustomOperation "between">]
|
||||
member _.Between (expr : ReqlExpr, lower : obj, upper : obj) =
|
||||
expr.Between (lower, upper)
|
||||
|
||||
/// Filter a query by a range of values, using optional arguments
|
||||
[<CustomOperation "between">]
|
||||
member this.Between (expr : ReqlExpr, lower : obj, upper : obj, opts : BetweenOptArg list) =
|
||||
this.Between (expr, lower, upper) |> BetweenOptArg.apply opts
|
||||
|
||||
/// Map fields for the current query
|
||||
[<CustomOperation "map">]
|
||||
member _.Map (expr : ReqlExpr, f : ReqlExpr -> obj) = expr.Map (ReqlFunction1 f)
|
||||
@ -169,18 +211,38 @@ type RethinkBuilder<'T> () =
|
||||
[<CustomOperation "insert">]
|
||||
member _.Insert (tbl : Table, doc : obj) = tbl.Insert doc
|
||||
|
||||
/// Insert a document into the given table, using optional arguments
|
||||
[<CustomOperation "insert">]
|
||||
member this.Insert (tbl : Table, doc : obj, opts : InsertOptArg list) =
|
||||
this.Insert (tbl, doc) |> InsertOptArg.apply opts
|
||||
|
||||
/// Update specific fields in a document
|
||||
[<CustomOperation "update">]
|
||||
member _.Update (expr : ReqlExpr, fields : (string * obj) list) = expr.Update (fieldsToMap fields)
|
||||
|
||||
/// Update specific fields in a document, using optional arguments
|
||||
[<CustomOperation "update">]
|
||||
member this.Update (expr : ReqlExpr, fields : (string * obj) list, args : UpdateOptArg list) =
|
||||
this.Update (expr, fields) |> UpdateOptArg.apply args
|
||||
|
||||
/// Replace the current query with the specified document
|
||||
[<CustomOperation "replace">]
|
||||
member _.Replace (expr : ReqlExpr, doc : obj) = expr.Replace doc
|
||||
|
||||
/// Replace the current query with the specified document, using optional arguments
|
||||
[<CustomOperation "replace">]
|
||||
member this.Replace (expr : ReqlExpr, doc : obj, args : ReplaceOptArg list) =
|
||||
this.Replace (expr, doc) |> ReplaceOptArg.apply args
|
||||
|
||||
/// Delete the document(s) identified by the current query
|
||||
[<CustomOperation "delete">]
|
||||
member _.Delete (expr : ReqlExpr) = expr.Delete ()
|
||||
|
||||
/// Delete the document(s) identified by the current query
|
||||
[<CustomOperation "delete">]
|
||||
member this.Delete (expr : ReqlExpr, opts : DeleteOptArg list) =
|
||||
this.Delete expr |> DeleteOptArg.apply opts
|
||||
|
||||
// executing queries
|
||||
|
||||
/// Execute the query, returning the result of the type specified
|
||||
|
@ -47,13 +47,12 @@ let between (lowerKey : obj) (upperKey : obj) (expr : ReqlExpr) =
|
||||
expr.Between (lowerKey, upperKey)
|
||||
|
||||
/// Get document between a lower bound and an upper bound, specifying one or more optional arguments
|
||||
let betweenWithOptArgs (lowerKey : obj) (upperKey : obj) (args : (string * obj) seq) (expr : ReqlExpr) =
|
||||
args
|
||||
|> Seq.fold (fun (btw : Between) arg -> btw.OptArg (fst arg, snd arg)) (between lowerKey upperKey expr)
|
||||
let betweenWithOptArgs (lowerKey : obj) (upperKey : obj) args expr =
|
||||
between lowerKey upperKey expr |> BetweenOptArg.apply args
|
||||
|
||||
/// Get documents between a lower bound and an upper bound based on an index
|
||||
let betweenIndex (lowerKey : obj) (upperKey : obj) (index : string) (expr : ReqlExpr) =
|
||||
betweenWithOptArgs lowerKey upperKey [ "index", index ] expr
|
||||
let betweenIndex (lowerKey : obj) (upperKey : obj) index expr =
|
||||
betweenWithOptArgs lowerKey upperKey [ Index index ] expr
|
||||
|
||||
/// Get a connection builder that can be used to create one RethinkDB connection
|
||||
let connection () =
|
||||
@ -61,7 +60,7 @@ let connection () =
|
||||
|
||||
/// Reference a database
|
||||
let db dbName =
|
||||
r.Db dbName
|
||||
match dbName with "" -> r.Db () | _ -> r.Db dbName
|
||||
|
||||
/// Create a database
|
||||
let dbCreate (dbName : string) =
|
||||
@ -80,8 +79,8 @@ let delete (expr : ReqlExpr) =
|
||||
expr.Delete ()
|
||||
|
||||
/// Delete documents, providing optional arguments
|
||||
let deleteWithOptArgs (args : (string * obj) seq) expr =
|
||||
args |> Seq.fold (fun (del : Delete) arg -> del.OptArg (fst arg, snd arg)) (delete expr)
|
||||
let deleteWithOptArgs args (expr : ReqlExpr) =
|
||||
delete expr |> DeleteOptArg.apply args
|
||||
|
||||
/// EqJoin the left field on the right-hand table using its primary key
|
||||
let eqJoin (field : string) (table : Table) (expr : ReqlExpr) =
|
||||
@ -111,50 +110,66 @@ let eqJoinJSIndex js table (indexName : string) expr =
|
||||
let filter (filterSpec : obj) (expr : ReqlExpr) =
|
||||
expr.Filter filterSpec
|
||||
|
||||
/// Apply optional arguments to a filter
|
||||
let private optArgsFilter (args : (string * obj) seq) filter =
|
||||
args |> Seq.fold (fun (fil : Filter) arg -> fil.OptArg (fst arg, snd arg)) filter
|
||||
/// Apply optional argument to a filter
|
||||
let private optArgFilter arg (filter : Filter) =
|
||||
filter.OptArg (match arg with Default d -> d.reql)
|
||||
|
||||
/// Filter documents, providing optional arguments
|
||||
let filterWithOptArgs (filterSpec : obj) args expr =
|
||||
filter filterSpec expr |> optArgsFilter args
|
||||
let filterWithOptArgs (filterSpec : obj) arg expr =
|
||||
filter filterSpec expr |> optArgFilter arg
|
||||
|
||||
/// Filter documents using a function
|
||||
let filterFunc<'T> (f : ReqlExpr -> 'T) (expr : ReqlExpr) =
|
||||
expr.Filter (ReqlFunction1 (fun row -> f row :> obj))
|
||||
|
||||
/// Filter documents using a function, providing optional arguments
|
||||
let filterFuncWithOptArgs<'T> (f : ReqlExpr -> 'T) args expr =
|
||||
filterFunc f expr |> optArgsFilter args
|
||||
let filterFuncWithOptArgs<'T> (f : ReqlExpr -> 'T) arg expr =
|
||||
filterFunc f expr |> optArgFilter arg
|
||||
|
||||
/// Filter documents using JavaScript
|
||||
let filterJS js (expr : ReqlExpr) =
|
||||
expr.Filter (toJS js)
|
||||
|
||||
/// Filter documents using JavaScript, providing optional arguments
|
||||
let filterJSWithOptArgs js args expr =
|
||||
filterJS js expr |> optArgsFilter args
|
||||
let filterJSWithOptArgs js arg expr =
|
||||
filterJS js expr |> optArgFilter arg
|
||||
|
||||
/// Get a document by its primary key
|
||||
let get (documentId : obj) (table : Table) =
|
||||
table.Get documentId
|
||||
|
||||
/// Get all documents matching primary keys
|
||||
let getAll (ids : obj seq) (table : Table) =
|
||||
table.GetAll (Array.ofSeq ids)
|
||||
|
||||
/// Get all documents matching keys in the given index
|
||||
let getAll (ids : obj seq) (indexName : string) (table : Table) =
|
||||
table.GetAll(Array.ofSeq ids).OptArg ("index", indexName)
|
||||
let getAllWithIndex (ids : obj seq) (indexName : string) table =
|
||||
(getAll ids table).OptArg ("index", indexName)
|
||||
|
||||
/// Create an index on the given table
|
||||
let indexCreate (indexName : string) (table : Table) =
|
||||
table.IndexCreate indexName
|
||||
|
||||
/// Create an index on the given table, including optional arguments
|
||||
let indexCreateWithOptArgs (indexName : string) args (table : Table) =
|
||||
indexCreate indexName table |> IndexCreateOptArg.apply args
|
||||
|
||||
/// Create an index on the given table using a function
|
||||
let indexCreateFunc<'T> (indexName : string) (f : ReqlExpr -> 'T) (table : Table) =
|
||||
table.IndexCreate (indexName, ReqlFunction1 (fun row -> f row :> obj))
|
||||
|
||||
/// Create an index on the given table using a function, including optional arguments
|
||||
let indexCreateFuncWithOptArgs<'T> indexName (f : ReqlExpr -> 'T) args table =
|
||||
indexCreateFunc indexName f table |> IndexCreateOptArg.apply args
|
||||
|
||||
/// Create an index on the given table using JavaScript
|
||||
let indexCreateJS (indexName : string) js (table : Table) =
|
||||
table.IndexCreate (indexName, toJS js)
|
||||
|
||||
/// Create an index on the given table using JavaScript, including optional arguments
|
||||
let indexCreateJSWithOptArgs indexName js args table =
|
||||
indexCreateJS indexName js table |> IndexCreateOptArg.apply args
|
||||
|
||||
/// Drop an index
|
||||
let indexDrop (indexName : string) (table : Table) =
|
||||
table.IndexDrop indexName
|
||||
@ -179,10 +194,6 @@ let innerJoinFunc<'T> (otherSeq : obj) (f : ReqlExpr -> ReqlExpr -> 'T) (expr :
|
||||
let innerJoinJS (otherSeq : obj) js (expr : ReqlExpr) =
|
||||
expr.InnerJoin (otherSeq, toJS js)
|
||||
|
||||
/// Apply optional arguments to an insert
|
||||
let private optArgsInsert (args : (string * obj) seq) ins =
|
||||
args |> Seq.fold (fun (ins : Insert) arg -> ins.OptArg (fst arg, snd arg)) ins
|
||||
|
||||
/// Insert a single document (use insertMany for multiple)
|
||||
let insert<'T> (doc : 'T) (table : Table) =
|
||||
table.Insert doc
|
||||
@ -193,11 +204,11 @@ let insertMany<'T> (docs : 'T seq) (table : Table) =
|
||||
|
||||
/// Insert a single document, providing optional arguments (use insertManyWithOptArgs for multiple)
|
||||
let insertWithOptArgs<'T> (doc : 'T) args table =
|
||||
insert doc table |> optArgsInsert args
|
||||
insert doc table |> InsertOptArg.apply args
|
||||
|
||||
/// Insert multiple documents, providing optional arguments
|
||||
let insertManyWithOptArgs<'T> (docs : 'T seq) args table =
|
||||
insertMany docs table |> optArgsInsert args
|
||||
insertMany docs table |> InsertOptArg.apply args
|
||||
|
||||
/// Test whether a sequence is empty
|
||||
let isEmpty (expr : ReqlExpr) =
|
||||
@ -223,17 +234,13 @@ let outerJoinJS (otherSeq : obj) js (expr : ReqlExpr) =
|
||||
let pluck (fields : string seq) (expr : ReqlExpr) =
|
||||
expr.Pluck (Array.ofSeq fields)
|
||||
|
||||
/// Apply optional arguments to a replace
|
||||
let private optArgsReplace (args : (string * obj) seq) repl =
|
||||
args |> Seq.fold (fun (rep : Replace) arg -> rep.OptArg (fst arg, snd arg)) repl
|
||||
|
||||
/// Replace documents
|
||||
let replace<'T> (replaceSpec : 'T) (expr : ReqlExpr) =
|
||||
expr.Replace replaceSpec
|
||||
|
||||
/// Replace documents, providing optional arguments
|
||||
let replaceWithOptArgs<'T> (replaceSpec : 'T) args expr =
|
||||
replace replaceSpec expr |> optArgsReplace args
|
||||
replace replaceSpec expr |> ReplaceOptArg.apply args
|
||||
|
||||
/// Replace documents using a function
|
||||
let replaceFunc<'T> (f : ReqlExpr -> 'T) (expr : ReqlExpr) =
|
||||
@ -241,7 +248,7 @@ let replaceFunc<'T> (f : ReqlExpr -> 'T) (expr : ReqlExpr) =
|
||||
|
||||
/// Replace documents using a function, providing optional arguments
|
||||
let replaceFuncWithOptArgs<'T> (f : ReqlExpr -> 'T) args expr =
|
||||
replaceFunc f expr |> optArgsReplace args
|
||||
replaceFunc f expr |> ReplaceOptArg.apply args
|
||||
|
||||
/// Replace documents using JavaScript
|
||||
let replaceJS js (expr : ReqlExpr) =
|
||||
@ -249,7 +256,7 @@ let replaceJS js (expr : ReqlExpr) =
|
||||
|
||||
/// Replace documents using JavaScript, providing optional arguments
|
||||
let replaceJSWithOptArgs js args expr =
|
||||
replaceJS js expr |> optArgsReplace args
|
||||
replaceJS js expr |> ReplaceOptArg.apply args
|
||||
|
||||
/// Skip a number of elements from the head of a sequence
|
||||
let skip n (expr : ReqlExpr) =
|
||||
@ -291,17 +298,13 @@ let tableList (db : Db) =
|
||||
let tableListFromDefault () =
|
||||
r.TableList ()
|
||||
|
||||
/// Apply optional arguments to an update
|
||||
let private optArgsUpdate (args : (string * obj) seq) upd =
|
||||
args |> Seq.fold (fun (upd : Update) arg -> upd.OptArg (fst arg, snd arg)) upd
|
||||
|
||||
/// Update documents
|
||||
let update<'T> (updateSpec : 'T) (expr : ReqlExpr) =
|
||||
expr.Update updateSpec
|
||||
|
||||
/// Update documents, providing optional arguments
|
||||
let updateWithOptArgs<'T> (updateSpec : 'T) args expr =
|
||||
update updateSpec expr |> optArgsUpdate args
|
||||
update updateSpec expr |> UpdateOptArg.apply args
|
||||
|
||||
/// Update documents using a function
|
||||
let updateFunc<'T> (f : ReqlExpr -> 'T) (expr : ReqlExpr) =
|
||||
@ -309,7 +312,7 @@ let updateFunc<'T> (f : ReqlExpr -> 'T) (expr : ReqlExpr) =
|
||||
|
||||
/// Update documents using a function, providing optional arguments
|
||||
let updateFuncWithOptArgs<'T> (f : ReqlExpr -> 'T) args expr =
|
||||
updateFunc f expr |> optArgsUpdate args
|
||||
updateFunc f expr |> UpdateOptArg.apply args
|
||||
|
||||
/// Update documents using JavaScript
|
||||
let updateJS js (expr : ReqlExpr) =
|
||||
@ -317,7 +320,7 @@ let updateJS js (expr : ReqlExpr) =
|
||||
|
||||
/// Update documents using JavaScript, providing optional arguments
|
||||
let updateJSWithOptArgs js args expr =
|
||||
updateJS js expr |> optArgsUpdate args
|
||||
updateJS js expr |> UpdateOptArg.apply args
|
||||
|
||||
/// Exclude fields from the result
|
||||
let without (columns : string seq) (expr : ReqlExpr) =
|
||||
|
228
src/RethinkDb.Driver.FSharp/OptArgs.fs
Normal file
228
src/RethinkDb.Driver.FSharp/OptArgs.fs
Normal file
@ -0,0 +1,228 @@
|
||||
namespace RethinkDb.Driver.FSharp
|
||||
|
||||
open RethinkDb.Driver
|
||||
open RethinkDb.Driver.Ast
|
||||
|
||||
|
||||
/// Delineates the type of bound when specifying bounded value ranges
|
||||
type BoundType =
|
||||
/// The bound includes the bounded value
|
||||
| Open
|
||||
/// The bound excludes the bounded value
|
||||
| Closed
|
||||
|
||||
/// The string representation of this bound used in the ReQL query
|
||||
member this.reql = match this with Open -> "open" | Closed -> "closed"
|
||||
|
||||
|
||||
/// Optional arguments for the `between` statement
|
||||
type BetweenOptArg =
|
||||
/// Use the specified index
|
||||
| Index of string
|
||||
/// The lower bound type
|
||||
| LowerBound of BoundType
|
||||
/// The upper bound type
|
||||
| UpperBound of BoundType
|
||||
|
||||
/// Function to support `between` optional arguments
|
||||
module BetweenOptArg =
|
||||
|
||||
/// Apply a list of optional arguments to a between statement
|
||||
let apply opts (b : Between) =
|
||||
opts
|
||||
|> List.fold (fun (btw : Between) arg ->
|
||||
match arg with
|
||||
| Index idx -> btw.OptArg ("index", idx)
|
||||
| LowerBound typ -> btw.OptArg ("lower_bound", typ.reql)
|
||||
| UpperBound typ -> btw.OptArg ("upper_bound", typ.reql))
|
||||
b
|
||||
|
||||
|
||||
/// The durability of a write command
|
||||
type Durability =
|
||||
/// Wait for write acknowledgement before returning
|
||||
| Hard
|
||||
/// Return before the write has been completely acknowledged
|
||||
| Soft
|
||||
|
||||
/// The ReQL value of this argument
|
||||
member this.reql = "durability", match this with Hard -> "hard" | Soft -> "soft"
|
||||
|
||||
|
||||
/// Whether changes should be returned
|
||||
type ReturnChanges =
|
||||
/// Return all documents considered for change ("always")
|
||||
| All
|
||||
/// Return changes
|
||||
| Changed
|
||||
/// Do not return changes
|
||||
| Nothing
|
||||
|
||||
/// The ReQL value of this argument
|
||||
member this.reql = "return_changes", match this with All -> "always" :> obj | Changed -> true | Nothing -> false
|
||||
|
||||
|
||||
/// Optional arguments for the `delete` statement
|
||||
type DeleteOptArg =
|
||||
/// The durability of the command
|
||||
| Durability of Durability
|
||||
/// Whether changes should be returned
|
||||
| ReturnChanges of ReturnChanges
|
||||
/// Whether write hooks should be ignored (assuming the user has the permission to ignore hooks)
|
||||
| IgnoreWriteHook of bool
|
||||
|
||||
/// Function to support `delete` optional arguments
|
||||
module DeleteOptArg =
|
||||
|
||||
/// Apply a list of optional arguments to a delete statement
|
||||
let apply opts (d : Delete) =
|
||||
opts
|
||||
|> List.fold (fun (del : Delete) arg ->
|
||||
match arg with
|
||||
| Durability dur -> del.OptArg dur.reql
|
||||
| ReturnChanges chg -> del.OptArg chg.reql
|
||||
| IgnoreWriteHook ign -> del.OptArg ("ignore_write_hook", ign))
|
||||
d
|
||||
|
||||
|
||||
/// How a filter command should handle filtering on a field that does not exist
|
||||
type FilterDefaultHandling =
|
||||
/// Return documents where the filtered field is missing
|
||||
| Return
|
||||
/// Skip documents where the filtered field is missing
|
||||
| Skip
|
||||
/// Raise an error if the filtered field is missing from a document
|
||||
| Error
|
||||
|
||||
/// The ReQL value for this default handling
|
||||
member this.reql = "default", match this with Return -> true :> obj | Skip -> false | Error -> RethinkDB.R.Error ()
|
||||
|
||||
|
||||
/// Optional arguments for the `filter` statement
|
||||
type FilterOptArg =
|
||||
| Default of FilterDefaultHandling
|
||||
|
||||
/// Function to support `filter` optional arguments
|
||||
module FilterOptArg =
|
||||
|
||||
/// Apply an option argument to the filter statement
|
||||
let apply arg (f : Filter) =
|
||||
match arg with Default d -> f.OptArg d.reql
|
||||
|
||||
|
||||
/// Optional arguments for the `indexCreate` statement
|
||||
type IndexCreateOptArg =
|
||||
/// Index multiple values in the given field
|
||||
| Multi
|
||||
/// Create a geospatial index
|
||||
| Geospatial
|
||||
|
||||
/// The parameter for the ReQL OptArg call
|
||||
member this.reql = (match this with Multi -> "multi" | Geospatial -> "geo"), true
|
||||
|
||||
/// Function to support `indexCreate` optional arguments
|
||||
module IndexCreateOptArg =
|
||||
|
||||
/// Apply a list of optional arguments to an indexCreate statement
|
||||
let apply (opts : IndexCreateOptArg list) (ic : IndexCreate) =
|
||||
opts |> List.fold (fun (idxC : IndexCreate) arg -> idxC.OptArg arg.reql) ic
|
||||
|
||||
|
||||
/// How to handle an insert conflict
|
||||
type Conflict =
|
||||
/// Return an error
|
||||
| Error
|
||||
/// Replace the existing document with the current one
|
||||
| Replace
|
||||
/// Update fields in the existing document with fields from the current one
|
||||
| Update
|
||||
/// Use a function to resolve conflicts
|
||||
| Resolve of (ReqlExpr -> ReqlExpr -> ReqlExpr -> obj)
|
||||
|
||||
/// The ReQL for the conflict parameter
|
||||
member this.reql =
|
||||
let value : obj =
|
||||
match this with
|
||||
| Error -> "error"
|
||||
| Replace -> "replace"
|
||||
| Update -> "update"
|
||||
| Resolve f -> ReqlFunction3 f :> obj
|
||||
"conflict", value
|
||||
|
||||
/// Optional arguments for the `insert` statement
|
||||
type InsertOptArg =
|
||||
/// The durability of the command
|
||||
| Durability of Durability
|
||||
/// Whether changes should be returned
|
||||
| ReturnChanges of ReturnChanges
|
||||
/// How to handle conflicts
|
||||
| OnConflict of Conflict
|
||||
/// Whether write hooks should be ignored (assuming the user has the permission to ignore hooks)
|
||||
| IgnoreWriteHook of bool
|
||||
|
||||
/// Function to support `insert` optional arguments
|
||||
module InsertOptArg =
|
||||
|
||||
/// Apply a list of optional arguments to an insert statement
|
||||
let apply (opts : InsertOptArg list) (i : Insert) =
|
||||
opts
|
||||
|> List.fold (fun (ins : Insert) arg ->
|
||||
match arg with
|
||||
| Durability dur -> ins.OptArg dur.reql
|
||||
| ReturnChanges chg -> ins.OptArg chg.reql
|
||||
| OnConflict con -> ins.OptArg con.reql
|
||||
| IgnoreWriteHook ign -> ins.OptArg ("ignore_write_hook", ign))
|
||||
i
|
||||
|
||||
|
||||
/// Optional arguments for the `replace` statement
|
||||
type ReplaceOptArg =
|
||||
/// The durability of the command
|
||||
| Durability of Durability
|
||||
/// Whether changes should be returned
|
||||
| ReturnChanges of ReturnChanges
|
||||
/// Allow the command to succeed if it is non-deterministic
|
||||
| NonAtomic of bool
|
||||
/// Whether write hooks should be ignored (assuming the user has the permission to ignore hooks)
|
||||
| IgnoreWriteHook of bool
|
||||
|
||||
/// Function to support `replace` optional arguments
|
||||
module ReplaceOptArg =
|
||||
|
||||
/// Apply a list of optional arguments to a replace statement
|
||||
let apply opts (r : Replace) =
|
||||
opts
|
||||
|> List.fold (fun (rep : Replace) arg ->
|
||||
match arg with
|
||||
| Durability dur -> rep.OptArg dur.reql
|
||||
| ReturnChanges chg -> rep.OptArg chg.reql
|
||||
| NonAtomic non -> rep.OptArg ("non_atomic", non)
|
||||
| IgnoreWriteHook ign -> rep.OptArg ("ignore_write_hook", ign))
|
||||
r
|
||||
|
||||
|
||||
/// Optional arguments for the `update` statement
|
||||
type UpdateOptArg =
|
||||
/// The durability of the command
|
||||
| Durability of Durability
|
||||
/// Whether changes should be returned
|
||||
| ReturnChanges of ReturnChanges
|
||||
/// Allow the command to succeed if it is non-deterministic
|
||||
| NonAtomic of bool
|
||||
/// Whether write hooks should be ignored (assuming the user has the permission to ignore hooks)
|
||||
| IgnoreWriteHook of bool
|
||||
|
||||
/// Function to support `update` optional arguments
|
||||
module UpdateOptArg =
|
||||
|
||||
/// Apply a list of optional arguments to an update statement
|
||||
let apply opts (u : Update) =
|
||||
opts
|
||||
|> List.fold (fun (upd : Update) arg ->
|
||||
match arg with
|
||||
| Durability dur -> upd.OptArg dur.reql
|
||||
| ReturnChanges chg -> upd.OptArg chg.reql
|
||||
| NonAtomic non -> upd.OptArg ("non_atomic", non)
|
||||
| IgnoreWriteHook ign -> upd.OptArg ("ignore_write_hook", ign))
|
||||
u
|
||||
|
@ -12,11 +12,12 @@
|
||||
<Copyright>See LICENSE</Copyright>
|
||||
<PackageTags>RethinkDB document F#</PackageTags>
|
||||
<VersionPrefix>0.8.0</VersionPrefix>
|
||||
<VersionSuffix>alpha-0001</VersionSuffix>
|
||||
<VersionSuffix>alpha-0002</VersionSuffix>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="Retry.fs" />
|
||||
<Compile Include="OptArgs.fs" />
|
||||
<Compile Include="Builder.fs" />
|
||||
<Compile Include="Functions.fs" />
|
||||
<Compile Include="Config.fs" />
|
||||
|
Loading…
Reference in New Issue
Block a user