WIP on Postgres type derivation
This commit is contained in:
		
							parent
							
								
									74e5b77edb
								
							
						
					
					
						commit
						e0fb793ec9
					
				@ -56,8 +56,21 @@ module Parameters =
 | 
			
		||||
    /// Create an ID parameter (name "@id", key will be treated as a string)
 | 
			
		||||
    [<CompiledName "Id">]
 | 
			
		||||
    let idParam (key: 'TKey) =
 | 
			
		||||
        // TODO: bind key by numeric types
 | 
			
		||||
        "@id", Sql.string (string key)
 | 
			
		||||
        match box key with
 | 
			
		||||
        | :? int8 as it -> Sql.int8 it
 | 
			
		||||
        | :? uint8 as it -> Sql.int8 (int8 it)
 | 
			
		||||
        | :? int16 as it -> Sql.int16 it
 | 
			
		||||
        | :? uint16 as it -> Sql.int16 (int16 it)
 | 
			
		||||
        | :? int as it -> Sql.int it
 | 
			
		||||
        | :? uint32 as it -> Sql.int (int it)
 | 
			
		||||
        | :? int64 as it -> Sql.int64 it
 | 
			
		||||
        | :? uint64 as it -> Sql.int64 (int64 it)
 | 
			
		||||
        | :? decimal as it -> Sql.decimal it
 | 
			
		||||
        | :? single as it -> Sql.double (double it)
 | 
			
		||||
        | :? double as it -> Sql.double it
 | 
			
		||||
        | :? string as it -> Sql.string it
 | 
			
		||||
        | _ -> Sql.string (string key)
 | 
			
		||||
        |> function it -> "@id", it
 | 
			
		||||
 | 
			
		||||
    /// Create a parameter with a JSON value
 | 
			
		||||
    [<CompiledName "Json">]
 | 
			
		||||
@ -135,12 +148,6 @@ module Query =
 | 
			
		||||
            | _ -> $"{it.Path PostgreSQL} {it.Op} {name.Derive it.ParameterName}")
 | 
			
		||||
        |> String.concat (match howMatched with Any -> " OR " | All -> " AND ")
 | 
			
		||||
 | 
			
		||||
    /// Create a WHERE clause fragment to implement a comparison on a field in a JSON document
 | 
			
		||||
    [<CompiledName "WhereByField">]
 | 
			
		||||
    [<System.Obsolete "Use WhereByFields instead; will be removed in v4">]
 | 
			
		||||
    let whereByField field paramName =
 | 
			
		||||
        whereByFields Any [ { field with ParameterName = Some paramName } ]
 | 
			
		||||
    
 | 
			
		||||
    /// Create a WHERE clause fragment to implement an ID-based query
 | 
			
		||||
    [<CompiledName "WhereById">]
 | 
			
		||||
    let whereById paramName =
 | 
			
		||||
 | 
			
		||||
@ -45,12 +45,6 @@ module Query =
 | 
			
		||||
            | _ -> $"{it.Path SQLite} {it.Op} {name.Derive it.ParameterName}")
 | 
			
		||||
        |> String.concat (match howMatched with Any -> " OR " | All -> " AND ")
 | 
			
		||||
 | 
			
		||||
    /// Create a WHERE clause fragment to implement a comparison on a field in a JSON document
 | 
			
		||||
    [<CompiledName "WhereByField">]
 | 
			
		||||
    [<System.Obsolete "Use WhereByFields instead; will be removed in v4">]
 | 
			
		||||
    let whereByField field paramName =
 | 
			
		||||
        whereByFields Any [ { field with ParameterName = Some paramName } ]
 | 
			
		||||
    
 | 
			
		||||
    /// Create a WHERE clause fragment to implement an ID-based query
 | 
			
		||||
    [<CompiledName "WhereById">]
 | 
			
		||||
    let whereById paramName =
 | 
			
		||||
 | 
			
		||||
@ -217,31 +217,6 @@ public static class PostgresCSharpTests
 | 
			
		||||
                        "WHERE clause not correct");
 | 
			
		||||
                })
 | 
			
		||||
            ]),
 | 
			
		||||
#pragma warning disable CS0618
 | 
			
		||||
            TestList("WhereByField",
 | 
			
		||||
            [
 | 
			
		||||
                TestCase("succeeds when a logical operator is passed", () =>
 | 
			
		||||
                {
 | 
			
		||||
                    Expect.equal(Postgres.Query.WhereByField(Field.GT("theField", 0), "@test"),
 | 
			
		||||
                        "data->>'theField' > @test", "WHERE clause not correct");
 | 
			
		||||
                }),
 | 
			
		||||
                TestCase("succeeds when an existence operator is passed", () =>
 | 
			
		||||
                {
 | 
			
		||||
                    Expect.equal(Postgres.Query.WhereByField(Field.NEX("thatField"), ""), "data->>'thatField' IS NULL",
 | 
			
		||||
                        "WHERE clause not correct");
 | 
			
		||||
                }),
 | 
			
		||||
                TestCase("succeeds when a between operator is passed with numeric values", () =>
 | 
			
		||||
                {
 | 
			
		||||
                    Expect.equal(Postgres.Query.WhereByField(Field.BT("aField", 50, 99), "@range"),
 | 
			
		||||
                        "(data->>'aField')::numeric BETWEEN @rangemin AND @rangemax", "WHERE clause not correct");
 | 
			
		||||
                }),
 | 
			
		||||
                TestCase("succeeds when a between operator is passed with non-numeric values", () =>
 | 
			
		||||
                {
 | 
			
		||||
                    Expect.equal(Postgres.Query.WhereByField(Field.BT("field0", "a", "b"), "@alpha"),
 | 
			
		||||
                        "data->>'field0' BETWEEN @alphamin AND @alphamax", "WHERE clause not correct");
 | 
			
		||||
                })
 | 
			
		||||
            ]),
 | 
			
		||||
#pragma warning restore CS0618
 | 
			
		||||
            TestCase("WhereById succeeds", () =>
 | 
			
		||||
            {
 | 
			
		||||
                Expect.equal(Postgres.Query.WhereById("@id"), "data->>'Id' = @id", "WHERE clause not correct");
 | 
			
		||||
 | 
			
		||||
@ -63,26 +63,6 @@ public static class SqliteCSharpTests
 | 
			
		||||
                        "WHERE clause not correct");
 | 
			
		||||
                })
 | 
			
		||||
            ]),
 | 
			
		||||
#pragma warning disable CS0618
 | 
			
		||||
            TestList("WhereByField",
 | 
			
		||||
            [
 | 
			
		||||
                TestCase("succeeds when a logical operator is passed", () =>
 | 
			
		||||
                {
 | 
			
		||||
                    Expect.equal(Sqlite.Query.WhereByField(Field.GT("theField", 0), "@test"),
 | 
			
		||||
                        "data->>'theField' > @test", "WHERE clause not correct");
 | 
			
		||||
                }),
 | 
			
		||||
                TestCase("succeeds when an existence operator is passed", () =>
 | 
			
		||||
                {
 | 
			
		||||
                    Expect.equal(Sqlite.Query.WhereByField(Field.NEX("thatField"), ""), "data->>'thatField' IS NULL",
 | 
			
		||||
                        "WHERE clause not correct");
 | 
			
		||||
                }),
 | 
			
		||||
                TestCase("succeeds when the between operator is passed", () =>
 | 
			
		||||
                {
 | 
			
		||||
                    Expect.equal(Sqlite.Query.WhereByField(Field.BT("aField", 50, 99), "@range"),
 | 
			
		||||
                        "data->>'aField' BETWEEN @rangemin AND @rangemax", "WHERE clause not correct");
 | 
			
		||||
                })
 | 
			
		||||
            ]),
 | 
			
		||||
#pragma warning restore CS0618
 | 
			
		||||
            TestCase("WhereById succeeds", () =>
 | 
			
		||||
            {
 | 
			
		||||
                Expect.equal(Sqlite.Query.WhereById("@id"), "data->>'Id' = @id", "WHERE clause not correct");
 | 
			
		||||
 | 
			
		||||
@ -196,32 +196,6 @@ let unitTests =
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
            testList "whereByField" [
 | 
			
		||||
                test "succeeds when a logical operator is passed" {
 | 
			
		||||
                    Expect.equal
 | 
			
		||||
                        (Query.whereByField (Field.GT "theField" 0) "@test")
 | 
			
		||||
                        "data->>'theField' > @test"
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
                test "succeeds when an existence operator is passed" {
 | 
			
		||||
                    Expect.equal
 | 
			
		||||
                        (Query.whereByField (Field.NEX "thatField") "")
 | 
			
		||||
                        "data->>'thatField' IS NULL"
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
                test "succeeds when a between operator is passed with numeric values" {
 | 
			
		||||
                    Expect.equal
 | 
			
		||||
                        (Query.whereByField (Field.BT "aField" 50 99) "@range")
 | 
			
		||||
                        "(data->>'aField')::numeric BETWEEN @rangemin AND @rangemax"
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
                test "succeeds when a between operator is passed with non-numeric values" {
 | 
			
		||||
                    Expect.equal
 | 
			
		||||
                        (Query.whereByField (Field.BT "field0" "a" "b") "@alpha")
 | 
			
		||||
                        "data->>'field0' BETWEEN @alphamin AND @alphamax"
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
            test "whereById succeeds" {
 | 
			
		||||
                Expect.equal (Query.whereById "@id") "data->>'Id' = @id" "WHERE clause not correct"
 | 
			
		||||
            }
 | 
			
		||||
@ -466,7 +440,7 @@ let integrationTests =
 | 
			
		||||
                let! theCount = Count.all PostgresDb.TableName
 | 
			
		||||
                Expect.equal theCount 5 "There should have been 5 matching documents"
 | 
			
		||||
            }
 | 
			
		||||
            ptestList "byFields" [
 | 
			
		||||
            testList "byFields" [
 | 
			
		||||
                testTask "succeeds when items are found" {
 | 
			
		||||
                    use db = PostgresDb.BuildDb()
 | 
			
		||||
                    do! loadDocs ()
 | 
			
		||||
@ -531,7 +505,7 @@ let integrationTests =
 | 
			
		||||
                    Expect.isFalse exists "There should not have been an existing document"
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
            testList "byFields" [
 | 
			
		||||
            ftestList "byFields" [
 | 
			
		||||
                testTask "succeeds when documents exist" {
 | 
			
		||||
                    use db = PostgresDb.BuildDb()
 | 
			
		||||
                    do! loadDocs ()
 | 
			
		||||
@ -647,7 +621,7 @@ let integrationTests =
 | 
			
		||||
                            PostgresDb.TableName All [ Field.EQ "Value" "purple"; Field.EX "Sub" ]
 | 
			
		||||
                    Expect.equal (List.length docs) 1 "There should have been one document returned"
 | 
			
		||||
                }
 | 
			
		||||
                ptestTask "succeeds when documents are not found" {
 | 
			
		||||
                ftestTask "succeeds when documents are not found" {
 | 
			
		||||
                    use db = PostgresDb.BuildDb()
 | 
			
		||||
                    do! loadDocs ()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -52,26 +52,6 @@ let unitTests =
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
            testList "whereByField" [
 | 
			
		||||
                test "succeeds when a logical operator is passed" {
 | 
			
		||||
                    Expect.equal
 | 
			
		||||
                        (Query.whereByField (Field.GT "theField" 0) "@test")
 | 
			
		||||
                        "data->>'theField' > @test"
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
                test "succeeds when an existence operator is passed" {
 | 
			
		||||
                    Expect.equal
 | 
			
		||||
                        (Query.whereByField (Field.NEX "thatField") "")
 | 
			
		||||
                        "data->>'thatField' IS NULL"
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
                test "succeeds when the between operator is passed" {
 | 
			
		||||
                    Expect.equal
 | 
			
		||||
                        (Query.whereByField (Field.BT "aField" 50 99) "@range")
 | 
			
		||||
                        "data->>'aField' BETWEEN @rangemin AND @rangemax"
 | 
			
		||||
                        "WHERE clause not correct"
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
            test "whereById succeeds" {
 | 
			
		||||
                Expect.equal (Query.whereById "@id") "data->>'Id' = @id" "WHERE clause not correct"
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user