[
  {
    "path": ".github/workflows/test.yml",
    "content": "name: test\non: [push, pull_request]\njobs:\n  swift_6_0:\n    container: swift:6.0\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v1\n    - run: swift test\n"
  },
  {
    "path": ".gitignore",
    "content": "Packages\n.build\n.DS_Store\n*.xcodeproj\nDerivedData/\nPackage.resolved\n.swiftpm\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Mihael Isaev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:6.0\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"SwifQL\",\n    platforms: [\n       .macOS(.v10_15)\n    ],\n    products: [\n        // 💎 Swift lib that gives an ability to build complex raw SQL-queries in strong-type declarative way\n        .library(name: \"SwifQL\", targets: [\"SwifQL\"]),\n    ],\n    dependencies: [],\n    targets: [\n        .target(name: \"SwifQL\", dependencies: []),\n        .testTarget(name: \"SwifQLTests\", dependencies: [.target(name: \"SwifQL\")]),\n    ],\n    swiftLanguageModes: [.v5]\n)\n"
  },
  {
    "path": "README.md",
    "content": "[![Mihael Isaev](https://user-images.githubusercontent.com/1272610/53677263-7ecbfe00-3cc6-11e9-9049-2d2b9a2d7947.png)](http://mihaelisaev.com)\n\n<p align=\"center\">\n    <a href=\"LICENSE\">\n        <img src=\"https://img.shields.io/badge/license-MIT-brightgreen.svg\" alt=\"MIT License\">\n    </a>\n    <a href=\"https://swift.org\">\n        <img src=\"https://img.shields.io/badge/swift-5.2-brightgreen.svg\" alt=\"Swift 5.2\">\n    </a>\n    <img src=\"https://img.shields.io/github/workflow/status/MihaelIsaev/SwifQL/test\" alt=\"Github Actions\">\n    <a href=\"https://discord.gg/q5wCPYv\">\n        <img src=\"https://img.shields.io/discord/612561840765141005\" alt=\"Swift.Stream\">\n    </a>\n</p>\n<p align=\"center\">\n    <a href=\"https://swiftpackageindex.com/SwifQL/SwifQL\">\n        <img src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FSwifQL%2FSwifQL%2Fbadge%3Ftype%3Dswift-versions\">\n    </a>\n    <a href=\"https://swiftpackageindex.com/SwifQL/SwifQL\">\n        <img src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FSwifQL%2FSwifQL%2Fbadge%3Ftype%3Dplatforms\">\n    </a>\n</p>\n<br>\n\nThis lib can be used either stand alone, or with frameworks like Vapor, Kitura, Perfect and others\n\nWe recommend to use it with our [Bridges](https://github.com/SwifQL/Bridges) lib which is built on top of SwifQL and support all its flexibility\n\nIt supports PostgreSQL and MySQL. And it's not so hard to add other dialects 🙂 just check [SwifQL/Dialect](https://github.com/SwifQL/SwifQL/tree/master/Sources/SwifQL/Dialect) folder\n\nPlease feel free to ask any questions in issues, and also you could find me in the [Discord app](https://discordapp.com) as `@iMike#3049` or even better just join **#swifql** channel on [Vapor's Discord server](https://discord.gg/vapor) 🙂\n\n> NOTE:\n>\n> If you haven't found some functions available out-of-the-box\n> then please check files like `SwifQLable+Select` and others in `Sources/SwifQL` folder\n> to ensure how easy it is to extend SwifQL to support anything you need 🚀\n>\n> And feel free to send pull requests with your awesome new extensions ❤️\n\n### Support SwifQL development by giving a ⭐️\n\n## Installation\n### With Vapor 4 + [Bridges](https://github.com/SwifQL/Bridges) + PostgreSQL\n```swift\n.package(url: \"https://github.com/vapor/vapor.git\", from:\"4.0.0-rc\"),\n.package(url: \"https://github.com/SwifQL/VaporBridges.git\", from:\"1.0.0-rc\"),\n.package(url: \"https://github.com/SwifQL/PostgresBridge.git\", from:\"1.0.0-rc\"),\n.target(name: \"App\", dependencies: [\n    .product(name: \"Vapor\", package: \"vapor\"),\n    .product(name: \"VaporBridges\", package: \"VaporBridges\"),\n    .product(name: \"PostgresBridge\", package: \"PostgresBridge\")\n]),\n```\n\n### With Vapor 4 + [Bridges](https://github.com/SwifQL/Bridges) + MySQL\n```swift\n.package(url: \"https://github.com/vapor/vapor.git\", from:\"4.0.0-rc\"),\n.package(url: \"https://github.com/SwifQL/VaporBridges.git\", from:\"1.0.0-rc\"),\n.package(url: \"https://github.com/SwifQL/MySQLBridge.git\", from:\"1.0.0-rc\"),\n.target(name: \"App\", dependencies: [\n    .product(name: \"Vapor\", package: \"vapor\"),\n    .product(name: \"VaporBridges\", package: \"VaporBridges\"),\n    .product(name: \"MySQLBridge\", package: \"MySQLBridge\")\n]),\n```\n\n### Pure\n```swift\n.package(url: \"https://github.com/MihaelIsaev/SwifQL.git\", from:\"2.0.0-beta\"),\n.target(name: \"App\", dependencies: [\n    .product(name: \"SwifQL\", package: \"SwifQL\"),\n]),\n```\n\n### Pure on NIO2\n```swift\n.package(url: \"https://github.com/MihaelIsaev/SwifQL.git\", from:\"2.0.0-beta\"),\n.package(url: \"https://github.com/MihaelIsaev/SwifQLNIO.git\", from:\"2.0.0\"),\n.target(name: \"App\", dependencies: [\n    .product(name: \"SwifQL\", package: \"SwifQL\"),\n    .product(name: \"SwifQLNIO\", package: \"SwifQLNIO\"),\n]),\n```\n\n#### Pure on NIO1 (deprecated)\n```swift\n.package(url: \"https://github.com/MihaelIsaev/SwifQL.git\", from:\"1.0.0\"),\n.package(url: \"https://github.com/MihaelIsaev/SwifQLNIO.git\", from:\"1.0.0\"),\n.target(name: \"App\", dependencies: [\"SwifQL\", \"SwifQLNIO\"]),\n```\n\n#### With Vapor 3 + Fluent (deprecated)\n```swift\n.package(url: \"https://github.com/MihaelIsaev/SwifQL.git\", from:\"1.0.0\"),\n.package(url: \"https://github.com/MihaelIsaev/SwifQLVapor.git\", from:\"1.0.0\"),\n.target(name: \"App\", dependencies: [\"Vapor\", \"SwifQL\", \"SwifQLVapor\"]),\n```\n\n## Philosophy\n\nThis lib gives an ability to build absolutely any SQL query from simplest to monster complex.\n\nExample of simple query\n```sql\nSELECT * FROM \"User\" WHERE \"email\" = 'john.smith@gmail.com'\n```\nbuild it with pure SwifQL this way\n```swift\nSwifQL.select(User.table.*).from(User.table).where(\\User.email == \"john.smith@gmail.com\")\n```\nor with SwifQL + [Bridges](https://github.com/SwifQL/Bridges)\n```swift\nSwifQL.select(User.table.*).from(User.table).where(\\User.$email == \"john.smith@gmail.com\")\n// or shorter\nUser.select.where(\\User.$email == \"john.smith@gmail.com\")\n```\n\n## Usage\n\n### Preparation\n\n> 💡 TIP: It is simpler and more powerful with [Bridges](https://github.com/SwifQL/Bridges)\n\nOf course you have to import the lib\n```swift\nimport SwifQL\n```\n\n#### For v1 Your table models should be conformed to `Tableable` protocol\n```swift\nextension MyTable: Tableable {}\n```\n\n#### For v2 Your table models should be conformed to `Table` protocol\n```swift\nextension MyTable: Table {}\n```\n\n### How to build query\n\n> Instead of writing `Model.self` you should write `Model.table`, cause without Vapor you should conform your models to `Table`, and with Vapor its `Model`s are already conforms to `Table`.\n\n```swift\nlet query = SwifQL.select(\\User.email, \\User.name, \\User.role)\n                  .from(User.table)\n                  .orderBy(.asc(\\User.name))\n                  .limit(10)\n```\nor with SwifQL + [Bridges](https://github.com/SwifQL/Bridges)\n```swift\nlet query = SwifQL.select(\\User.$email, \\User.$name, \\User.$role)\n                  .from(User.table)\n                  .orderBy(.asc(\\User.$name))\n                  .limit(10)\n// or shorter\nUser.select(\\.$email, \\.$name, \\.$role).orderBy(.asc(\\User.$name)).limit(10)\n```\n\n### How to print raw query\n\nThere are two options\n\n##### 1. Get just plain query\n```swift\nlet rawSQLString = query.prepare(.psql).plain\n```\n\nor when using SwifQLSelectBuilder() - see below\n\n```swift\nlet rawSQLBuilderString = query.build().prepare(.psql).plain\n```\n\n##### 2. Get object splitted into: formatted raw SQL string with $ symbols, and separated array with values\n```swift\nlet splittedQuery = query.prepare(.psql).splitted\nlet formattedSQLQuery = splittedQuery.query // formatted raw SQL string with $ symbols instead of values\nlet values = splittedQuery.values // an array of [Encodable] values\n```\n\nThen just put it into your database driver somehow 🙂 or use [Bridges](https://github.com/SwifQL/Bridges)\n\n### How to execute query?\n\nSwifQL is only about building queries. For execution you have to use your favourite database driver.\n\nBelow you can see an example for SwifQL + Vapor4 + [Bridges](https://github.com/SwifQL/Bridges) + PostgreSQL\n\n> 💡 You can get connection on both `Application` and `Request` objects.\n\nExample for `Application` object e.g. for `configure.swift` file\n```swift\n// Called before your application initializes.\npublic func configure(_ app: Application) throws {\n    app.postgres.connection(to: .myDb1) { conn in\n        SwifQL.select(User.table.*).from(User.table).execute(on: conn).all(decoding: User.self).flatMap { rows in\n            print(\"yaaay it works and returned \\(rows.count) rows!\")\n        }\n    }.whenComplete {\n        switch $0 {\n        case .success: print(\"query was successful\")\n        case .failure(let error): print(\"query failed: \\(error)\")\n        }\n    }\n}\n```\nExample for `Request` object\n```swift\nfunc routes(_ app: Application) throws {\n    app.get(\"users\") { req -> EventLoopFuture<[User]> in\n        req.postgres.connection(to: .myDb1) { conn in\n            SwifQL.select(User.table.*).from(User.table).execute(on: conn).all(decoding: User.self)\n        }\n    }\n}\n```\n\n> 💡 In examples above we use `.all(decoding: User.self)` for decoding results, but we also can use `.first(decoding: User.self).unwrap(or: Abort(.notFound))` to get only first row and unwrap it since it may be nil.\n\n## Insert Into\n\n### Single record\nSQL example\n```sql\nINSERT INTO \"User\" (\"email\", \"name\") VALUES ('john@gmail.com', 'John Doe'), ('sam@gmail.com', 'Samuel Jackson')\n```\nSwifQL representation\n```swift\nSwifQL.insertInto(User.table, fields: \\User.email, \\User.name).values(\"john@gmail.com\", \"John Doe\")\n```\nor with SwifQL + [Bridges](https://github.com/SwifQL/Bridges)\n```swift\nUser(email: \"john@gmail.com\", name: \"John Doe\").insert(on: conn)\n```\n\n### Batch\nSQL example\n```sql\nINSERT INTO \"User\" (\"email\", \"name\") VALUES ('john@gmail.com', 'John Doe'), ('sam@gmail.com', 'Samuel Jackson')\n```\nSwifQL representation\n```swift\nSwifQL.insertInto(User.table, fields: \\User.email, \\User.name).values(array: [\"john@gmail.com\", \"John Doe\"], [\"sam@gmail.com\", \"Samuel Jackson\"])\n```\nor with SwifQL + [Bridges](https://github.com/SwifQL/Bridges)\n```swift\nlet user1 = User(email: \"hello@gmail.com\", name: \"John\")\nlet user2 = User(email: \"byebye@gmail.com\", name: \"Amily\")\nlet user3 = User(email: \"trololo@gmail.com\", name: \"Trololo\")\n[user1, user2, user3].batchInsert(on: conn)\n```\n## Update\n\n### General Update\nSQL example\n```sql\nUPDATE \"User\" SET \"name\" = 'Mike'\n```\nSwifQL representation\n```swift\nSwifQL.update(User.table).set[items: User.$name == \"Mike\"]\n```\n\n### In Schema Update\nSQL example\n```sql\nUPDATE \"VIP\".\"User\" SET \"name\" = 'Mike'\n```\nSwifQL representation\n```swift\nlet vip = User.inSchema(\"VIP\")\nSwifQL.update(vip.table).set[items: vip.$name == \"Mike\"]\n```\n\n## Builders\n\nFor now there are only one implemented builder\n\n### Select builder\n\n`SwifQLSelectBuilder` - by using it you could easily build a select query but in multiple lines without carying about ordering.\n\n```swift\nlet builder = SwifQLSelectBuilder()\nbuilder.where(\\User.id == 1)\nbuilder.from(User.table)\nbuilder.limit(1)\nbuilder.select(User.table.*)\nlet query = builder.build()\nreturn query.execute(on: req, as: .psql)\n            .first(decoding: User.self)\n            .unwrap(or: Abort(.notFound, reason: \"User not found\"))\n```\n\nSo it will build query like: `SELECT \"User\".* FROM \"User\" WHERE \"User\".\"id\" = 1 LIMIT 1`.\n\nAs you can see you shouldn't worry about parts ordering, it will sort them the right way before building.\n\n### More builders\n\nFeel free to make your own builders and send pull request with it here!\n\nAlso more conveniences are available in [Bridges](https://github.com/SwifQL/Bridges) lib which is created on top of SwifQL and support all its flexibility\n\n## More query examples\n\n*Let's use `SwifQLSelectBuilder` for some next examples below, cause it's really convenient especially for complex queries.*\n\n1. Let's imagine that you want to query count of users.\n\n```swift\n/// Just query\nlet query = SwifQL.select(Fn.count(\\User.id) => \"count\").from(User.table)\n\n/// Execution and decoding for Vapor\nstruct CountResult: Codable {\n  let count: Int64\n}\nquery.execute(on: req, as: .psql)\n     .first(decoding: CountResult.self)\n     .unwrap(or: Abort(.notFound)) // returns Future<CountResult>\n```\n\nHere you can see two interesting things: `Fn.count()` and `=> \"count\"`\n\n`Fn` is a collection of function builders, so just call `Fn.` and take a look at the functions list on autocompletion.\n\n`=>` uses for two things: 1) to write alias through `as` 2) to cast values to some other types\n\n`// TBD: Expand list of examples`\n\n## Aliasing\nUse `=>` operator for that, e.g.:\n\nIf you want to write `SELECT \"User\".\"email\" as eml` then do it like this `SwifQL.select(\\User.email => \"eml\")`\n\nOr if to speak about table name aliasing:\n\nIf you want to reach `\"User\" as u` then do it like this `User.as(\"u\")`\n\nAnd then keypaths will work like\n\n```swift\nlet u = User.as(\"u\")\nlet emailKeypath = u.email\n```\n\n## Type casting\nUse `=>` operator for that, e.g.:\n\nIf you want to write `SELECT \"User\".\"email\"::text` then do it like this `SwifQL.select(\\User.email => .text)`\n\n## Predicates\n| Infix operator  | SQL equivalent |\n| ------- | -------------- |\n| > | > |\n| >= | >= |\n| < | < |\n| <= | <= |\n| == | = |\n| == nil | IS NULL |\n| != | != |\n| != nil | IS NOT NULL |\n| && | AND |\n\nAnd also\n\n`||` is for `OR`\n\n`||>` is for `@>`\n\n`<||` is for `<@`\n\n> Please feel free to add more predicates in `Predicates.swift` 😉\n\n## Operators\nPlease feel free to take a look at `Fn.Operator` enum in `Functions.swift`\n\n## Functions\nPlease feel free to take a look at the list of function in `Functions.swift`\n\n## Postgres JSON Object\nYou could build JSON objects by using `PostgresJsonObject`\n\nSQL example\n```sql\njsonb_build_object('id', \"User\".\"id\", 'email', \"User\".\"email\")\n```\nSwifQL representation\n```swift\nPgJsonObject().field(key: \"id\", value: \\User.id).field(key: \"email\", value: \\User.email)\n```\n\n## Postgres Array\nYou could build PostgreSQL arrays by using `PostgresArray`\n\nSQL example\n```sql\n$$[]$$\nARRAY[]\nARRAY[1,2,3]\n$$[]$$::uuid[]\nARRAY[]::text[]\n```\nSwifQL representation\n```swift\nPgArray(emptyMode: .dollar)\nPgArray()\nPgArray(1, 2, 3)\nPgArray(emptyMode: .dollar) => .uuidArray\nPgArray() => .textArray\n```\n\nPostgress range query examples\n```swift\n// var ingredients: [IngredientsEnum] \nSwifQL.select(FoodMenu.table.*).WHERE( \\FoodMenu.$ingredients ||> [.tomato] )\n\n// var ingredients: [String]\nSwifQL.select(FoodMenu.table.*).WHERE( \\FoodMenu.$ingredients ||> PgArray([\"tomato\"]) )\n\n// var vendors: [UUID]\nSwifQL.select(FoodMenu.table.*).WHERE( \\FoodMenu.$vendors ||> PgArray([vendorUuid]) )\n```\n\n## Nesting array of objects inside of query result\nConsider such response object you want to achieve:\n\n```swift\nstruct Book {\n  let title: String\n  let authors: [Author]\n}\n\nstruct Author {\n  let name: String\n}\n```\n\nyou have to build it with use of subquery to dump Authors in JSON array and then attach them to result query. This will allow you to get all `Books` with their respective `Authors` \n\nThis example uses Pivot table `BookAuthor` to join `Books` with their `Authors`\n\n```swift\n    let authors = SwifQL.select(Fn.coalesce(Fn.array_agg(Fn.to_jsonb(Author.table)), PgArray() => .jsonbArray))\n\n    let query = SwifQLSelectBuilder()\n    query.select(Book.table.*)\n\n    query.from(Book.table)\n\n    query.join(.left, BookAuthor.table, on: \\Book.$id == \\BookAuthor.$bookID)\n    query.join(.left, Author.table, on: \\Author.$id == \\BookAuthor.$authorID)\n\n    // then query.group(...) as required in your case\n```\n\n## FILTER\nSQL example\n```sql\nCOUNT(\"User\".\"id\") FILTER (WHERE \\User.isAdmin = TRUE) as \"admins\"\n```\nSwifQL representation\n```swift\nFn.count(\\User.id).filter(where: \\User.isAdmin == true) => \"admins\"\n```\n\n## CASE ... WHEN ... THEN ... END\nSQL example\n```sql\nCASE\n  WHEN \"User\".\"email\" IS NULL\n  THEN NULL\n  ELSE \"User\".\"email\"\nEND\n```\nSwifQL representation\n```swift\nCase.when(\\User.email == nil).then(nil).else(\\User.email).end\n// or as many cases as needed\nCase.when(...).then(...).when(...).then(...).when(...).then(...).else(...).end\n```\n\n## Brackets\n\nYes, we really often use round brackets in our queries, e.g. in where clauses or in subqueries.\n\nSwifQL provides you with `|` prefix and postfix operators which is representates `(` and `)`.\n\nSo it's easy to wrap some part of query into brackets, e.g.:\nSQL example\n```sql\n\"User.role\" = 'admin' OR (\"User.role\" = 'user' AND \"User\".\"age\" >= 21)\n```\nSwifQL representation\n```swift\nlet where = \\User.role == .admin || |\\User.role == .user && \\User.age >= 21|\n```\n\n## Keypaths\n| SQL | SwiftQL | SwiftQL + Bridges |\n| ------- | -------------- | -------------- |\n| `\"User\"` | `User.table` | `the same` |\n| `\"User\" as u` | `User.as(\"u\")` you could declare it as `let u = User.as(\"u\")` | `the same` |\n| `\"User\".*` | `User.table.*` | `the same` |\n| `u.*` | `u.*` | `the same` |\n| `\"User\".\"email\"` | `\\User.email` | `\\User.$email` |\n| `u.\"email\"` | `u.email` | `u.$email` |\n| `\"User\".\"jsonObject\"->\"jsonField\"` | `\\User.jsonObject.jsonField` | `only through full path for now` |\n| `\"User\".\"jsonObject\"->\"jsonField\"` | `Path.Table(\"User\").column(\"jsonObject\", \"jsonField\")` | `the same` |\n\n## Tests\n\nFor now tests coverage is maybe around 70%. If you have timе and interest please feel free to send pull requests with more tests.\n\nYou could find tests in `Tests` folder\n\n### How it works under the hood\n\n`SwifQL` object needed just to start writing query, but it's just an empty object that conforms to `SwifQLable`.\n\nYou can build your query with everything which conforms to `SwifQLable`, because `SwifQLable` is that very piece which will be used for concatenation to build a query.\n\n> If you take a look at the lib's files you may realize that the most of files are just extensions to `SwifQLable`.\n\nAll available operators like `select`, `from`, `where`, and `orderBy` realized just as a function in `SwifQLable` extension and these functions always returns `SwifQLable` as a result. That's why you can write a query by calling `SwifQL.select().from().where().orderBy()` one by one. That's awesome cause it feels like writing a raw SQL, but it also gives you an ordering limitation, so if you write `SwifQL.select().where().from()` then you'll get wrong query as a result. But this limitation is resolved by using special builders, like `SwifQLSelectBuilder` (read about it later below).\n\nSo let's take a look how lib builds a simple `SELECT \"User\".* FROM \"User\" WHERE \"User\".\"email\" = 'john.smith@gmail.com'` query\n\nFirst of all we should split query into the parts. Almost every word and punctuation here is a `SwifQLable` piece.\n\n- `SELECT` is `Fn.Operator.select`\n- ` ` is `Fn.Operator.space`\n- `\"User\"` is `User.table`\n- `.*` is `postfix operator .*`\n- ` ` is `Fn.Operator.space`\n- `FROM` is `Fn.Operator.from`\n- `\"User\"` is `User.table`\n- ` ` is `Fn.Operator.space`\n- `WHERE` is `Fn.Operator.where`\n- ` ` is `Fn.Operator.space`\n- `\"User\".\"email\"` is `\\User.email` keypath\n- ` ` is `Fn.Operator.space`\n- `==` is `infix operator ==`\n- ` ` is `Fn.Operator.space`\n- `'john.smith@gmail.com'` is `SwifQLPartUnsafeValue` (it means that this value should be passed as $1 to the database)\n\nThat's crazy, but awesome, right? 😄 But it's under the hood, so no worries! 😃 I just wanted to explain, that if you need something more than already provided then you'll be able to add needed operators/functions easily just by writing little extensions.\n\n> And also there is no overhead, it works pretty fast, but I'd love to hear if you know how to make it faster.\n\nThis way gives you almost absolute flexibility in building queries. More than that as lib support `SQLDialect`'s it will build this query different way for PostgreSQL and MySQL, e.g.:\n\n- PostgreSQL: `SELECT \"User\".* FROM \"User\" WHERE \"User\".\"email\" = 'john.smith@gmail.com'`\n- MySQL: `SELECT User.* FROM User WHERE User.email = 'john.smith@gmail.com'`\n\n## Contributing\n\nPlease feel free to contribute!\n"
  },
  {
    "path": "Sources/SwifQL/Alias.swift",
    "content": "//\n//  Alias.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 19.04.2020.\n//\n\nimport Foundation\n\npublic protocol AnyAlias {\n    var name: String { get }\n    var inputValue: Encodable? { get }\n    var isChanged: Bool { get }\n    func encode(to encoder: Encoder) throws\n    func decode(from decoder: Decoder) throws\n}\n\npublic protocol AliasRepresentable {\n    associatedtype Value: Codable\n    var alias: Alias<Value> { get }\n}\n\n@propertyWrapper\npublic final class Alias<Value>: AnyAlias, AliasRepresentable, ColumnRootNameable, Encodable where Value: Codable {\n    public let name: String\n    \n    var outputValue: Value?\n    public internal(set) var inputValue: Encodable?\n    public var isChanged: Bool = false\n    \n    public var alias: Alias<Value> { self }\n    public var columnName: String { alias.name }\n    \n    public var projectedValue: Alias<Value> { self }\n    \n    public var wrappedValue: Value {\n        get {\n            if let value = self.inputValue {\n                return value as! Value\n            } else if let value = self.outputValue {\n                return value\n            } else {\n                fatalError(\"Cannot access field before it is initialized\")\n            }\n        }\n        set {\n            self.inputValue = newValue\n            self.isChanged = true\n        }\n    }\n    \n    public init(_ name: String) {\n        self.name = name\n    }\n    \n    /// See `Codable`\n    \n    public func encode(to encoder: Encoder) throws {\n        var container = encoder.singleValueContainer()\n        try container.encode(self.wrappedValue)\n    }\n\n    public func decode(from decoder: Decoder) throws {\n        let container = try decoder.singleValueContainer()\n        if let valueType = Value.self as? _Optional.Type {\n            if container.decodeNil() {\n                self.wrappedValue = (valueType._none as! Value)\n            } else {\n                self.wrappedValue = try container.decode(Value.self)\n            }\n        } else {\n            self.wrappedValue = try container.decode(Value.self)\n        }\n        self.isChanged = false\n    }\n}\n\nprotocol _Optional {\n    static var _none: Any { get }\n}\n\nextension Optional: _Optional {\n    static var _none: Any {\n        return Self.none as Any\n    }\n}\n\n// MARK: - KeyPath\n\nprotocol _AliasKeyPath {}\n\nextension KeyPath: _AliasKeyPath where Value: AnyAlias {}\n\nextension KeyPath: SwifQLable, CustomStringConvertible where Root: ColumnRoot, Value: ColumnRootNameable {\n    public var parts: [SwifQLPart] {\n        if let kp = self as? Keypathable {\n            return Path.Schema(kp.schema).table(kp.table).column(Root.key(for: self)).parts\n        }\n        return [SwifQLPartAlias(Root.key(for: self))]\n    }\n}\n\n// MARK: - Aliasable\n\npublic protocol Aliasable: ColumnRoot, Codable {\n    init ()\n}\n\nextension Aliasable {\n    var columns: [(String, AnyAlias)] {\n        return Mirror(reflecting: self)\n            .children\n            .compactMap { child in\n                guard let property = child.value as? AnyAlias else {\n                    return nil\n                }\n                // remove underscore\n                return (property.name, property)\n            }\n    }\n    \n    /// See `Codable`\n    \n    public init(from decoder: Decoder) throws {\n        self.init()\n        let container = try decoder.container(keyedBy: AliasCodingKey.self)\n        try self.columns.forEach { label, property in\n            let decoder = AliasContainerDecoder(container: container, key: .string(label))\n            try property.decode(from: decoder)\n        }\n    }\n\n    public func encode(to encoder: Encoder) throws {\n        let container = encoder.container(keyedBy: AliasCodingKey.self)\n        try self.columns.forEach { label, property in\n            let encoder = ContainerEncoder(container: container, key: .string(label))\n            try property.encode(to: encoder)\n        }\n    }\n}\n\nenum AliasCodingKey: CodingKey {\n    case string(String)\n    case int(Int)\n    \n    var stringValue: String {\n        switch self {\n        case .int(let int): return String(describing: int)\n        case .string(let string): return string\n        }\n    }\n    \n    var intValue: Int? {\n        switch self {\n        case .int(let int): return int\n        case .string(let string): return Int(string)\n        }\n    }\n    \n    init?(stringValue: String) {\n        self = .string(stringValue)\n    }\n    \n    init?(intValue: Int) {\n        self = .int(intValue)\n    }\n}\n\nprivate struct AliasContainerDecoder: Decoder, SingleValueDecodingContainer {\n    let container: KeyedDecodingContainer<AliasCodingKey>\n    let key: AliasCodingKey\n    \n    var codingPath: [CodingKey] {\n        self.container.codingPath\n    }\n    \n    var userInfo: [CodingUserInfoKey : Any] {\n        [:]\n    }\n    \n    func container<Key>(keyedBy type: Key.Type) throws -> KeyedDecodingContainer<Key> where Key : CodingKey {\n        try self.container.nestedContainer(keyedBy: Key.self, forKey: self.key)\n    }\n    \n    func unkeyedContainer() throws -> UnkeyedDecodingContainer {\n        try self.container.nestedUnkeyedContainer(forKey: self.key)\n    }\n    \n    func singleValueContainer() throws -> SingleValueDecodingContainer {\n        self\n    }\n    \n    func decode<T>(_ type: T.Type) throws -> T where T : Decodable {\n        try self.container.decode(T.self, forKey: self.key)\n    }\n    \n    func decodeNil() -> Bool {\n        do {\n            return try self.container.decodeNil(forKey: self.key)\n        } catch {\n            return true\n        }\n    }\n}\n\nprivate struct ContainerEncoder: Encoder, SingleValueEncodingContainer {\n    var container: KeyedEncodingContainer<AliasCodingKey>\n    let key: AliasCodingKey\n    \n    var codingPath: [CodingKey] {\n        self.container.codingPath\n    }\n    \n    var userInfo: [CodingUserInfoKey : Any] {\n        [:]\n    }\n    \n    func container<Key>(keyedBy type: Key.Type) -> KeyedEncodingContainer<Key> where Key : CodingKey {\n        var container = self.container\n        return container.nestedContainer(keyedBy: Key.self, forKey: self.key)\n    }\n    \n    func unkeyedContainer() -> UnkeyedEncodingContainer {\n        var container = self.container\n        return container.nestedUnkeyedContainer(forKey: self.key)\n    }\n    \n    func singleValueContainer() -> SingleValueEncodingContainer {\n        self\n    }\n    \n    mutating func encode<T>(_ value: T) throws where T : Encodable {\n        try self.container.encode(value, forKey: self.key)\n    }\n    \n    mutating func encodeNil() throws {\n        try self.container.encodeNil(forKey: self.key)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/CaseWhen.swift",
    "content": "//\n//  SwifQLable+Case.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 15/02/2019.\n//\n\nimport Foundation\n\npublic class Case {\n    var parts: [SwifQLPart] = []\n    \n    public init (_ expression: SwifQLable? = nil) {\n        parts.append(o: .case)\n        if let expression = expression {\n            parts.append(o: .space)\n            parts.append(contentsOf: expression.parts)\n        }\n    }\n    \n    public static func when(_ expression: SwifQLable) -> Case {\n        Case().when(expression)\n    }\n    \n    public func when(_ expression: SwifQLable) -> Case {\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .when)\n        parts.append(o: .space)\n        parts.append(contentsOf: expression.parts)\n        return self\n    }\n    \n    public func then(_ expression: SwifQLable?) -> Case {\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .then)\n        parts.append(o: .space)\n        if let expression = expression {\n            parts.append(contentsOf: expression.parts)\n        } else {\n            parts.append(o: .null)\n        }\n        return self\n    }\n    \n    public func `else`(_ expression: SwifQLable?) -> Case {\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .else)\n        parts.append(o: .space)\n        if let expression = expression {\n            parts.append(contentsOf: expression.parts)\n        } else {\n            parts.append(o: .null)\n        }\n        return self\n    }\n    \n    public var end: SwifQLable {\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .end)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Distinct.swift",
    "content": "//\n//  Distinct.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 02/03/2019.\n//\n\nimport Foundation\n\n//MARK: DISTINCT\n\npublic class Distinct: SwifQLable {\n    public var parts: [SwifQLPart]\n    \n    public convenience init (_ field: SwifQLable...) {\n        self.init(field)\n    }\n    \n    public init (_ fields: [SwifQLable]) {\n        parts = []\n        parts.append(o: .distinct)\n        parts.append(o: .space)\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n    }\n    \n    public convenience init (on field: SwifQLable...) {\n        self.init(on: field)\n    }\n    \n    public init (on fields: [SwifQLable]) {\n        parts = []\n        parts.append(o: .distinct)\n        parts.append(o: .space)\n        parts.append(o: .on)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        parts.append(o: .closeBracket)\n    }\n    \n    public func andAlso(_ fields: SwifQLable...) -> Distinct {\n        andAlso(fields)\n    }\n    \n    public func andAlso(_ fields: [SwifQLable]) -> Distinct {\n        parts.append(o: .space)\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/GenericTableSelector.swift",
    "content": "//\n//  GenericTableSelector.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 31.01.2020.\n//\n\nextension Table {\n    public static var select: TableSelector<Self> { .init() }\n}\n\npublic class TableSelector<T: Table>: SwifQLable {\n    public var parts: [SwifQLPart] { build() }\n    \n    var columns: [String] = []\n    var exceptColumns: [String] = []\n\n    // MARK: Columns\n    \n    public func columns<A>(_ a: KeyPath<T, A>) -> Self where A: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        return self\n    }\n    \n    public func columns<A, B>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        return self\n    }\n    \n    public func columns<A, B, C>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        return self\n    }\n    \n    public func columns<A, B, C, D>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K, L>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>,\n        _ l: KeyPath<T, L>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable,\n        L: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        columns.append(T.key(for: l))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K, L, M>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>,\n        _ l: KeyPath<T, L>,\n        _ m: KeyPath<T, M>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable,\n        L: ColumnRepresentable,\n        M: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        columns.append(T.key(for: l))\n        columns.append(T.key(for: m))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K, L, M, N>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>,\n        _ l: KeyPath<T, L>,\n        _ m: KeyPath<T, M>,\n        _ n: KeyPath<T, N>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable,\n        L: ColumnRepresentable,\n        M: ColumnRepresentable,\n        N: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        columns.append(T.key(for: l))\n        columns.append(T.key(for: m))\n        columns.append(T.key(for: n))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>,\n        _ l: KeyPath<T, L>,\n        _ m: KeyPath<T, M>,\n        _ n: KeyPath<T, N>,\n        _ o: KeyPath<T, O>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable,\n        L: ColumnRepresentable,\n        M: ColumnRepresentable,\n        N: ColumnRepresentable,\n        O: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        columns.append(T.key(for: l))\n        columns.append(T.key(for: m))\n        columns.append(T.key(for: n))\n        columns.append(T.key(for: o))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>,\n        _ l: KeyPath<T, L>,\n        _ m: KeyPath<T, M>,\n        _ n: KeyPath<T, N>,\n        _ o: KeyPath<T, O>,\n        _ p: KeyPath<T, P>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable,\n        L: ColumnRepresentable,\n        M: ColumnRepresentable,\n        N: ColumnRepresentable,\n        O: ColumnRepresentable,\n        P: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        columns.append(T.key(for: l))\n        columns.append(T.key(for: m))\n        columns.append(T.key(for: n))\n        columns.append(T.key(for: o))\n        columns.append(T.key(for: p))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>,\n        _ l: KeyPath<T, L>,\n        _ m: KeyPath<T, M>,\n        _ n: KeyPath<T, N>,\n        _ o: KeyPath<T, O>,\n        _ p: KeyPath<T, P>,\n        _ q: KeyPath<T, Q>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable,\n        L: ColumnRepresentable,\n        M: ColumnRepresentable,\n        N: ColumnRepresentable,\n        O: ColumnRepresentable,\n        P: ColumnRepresentable,\n        Q: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        columns.append(T.key(for: l))\n        columns.append(T.key(for: m))\n        columns.append(T.key(for: n))\n        columns.append(T.key(for: o))\n        columns.append(T.key(for: p))\n        columns.append(T.key(for: q))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>,\n        _ l: KeyPath<T, L>,\n        _ m: KeyPath<T, M>,\n        _ n: KeyPath<T, N>,\n        _ o: KeyPath<T, O>,\n        _ p: KeyPath<T, P>,\n        _ q: KeyPath<T, Q>,\n        _ r: KeyPath<T, R>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable,\n        L: ColumnRepresentable,\n        M: ColumnRepresentable,\n        N: ColumnRepresentable,\n        O: ColumnRepresentable,\n        P: ColumnRepresentable,\n        Q: ColumnRepresentable,\n        R: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        columns.append(T.key(for: l))\n        columns.append(T.key(for: m))\n        columns.append(T.key(for: n))\n        columns.append(T.key(for: o))\n        columns.append(T.key(for: p))\n        columns.append(T.key(for: q))\n        columns.append(T.key(for: r))\n        return self\n    }\n    \n    public func columns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>(\n        _ a: KeyPath<T, A>,\n        _ b: KeyPath<T, B>,\n        _ c: KeyPath<T, C>,\n        _ d: KeyPath<T, D>,\n        _ e: KeyPath<T, E>,\n        _ f: KeyPath<T, F>,\n        _ g: KeyPath<T, G>,\n        _ h: KeyPath<T, H>,\n        _ i: KeyPath<T, I>,\n        _ j: KeyPath<T, J>,\n        _ k: KeyPath<T, K>,\n        _ l: KeyPath<T, L>,\n        _ m: KeyPath<T, M>,\n        _ n: KeyPath<T, N>,\n        _ o: KeyPath<T, O>,\n        _ p: KeyPath<T, P>,\n        _ q: KeyPath<T, Q>,\n        _ r: KeyPath<T, R>,\n        _ s: KeyPath<T, S>\n    ) -> Self where\n        A: ColumnRepresentable,\n        B: ColumnRepresentable,\n        C: ColumnRepresentable,\n        D: ColumnRepresentable,\n        E: ColumnRepresentable,\n        F: ColumnRepresentable,\n        G: ColumnRepresentable,\n        H: ColumnRepresentable,\n        I: ColumnRepresentable,\n        J: ColumnRepresentable,\n        K: ColumnRepresentable,\n        L: ColumnRepresentable,\n        M: ColumnRepresentable,\n        N: ColumnRepresentable,\n        O: ColumnRepresentable,\n        P: ColumnRepresentable,\n        Q: ColumnRepresentable,\n        R: ColumnRepresentable,\n        S: ColumnRepresentable {\n        columns.append(T.key(for: a))\n        columns.append(T.key(for: b))\n        columns.append(T.key(for: c))\n        columns.append(T.key(for: d))\n        columns.append(T.key(for: e))\n        columns.append(T.key(for: f))\n        columns.append(T.key(for: g))\n        columns.append(T.key(for: h))\n        columns.append(T.key(for: i))\n        columns.append(T.key(for: j))\n        columns.append(T.key(for: k))\n        columns.append(T.key(for: l))\n        columns.append(T.key(for: m))\n        columns.append(T.key(for: n))\n        columns.append(T.key(for: o))\n        columns.append(T.key(for: p))\n        columns.append(T.key(for: q))\n        columns.append(T.key(for: r))\n        columns.append(T.key(for: s))\n        return self\n    }\n    \n    // MARK: Except columns\n    \n    public func exceptColumn<Column>(_ column: KeyPath<T, Column>) -> Self where Column: ColumnRepresentable {\n        exceptColumns.append(T.key(for: column))\n        return self\n    }\n    \n    // MARK: Building\n    \n    private func build() -> [SwifQLPart] {\n        var query = SwifQL\n        if columns.count == 0 {\n            if exceptColumns.count > 0 {\n                var cols = T.init().columns.map { $0.name.label }\n                if exceptColumns.count > 0 {\n                    cols = cols.filter { !exceptColumns.contains($0) }\n                }\n                query = query.select(cols.map { Path.Table(T.tableName).column($0) })\n            } else {\n                query = query.select(T.table.*)\n            }\n        } else {\n            var cols = columns\n            if exceptColumns.count > 0 {\n                cols = cols.filter { !exceptColumns.contains($0) }\n            }\n            query = query.select(cols.map { Path.Table(T.tableName).column($0) })\n        }\n        query = query.from(T.table)\n        return query.parts\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/NewColumn.swift",
    "content": "//\n//  NewColumn.swift\n//  \n//\n//  Created by Mihael Isaev on 26.01.2020.\n//\n\nimport Foundation\n\npublic class NewColumn: SwifQLable {\n    var name: String\n    var type: Type\n    var `default`: SwifQLable?\n    var constraints: [SwifQLable] = []\n    \n    public init(_ name: String, _ type: Type) {\n        self.name = name\n        self.type = type\n    }\n    \n    @discardableResult\n    public func `default`(constant v: Any) -> Self {\n        `default` = SwifQLableParts(parts: SwifQLPartSafeValue(v))\n        return self\n    }\n    \n    @discardableResult\n    public func `default`(expression: SwifQLable) -> Self {\n        `default` = expression\n        return self\n    }\n    \n    @discardableResult\n    public func `default`(sequence name: String) -> Self {\n        `default` = SwifQLableParts(parts: Op.custom(name))\n        return self\n    }\n    \n    @discardableResult\n    public func constraint(expression: SwifQLable) -> Self {\n        constraints.append(expression)\n        return self\n    }\n    \n    @discardableResult\n    public func primaryKey() -> Self {\n        constraints.append(SwifQL.primary.key)\n        return self\n    }\n    \n    @discardableResult\n    public func unique() -> Self {\n        constraints.append(SwifQL.unique)\n        return self\n    }\n    \n    @discardableResult\n    public func notNull() -> Self {\n        constraints.append(SwifQL.not.null)\n        return self\n    }\n    \n    @discardableResult\n    public func check(name: String? = nil, _ expression: SwifQLable) -> Self {\n        guard expression.parts.count > 0 else { return self }\n        var parts: [SwifQLPart] = []\n        if let name = name {\n            parts.append(o: .constraint)\n            parts.append(o: .space)\n            parts.append(SwifQLPartColumn(name))\n        }\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .check)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: expression.parts)\n        parts.append(o: .closeBracket)\n        constraints.append(SwifQLableParts(parts: parts))\n        return self\n    }\n    \n    public var parts: [SwifQLPart] {\n        var parts: [SwifQLPart] = []\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .custom(type.name))\n        if let expression = `default` {\n            parts.append(o: .space)\n            parts.append(contentsOf: expression.parts)\n        }\n        constraints.forEach { expression in\n            parts.append(o: .space)\n            parts.append(contentsOf: expression.parts)\n        }\n        return parts\n    }\n}\n\n"
  },
  {
    "path": "Sources/SwifQL/Builders/PostgresArray.swift",
    "content": "//\n//  PostgresArray.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\npublic typealias PgArray = PostgresArray\n\npublic struct PostgresArray: SwifQLable {\n    public enum EmptyMode {\n        case simple, dollar\n    }\n    \n    public var parts: [SwifQLPart] = []\n    \n    public init (_ items: SwifQLable..., emptyMode: EmptyMode = .simple) {\n        self.init(items, emptyMode: emptyMode)\n    }\n    \n    public init (_ items: [SwifQLable], emptyMode: EmptyMode = .simple) {\n        if items.count == 0 && emptyMode == .dollar {\n            parts.append(o: .doubleDollar)\n            parts.append(o: .openSquareBracket)\n            parts.append(o: .closeSquareBracket)\n            parts.append(o: .doubleDollar)\n            return\n        }\n        parts.append(o: .array)\n        parts.append(o: .openSquareBracket)\n        for (i, v) in items.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        parts.append(o: .closeSquareBracket)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/PostgresJsonObject.swift",
    "content": "//\n//  PostgresJsonObject.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\npublic typealias PgJsonObject = PostgresJsonObject\n\npublic class PostgresJsonObject: SwifQLable {\n    private struct Field {\n        enum KeyMode {\n            case `default`, keyPath\n        }\n        let key: SwifQLable\n        let mode: KeyMode\n        let value: SwifQLable\n    }\n    \n    private var fields: [Field] = []\n    \n    public var parts: [SwifQLPart] {\n        var parts: [SwifQLPart] = []\n        parts.appendSpaceIfNeeded()\n        var body: [SwifQLPart] = []\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                body.append(o: .comma)\n                body.append(o: .space)\n            }\n            switch v.mode {\n            case .default:\n                body.append(contentsOf: v.key.parts)\n            case .keyPath:\n                if let key = v.key as? SwifQLUniversalKeyPathSimple {\n                    body.append(o: .custom(key.lastPath.singleQuotted))\n                } else {\n                    body.append(o: .custom(String(describing: v.key).singleQuotted))\n                }\n            }\n            body.append(o: .comma)\n            body.append(o: .space)\n            body.append(contentsOf: v.value.parts)\n        }\n        return Fn.build(.jsonb_build_object, body: body).parts\n    }\n    \n    public init () {}\n    \n    public func field(key: SwifQLable, value: SwifQLable) -> PostgresJsonObject {\n        let field = Field(key: key, mode: .default, value: value)\n        fields.append(field)\n        return self\n    }\n    \n    public func field(keyPathAsKey: SwifQLable, value: SwifQLable) -> PostgresJsonObject {\n        let field = Field(key: keyPathAsKey, mode: .keyPath, value: value)\n        fields.append(field)\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/QueryBuilder.swift",
    "content": "//\n//  QueryBuilder.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 19.12.2019.\n//\n\nimport Foundation\n\npublic protocol QueryBuilderItemable {\n    var values: [SwifQLable] { get }\n}\npublic struct QueryBuilderItem: SwifQLable {\n    public let parts: [SwifQLPart]\n    public let values: [SwifQLable]\n    public init (_ values: [SwifQLable]? = nil) {\n        var parts: [SwifQLPart] = []\n        if let values = values {\n            values.forEach {\n                parts.append(contentsOf: $0.parts)\n            }\n        }\n        self.parts = parts\n        self.values = values ?? []\n    }\n}\n@resultBuilder public struct QueryBuilder {\n    public typealias Block = () -> SwifQLable\n    \n    /// Builds an empty view from an block containing no statements, `{ }`.\n    public static func buildBlock() -> SwifQLable { QueryBuilderItem() }\n    \n    /// Passes a single view written as a child view (e..g, `{ Text(\"Hello\") }`) through unmodified.\n    public static func buildBlock(_ attr: SwifQLable) -> SwifQLable {\n        QueryBuilderItem([attr])\n    }\n    \n    /// Passes a single view written as a child view (e..g, `{ Text(\"Hello\") }`) through unmodified.\n    public static func buildBlock(_ attrs: SwifQLable...) -> SwifQLable {\n        QueryBuilderItem(attrs)\n    }\n    \n    /// Passes a single view written as a child view (e..g, `{ Text(\"Hello\") }`) through unmodified.\n    public static func buildBlock(_ attrs: [SwifQLable]) -> SwifQLable {\n        QueryBuilderItem(attrs)\n    }\n    \n    /// Provides support for \"if\" statements in multi-statement closures, producing an `Optional` view\n    /// that is visible only when the `if` condition evaluates `true`.\n    public static func buildIf(_ content: SwifQLable?) -> SwifQLable {\n        guard let content = content else { return QueryBuilderItem() }\n        return QueryBuilderItem([content])\n    }\n    \n    /// Provides support for \"if\" statements in multi-statement closures, producing\n    /// ConditionalContent for the \"then\" branch.\n    public static func buildEither(first: SwifQLable) -> SwifQLable {\n        QueryBuilderItem([first])\n    }\n\n    /// Provides support for \"if-else\" statements in multi-statement closures, producing\n    /// ConditionalContent for the \"else\" branch.\n    public static func buildEither(second: SwifQLable) -> SwifQLable {\n        QueryBuilderItem([second])\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Schema/CreateSchemaBuilder.swift",
    "content": "//\n//  CreateSchemaBuilder.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\npublic class CreateSchemaBuilder<Schema: Schemable>: SwifQLable {\n    public var parts: [SwifQLPart] {\n        var query = SwifQL.create.schema\n        if shouldCheckIfNotExists {\n            query = query.if.not.exists\n        }\n        query = query[any: Path.Schema(Schema.schemaName)]\n        return query.parts\n    }\n    \n    var shouldCheckIfNotExists = false\n    \n    public init () {}\n    \n    public func checkIfNotExists() -> Self {\n        shouldCheckIfNotExists = true\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Schema/DropSchemaBuilder.swift",
    "content": "//\n//  DropSchemaBuilder.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\npublic class DropSchemaBuilder<Schema: Schemable>: SwifQLable {\n    public var parts: [SwifQLPart] {\n        var query = SwifQL.drop.schema\n        if shouldCheckIfExists {\n            query = query.if.exists\n        }\n        query = query[any: Path.Schema(Schema.schemaName)]\n        return query.parts\n    }\n    \n    var shouldCheckIfExists = false\n    \n    public init () {}\n    \n    public func checkIfExists() -> Self {\n        shouldCheckIfExists = true\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Schema/UpdateSchemaChangeOwner.swift",
    "content": "//\n//  UpdateSchemaChangeOwner.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\npublic class UpdateSchemaChangeOwner<Schema: Schemable>: SwifQLable {\n    public var parts: [SwifQLPart] {\n        var query = SwifQL.alter.schema\n        query = query[any: Path.Schema(Schema.schemaName)]\n        query = query.owner.to\n        query = query[any: Path.Schema(newOwner)]\n        return query.parts\n    }\n    \n    var newOwner = \"\"\n    \n    public init () {}\n    \n    public func newOwner(_ name: String) -> Self {\n        newOwner = name\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Schema/UpdateSchemaRename.swift",
    "content": "//\n//  UpdateSchemaRename.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\npublic class UpdateSchemaRenameBuilder<Schema: Schemable>: SwifQLable {\n    public var parts: [SwifQLPart] {\n        var query = SwifQL.alter.schema\n        query = query[any: Path.Schema(Schema.schemaName)]\n        query = query.rename.to\n        query = query[any: Path.Schema(newName)]\n        return query.parts\n    }\n    \n    var newName = \"\"\n    \n    public init () {}\n    \n    public func newName(_ name: String) -> Self {\n        newName = name\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/SwifQLJoinBuilder.swift",
    "content": "//\n//  SwifQLJoinBuilder.swift\n//  App\n//\n//  Created by Mihael Isaev on 22/02/2019.\n//\n\nimport Foundation\n\npublic struct JoinMode {\n    let parts: [SwifQLPartOperator]\n    \n    public init (_ parts: SwifQLPartOperator...) {\n        self.parts = parts\n    }\n    \n    public init (_ parts: [SwifQLPartOperator]) {\n        self.parts = parts\n    }\n    \n    public static var none: JoinMode { .init(.join) }\n    \n    public static var left: JoinMode { .init(.left, .space, .join) }\n    public static var leftLateral: JoinMode { .init(.left, .space, .join, .space, .lateral) }\n    \n    public static var leftOuter: JoinMode { .init(.left, .space, .outer, .space, .join) }\n    public static var leftOuterLateral: JoinMode { .init(.left, .space, .outer, .space, .join, .space, .lateral) }\n\n    public static var right: JoinMode { .init(.right, .space, .join) }\n    public static var rightLateral: JoinMode { .init(.right, .space, .join, .space, .lateral) }\n\n    public static var rightOuter: JoinMode { .init(.right, .space, .outer, .space, .join) }\n    public static var rightOuterLateral: JoinMode { .init(.right, .space, .outer, .space, .join, .space, .lateral) }\n\n    public static var inner: JoinMode { .init(.inner, .space, .join) }\n    public static var outer: JoinMode { .init(.outer, .space, .join) }\n    \n    public static var cross: JoinMode { .init(.cross, .space, .join) }\n    public static var crossLateral: JoinMode { .init(.cross, .space, .join, .space, .lateral) }\n}\n\npublic struct SwifQLJoinBuilder: SwifQLable {\n    let mode: JoinMode\n    let table: SwifQLable\n    let predicates: SwifQLable?\n    \n    public init (_ mode: JoinMode? = nil, _ table: SwifQLable, on predicates: SwifQLable? = nil) {\n        self.mode = mode ?? .none\n        self.table = table\n        self.predicates = predicates\n    }\n    \n    public var parts: [SwifQLPart] {\n        var parts: [SwifQLPart] = []\n        parts.appendSpaceIfNeeded()\n        parts.append(contentsOf: mode.parts)\n        parts.append(o: .space)\n        parts.append(contentsOf: table.parts)\n        if let predicates = predicates {\n            parts.append(o: .space)\n            parts.append(o: .on)\n            parts.append(o: .space)\n            parts.append(contentsOf: predicates.parts)\n        }\n        return parts\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/SwifQLSelectBuilder.swift",
    "content": "//\n//  SwifQLSelectBuilder.swift\n//  App\n//\n//  Created by Mihael Isaev on 22/02/2019.\n//\n\nimport Foundation\n\npublic class SwifQLSelectBuilder: QueryBuilderable {\n    var select: [SwifQLable] = []\n    var froms: [SwifQLable] = []\n    \n    public var queryParts = QueryParts()\n    \n    public init() {}\n    \n    public func copy() -> SwifQLSelectBuilder {\n        let copy = SwifQLSelectBuilder()\n        \n        copy.select = select\n        copy.froms = froms\n        copy.queryParts = queryParts.copy()\n        \n        return copy\n    }\n    \n    // MARK: Select\n    \n    @discardableResult\n    public func select(_ item: SwifQLable...) -> SwifQLSelectBuilder {\n        select(item)\n    }\n    \n    @discardableResult\n    public func select(_ items: [SwifQLable]) -> SwifQLSelectBuilder {\n        select.append(contentsOf: items)\n        return self\n    }\n    \n    // MARK: From\n    \n    @discardableResult\n    public func from(_ item: SwifQLable...) -> SwifQLSelectBuilder {\n        from(item)\n    }\n    \n    @discardableResult\n    public func from(_ items: [SwifQLable]) -> SwifQLSelectBuilder {\n        froms.append(contentsOf: items)\n        return self\n    }\n    \n    public func build() -> SwifQLable {\n        var query = SwifQL.select(select)\n        if froms.count > 0 {\n            query = query.from(froms)\n        }\n        return queryParts.appended(to: query)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Table/CreateTableBuilder.swift",
    "content": "//\n//  CreateTableBuilder.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\npublic class CreateTableBuilder<T: Table>: SwifQLable {\n    public var parts: [SwifQLPart] {\n        var query = SwifQL.create.table\n        if shouldCheckIfNotExists {\n            query = query.if.not.exists\n        }\n        let table = Path.Schema(schemaName).table(T.tableName)\n        query = query[any: table].newColumns(columns)\n        return query.parts\n    }\n    \n    var columns: [NewColumn] = []\n    var shouldCheckIfNotExists = false\n    var schemaName: String?\n    \n    public init (schema: Schemable.Type? = nil) {\n        self.schemaName = schema?.schemaName ?? (T.self as? Schemable.Type)?.schemaName\n    }\n    \n    public init (schema: String) {\n        self.schemaName = schema\n    }\n    \n    public func column(_ newColumn: NewColumn) -> Self {\n        columns.append(newColumn)\n        return self\n    }\n    \n    // MARK: KeyPath\n    \n    public func column<V>(_ keyPath: KeyPath<T, V>, _ type: SwifQL.`Type`) -> Self where V: ColumnRepresentable {\n        column(keyPath, type: type, default: nil, constraints: [])\n    }\n    \n    public func column<V>(_ keyPath: KeyPath<T, V>, _ type: SwifQL.`Type`, _ constraints: Constraint...) -> Self where V: ColumnRepresentable {\n        column(keyPath, type: type, default: nil, constraints: constraints)\n    }\n    \n    public func column<V>(_ keyPath: KeyPath<T, V>, _ type: SwifQL.`Type`, _ `default`: ColumnDefault, _ constraints: Constraint...) -> Self where V: ColumnRepresentable {\n        column(keyPath, type: type, default: `default`, constraints: constraints)\n    }\n    \n    public func column<V>(_ keyPath: KeyPath<T, V>, type: SwifQL.`Type`, `default`: ColumnDefault?, constraints: [Constraint]) -> Self where V: ColumnRepresentable {\n        column(T.key(for: keyPath), type: type, default: `default`, constraints: constraints)\n    }\n    \n    // MARK: String\n    \n    public func column(_ name: String, _ type: SwifQL.`Type`) -> Self {\n        column(name, type: type, default: nil, constraints: [])\n    }\n    \n    public func column(_ name: String, _ type: SwifQL.`Type`, _ constraints: Constraint...) -> Self {\n        column(name, type: type, default: nil, constraints: constraints)\n    }\n    \n    public func column(_ name: String, _ type: SwifQL.`Type`, _ `default`: ColumnDefault, _ constraints: Constraint...) -> Self {\n        column(name, type: type, default: `default`, constraints: constraints)\n    }\n    \n    public func column(_ name: String, type: SwifQL.`Type`, `default`: ColumnDefault?, constraints: [Constraint]) -> Self {\n        let newColumn = NewColumn(name, type)\n        if let expression = `default`?.query {\n            newColumn.default(expression: expression)\n        }\n        constraints.forEach {\n            newColumn.constraint(expression: $0.query)\n        }\n        columns.append(newColumn)\n        return self\n    }\n    \n    public func checkIfNotExists() -> Self {\n        shouldCheckIfNotExists = true\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Table/DropTableBuilder.swift",
    "content": "//\n//  DropTableBuilder.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\npublic class DropTableBuilder<T: Table>: SwifQLable {\n    public var parts: [SwifQLPart] {\n        var query = SwifQL.drop.table\n        if shouldCheckIfExists {\n            query = query.if.exists\n        }\n        query = query[any: Path.Table(T.tableName)]\n        return query.parts\n    }\n    \n    var shouldCheckIfExists = false\n    \n    public init () {}\n    \n    public func checkIfExists() -> Self {\n        shouldCheckIfExists = true\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Table/UpdateTableBuilder.swift",
    "content": "//\n//  UpdateTableBuilder.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\npublic class UpdateTableBuilder<T: Table>: SwifQLable {\n    public var parts: [SwifQLPart] {\n        let table = Path.Schema(schemaName).table(T.tableName)\n        var parts: [SwifQLPart] = []\n        if combinedAlterActions.count > 0 {\n            var combinedParts = SwifQL.alter.table[any: table].parts\n            combinedParts.append(o: .space)\n            combinedAlterActions.enumerated().forEach { i, action in\n                if i > 0 {\n                    combinedParts.append(o: .comma)\n                    combinedParts.append(o: .space)\n                }\n                combinedParts.append(contentsOf: action)\n            }\n            combinedParts.append(o: .semicolon)\n            parts.append(contentsOf: combinedParts)\n        }\n        standAloneAlterActions.forEach { action in\n            var standAloneParts = SwifQL.alter.table[any: table].parts\n            standAloneParts.append(o: .space)\n            standAloneParts.append(contentsOf: action)\n            standAloneParts.append(o: .semicolon)\n            parts.append(contentsOf: standAloneParts)\n        }\n        otherActions.forEach { action in\n            var actionParts = action\n            actionParts.append(o: .semicolon)\n            parts.append(contentsOf: actionParts)\n        }\n        if let newName = renameTableTo {\n            var renameParts = SwifQL.alter.table[any: table].parts\n            renameParts.append(o: .space)\n            renameParts.append(o: .rename)\n            renameParts.append(o: .space)\n            renameParts.append(o: .to)\n            renameParts.append(o: .space)\n            renameParts.append(SwifQLPartColumn(newName))\n            renameParts.append(o: .semicolon)\n            parts.append(contentsOf: renameParts)\n        }\n        return parts\n    }\n    \n    var combinedAlterActions: [[SwifQLPart]] = []\n    var standAloneAlterActions: [[SwifQLPart]] = []\n    var otherActions: [[SwifQLPart]] = []\n    var renameTableTo: String?\n    var schemaName: String?\n    \n    public init (schema: Schemable.Type? = nil) {\n        self.schemaName = schema?.schemaName ?? (T.self as? Schemable.Type)?.schemaName\n    }\n    \n    public init (schema: String) {\n        self.schemaName = schema\n    }\n    \n    // MARK: - RENAME TABLE\n    \n    /// For changing the table name.\n    public func renameTable(to: String) -> Self {\n        renameTableTo = to\n        return self\n    }\n    \n    // MARK: - ADD COLUMN\n    \n    public func addColumn(_ newColumn: NewColumn) -> Self {\n        var parts: [SwifQLPart] = []\n        parts.append(o: .add)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        parts.append(o: .space)\n        parts.append(contentsOf: newColumn.parts)\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: KeyPath\n    \n    /// Adds a new column to a table.\n    public func addColumn<V>(_ keyPath: KeyPath<T, V>, _ type: SwifQL.`Type`, checkIfNotExists: Bool = false) -> Self where V: ColumnRepresentable {\n        addColumn(keyPath, type: type, default: nil, checkIfNotExists: checkIfNotExists, constraints: [])\n    }\n    \n    /// Adds a new column to a table.\n    public func addColumn<V>(_ keyPath: KeyPath<T, V>, _ type: SwifQL.`Type`, checkIfNotExists: Bool = false, _ constraints: Constraint...) -> Self where V: ColumnRepresentable {\n        addColumn(keyPath, type: type, default: nil, checkIfNotExists: checkIfNotExists, constraints: constraints)\n    }\n    \n    /// Adds a new column to a table.\n    public func addColumn<V>(_ keyPath: KeyPath<T, V>, _ type: SwifQL.`Type`, _ `default`: ColumnDefault, checkIfNotExists: Bool = false, _ constraints: Constraint...) -> Self where V: ColumnRepresentable {\n        addColumn(keyPath, type: type, default: `default`, checkIfNotExists: checkIfNotExists, constraints: constraints)\n    }\n    \n    /// Adds a new column to a table.\n    public func addColumn<V>(_ keyPath: KeyPath<T, V>, type: SwifQL.`Type`, `default`: ColumnDefault?, checkIfNotExists: Bool = false, constraints: [Constraint]) -> Self where V: ColumnRepresentable {\n        addColumn(T.key(for: keyPath), type: type, default: `default`, checkIfNotExists: checkIfNotExists, constraints: constraints)\n    }\n    \n    // MARK: String\n    \n    /// Adds a new column to a table.\n    public func addColumn(_ name: String, _ type: SwifQL.`Type`, checkIfNotExists: Bool = false) -> Self {\n        addColumn(name, type: type, default: nil, checkIfNotExists: checkIfNotExists, constraints: [])\n    }\n    \n    /// Adds a new column to a table.\n    public func addColumn(_ name: String, _ type: SwifQL.`Type`, checkIfNotExists: Bool = false, _ constraints: Constraint...) -> Self {\n        addColumn(name, type: type, default: nil, checkIfNotExists: checkIfNotExists, constraints: constraints)\n    }\n    \n    /// Adds a new column to a table.\n    public func addColumn(_ name: String, _ type: SwifQL.`Type`, _ `default`: ColumnDefault, checkIfNotExists: Bool = false, _ constraints: Constraint...) -> Self {\n        addColumn(name, type: type, default: `default`, checkIfNotExists: checkIfNotExists, constraints: constraints)\n    }\n    \n    /// Adds a new column to a table.\n    public func addColumn(_ name: String, type: SwifQL.`Type`, `default`: ColumnDefault?, checkIfNotExists: Bool = false, constraints: [Constraint]) -> Self {\n        var parts: [SwifQLPart] = []\n        parts.append(o: .add)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        if checkIfNotExists {\n            parts.append(o: .space)\n            parts.append(o: .if)\n            parts.append(o: .space)\n            parts.append(o: .not)\n            parts.append(o: .space)\n            parts.append(o: .exists)\n        }\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .custom(type.name))\n        if let expression = `default` {\n            parts.append(o: .space)\n            parts.append(contentsOf: expression.query.parts)\n        }\n        constraints.forEach { expression in\n            parts.append(o: .space)\n            parts.append(contentsOf: expression.query.parts)\n        }\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - DROP COLUMN\n    \n    /// For dropping a table column.\n    /// The constraints and indexes imposed on the columns will also be dropped.\n    ///\n    /// You should use \"string\" table names instead of KeyPaths to keep consistency with previous migrations.\n    ///\n    /// Usage:\n    ///\n    /// ```swift\n    /// .dropColumn(\\User.$name)\n    /// .dropColumn(\\User.$surname, checkIfExists: true) // default `false`\n    /// .dropColumn(\\User.$createdAt, cascade: true) // default `false`\n    /// ```\n    public func dropColumn<V>(_ keyPath: KeyPath<T, V>, checkIfExists: Bool = false, cascade: Bool = false)  -> Self where V: ColumnRepresentable {\n        dropColumn(T.key(for: keyPath), checkIfExists: checkIfExists, cascade: cascade)\n    }\n    \n    /// For dropping a table column.\n    /// The constraints and indexes imposed on the columns will also be dropped.\n    ///\n    /// Usage:\n    ///\n    /// ```swift\n    /// .dropColumn(\"abc\")\n    /// .dropColumn(\"xyz\", checkIfExists: true) // default `false`\n    /// .dropColumn(\"qwe\", cascade: true) // default `false`\n    /// ```\n    public func dropColumn(_ name: String, checkIfExists: Bool = false, cascade: Bool = false) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .drop)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        if checkIfExists {\n            parts.append(o: .space)\n            parts.append(o: .if)\n            parts.append(o: .space)\n            parts.append(o: .exists)\n        }\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        if cascade {\n            parts.append(o: .space)\n            parts.append(o: .cascade)\n        }\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - SET DEFAULT\n    \n    /// Use for adding/changing the default value for a column.\n    public func setDefault<V>(_ keyPath: KeyPath<T, V>, constant v: Any)  -> Self where V: ColumnRepresentable {\n        setDefault(T.key(for: keyPath), constant: v)\n    }\n    \n    /// Use for adding/changing the default value for a column.\n    public func setDefault<V>(_ keyPath: KeyPath<T, V>, expression: SwifQLable)  -> Self where V: ColumnRepresentable {\n        setDefault(T.key(for: keyPath), expression: expression)\n    }\n    \n    /// Use for adding/changing the default value for a column.\n    public func setDefault<V>(_ keyPath: KeyPath<T, V>, sequence name: String)  -> Self where V: ColumnRepresentable {\n        setDefault(T.key(for: keyPath), sequence: name)\n    }\n    \n    /// Use for adding/changing the default value for a column.\n    public func setDefault(_ name: String, constant v: Any) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .alter)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .set)\n        parts.append(o: .space)\n        parts.append(o: .default)\n        parts.append(o: .space)\n        parts.append(SwifQLPartSafeValue(v))\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    /// Use for adding/changing the default value for a column.\n    public func setDefault(_ name: String, expression: SwifQLable) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .alter)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .set)\n        parts.append(o: .space)\n        parts.append(o: .default)\n        parts.append(o: .space)\n        parts.append(contentsOf: expression.parts)\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    /// Use for adding/changing the default value for a column.\n    public func setDefault(_ name: String, sequence: String) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .alter)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .set)\n        parts.append(o: .space)\n        parts.append(o: .default)\n        parts.append(o: .space)\n        parts.append(Op.custom(sequence))\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - DROP DEFAULT\n    \n    /// Use for removing the default value for a column.\n    public func dropDefault<V>(_ keyPath: KeyPath<T, V>)  -> Self where V: ColumnRepresentable {\n        dropDefault(T.key(for: keyPath))\n    }\n    \n    /// Use for removing the default value for a column.\n    public func dropDefault(_ name: String) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .alter)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .drop)\n        parts.append(o: .space)\n        parts.append(o: .default)\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - SET NOT NULL\n    \n    /// Use for removing NOT NULL mark for a column.\n    public func setNotNull<V>(_ keyPath: KeyPath<T, V>)  -> Self where V: ColumnRepresentable {\n        setNotNull(T.key(for: keyPath))\n    }\n    \n    /// Use for removing NOT NULL mark for a column.\n    public func setNotNull(_ name: String) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .alter)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .set)\n        parts.append(o: .space)\n        parts.append(o: .not)\n        parts.append(o: .space)\n        parts.append(o: .null)\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - DROP NOT NULL\n    \n    /// Use for removing NOT NULL mark for a column.\n    public func dropNotNull<V>(_ keyPath: KeyPath<T, V>)  -> Self where V: ColumnRepresentable {\n        dropNotNull(T.key(for: keyPath))\n    }\n    \n    /// Use for removing NOT NULL mark for a column.\n    public func dropNotNull(_ name: String) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .alter)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .drop)\n        parts.append(o: .space)\n        parts.append(o: .not)\n        parts.append(o: .space)\n        parts.append(o: .null)\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - RENAME COLUMN\n    \n    /// For changing the table name or a column name.\n    public func renameColumn<V>(_ keyPath: KeyPath<T, V>, to: String)  -> Self where V: ColumnRepresentable {\n        renameColumn(T.key(for: keyPath), to: to)\n    }\n    \n    /// For changing the table name or a column name.\n    public func renameColumn(_ name: String, to: String) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .rename)\n        parts.append(o: .space)\n        parts.append(o: .column)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        parts.append(o: .space)\n        parts.append(o: .to)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(to))\n        standAloneAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - DROP CONSTRAINT\n    \n    /// Use for dropping a table constraint.\n    public func dropConstraint(_ name: String) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .drop)\n        parts.append(o: .space)\n        parts.append(o: .constraint)\n        parts.append(o: .space)\n        parts.append(SwifQLPartColumn(name))\n        otherActions.append(parts)\n        return self\n    }\n    \n    // MARK: - ADD UNIQUE\n    \n    /// Use to add UNIQUE mark to one or several columns.\n    public func addUnique(to columns: String...) -> Self {\n        guard columns.count > 0 else { return self }\n        var parts = SwifQL.parts\n        parts.append(o: .add)\n        parts.append(o: .space)\n        parts.append(o: .unique)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        columns.enumerated().forEach { i, name in\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(SwifQLPartColumn(name))\n        }\n        parts.append(o: .closeBracket)\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - ADD PRIMARY KEY\n    \n    /// Use to add PRIMARY KEY mark to one or several columns.\n    public func addPrimaryKey(to columns: String...) -> Self {\n        guard columns.count > 0 else { return self }\n        var parts = SwifQL.parts\n        parts.append(o: .add)\n        parts.append(o: .space)\n        parts.append(o: .primary)\n        parts.append(o: .space)\n        parts.append(o: .key)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        columns.enumerated().forEach { i, name in\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(SwifQLPartColumn(name))\n        }\n        parts.append(o: .closeBracket)\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - DROP INDEX\n    \n    /// Drops index by its name.\n    public func dropIndex(schema: String? = nil, name: String) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .drop)\n        parts.append(o: .space)\n        parts.append(o: .index)\n        parts.append(o: .space)\n        if let schema = schema {\n            parts.append(SwifQLPartColumn(schema))\n            parts.append(o: .period)\n        }\n        parts.append(SwifQLPartColumn(name))\n        otherActions.append(parts)\n        return self\n    }\n    \n    // MARK: - CREATE INDEX\n    \n    /// Creates index for one or several columns.\n    public func createIndex(unique: Bool = false, name: String? = nil, items: IndexItem..., type: IndexType? = nil, where condition: SwifQLable? = nil) -> Self {\n        createIndex(unique: unique, name: name, items: items, type: type, where: condition)\n    }\n    \n    /// Creates index for one or several columns.\n    public func createIndex(unique: Bool = false, name: String? = nil, items: [IndexItem], type: IndexType? = nil, where condition: SwifQLable? = nil) -> Self {\n        guard items.count > 0 else { return self }\n        var parts = SwifQL.parts\n        parts.append(o: .create)\n        if unique {\n            parts.append(o: .space)\n            parts.append(o: .unique)\n        }\n        parts.append(o: .space)\n        parts.append(o: .index)\n        if let name = name {\n            parts.append(o: .space)\n            parts.append(SwifQLPartColumn(name))\n        }\n        parts.append(o: .space)\n        parts.append(o: .on)\n        parts.append(o: .space)\n        parts.append(contentsOf: Path.Schema(schemaName).table(T.tableName).parts)\n        if let type = type {\n            parts.append(o: .space)\n            parts.append(o: .using)\n            parts.append(o: .space)\n            parts.append(contentsOf: type.parts)\n            parts.append(o: .space)\n        }\n        parts.append(o: .openBracket)\n        items.enumerated().forEach { i, item in\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: item.parts)\n        }\n        parts.append(o: .closeBracket)\n        if let condition = condition {\n            parts.append(o: .space)\n            parts.append(o: .where)\n            parts.append(o: .space)\n            parts.append(contentsOf: condition.parts)\n        }\n        otherActions.append(parts)\n        return self\n    }\n    \n    // MARK: - ADD CHECK\n    \n    /// A check constraint helps in validating the records that are being inserted into a table.\n    /// We can do this by combining the ALTER TABLE command with the ADD CHECK statement.\n    public func addCheck(constraintName: String? = nil, _ expression: SwifQLable) -> Self {\n        var parts = SwifQL.parts\n        parts.append(o: .add)\n        if let constraintName = constraintName {\n            parts.append(o: .space)\n            parts.append(o: .constraint)\n            parts.append(o: .space)\n            parts.append(SwifQLPartColumn(constraintName))\n        }\n        parts.append(o: .space)\n        parts.append(o: .check)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: expression.parts)\n        parts.append(o: .closeBracket)\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // MARK: - ADD FOREIGN KEY\n    \n    public func addForeignKey(column: String, constraintName: String? = nil, schema: String? = nil, table: String, columns: String..., onDelete: ReferentialAction? = nil, onUpdate: ReferentialAction? = nil) -> Self {\n        addForeignKey(column: column, constraintName: constraintName, schema: schema, table: table, columns: columns, onDelete: onDelete, onUpdate: onUpdate)\n    }\n    \n    public func addForeignKey(column: String, constraintName: String? = nil, schema: String? = nil, table: String, columns: [String], onDelete: ReferentialAction? = nil, onUpdate: ReferentialAction? = nil) -> Self {\n        guard columns.count > 0 else { return self }\n        var parts = SwifQL.parts\n        parts.append(o: .add)\n        if let constraintName = constraintName {\n            parts.append(o: .space)\n            parts.append(o: .constraint)\n            parts.append(o: .space)\n            parts.append(SwifQLPartColumn(constraintName))\n        }\n        parts.append(o: .space)\n        parts.append(o: .foreign)\n        parts.append(o: .space)\n        parts.append(o: .key)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(SwifQLPartColumn(column))\n        parts.append(o: .closeBracket)\n        parts.append(o: .space)\n        parts.append(o: .references)\n        parts.append(o: .space)\n        parts.append(SwifQLPartTable(schema: schema, table: table))\n        parts.append(o: .openBracket)\n        columns.enumerated().forEach { i, name in\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(SwifQLPartColumn(name))\n        }\n        parts.append(o: .closeBracket)\n        if let action = onDelete {\n            parts.append(o: .space)\n            parts.append(o: .on)\n            parts.append(o: .space)\n            parts.append(o: .delete)\n            parts.append(o: .space)\n            parts.append(contentsOf: action.parts)\n        }\n        if let action = onUpdate {\n            parts.append(o: .space)\n            parts.append(o: .on)\n            parts.append(o: .space)\n            parts.append(o: .update)\n            parts.append(o: .space)\n            parts.append(contentsOf: action.parts)\n        }\n        combinedAlterActions.append(parts)\n        return self\n    }\n    \n    // TODO: https://www.postgresql.org/docs/current/sql-altertable.html\n    \n    // MARK: - SET STATISTICS\n    \n    /// For setting the statistics-gathering target for each column for ANALYZE operations.\n    \n    // MARK: - SET STORAGE\n    \n    /// For setting the mode of storage for a column.\n    /// This will determine where the column is held, whether inline, or in a supplementary table.\n    \n    // MARK: - SET WITHOUT OIDS\n    \n    /// Use for removing the old column of the table.\n    \n    // MARK: - OWNER\n    \n    /// For changing the owner of a table, sequence, index or a view to a certain user.\n    \n    // MARK: - CLUSTER\n    \n    /// For marking a table to be used for carrying out future cluster operations.\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/Union.swift",
    "content": "//\n//  Union.swift\n//  SwifQL\n//\n//  Created by Taylor McIntyre on 2020-01-15.\n//\n\nimport Foundation\n\n//MARK: UNION\n\npublic class Union: SwifQLable {\n    public var parts: [SwifQLPart]\n    \n    public convenience init (_ selection: SwifQLable...) {\n        self.init(selection)\n    }\n    \n    public init (_ selections: [SwifQLable]) {\n        parts = [SwifQLPartOperator.openBracket]\n        for (i, v) in selections.enumerated() {\n            if i > 0 {\n                parts.append(o: .space)\n                parts.append(o: .union)\n                parts.append(o: .space)\n                parts.append(o: .openBracket)\n            }\n            parts.append(contentsOf: v.parts)\n            parts.append(o: .closeBracket)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Builders/With.swift",
    "content": "//\n//  With.swift\n//  SwifQL\n//\n//  Created by Taylor McIntyre on 2020-01-16.\n//\n\nimport Foundation\n\n//MARK: WITH\n\npublic class With: SwifQLable {\n    public var parts: [SwifQLPart]\n    \n    public init(_ table: SwifQLable, columns: [SwifQLable] = [], _ query: SwifQLable) {\n        parts = table.parts\n        if !columns.isEmpty {\n            parts.append(o: .space)\n            parts.append(o: .openBracket)\n            for (i, v) in columns.enumerated() {\n                if i > 0 {\n                    parts.append(o: .comma)\n                    parts.append(o: .space)\n                }\n                parts.append(contentsOf: v.parts)\n            }\n            parts.append(o: .closeBracket)\n        }\n        parts.append(o: .space)\n        parts.append(o: .as)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: query.parts)\n        parts.append(o: .closeBracket)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Codable.swift",
    "content": "//\n//  Codable.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 25.04.2020.\n//\n\nimport Foundation\n\npublic protocol SwifQLCodable: Codable, SwifQLable {}\n\nextension SwifQLCodable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\n\npublic protocol SwifQLEncodable: Encodable, SwifQLable {}\n\nextension SwifQLEncodable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\n\nextension Array: SwifQLCodable where Element: SwifQLCodable {}\n"
  },
  {
    "path": "Sources/SwifQL/Column.swift",
    "content": "//\n//  Column.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 26.01.2020.\n//\n\nimport Foundation\n\npublic protocol AnyColumn {\n    var name: String { get }\n    var type: SwifQL.`Type` { get }\n    var `default`: ColumnDefault? { get }\n    var constraints: [Constraint] { get }\n    var inputValue: Encodable? { get }\n    var isChanged: Bool { get }\n    func encode(to encoder: Encoder) throws\n    func decode(from decoder: Decoder) throws\n}\n\npublic protocol ColumnRepresentable {\n    associatedtype Value: Codable\n    var column: Column<Value> { get }\n}\n\n#if swift(>=5.4)\nprivate protocol AnyOptional {\n    static var nilValue: Self { get }\n}\n\nextension Optional: AnyOptional {\n    static var nilValue: Optional<Wrapped> { .none }\n}\n#endif\n\n@propertyWrapper\npublic final class Column<Value>: AnyColumn, ColumnRepresentable, ColumnRootNameable, Encodable where Value: Codable {\n    public let name: String\n    public let type: SwifQL.`Type`\n    public let `default`: ColumnDefault?\n    public let constraints: [Constraint]\n    \n    var outputValue: Value?\n    public internal(set) var inputValue: Encodable?\n    public var isChanged: Bool = false\n    \n    public var column: Column<Value> { self }\n    public var columnName: String { column.name }\n    \n    public var projectedValue: Column<Value> { self }\n    \n    public var wrappedValue: Value {\n        get {\n            if let value = self.inputValue {\n                return value as! Value\n            } else if let value = self.outputValue {\n                return value\n            } else {\n                #if swift(>=5.4)\n                if let type = Value.self as? AnyOptional.Type {\n                    return type.nilValue as! Value\n                }\n                #endif\n                fatalError(\"Cannot access \\\"\\(columnName)\\\" field before it is initialized or fetched\")\n            }\n        }\n        set {\n            self.inputValue = newValue\n            self.isChanged = true\n        }\n    }\n    \n    /// Type will be selected automatically based on Swift type\n    public init(_ name: String, default: ColumnDefault? = nil, constraints: Constraint...) {\n        let autoType = Self.autoType(constraints)\n        self.name = name\n        self.type = autoType.type\n        self.default = `default`\n        var constraints = constraints\n        if !autoType.isOptional, !constraints.contains(where: { $0.isNotNull || $0.isPrimaryKey }) {\n            constraints.append(.notNull)\n        }\n        self.constraints = constraints\n    }\n    \n    public init(name: String, type: SwifQL.`Type`, default: ColumnDefault? = nil, constraints: Constraint...) {\n        self.name = name\n        self.type = type\n        self.default = `default`\n        self.constraints = constraints\n    }\n    \n    /// See `Codable`\n    \n    public func encode(to encoder: Encoder) throws {\n        var container = encoder.singleValueContainer()\n        try container.encode(self.wrappedValue)\n    }\n\n    public func decode(from decoder: Decoder) throws {\n        let container = try decoder.singleValueContainer()\n        if let valueType = Value.self as? _Optional.Type {\n            if container.decodeNil() {\n                self.wrappedValue = (valueType._none as! Value)\n            } else {\n                self.wrappedValue = try container.decode(Value.self)\n            }\n        } else {\n            self.wrappedValue = try container.decode(Value.self)\n        }\n        self.isChanged = false\n    }\n}\n\npublic struct ColumnDefault {\n    let query: SwifQLable\n    \n    init (_ query: SwifQLable) {\n        self.query = query\n    }\n    \n    public static func `default`(_ v: Any) -> ColumnDefault {\n        var parts: [SwifQLPart] = []\n        parts.append(o: .default)\n        parts.append(o: .space)\n        parts.append(safe: v)\n        return .init(SwifQLableParts(parts: parts))\n    }\n    \n    public static func `default`(_ expression: SwifQLable) -> ColumnDefault {\n        var parts: [SwifQLPart] = []\n        parts.append(o: .default)\n        parts.append(o: .space)\n        parts.append(contentsOf: expression.parts)\n        return .init(SwifQLableParts(parts: parts))\n    }\n    \n    public static func `default`(sequence name: String) -> ColumnDefault {\n        .init(SwifQLableParts(parts: Op.custom(name)))\n    }\n}\n\npublic protocol ColumnRoot {\n    init ()\n    \n    static func key<C>(for column: KeyPath<Self, C>) -> String where C: ColumnRootNameable\n}\n\nextension ColumnRoot {\n    public static func key<Column>(for column: KeyPath<Self, Column>) -> String where Column: ColumnRootNameable {\n        Self.init()[keyPath: column].columnName\n    }\n}\n\npublic protocol ColumnRootNameable {\n    var columnName: String { get }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Constraint.swift",
    "content": "//\n//  Constraint.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 19.04.2020.\n//\n\nimport Foundation\n\npublic struct Constraint {\n    let query: SwifQLable\n    \n    init (_ query: SwifQLable) {\n        self.query = query\n    }\n    \n    var isPrimaryKey = false\n    var isNotNull = false\n    \n    public static var primaryKey: Constraint {\n        var constraint = Constraint(SwifQL.primary.key)\n        constraint.isPrimaryKey = true\n        return constraint\n    }\n    \n    public static var unique: Constraint {\n        .init(SwifQL.unique)\n    }\n    \n    public static var notNull: Constraint {\n        var constraint = Constraint(SwifQL.not.null)\n        constraint.isNotNull = true\n        return constraint\n    }\n    \n    public static func check(name: String? = nil, _ expression: SwifQLable) -> Constraint {\n        var query = SwifQL\n        if let name = name {\n            query = query.constraint[any: Path.Column(name)]\n        }\n        return .init(query.check.values(expression))\n    }\n    \n    public static func references<T: Table>(_ table: T.Type, onDelete: ReferentialAction? = nil, onUpdate: ReferentialAction? = nil) -> Constraint {\n        var schemaName: String?\n        if let schemable = table as? Schemable.Type {\n            schemaName = schemable.schemaName\n        }\n        return references(schemaName, table.tableName, onDelete: onDelete, onUpdate: onUpdate)\n    }\n    \n    public static func references(_ schema: String? = nil, _ table: String, onDelete: ReferentialAction? = nil, onUpdate: ReferentialAction? = nil) -> Constraint {\n        var query = SwifQL.references[any: Path.SchemaWithTable(schema: schema, table: table)]\n        if let action = onDelete {\n            query = query.on.delete[any: action]\n        }\n        if let action = onUpdate {\n            query = query.on.update[any: action]\n        }\n        return .init(query)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Dialect/Dialect+MySQL.swift",
    "content": "//\n//  Dialect+MySQL.swift\n//\n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\nclass MySQLDialect: SQLDialect {\n    override var id: String? { \"mysql\" }\n    \n    override func keyPath(_ keyPath: SwifQLPartKeyPath) -> String {\n        var result = \"\"\n        if let schema = keyPath.schema {\n            result.append(schemaName(schema))\n        }\n        if let table = keyPath.table {\n            if result.count > 0 {\n                result.append(\".\")\n            }\n            result.append(tableName(table))\n        }\n        if let lastPath = keyPath.paths.last {\n            if result.count > 0 {\n                result.append(\".\")\n            }\n            result.append(lastPath)\n        }\n        return result\n    }\n    \n    override func date(_ value: Date) -> String {\n        Fn.from_unixtime(value.timeIntervalSince1970).prepare(self).plain\n    }\n    \n    override func bindKey(_ i: Int) -> String { \"?\" }\n    \n    override var arrayStart: String { \"'\" }\n    \n    override var arrayEnd: String { \"'\" }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Dialect/Dialect+Postgres.swift",
    "content": "//\n//  Dialect+Postgres.swift\n//\n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\nclass PostgreSQLDialect: SQLDialect {\n    override var id: String? { \"psql\" }\n    \n    override func schemaName(_ value: String) -> String { value.doubleQuotted }\n    \n    override func tableName(_ value: String) -> String { value.doubleQuotted }\n    \n    override func alias(_ value: String) -> String { value.doubleQuotted }\n    \n    override func column(_ value: String) -> String { value.doubleQuotted }\n    \n    override func jsonField(_ value: String) -> String { value.singleQuotted }\n    \n    override func keyPath(_ keyPath: SwifQLPartKeyPath) -> String {\n        var result = \"\"\n        if let schema = keyPath.schema {\n            result.append(schemaName(schema))\n        }\n        if let table = keyPath.table {\n            if result.count > 0 {\n                result.append(\".\")\n            }\n            result.append(tableName(table))\n        }\n        for (i, v) in keyPath.paths.enumerated() {\n            if i == 0 {\n                if result.count > 0 {\n                    result.append(\".\")\n                }\n                result.append(column(v))\n            } else {\n                if keyPath.asText, i == keyPath.paths.count - 1 {\n                    result.append(\"->>\")\n                } else {\n                    result.append(\"->\")\n                }\n                result.append(jsonField(v))\n            }\n        }\n        return result\n    }\n    \n    private lazy var _dateFormatter = PostgresDateFormatter()\n    \n    override func date(_ value: Date) -> String {\n        let date = _dateFormatter.string(from: value) => .timestamptz\n        let result = |date|\n        return result.prepare(self).plain\n    }\n    \n    // returns $1 $2 $3 binding keys for PostgreSQL\n    override func bindKey(_ i: Int) -> String { \"$\\(i)\" }\n    \n    override var arrayStart: String { Operator.array._value + Operator.openSquareBracket._value }\n    override var emptyArrayStart: String { \"'\" + Operator.openBrace._value }\n    \n    override var arrayEnd: String { Operator.closeSquareBracket._value }\n    override var emptyArrayEnd: String { Operator.closeBrace._value + \"'\" }\n}\n\nclass PostgresDateFormatter: DateFormatter {\n    override init() {\n        super.init()\n        calendar = Calendar(identifier: .iso8601)\n        locale = Locale(identifier: \"en_US_POSIX\")\n        timeZone = TimeZone.current\n        dateFormat = \"yyyy-MM-dd HH:mm:ssZZZZZ\"\n    }\n    \n    required init?(coder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Dialect/Dialect.swift",
    "content": "//\n//  Dialect.swift\n//\n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\nopen class SQLDialect {\n    open var id: String? { nil }\n    \n    public static var mysql: SQLDialect {\n        MySQLDialect()\n    }\n    \n    public static var psql: SQLDialect {\n        PostgreSQLDialect()\n    }\n    \n    public static var all: [SQLDialect] {\n        [.psql, .mysql]\n    }\n    \n    /// Good choice only for super short and universal queries like `BEGIN;`, `ROLLBACK;`, `COMMIT;`\n    public static var any: SQLDialect {\n        .init()\n    }\n    \n    init () {}\n    \n    open func boolValue(_ value: Bool) -> String {\n        value ? \"TRUE\" : \"FALSE\"\n    }\n    \n    open var arrayStart: String { \"\" }\n    open var emptyArrayStart: String { arrayStart }\n    \n    open var arraySeparator: String { Operator.comma._value }\n    \n    open var arrayEnd: String { \"\" }\n    open var emptyArrayEnd: String { arrayEnd }\n    \n    open func schemaName(_ value: String) -> String { value }\n    \n    open func tableName(_ value: String) -> String { value }\n    \n    open func alias(_ value: String) -> String { value }\n    \n    open func column(_ value: String) -> String { value }\n    \n    open func stringValue(_ value: String) -> String { value.singleQuotted }\n    \n    open func uuidValue(_ value: UUID) -> String { stringValue(value.uuidString) }\n    \n    open func jsonField(_ value: String) -> String { value }\n    \n    open func tableName(_ tableName: String, andAlias alias: String) -> String {\n        self.tableName(tableName) + \" AS \" + self.alias(alias)\n    }\n    \n    open func keyPath(_ keyPath: SwifQLPartKeyPath) -> String {\n        \"<key_path_should_be_here: override dialect function to fix>\"\n    }\n    \n    open func date(_ value: Date) -> String {\n        \"<date_should_be_here: override dialect function to fix>\"\n    }\n    \n    open var null: String { \"NULL\" }\n    \n    open func safeValue(_ value: Any?) -> String {\n        guard let value = value else { return null }\n        switch value {\n        case let v as String: return stringValue(v)\n        case let v as UUID: return uuidValue(v)\n        case let v as Bool: return boolValue(v)\n        case let v as UInt: return String(describing: v)\n        case let v as UInt8: return String(describing: v)\n        case let v as UInt16: return String(describing: v)\n        case let v as UInt32: return String(describing: v)\n        case let v as UInt64: return String(describing: v)\n        case let v as Int: return String(describing: v)\n        case let v as Int8: return String(describing: v)\n        case let v as Int16: return String(describing: v)\n        case let v as Int32: return String(describing: v)\n        case let v as Int64: return String(describing: v)\n        case let v as Float: return String(describing: v)\n        case let v as Double: return String(describing: v)\n        case let v as Decimal: return String(describing: v)\n        default: return stringValue(String(describing: \"<unsafe value>\")) // TODO:\n        }\n    }\n    \n    // MARK: - Binding (for formatter)\n    \n    open var bindSymbol: String { \"§§§\" }\n    \n    open func bindKey(_ i: Int) -> String { \"?\" }\n}\n\nextension SQLDialect: Equatable {\n    public static func == (lhs: SQLDialect, rhs: SQLDialect) -> Bool {\n        lhs.id == rhs.id\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Enum.swift",
    "content": "//\n//  Enum.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic protocol AnySwifQLEnum: Codable, SwifQLable {\n    static var name: String { get }\n    var anyRawValue: Any { get }\n}\n\nprotocol AnySwifQLEnumArray {\n    var items: [AnySwifQLEnum] { get }\n}\n\nextension Array: AnySwifQLEnumArray where Element: AnySwifQLEnum {\n    var items: [AnySwifQLEnum] { self }\n}\n\npublic protocol SwifQLEnum: AnySwifQLEnum, RawRepresentable, CaseIterable {\n    static var name: String { get }\n}\n\nextension SwifQLEnum {\n    public static var name: String { String(describing: Self.self).lowercased() }\n    public var anyRawValue: Any { rawValue }\n}\n\n/// See `SwifQLable`\nextension SwifQLEnum {\n    public var parts: [SwifQLPart] { [SwifQLPartSafeValue(rawValue)] }\n}\n\n/// Allows to compare enum with enum column\n///\n/// Usage:\n/// \n/// ```swift\n/// \\User.$status == UserStatus.banned\n/// ```\npublic func == <A, B>(lhs: KeyPath<A, B>, rhs: B.Value.RawValue) -> SwifQLable\n    where A: Table, B: ColumnRepresentable, B: ColumnRootNameable, B.Value: SwifQLEnum {\n    SwifQLPredicate(operator: .equal, lhs: lhs, rhs: SwifQLableParts(parts: SwifQLPartSafeValue(rhs)))\n}\n"
  },
  {
    "path": "Sources/SwifQL/Extensions/Array+SwifQLable.swift",
    "content": "//\n//  Array+SwifQLable.swift\n//\n//\n//  Created by Mihael Isaev on 26.01.2020.\n//\n\nimport Foundation\n\nextension Array: SwifQLable where Element: SwifQLable {\n    public var parts: [SwifQLPart] {\n        if let _ = Element.self as? AnySwifQLEnum.Type {\n            let values = compactMap {\n                ($0 as? AnySwifQLEnum)?.anyRawValue as? String\n            }.joined(separator: \",\")\n            return [SwifQLPartSafeValue(\"{\\(values)}\")]\n        }\n        if let s = self as? SwifQLCodable {\n            return [SwifQLPartUnsafeValue(s)]\n        } else {\n            return separator(.comma).parts\n        }\n    }\n}\n\nextension Array where Element: SwifQLable {\n    public func separator(_ separator: SwifQLableArraySeparator) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        for (i, v) in enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n\nextension Array: SwifQLPart where Element: SwifQLable {}\n\nextension Array: SwifQLPartArray where Element: SwifQLable {\n    public var elements: [SwifQLable] { self }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Extensions/Column+AutoType.swift",
    "content": "//\n//  Column+AutoType.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\nextension Column {\n    struct AutoType {\n        let type: SwifQL.`Type`\n        let isOptional: Bool\n        \n        init (_ type: SwifQL.`Type`, _ isOptional: Bool) {\n            self.type = type\n            self.isOptional = isOptional\n        }\n    }\n    \n    static func autoType(_ constraints: [Constraint]) -> AutoType {\n        var isOptional = false\n        switch Value.self {\n        case is Optional<String>.Type: isOptional = true; fallthrough\n        case is String.Type: return .init(.text, isOptional)\n        \n        case is Optional<[String]>.Type: isOptional = true; fallthrough\n        case is [String].Type: return .init(.textArray, isOptional)\n        \n        case is Optional<UUID>.Type: isOptional = true; fallthrough\n        case is UUID.Type: return .init(.uuid, isOptional)\n        \n        case is Optional<[UUID]>.Type: isOptional = true; fallthrough\n        case is [UUID].Type: return .init(.uuidArray, isOptional)\n        \n        case is Optional<Double>.Type: isOptional = true; fallthrough\n        case is Double.Type: return .init(.decimal, isOptional)\n        \n        case is Optional<[Double]>.Type: isOptional = true; fallthrough\n        case is [Double].Type: return .init(.decimalArray, isOptional)\n        \n        case is Optional<Float>.Type: isOptional = true; fallthrough\n        case is Float.Type: return .init(.float4, isOptional)\n        \n        case is Optional<[Float]>.Type: isOptional = true; fallthrough\n        case is [Float].Type: return .init(.float4Array, isOptional)\n        \n        case is Optional<UInt>.Type: isOptional = true; fallthrough\n        case is UInt.Type: fallthrough\n        \n        case is Optional<UInt8>.Type: isOptional = true; fallthrough\n        case is UInt8.Type: fallthrough\n        \n        case is Optional<UInt16>.Type: isOptional = true; fallthrough\n        case is UInt16.Type: fallthrough\n        \n        case is Optional<UInt32>.Type: isOptional = true; fallthrough\n        case is UInt32.Type: fallthrough\n        \n        case is Optional<UInt64>.Type: isOptional = true; fallthrough\n        case is UInt64.Type: return .init(.int, isOptional)\n        \n        case is Optional<[UInt]>.Type: isOptional = true; fallthrough\n        case is [UInt].Type: fallthrough\n        \n        case is Optional<[UInt8]>.Type: isOptional = true; fallthrough\n        case is [UInt8].Type: fallthrough\n        \n        case is Optional<[UInt16]>.Type: isOptional = true; fallthrough\n        case is [UInt16].Type: fallthrough\n        \n        case is Optional<[UInt32]>.Type: isOptional = true; fallthrough\n        case is [UInt32].Type: fallthrough\n        \n        case is Optional<[UInt64]>.Type: isOptional = true; fallthrough\n        case is [UInt64].Type: return .init(.intArray, isOptional)\n        \n        case is Optional<Int8>.Type: isOptional = true; fallthrough\n        case is Int8.Type: fallthrough\n        \n        case is Optional<Int16>.Type: isOptional = true; fallthrough\n        case is Int16.Type: fallthrough\n        \n        case is Optional<Int32>.Type: isOptional = true; fallthrough\n        case is Int32.Type: fallthrough\n        \n        case is Optional<Int>.Type: isOptional = true; fallthrough\n        case is Int.Type:\n            if constraints.contains(where: { $0.isPrimaryKey }) {\n                return .init(.serial, isOptional)\n            } else {\n                return .init(.int, isOptional)\n            }\n        \n        case is Optional<Int64>.Type: isOptional = true; fallthrough\n        case is Int64.Type:\n            if constraints.contains(where: { $0.isPrimaryKey }) {\n                return .init(.bigserial, isOptional)\n            } else {\n                return .init(.bigint, isOptional)\n            }\n        \n        case is Optional<[Int8]>.Type: isOptional = true; fallthrough\n        case is [Int8].Type: fallthrough\n        \n        case is Optional<[Int16]>.Type: isOptional = true; fallthrough\n        case is [Int16].Type: fallthrough\n        \n        case is Optional<[Int32]>.Type: isOptional = true; fallthrough\n        case is [Int32].Type: fallthrough\n        \n        case is Optional<[Int]>.Type: isOptional = true; fallthrough\n        case is [Int].Type: return .init(.intArray, isOptional)\n        \n        case is Optional<[Int64]>.Type: isOptional = true; fallthrough\n        case is [Int64].Type: return .init(.bigintArray, isOptional)\n        \n        case is Optional<Date>.Type: isOptional = true; fallthrough\n        case is Date.Type: return .init(.timestamptz, isOptional)\n        \n        case is Optional<[Date]>.Type: isOptional = true; fallthrough\n        case is [Date].Type: return .init(.timestamptzArray, isOptional)\n        \n        case is Optional<Data>.Type: isOptional = true; fallthrough\n        case is Data.Type: return .init(.bytea, isOptional)\n        \n        case is Optional<[Data]>.Type: isOptional = true; fallthrough\n        case is [Data].Type: return .init(.byteaArray, isOptional)\n            \n        case is AnyOptionalEnum.Type:\n            guard let t = Value.self as? AnyOptionalEnum.Type else { fallthrough }\n            return .init(.custom(t.name), true)\n        case is AnySwifQLEnum.Type:\n            guard let t = Value.self as? AnySwifQLEnum.Type else { fallthrough }\n            return .init(.custom(t.name), false)\n        \n        case is Optional<[Encodable]>.Type: isOptional = true; fallthrough\n        case is [Encodable].Type: return .init(.jsonbArray, isOptional)\n        \n        case is ClosedRange<Date>.Type: return .init(.daterange, isOptional)\n        case is Range<Date>.Type: return .init(.daterange, isOptional)\n        \n        default: return .init(.text, true)\n        }\n    }\n}\nfileprivate protocol AnyOptionalEnum {\n    static var name: String { get }\n}\nextension Optional: AnyOptionalEnum where Wrapped: AnySwifQLEnum {\n    fileprivate static var name: String { return Wrapped.name }\n}\nextension Optional {\n    fileprivate static var trololo: Wrapped.Type { return Wrapped.self }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Extensions/Decodable+Table.swift",
    "content": "//\n//  Decodable+Table.swift\n//  \n//\n//  Created by Mihael Isaev on 26.01.2020.\n//\n\nimport Foundation\n\nextension Decodable {\n    public static var table: SwifQLable {\n        let tableName: String\n        if let model = Self.self as? AnyTable.Type {\n            tableName = model.tableName\n        } else {\n            tableName = String(describing: Self.self)\n        }\n        if let schema = Self.self as? Schemable.Type {\n            return Path.SchemaWithTable(schema: schema.schemaName, table: tableName)\n        } else {\n            return Path.Table(tableName)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Extensions/StringExtensions.swift",
    "content": "//\n//  StringExtensions.swift\n//  App\n//\n//  Created by Mihael Isaev on 06.06.2018.\n//\n\nimport Foundation\n\nextension String {\n    public var singleQuotted: String {\n        \"'\\(self)'\"\n    }\n    \n    public var doubleQuotted: String {\n        \"\\\"\\(self)\\\"\"\n    }\n    \n    public var roundBracketted: String {\n        \"(\\(self))\"\n    }\n    \n    public static func singleQuotted(_ v: Any) -> String {\n        \"\\(v)\".singleQuotted\n    }\n    \n    public static func doubleQuotted(_ v: Any) -> String {\n        \"\\(v)\".doubleQuotted\n    }\n    \n    public static func roundBracketted(_ v: Any) -> String {\n        \"\\(v)\".roundBracketted\n    }\n    \n    public func `as`(_ v: String) -> String {\n        self + \" as \" + v\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/ExtractFieldValue.swift",
    "content": "//\n//  ExtractFieldValue.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29/10/2019.\n//\n\npublic struct ExtractFieldValue {\n    public let value: String\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The century\n    /// for Interval: The number of centuries\n    public static var century: ExtractFieldValue { .init(value: \"CENTURY\") }\n    \n    /// Universal\n    /// for TIMESTAMP: The day of the month (1-31)\n    /// for Interval: The number of days\n    public static var day: ExtractFieldValue { .init(value: \"DAY\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The decade that is the year divided by 10\n    /// for Interval: Sames as TIMESTAMP\n    public static var decade: ExtractFieldValue { .init(value: \"DECADE\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The day of week Sunday (0) to Saturday (6)\n    /// for Interval: N/A\n    public static var dow: ExtractFieldValue { .init(value: \"DOW\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The day of year that ranges from 1 to 366\n    /// for Interval: N/A\n    public static var doy: ExtractFieldValue { .init(value: \"DOY\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The number of seconds since 1970-01-01 00:00:00 UTC\n    /// for Interval: The total number of seconds in the interval\n    public static var epoch: ExtractFieldValue { .init(value: \"EPOCH\") }\n    \n    /// Universal\n    /// for TIMESTAMP: The hour (0-23)\n    /// for Interval: The number of hours\n    public static var hour: ExtractFieldValue { .init(value: \"HOUR\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: Day of week based on ISO 8601 Monday (1) to Saturday (7)\n    /// for Interval: N/A\n    public static var isoDow: ExtractFieldValue { .init(value: \"ISODOW\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: ISO 8601 week number of year\n    /// for Interval: N/A\n    public static var isoYear: ExtractFieldValue { .init(value: \"ISOYEAR\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The seconds field, including fractional parts, multiplied by 1000000\n    /// for Interval: Sames as TIMESTAMP\n    public static var microseconds: ExtractFieldValue { .init(value: \"MICROSECONDS\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The millennium\n    /// for Interval: The number of millennium\n    public static var millenium: ExtractFieldValue { .init(value: \"MILLENNIUM\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The seconds field, including fractional parts, multiplied by 1000\n    /// for Interval: Sames as TIMESTAMP\n    public static var milliseconds: ExtractFieldValue { .init(value: \"MILLISECONDS\") }\n    \n    /// Universal\n    /// for TIMESTAMP: The minute (0-59)\n    /// for Interval: The number of minutes\n    public static var minute: ExtractFieldValue { .init(value: \"MINUTE\") }\n    \n    /// Universal\n    /// for TIMESTAMP: Month, 1-12\n    /// for Interval: The number of months, modulo (0-11)\n    public static var month: ExtractFieldValue { .init(value: \"MONTH\") }\n    \n    /// Universal\n    /// for TIMESTAMP: Quarter of the year\n    /// for Interval: The number of quarters\n    public static var quarter: ExtractFieldValue { .init(value: \"QUARTER\") }\n    \n    /// Universal\n    /// for TIMESTAMP: The second\n    /// for Interval: The number of seconds\n    public static var second: ExtractFieldValue { .init(value: \"SECOND\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The timezone offset from UTC, measured in seconds\n    /// for Interval: N/A\n    public static var timeZone: ExtractFieldValue { .init(value: \"TIMEZONE\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The hour component of the time zone offset\n    /// for Interval: N/A\n    public static var timeZoneHour: ExtractFieldValue { .init(value: \"TIMEZONE_HOUR\") }\n    \n    /// Postgres specific\n    /// for TIMESTAMP: The minute component of the time zone offset\n    /// for Interval: N/A\n    public static var timeZoneMinute: ExtractFieldValue { .init(value: \"TIMEZONE_MINUTE\") }\n    \n    /// Universal\n    /// for TIMESTAMP: The number of the ISO 8601 week-numbering week of the year\n    /// for Interval: N/A\n    public static var week: ExtractFieldValue { .init(value: \"WEEK\") }\n    \n    /// Universal\n    /// for TIMESTAMP: The year\n    /// for Interval: Sames as TIMESTAMP\n    public static var year: ExtractFieldValue { .init(value: \"YEAR\") }\n    \n    /// MySQL specific\n    public static var microsecond: ExtractFieldValue { .init(value: \"MICROSECOND\") }\n    \n    /// MySQL specific\n    public static var secondMicrosecond: ExtractFieldValue { .init(value: \"SECOND_MICROSECOND\") }\n    \n    /// MySQL specific\n    public static var minuteMicrosecond: ExtractFieldValue { .init(value: \"MINUTE_MICROSECOND\") }\n    \n    /// MySQL specific\n    public static var minuteSecond: ExtractFieldValue { .init(value: \"MINUTE_SECOND\") }\n    \n    /// MySQL specific\n    public static var hourMicrosecond: ExtractFieldValue { .init(value: \"HOUR_MICROSECOND\") }\n    \n    /// MySQL specific\n    public static var hourSecond: ExtractFieldValue { .init(value: \"HOUR_SECOND\") }\n    \n    /// MySQL specific\n    public static var hourMinute: ExtractFieldValue { .init(value: \"HOUR_MINUTE\") }\n    \n    /// MySQL specific\n    public static var dayMicrosecond: ExtractFieldValue { .init(value: \"DAY_MICROSECOND\") }\n    \n    /// MySQL specific\n    public static var daySecond: ExtractFieldValue { .init(value: \"DAY_SECOND\") }\n    \n    /// MySQL specific\n    public static var dayMinute: ExtractFieldValue { .init(value: \"DAY_MINUTE\") }\n    \n    /// MySQL specific\n    public static var dayHour: ExtractFieldValue { .init(value: \"DAY_HOUR\") }\n    \n    /// MySQL specific\n    public static var yearMonth: ExtractFieldValue { .init(value: \"YEAR_MONTH\") }\n}\n"
  },
  {
    "path": "Sources/SwifQL/FluentKitFieldable.swift",
    "content": "public protocol FluentKitFieldable {\n    var schema: String { get }\n    var key: String { get }\n}\n"
  },
  {
    "path": "Sources/SwifQL/FormattedKeyPath.swift",
    "content": "//\n//  FormattedKeyPath.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 20/06/2019.\n//\n\nimport Foundation\n\n/// Formatting keypath\npublic typealias FKP = FormattedKeyPath\n\npublic struct FormattedKeyPath {\n    let _table: String\n    let _paths: [String]\n    \n    public init <T: Table>(_ table: T.Type, _ paths: String...) {\n        _table = table.tableName\n        _paths = paths\n    }\n    \n    public init <T: Table>(_ table: T.Type, _ paths: [String]) {\n        _table = table.tableName\n        _paths = paths\n    }\n    \n    public init (_ table: String, _ paths: String...) {\n        _table = table\n        _paths = paths\n    }\n    \n    public init (_ table: String, _ paths: [String]) {\n        _table = table\n        _paths = paths\n    }\n}\n\nextension FormattedKeyPath: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [SwifQLPartKeyPath(table: _table, paths: _paths)]\n    }\n}\n\nextension FormattedKeyPath: KeyPathLastPath {\n    public var lastPath: String { _paths.last ?? \"\" }\n}\n\nextension Table {\n    /// Manual key path. Alias to `\\User.something`\n    public static func manualKeyPath(_ paths: String...) -> FormattedKeyPath {\n        manualKeyPath(paths)\n    }\n    \n    /// Manual key path. Alias to `\\User.something`\n    public static func manualKeyPath(_ paths: [String]) -> FormattedKeyPath {\n        FormattedKeyPath(tableName, paths)\n    }\n    \n    /// Manual key path. Alias to `\\User.something`\n    public static func mkp(_ paths: String...) -> FormattedKeyPath {\n        manualKeyPath(paths)\n    }\n    \n    /// Manual key path. Alias to `\\User.something`\n    public static func mkp(_ paths: [String]) -> FormattedKeyPath {\n        manualKeyPath(paths)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Formatter.swift",
    "content": "//\n//  Formatter.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\nstruct SwifQLFormatter {\n    private let dialect: SQLDialect\n    private let mode: Mode\n    \n    init (_ dialect: SQLDialect, mode: Mode) {\n        self.dialect = dialect\n        self.mode = mode\n    }\n    \n    enum Mode {\n        case binded\n        case plain\n    }\n    \n    func string(from query: String, with formattedValues: [String]) -> String {\n        switch mode {\n        case .binded:\n            return binded(query)\n        case .plain:\n            return plain(query: query, with: formattedValues)\n        }\n    }\n    \n    private func binded(_ query: String, _ valueRetriever: @escaping (Int) -> String) -> String {\n        let rawChars: [Character] = Array(query)\n        var finalChars: [Character] = []\n        var skipTill = -1\n        var b = 1\n        for (i, char) in rawChars.enumerated() {\n            guard skipTill < i else { continue }\n            guard char == dialect.bindSymbol.first else {\n                finalChars.append(char)\n                continue\n            }\n            if dialect.bindSymbol.count > 1 {\n                guard rawChars.count >= i + dialect.bindSymbol.count else { continue }\n                for n in 1...dialect.bindSymbol.count - 1 {\n                    guard rawChars[i + n] == Array(dialect.bindSymbol)[n] else { continue }\n                }\n                skipTill = i + dialect.bindSymbol.count - 1\n            }\n            finalChars.append(contentsOf: Array(valueRetriever(b)))\n            b = b + 1\n        }\n        return String(finalChars)\n    }\n    \n    private func binded(_ query: String) -> String {\n        binded(query) { self.dialect.bindKey($0) }\n    }\n    \n    private func plain(query: String, with formattedValues: [String]) -> String {\n        binded(query) { formattedValues[$0 - 1] }\n    }\n}\n\nextension String {\n    fileprivate func split(by length: Int) -> [String] {\n        var startIndex = self.startIndex\n        var results = [Substring]()\n\n        while startIndex < self.endIndex {\n            let endIndex = self.index(startIndex, offsetBy: length, limitedBy: self.endIndex) ?? self.endIndex\n            results.append(self[startIndex..<endIndex])\n            startIndex = endIndex\n        }\n\n        return results.map { String($0) }\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+Array.swift",
    "content": "//\n//  Functions+Array.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static let array_agg: Self = .init(\"array_agg\")\n    public static let array_remove: Self = .init(\"array_remove\")\n}\n\nextension Fn {\n    ///\n    public static func array_agg(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.array_agg, body: aggregateExpression.parts)\n    }\n    \n    /// `SELECT array_remove(ARRAY[1,2,3,2], 2);` will return {1,3}\n    public static func array_remove(_ queryPart: SwifQLable...) -> SwifQLable {\n        array_remove(queryPart)\n    }\n    \n    /// `SELECT array_remove(ARRAY[1,2,3,2], 2);` will return {1,3}\n    public static func array_remove(_ queryParts: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        for (i, q) in queryParts.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: q.parts)\n        }\n        return build(.array_remove, body: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+General.swift",
    "content": "//\n//  Functions+General.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var substr: Self = .init(\"substr\")\n    public static var coalesce: Self = .init(\"coalesce\")\n    public static var octet_length: Self = .init(\"octet_length\")\n    public static var cast: Self = .init(\"cast\")\n    public static var ifnull: Self = .init(\"ifnull\")\n    public static var isnull: Self = .init(\"isnull\")\n    public static var nvl: Self = .init(\"nvl\")\n    public static var expression: Self = .init(\"expression\")\n}\n\nextension Fn {\n    public static func substr(_ queryPart: SwifQLable, _ to: Int) -> SwifQLable {\n        var parts: [SwifQLPart] = queryPart.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(safe: to)\n        return build(.substr, body: parts)\n    }\n    \n    /// `SELECT COALESCE (NULL, 2 , 1);` will return 2\n    public static func coalesce(_ queryPart: SwifQLable...) -> SwifQLable {\n        coalesce(queryPart)\n    }\n    \n    /// `SELECT COALESCE (NULL, 2 , 1);` will return 2\n    public static func coalesce(_ queryParts: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        for (i, q) in queryParts.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n            }\n            parts.append(contentsOf: q.parts)\n        }\n        return build(.coalesce, body: parts)\n    }\n    \n    public static func octet_length(_ string: SwifQLable) -> SwifQLable {\n        build(.octet_length, body: string.parts)\n    }\n    \n    public static func cast(_ queryPart: SwifQLable, _ to: Type) -> SwifQLable {\n        cast(nil, queryPart, to)\n    }\n    \n    public static func cast(_ from: Type?, _ queryPart: SwifQLable, _ to: Type) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        if let from = from?.name {\n            parts.append(o: .custom(from))\n            parts.append(o: .space)\n        }\n        parts.append(contentsOf: queryPart.parts)\n        parts.append(o: .space)\n        parts.append(o: .as)\n        parts.append(o: .space)\n        parts.append(o: .custom(to.name))\n        return build(.cast, body: parts)\n    }\n    \n    public static func ifNull(_ value1: SwifQLable, _ value2: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = value1.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: value2.parts)\n        return build(.ifnull, body: parts)\n    }\n    \n    public static func isNull(_ value1: SwifQLable, _ value2: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = value1.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: value2.parts)\n        return build(.isnull, body: parts)\n    }\n    \n    public static func nvl(_ value1: SwifQLable, _ value2: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = value1.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: value2.parts)\n        return build(.nvl, body: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+MySQL.swift",
    "content": "//\n//  Functions+MySQL.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var from_unixtime: Self = .init(\"FROM_UNIXTIME\")\n    public static var date_format: Self = .init(\"DATE_FORMAT\")\n}\n\nextension Fn {\n    public static func from_unixtime(_ timeinterval: SwifQLable, _ format: String? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = timeinterval.parts\n        if let format = format {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(o: .custom(format.singleQuotted))\n        }\n        return build(.from_unixtime, body: parts)\n    }\n\n    /// Formats the date value according to the format string.\n    /// # Example\n    /// ```swift\n    /// Fn.date_format(\\User.createdAt, \"%y-%m\")\n    /// ```\n    /// # Result\n    /// ```\n    /// date_format(User.createdAt, '%y-%m')\n    /// ```\n    /// [Learn more →](https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format)\n    /// [Learn more →](https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format)\n    public static func date_format(_ datetime: SwifQLable, _ format: String) -> SwifQLable {\n        var parts: [SwifQLPart] = datetime.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(o: .custom(format.singleQuotted))\n        return build(.date_format, body: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+Numeric.swift",
    "content": "//\n//  Functions+Numeric.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var abs: Self = .init(\"abs\")\n    public static var avg: Self = .init(\"avg\")\n    public static var ceil: Self = .init(\"ceil\")\n    public static var ceiling: Self = .init(\"ceiling\")\n    public static var count: Self = .init(\"count\")\n    public static var div: Self = .init(\"div\")\n    public static var exp: Self = .init(\"exp\")\n    public static var floor: Self = .init(\"floor\")\n    public static var max: Self = .init(\"max\")\n    public static var min: Self = .init(\"min\")\n    public static var mod: Self = .init(\"mod\")\n    public static var power: Self = .init(\"power\")\n    public static var random: Self = .init(\"random\")\n    public static var round: Self = .init(\"round\")\n    public static var setseed: Self = .init(\"setseed\")\n    public static var sign: Self = .init(\"sign\")\n    public static var sqrt: Self = .init(\"sqrt\")\n    public static var sum: Self = .init(\"sum\")\n}\n\nextension Fn {\n    /// Returns the absolute value of a number\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/abs.php)\n    public static func abs(_ number: SwifQLable) -> SwifQLable {\n        build(.abs, body: number.parts)\n    }\n    \n    /// Returns the average value of an expression\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/avg.php)\n    public static func avg(_ quantity: SwifQLable) -> SwifQLable {\n        build(.avg, body: quantity.parts)\n    }\n    \n    /// Returns the smallest integer value that is greater than or equal to a number\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/ceil.php)\n    public static func ceil(_ number: SwifQLable) -> SwifQLable {\n        build(.ceil, body: number.parts)\n    }\n    \n    /// Returns the smallest integer value that is greater than or equal to a number\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/ceiling.php)\n    public static func ceiling(_ number: SwifQLable) -> SwifQLable {\n        build(.ceiling, body: number.parts)\n    }\n    \n    /// Returns the count of an expression\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/count.php)\n    public static func count(_ expression: SwifQLable) -> SwifQLable {\n        build(.count, body: expression.parts)\n    }\n    \n    /// Used for integer division where n is divided by m and an integer value is returned\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/div.php)\n    public static func div(_ n: SwifQLable, _ m: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = n.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: m.parts)\n        return build(.div, body: parts)\n    }\n    \n    /// Used for integer division where n is divided by m and an integer value is returned\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/exp.php)\n    public static func exp(_ n: SwifQLable, _ m: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = n.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: m.parts)\n        return build(.exp, body: parts)\n    }\n    \n    /// Returns the largest integer value that is equal to or less than a number\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/floor.php)\n    public static func floor(_ number: SwifQLable) -> SwifQLable {\n        build(.floor, body: number.parts)\n    }\n    \n    /// Returns the maximum value of an expression\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/max.php)\n    public static func max(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.max, body: aggregateExpression.parts)\n    }\n    \n    /// Returns the minimum value of an expression\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/min.php)\n    public static func min(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.min, body: aggregateExpression.parts)\n    }\n    \n    /// Returns the remainder of n divided by m\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/mod.php)\n    public static func mod(_ n: SwifQLable, _ m: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = n.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: m.parts)\n        return build(.mod, body: parts)\n    }\n    \n    /// Returns m raised to the nth power\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/power.php)\n    public static func power(_ n: SwifQLable, _ m: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = n.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: m.parts)\n        return build(.power, body: parts)\n    }\n    \n    /// Random function can be used to return a random number or a random number within a range\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/random.php)\n    public static func random() -> SwifQLable {\n        build(.random, body: [])\n    }\n    \n    /// Returns a number rounded to a certain number of decimal places\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/round.php)\n    public static func round(_ number: SwifQLable, _ decimalPlaces: Int? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = number.parts\n        if let decimalPlaces = decimalPlaces {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(safe: decimalPlaces)\n        }\n        return build(.round, body: parts)\n    }\n    \n    /// Can be used to set a seed for the next time that you call the random function.\n    /// If you do not call setseed, PostgreSQL will use its own seed value.\n    /// This may or may not be truly random.\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/setseed.php)\n    public static func setseed(_ number: SwifQLable) -> SwifQLable {\n        build(.setseed, body: number.parts)\n    }\n    \n    /// Returns a value indicating the sign of a number\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/sign.php)\n    public static func sign(_ number: SwifQLable) -> SwifQLable {\n        build(.sign, body: number.parts)\n    }\n    \n    /// Returns the square root of a number\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/sqrt.php)\n    public static func sqrt(_ number: SwifQLable) -> SwifQLable {\n        build(.sqrt, body: number.parts)\n    }\n    \n    /// Returns the summed value of an expression\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/sum.php)\n    public static func sum(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.sum, body: aggregateExpression.parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+PostgresBool.swift",
    "content": "//\n//  Functions+PostgresBool.swift\n//  SwifQL\n//\n//  Created by Ethan Lozano on 06.12.20.\n//\n\nimport Foundation\n\nextension Fn.Name {\n    public static let bool_and: Self = .init(\"bool_and\")\n    public static let bool_or: Self = .init(\"bool_or\")\n}\n\nextension Fn {\n\n    public static func bool_and(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.bool_and, body: aggregateExpression.parts)\n    }\n\n    public static func bool_or(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.bool_or, body: aggregateExpression.parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+PostgresJSON.swift",
    "content": "//\n//  Functions+PostgresJSON.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var json_agg: Self = .init(\"json_agg\")\n    public static var to_json: Self = .init(\"to_json\")\n    public static var array_to_json: Self = .init(\"array_to_json\")\n    public static var row_to_json: Self = .init(\"row_to_json\")\n    public static var json_build_array: Self = .init(\"json_build_array\")\n    public static var json_build_object: Self = .init(\"json_build_object\")\n    public static var json_object: Self = .init(\"json_object\")\n    public static var json_array_length: Self = .init(\"json_array_length\")\n    public static var json_each: Self = .init(\"json_each\")\n    public static var json_each_text: Self = .init(\"json_each_text\")\n    public static var json_extract_path: Self = .init(\"json_extract_path\")\n    public static var json_extract_path_text: Self = .init(\"json_extract_path_text\")\n    public static var json_object_keys: Self = .init(\"json_object_keys\")\n    public static var json_populate_record: Self = .init(\"json_populate_record\")\n    public static var json_populate_recordset: Self = .init(\"json_populate_recordset\")\n    public static var json_array_elements: Self = .init(\"json_array_elements\")\n    public static var json_array_elements_text: Self = .init(\"json_array_elements_text\")\n    public static var json_typeof: Self = .init(\"json_typeof\")\n    public static var json_to_record: Self = .init(\"json_to_record\")\n    public static var json_to_recordset: Self = .init(\"json_to_recordset\")\n    public static var json_strip_nulls: Self = .init(\"json_strip_nulls\")\n}\n\nextension Fn {\n    ///\n    public static func json_agg(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_agg, body: aggregateExpression.parts)\n    }\n    \n    /// Returns the value as json.\n    /// Arrays and composites are converted (recursively) to arrays and objects;\n    /// otherwise, if there is a cast from the type to json, the cast function will be used to perform the conversion;\n    /// otherwise, a scalar value is produced.\n    /// For any scalar type other than a number, a Boolean, or a null value,\n    /// the text representation will be used, in such a fashion that it is a valid json or jsonb value.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func to_json(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.to_json, body: aggregateExpression.parts)\n    }\n    \n    /// Returns the array as a JSON array.\n    /// A PostgreSQL multidimensional array becomes a JSON array of arrays.\n    /// Line feeds will be added between dimension-1 elements if pretty_bool is true\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func array_to_json(_ anyarray: SwifQLable, pretty: Bool? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = anyarray.parts\n        if let pretty = pretty {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(safe: pretty)\n        }\n        return build(.array_to_json, body: parts)\n    }\n    \n    /// Returns the row as a JSON object.\n    /// Line feeds will be added between level-1 elements if pretty_bool is true\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func row_to_json(_ record: SwifQLable, pretty: Bool? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = record.parts\n        if let pretty = pretty {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(safe: pretty)\n        }\n        return build(.row_to_json, body: parts)\n    }\n    \n    /// Builds a possibly-heterogeneously-typed JSON array out of a variadic argument list\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_build_array(_ items: SwifQLable...) -> SwifQLable {\n        json_build_array(items)\n    }\n    \n    /// Builds a possibly-heterogeneously-typed JSON array out of a variadic argument list\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_build_array(_ items: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        for (i, v) in items.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return build(.json_build_array, body: parts)\n    }\n    \n    /// Builds a JSON object out of a variadic argument list.\n    /// By convention, the argument list consists of alternating keys and values\n    /// # Example\n    /// ```swift\n    /// Fn.json_build_object(\"foo\", 1, \"bar\", 2)\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_build_object(_ items: SwifQLable...) -> SwifQLable {\n        json_build_object(items)\n    }\n    \n    /// Builds a JSON object out of a variadic argument list.\n    /// By convention, the argument list consists of alternating keys and values\n    /// # Example\n    /// ```swift\n    /// Fn.json_build_object(\"foo\", 1, \"bar\", 2)\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_build_object(_ items: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        for (i, v) in items.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return build(.json_build_object, body: parts)\n    }\n    \n    /// Builds a JSON object out of a text array.\n    /// The array must have either exactly one dimension with an even number of members,\n    /// in which case they are taken as alternating key/value pairs,\n    /// or two dimensions such that each inner array has exactly two elements, which are taken as a key/value pair\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_object(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_object, body: aggregateExpression.parts)\n    }\n    \n    /// This form of json_object takes keys and values pairwise from two separate arrays.\n    /// In all other respects it is identical to the one-argument form.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_object(keys: SwifQLable, values: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = keys.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: values.parts)\n        return build(.json_object, body: parts)\n    }\n    \n    /// Returns the number of elements in the outermost JSON array\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_array_length(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_array_length, body: aggregateExpression.parts)\n    }\n    \n    /// Expands the outermost JSON object into a set of key/value pairs\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_each(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_each, body: aggregateExpression.parts)\n    }\n    \n    /// Expands the outermost JSON object into a set of key/value pairs. The returned values will be of type text\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_each_text(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_each_text, body: aggregateExpression.parts)\n    }\n    \n    /// Returns JSON value pointed to by path_elems (equivalent to #> operator)\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_extract_path(_ from_json: SwifQLable, path_elems: [String]) -> SwifQLable {\n        var parts: [SwifQLPart] = from_json.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        for (i, v) in path_elems.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        \n        return build(.json_extract_path, body: parts)\n    }\n    \n    public static func json_extract_path(_ from_json: SwifQLable, path_elems: String...) -> SwifQLable {\n        json_extract_path(from_json, path_elems: path_elems)\n    }\n    \n    /// Returns JSON value pointed to by path_elems as text (equivalent to #>> operator)\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_extract_path_text(_ from_json: SwifQLable, path_elems: [String]) -> SwifQLable {\n        var parts: [SwifQLPart] = from_json.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        for (i, v) in path_elems.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        \n        return build(.json_extract_path_text, body: parts)\n    }\n    \n    public static func json_extract_path_text(_ from_json: SwifQLable, path_elems: String...) -> SwifQLable {\n        json_extract_path_text(from_json, path_elems: path_elems)\n    }\n    \n    /// Returns set of keys in the outermost JSON object.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_object_keys(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_object_keys, body: aggregateExpression.parts)\n    }\n    \n    /// Expands the object in from_json to a row whose columns match the record type defined by base (see note below).\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_populate_record(base: SwifQLable, from_json: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = base.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: from_json.parts)\n        return build(.json_populate_record, body: parts)\n    }\n    \n    /// Expands the outermost array of objects in from_json to a set of rows whose columns match the record type defined by base (see note below).\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_populate_recordset(base: SwifQLable, from_json: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = base.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: from_json.parts)\n        return build(.json_populate_recordset, body: parts)\n    }\n    \n    /// Expands a JSON array to a set of JSON values.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_array_elements(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_array_elements, body: aggregateExpression.parts)\n    }\n    \n    /// Expands a JSON array to a set of text values.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_array_elements_text(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_array_elements_text, body: aggregateExpression.parts)\n    }\n    \n    /// Returns the type of the outermost JSON value as a text string. Possible types are object, array, string, number, boolean, and null.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_typeof(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_typeof, body: aggregateExpression.parts)\n    }\n    \n    /// Builds an arbitrary record from a JSON object (see note below). As with all functions returning record, the caller must explicitly define the structure of the record with an AS clause.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_to_record(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_to_record, body: aggregateExpression.parts)\n    }\n    \n    /// Builds an arbitrary set of records from a JSON array of objects (see note below). As with all functions returning record, the caller must explicitly define the structure of the record with an AS clause.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_to_recordset(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_to_recordset, body: aggregateExpression.parts)\n    }\n    \n    /// Returns from_json with all object fields that have null values omitted. Other null values are untouched.\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    public static func json_strip_nulls(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        build(.json_strip_nulls, body: aggregateExpression.parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+PostgresJSONB.swift",
    "content": "//\n//  Functions+PostgresJSONB.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var jsonb_agg: Self = .init(\"jsonb_agg\")\n    public static var to_jsonb: Self = .init(\"to_jsonb\")\n    public static var jsonb_build_array: Self = .init(\"jsonb_build_array\")\n    public static var jsonb_build_object: Self = .init(\"jsonb_build_object\")\n    public static var jsonb_object: Self = .init(\"jsonb_object\")\n    public static var jsonb_array_length: Self = .init(\"jsonb_array_length\")\n    public static var jsonb_each: Self = .init(\"jsonb_each\")\n    public static var jsonb_each_text: Self = .init(\"jsonb_each_text\")\n    public static var jsonb_extract_path: Self = .init(\"jsonb_extract_path\")\n    public static var jsonb_extract_path_text: Self = .init(\"jsonb_extract_path_text\")\n    public static var jsonb_object_keys: Self = .init(\"jsonb_object_keys\")\n    public static var jsonb_populate_record: Self = .init(\"jsonb_populate_record\")\n    public static var jsonb_populate_recordset: Self = .init(\"jsonb_populate_recordset\")\n    public static var jsonb_array_elements: Self = .init(\"jsonb_array_elements\")\n    public static var jsonb_array_elements_text: Self = .init(\"jsonb_array_elements_text\")\n    public static var jsonb_typeof: Self = .init(\"jsonb_typeof\")\n    public static var jsonb_to_record: Self = .init(\"jsonb_to_record\")\n    public static var jsonb_to_recordset: Self = .init(\"jsonb_to_recordset\")\n    public static var jsonb_strip_nulls: Self = .init(\"jsonb_strip_nulls\")\n    public static var jsonb_set: Self = .init(\"jsonb_set\")\n    public static var jsonb_insert: Self = .init(\"jsonb_insert\")\n    public static var jsonb_pretty: Self = .init(\"jsonb_pretty\")\n}\n\nextension Fn {\n    ///\n        public static func jsonb_agg(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_agg, body: aggregateExpression.parts)\n        }\n        \n        /// Returns the value as jsonb.\n        /// Arrays and composites are converted (recursively) to arrays and objects;\n        /// otherwise, if there is a cast from the type to json, the cast function will be used to perform the conversion;\n        /// otherwise, a scalar value is produced.\n        /// For any scalar type other than a number, a Boolean, or a null value,\n        /// the text representation will be used, in such a fashion that it is a valid json or jsonb value.\n        public static func to_jsonb(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.to_jsonb, body: aggregateExpression.parts)\n        }\n        \n        /// Builds a possibly-heterogeneously-typed JSON array out of a variadic argument list\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_build_array(_ items: SwifQLable...) -> SwifQLable {\n            jsonb_build_array(items)\n        }\n        \n        /// Builds a possibly-heterogeneously-typed JSON array out of a variadic argument list\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_build_array(_ items: [SwifQLable]) -> SwifQLable {\n            var parts: [SwifQLPart] = []\n            for (i, v) in items.enumerated() {\n                if i > 0 {\n                    parts.append(o: .comma)\n                    parts.append(o: .space)\n                }\n                parts.append(contentsOf: v.parts)\n            }\n            return build(.jsonb_build_array, body: parts)\n        }\n        \n        /// Builds a JSON object out of a variadic argument list.\n        /// By convention, the argument list consists of alternating keys and values\n        /// # Example\n        /// ```swift\n        /// Fn.jsonb_build_object(\"foo\", 1, \"bar\", 2)\n        /// ```\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_build_object(_ items: SwifQLable...) -> SwifQLable {\n            jsonb_build_object(items)\n        }\n        \n        /// Builds a JSON object out of a variadic argument list.\n        /// By convention, the argument list consists of alternating keys and values\n        /// # Example\n        /// ```swift\n        /// Fn.jsonb_build_object(\"foo\", 1, \"bar\", 2)\n        /// ```\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_build_object(_ items: [SwifQLable]) -> SwifQLable {\n            var parts: [SwifQLPart] = []\n            for (i, v) in items.enumerated() {\n                if i > 0 {\n                    parts.append(o: .comma)\n                    parts.append(o: .space)\n                }\n                parts.append(contentsOf: v.parts)\n            }\n            return build(.jsonb_build_object, body: parts)\n        }\n        \n        /// Builds a JSON object out of a text array.\n        /// The array must have either exactly one dimension with an even number of members,\n        /// in which case they are taken as alternating key/value pairs,\n        /// or two dimensions such that each inner array has exactly two elements, which are taken as a key/value pair\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_object(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_object, body: aggregateExpression.parts)\n        }\n        \n        /// This form of json_object takes keys and values pairwise from two separate arrays.\n        /// In all other respects it is identical to the one-argument form.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_object(keys: SwifQLable, values: SwifQLable) -> SwifQLable {\n            var parts: [SwifQLPart] = keys.parts\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: values.parts)\n            return build(.jsonb_object, body: parts)\n        }\n        \n        /// Returns the number of elements in the outermost JSON array\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_array_length(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_array_length, body: aggregateExpression.parts)\n        }\n        \n        /// Expands the outermost JSON object into a set of key/value pairs\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_each(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_each, body: aggregateExpression.parts)\n        }\n        \n        /// Expands the outermost JSON object into a set of key/value pairs. The returned values will be of type text\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_each_text(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_each_text, body: aggregateExpression.parts)\n        }\n        \n        /// Returns JSON value pointed to by path_elems (equivalent to #> operator)\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_extract_path(_ from_json: SwifQLable, path_elems: [String]) -> SwifQLable {\n            var parts: [SwifQLPart] = from_json.parts\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            for (i, v) in path_elems.enumerated() {\n                if i > 0 {\n                    parts.append(o: .comma)\n                    parts.append(o: .space)\n                }\n                parts.append(contentsOf: v.parts)\n            }\n            \n            return build(.jsonb_extract_path, body: parts)\n        }\n        \n        public static func jsonb_extract_path(_ from_json: SwifQLable, path_elems: String...) -> SwifQLable {\n            jsonb_extract_path(from_json, path_elems: path_elems)\n        }\n        \n        /// Returns JSON value pointed to by path_elems as text (equivalent to #>> operator)\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_extract_path_text(_ from_json: SwifQLable, path_elems: [String]) -> SwifQLable {\n            var parts: [SwifQLPart] = from_json.parts\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            for (i, v) in path_elems.enumerated() {\n                if i > 0 {\n                    parts.append(o: .comma)\n                    parts.append(o: .space)\n                }\n                parts.append(contentsOf: v.parts)\n            }\n            \n            return build(.jsonb_extract_path_text, body: parts)\n        }\n        \n        public static func jsonb_extract_path_text(_ from_json: SwifQLable, path_elems: String...) -> SwifQLable {\n            jsonb_extract_path_text(from_json, path_elems: path_elems)\n        }\n        \n        /// Returns set of keys in the outermost JSON object.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_object_keys(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_object_keys, body: aggregateExpression.parts)\n        }\n        \n        /// Expands the object in from_json to a row whose columns match the record type defined by base (see note below).\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_populate_record(base: SwifQLable, from_json: SwifQLable) -> SwifQLable {\n            var parts: [SwifQLPart] = base.parts\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: from_json.parts)\n            return build(.jsonb_populate_record, body: parts)\n        }\n        \n        /// Expands the outermost array of objects in from_json to a set of rows whose columns match the record type defined by base (see note below).\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_populate_recordset(base: SwifQLable, from_json: SwifQLable) -> SwifQLable {\n            var parts: [SwifQLPart] = base.parts\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: from_json.parts)\n            return build(.jsonb_populate_recordset, body: parts)\n        }\n        \n        /// Expands a JSON array to a set of JSON values.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_array_elements(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_array_elements, body: aggregateExpression.parts)\n        }\n        \n        /// Expands a JSON array to a set of text values.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_array_elements_text(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_array_elements_text, body: aggregateExpression.parts)\n        }\n        \n        /// Returns the type of the outermost JSON value as a text string. Possible types are object, array, string, number, boolean, and null.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_typeof(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_typeof, body: aggregateExpression.parts)\n        }\n        \n        /// Builds an arbitrary record from a JSON object (see note below). As with all functions returning record, the caller must explicitly define the structure of the record with an AS clause.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_to_record(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_to_record, body: aggregateExpression.parts)\n        }\n        \n        /// Builds an arbitrary set of records from a JSON array of objects (see note below). As with all functions returning record, the caller must explicitly define the structure of the record with an AS clause.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_to_recordset(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_to_recordset, body: aggregateExpression.parts)\n        }\n        \n        /// Returns from_json with all object fields that have null values omitted. Other null values are untouched.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_strip_nulls(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_strip_nulls, body: aggregateExpression.parts)\n        }\n        \n        /// Returns target with the section designated by path replaced by new_value,\n        /// or with new_value added if create_missing is true ( default is true)\n        /// and the item designated by path does not exist.\n        /// As with the path orientated operators, negative integers\n        /// that appear in path count from the end of JSON arrays.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    //    public static func jsonb_set(target: SwifQLable, path text: [String], new_value: SwifQLable, create_missing: Bool? = nil) -> SwifQLable { // TDB\n    //        return _buildFn(.jsonb_set, body: aggregateExpression.parts)\n    //    }\n        \n        /// Returns target with new_value inserted.\n        /// If target section designated by path is in a JSONB array,\n        /// new_value will be inserted before target or after if insert_after is true (default is false).\n        /// If target section designated by path is in JSONB object, new_value will be inserted\n        /// only if target does not exist. As with the path orientated operators, negative integers\n        /// that appear in path count from the end of JSON arrays.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n    //    public static func jsonb_insert(target: SwifQLable, path text: [String], new_value: SwifQLable, insert_after: Bool? = nil) -> SwifQLable { // TDB\n    //        return _buildFn(.jsonb_insert, body: aggregateExpression.parts)\n    //    }\n        \n        /// Returns from_json as indented JSON text.\n        /// [Learn more →](https://www.postgresql.org/docs/current/functions-json.html)\n        public static func jsonb_pretty(_ aggregateExpression: SwifQLable) -> SwifQLable {\n            build(.jsonb_pretty, body: aggregateExpression.parts)\n        }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+PostgresSeries.swift",
    "content": "//\n//  Functions+PostgresSeries.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var generate_series: Self = .init(\"generate_series\")\n}\n\nextension Fn {\n    /// Generate series\n    /// # Example\n    /// ```swift\n    /// Fn.generate_series(1, 4)\n    /// Fn.generate_series(1, 4, 2)\n    /// Fn.generate_series('2019-10-01', '2019-10-04', '1 day')\n    /// ```\n    /// # Result\n    /// ```\n    /// 1, 2, 3, 4\n    /// 1, 3\n    /// 2019-10-01, 2019-10-02, 2019-10-03, 2019-10-04\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-srf.html)\n    public static func generate_series(_ start: SwifQLable, _ stop: SwifQLable, _ step: SwifQLable? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = start.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: stop.parts)\n        if let step = step {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: step.parts)\n        }\n        return build(.generate_series, body: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+PostgresTime.swift",
    "content": "//\n//  Functions+PostgresTime.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var age: Self = .init(\"age\")\n    public static var clock_timestamp: Self = .init(\"clock_timestamp\")\n    public static var current_date: Self = .init(\"current_date\")\n    public static var current_time: Self = .init(\"current_time\")\n    public static var current_timestamp: Self = .init(\"current_timestamp\")\n    public static var date_part: Self = .init(\"date_part\")\n    public static var date_trunc: Self = .init(\"date_trunc\")\n    public static var extract: Self = .init(\"extract\")\n    public static var isfinite: Self = .init(\"isfinite\")\n    public static var justify_days: Self = .init(\"justify_days\")\n    public static var justify_hours: Self = .init(\"justify_hours\")\n    public static var justify_interval: Self = .init(\"justify_interval\")\n    public static var localtime: Self = .init(\"localtime\")\n    public static var localtimestamp: Self = .init(\"localtimestamp\")\n    public static var make_date: Self = .init(\"make_date\")\n    public static var make_interval: Self = .init(\"make_interval\")\n    public static var make_time: Self = .init(\"make_time\")\n    public static var make_timestamp: Self = .init(\"make_timestamp\")\n    public static var make_timestamptz: Self = .init(\"make_timestamptz\")\n    public static var now: Self = .init(\"now\")\n    public static var statement_timestamp: Self = .init(\"statement_timestamp\")\n    public static var timeofday: Self = .init(\"timeofday\")\n    public static var transaction_timestamp: Self = .init(\"transaction_timestamp\")\n    public static var to_timestamp: Self = .init(\"to_timestamp\")\n}\n\nextension Fn {\n    /// Subtract arguments, producing a “symbolic” result that uses years and months, rather than just days\n    /// # Example\n    /// ```swift\n    /// Fn.age(\"2001-04-10\" => .timestamp, \"1957-06-13\" => .timestamp)\n    /// ```\n    /// # Result\n    /// ```\n    /// 43 years 9 mons 27 days\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func age(_ timestamp1: SwifQLable, _ timestamp2: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = timestamp1.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: timestamp2.parts)\n        return build(.age, body: parts)\n    }\n    \n    /// Subtract from current_date (at midnight)\n    /// # Example\n    /// ```swift\n    /// Fn.age(\"2001-04-10\" => .timestamp)\n    /// ```\n    /// # Result\n    /// ```\n    /// 43 years 8 mons 3 days\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func age(_ timestamp1: SwifQLable) -> SwifQLable {\n        build(.age, body: timestamp1.parts)\n    }\n    \n    /// Current date and time (changes during statement execution)\n    /// # Example\n    /// ```swift\n    /// Fn.clock_timestamp()\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT)\n    public static func clock_timestamp() -> SwifQLable {\n        build(.clock_timestamp, body: [])\n    }\n    \n    /// Current date\n    /// # Example\n    /// ```swift\n    /// Fn.current_date\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT)\n    public static var current_date: SwifQLable {\n        SwifQLableParts(parts: Name.current_date.part)\n    }\n    \n    /// Current time of day\n    /// # Example\n    /// ```swift\n    /// Fn.current_time\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT)\n    public static func current_time(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        SwifQLableParts(parts: Name.current_time.part)\n    }\n    \n    /// Current date and time (start of current transaction)\n    /// # Example\n    /// ```swift\n    /// Fn.current_timestamp\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT)\n    public static func current_timestamp(_ aggregateExpression: SwifQLable) -> SwifQLable {\n        SwifQLableParts(parts: Name.current_timestamp.part)\n    }\n    \n    /// Get subfield (equivalent to extract)\n    /// # Example with timestamp\n    /// ```swift\n    /// Fn.date_part(\"hour\", \"2001-02-16 20:38:40\" => .timestamp)\n    /// ```\n    /// # Result\n    /// ```\n    /// 20\n    /// ```\n    /// # Example with interval\n    /// ```swift\n    /// Fn.date_part(\"month\", \"2 years 3 months\" => .interval)\n    /// ```\n    /// # Result\n    /// ```\n    /// 3\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT)\n    public static func date_part(_ text: SwifQLable, _ value: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = text.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: value.parts)\n        return build(.date_part, body: parts)\n    }\n    \n    /// Truncate to specified precision\n    /// # Example with timestamp\n    /// ```swift\n    /// Fn.date_trunc(\"hour\", \"2001-02-16 20:38:40\" => .timestamp)\n    /// ```\n    /// # Result\n    /// ```\n    /// 2001-02-16 20:00:00\n    /// ```\n    /// # Example with interval\n    /// ```swift\n    /// Fn.date_trunc(\"hour\", \"2 days 3 hours 40 minutes\" => .interval)\n    /// ```\n    /// # Result\n    /// ```\n    /// 2 days 03:00:00\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC)\n    public static func date_trunc(_ text: SwifQLable, _ value: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = text.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: value.parts)\n        return build(.date_trunc, body: parts)\n    }\n    \n    /// Get subfield\n    /// # Example with timestamp\n    /// ```swift\n    /// Fn.extract(.hour, \"2001-02-16 20:38:40\" => .timestamp)\n    /// ```\n    /// # Result\n    /// ```\n    /// 20\n    /// ```\n    /// # Example with interval\n    /// ```swift\n    /// Fn.extract(.month, \"2 years 3 months\" => .interval)\n    /// ```\n    /// # Result\n    /// ```\n    /// 3\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT)\n    public static func extract(_ field: ExtractFieldValue, from value: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        parts.append(safe: field.value)\n        parts.append(o: .space)\n        parts.append(o: .from)\n        parts.append(o: .space)\n        parts.append(contentsOf: value.parts)\n        return build(.extract, body: parts)\n    }\n    \n    /// Get subfield\n    /// # Example with timestamp\n    /// ```swift\n    /// Fn.extract(\"hour\", \"2001-02-16 20:38:40\" => .timestamp)\n    /// ```\n    /// # Result\n    /// ```\n    /// 20\n    /// ```\n    /// # Example with interval\n    /// ```swift\n    /// Fn.extract(\"month\", \"2 years 3 months\" => .interval)\n    /// ```\n    /// # Result\n    /// ```\n    /// 3\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT)\n    public static func extract(_ field: SwifQLable, from value: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = field.parts\n        parts.append(o: .space)\n        parts.append(o: .from)\n        parts.append(o: .space)\n        parts.append(contentsOf: value.parts)\n        return build(.extract, body: parts)\n    }\n    \n    /// Test for finite date (not +/-infinity)\n    /// # Example\n    /// ```swift\n    /// Fn.isfinite(\"4 hours\" => .interval)\n    /// ```\n    /// # Result\n    /// ```\n    /// true\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func isfinite(_ interval: SwifQLable) -> SwifQLable {\n        build(.isfinite, body: interval.parts)\n    }\n    \n    /// Adjust interval so 30-day time periods are represented as months\n    /// # Example\n    /// ```swift\n    /// Fn.justify_days(\"35 days\" => .interval)\n    /// ```\n    /// # Result\n    /// ```\n    /// 1 mon 5 days\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func justify_days(_ interval: SwifQLable) -> SwifQLable {\n        build(.justify_days, body: interval.parts)\n    }\n    \n    /// Adjust interval so 24-hour time periods are represented as days\n    /// # Example\n    /// ```swift\n    /// Fn.justify_hours(\"27 hours\" => .interval)\n    /// ```\n    /// # Result\n    /// ```\n    /// 1 day 03:00:00\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func justify_hours(_ interval: SwifQLable) -> SwifQLable {\n        build(.justify_hours, body: interval.parts)\n    }\n    \n    /// Adjust interval using justify_days and justify_hours, with additional sign adjustments\n    /// # Example\n    /// ```swift\n    /// Fn.justify_interval(\"1 mon -1 hour\" => .interval)\n    /// ```\n    /// # Result\n    /// ```\n    /// 29 days 23:00:00\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func justify_interval(_ interval: SwifQLable) -> SwifQLable {\n        build(.justify_interval, body: interval.parts)\n    }\n    \n    /// Current time of day\n    /// # Example\n    /// ```swift\n    /// Fn.localtime\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static var localtime: SwifQLable {\n        SwifQLableParts(parts: Name.localtime.part)\n    }\n    \n    /// Current date and time (start of current transaction)\n    /// # Example\n    /// ```swift\n    /// Fn.localtimestamp\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static var localtimestamp: SwifQLable {\n        SwifQLableParts(parts: Name.localtimestamp.part)\n    }\n    \n    /// Create date from year, month and day fields\n    /// # Example\n    /// ```swift\n    /// Fn.make_date(2013, 7, 15)\n    /// ```\n    /// # Result\n    /// ```\n    /// 2013-07-15\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func make_date(_ year: SwifQLable, _ month: SwifQLable, _ day: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = year.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: month.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: day.parts)\n        return build(.make_date, body: parts)\n    }\n    \n    /// Create interval from years, months, weeks, days, hours, minutes and seconds fields\n    /// # Example\n    /// ```swift\n    /// Fn.make_interval(days: 10)\n    /// ```\n    /// # Result\n    /// ```\n    /// 10 days\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func make_interval(years: SwifQLable? = nil,\n                                                   months: SwifQLable? = nil,\n                                                   weeks: SwifQLable? = nil,\n                                                   days: SwifQLable? = nil,\n                                                   hours: SwifQLable? = nil,\n                                                   mins: SwifQLable? = nil,\n                                                   secs: SwifQLable? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        if let years = years {\n            parts.append(o: .custom(\"years => \"))\n            if let number = years as? Int {\n                parts.append(o: .custom(\"\\(number)\"))\n            } else {\n                parts.append(contentsOf: years.parts)\n            }\n        }\n        if let months = months {\n            if parts.count > 0 { parts.append(o: .comma, .space) }\n            parts.append(o: .custom(\"months => \"))\n            if let number = months as? Int {\n                parts.append(o: .custom(\"\\(number)\"))\n            } else {\n                parts.append(contentsOf: months.parts)\n            }\n        }\n        if let weeks = weeks {\n            if parts.count > 0 { parts.append(o: .comma, .space) }\n            parts.append(o: .custom(\"weeks => \"))\n            if let number = weeks as? Int {\n                parts.append(o: .custom(\"\\(number)\"))\n            } else {\n                parts.append(contentsOf: weeks.parts)\n            }\n        }\n        if let days = days {\n            if parts.count > 0 { parts.append(o: .comma, .space) }\n            parts.append(o: .custom(\"days => \"))\n            if let number = days as? Int {\n                parts.append(o: .custom(\"\\(number)\"))\n            } else {\n                parts.append(contentsOf: days.parts)\n            }\n        }\n        if let hours = hours {\n            if parts.count > 0 { parts.append(o: .comma, .space) }\n            parts.append(o: .custom(\"hours => \"))\n            if let number = hours as? Int {\n                parts.append(o: .custom(\"\\(number)\"))\n            } else {\n                parts.append(contentsOf: hours.parts)\n            }\n        }\n        if let mins = mins {\n            if parts.count > 0 { parts.append(o: .comma, .space) }\n            parts.append(o: .custom(\"mins => \"))\n            if let number = mins as? Int {\n                parts.append(o: .custom(\"\\(number)\"))\n            } else {\n                parts.append(contentsOf: mins.parts)\n            }\n        }\n        if let secs = secs {\n            if parts.count > 0 { parts.append(o: .comma, .space) }\n            parts.append(o: .custom(\"secs => \"))\n            if let number = secs as? Int {\n                parts.append(o: .custom(\"\\(number)\"))\n            } else if let number = secs as? Double {\n                parts.append(o: .custom(\"\\(number)\"))\n            } else {\n                parts.append(contentsOf: secs.parts)\n            }\n        }\n        return build(.make_interval, body: parts)\n    }\n    \n    /// Create time from hour, minute and seconds fields\n    /// # Example\n    /// ```swift\n    /// Fn.make_time(8, 15, 23.5)\n    /// ```\n    /// # Result\n    /// ```\n    /// 08:15:23.5\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func make_time(_ hour: SwifQLable, _ min: SwifQLable, _ sec: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = hour.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: min.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: sec.parts)\n        return build(.make_time, body: parts)\n    }\n    \n    /// Create timestamp from year, month, day, hour, minute and seconds fields\n    /// # Example\n    /// ```swift\n    /// Fn.make_timestamp(2013, 7, 15, 8, 15, 23.5)\n    /// ```\n    /// # Result\n    /// ```\n    /// 2013-07-15 08:15:23.5\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func make_timestamp(_ year: SwifQLable,\n                                                       _ month: SwifQLable,\n                                                       _ day: SwifQLable,\n                                                       _ hour: SwifQLable,\n                                                       _ min: SwifQLable,\n                                                       _ sec: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = year.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: month.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: day.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: hour.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: min.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: sec.parts)\n        return build(.make_timestamp, body: parts)\n    }\n    \n    /// Create timestamp with time zone from year, month, day, hour, minute and seconds fields;\n    /// if timezone is not specified, the current time zone is used\n    /// # Example\n    /// ```swift\n    /// Fn.make_timestamptz(2013, 7, 15, 8, 15, 23.5)\n    /// ```\n    /// # Result\n    /// ```\n    /// 2013-07-15 08:15:23.5+01\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func make_timestamptz(_ year: SwifQLable,\n                                                          _ month: SwifQLable,\n                                                          _ day: SwifQLable,\n                                                          _ hour: SwifQLable,\n                                                          _ min: SwifQLable,\n                                                          _ sec: SwifQLable,\n                                                          _ timezone: SwifQLable? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = year.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: month.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: day.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: hour.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: min.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: sec.parts)\n        if let timezone = timezone {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: timezone.parts)\n        }\n        return build(.make_timestamptz, body: parts)\n    }\n    \n    /// Current date and time (start of current transaction)\n    /// # Example\n    /// ```swift\n    /// Fn.now()\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func now() -> SwifQLable {\n        build(.now, body: [])\n    }\n    \n    /// Current date and time (start of current statement)\n    /// # Example\n    /// ```swift\n    /// Fn.statement_timestamp()\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func statement_timestamp() -> SwifQLable {\n        build(.statement_timestamp, body: [])\n    }\n    \n    /// Current date and time (like clock_timestamp, but as a text string)\n    /// # Example\n    /// ```swift\n    /// Fn.timeofday()\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func timeofday() -> SwifQLable {\n        build(.timeofday, body: [])\n    }\n    \n    /// Current date and time (start of current transaction)\n    /// # Example\n    /// ```swift\n    /// Fn.transaction_timestamp()\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func transaction_timestamp() -> SwifQLable {\n        build(.transaction_timestamp, body: [])\n    }\n    \n    /// Convert Unix epoch (seconds since 1970-01-01 00:00:00+00) to timestamp\n    /// # Example\n    /// ```swift\n    /// Fn.to_timestamp(1284352323)\n    /// ```\n    /// # Result\n    /// ```\n    /// 2010-09-13 04:32:03+00\n    /// ```\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-datetime.html)\n    public static func to_timestamp(_ value: SwifQLable) -> SwifQLable {\n        build(.to_timestamp, body: value.parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+String.swift",
    "content": "//\n//  Functions+String.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var bit_length: Self = .init(\"bit_length\")\n    public static var btrim: Self = .init(\"btrim\")\n    public static var char_length: Self = .init(\"char_length\")\n    public static var character_length: Self = .init(\"character_length\")\n    public static var initcap: Self = .init(\"initcap\")\n    public static var concat: Self = .init(\"concat\")\n    public static var concat_ws: Self = .init(\"concat_ws\")\n    public static var array_length: Self = .init(\"array_length\")\n    public static var length: Self = .init(\"length\")\n    public static var lower: Self = .init(\"lower\")\n    public static var lpad: Self = .init(\"lpad\")\n    public static var ltrim: Self = .init(\"ltrim\")\n    public static var position: Self = .init(\"position\")\n    public static var `repeat`: Self = .init(\"repeat\")\n    public static var replace: Self = .init(\"replace\")\n    public static var rpad: Self = .init(\"rpad\")\n    public static var rtrim: Self = .init(\"rtrim\")\n    public static var strpos: Self = .init(\"strpos\")\n    public static var substring: Self = .init(\"substring\")\n    public static var translate: Self = .init(\"translate\")\n    public static var trim: Self = .init(\"trim\")\n    public static var upper: Self = .init(\"upper\")\n    public static var string_agg: Self = .init(\"string_agg\")\n    public static var regexp_replace: Self = .init(\"regexp_replace\")\n} \n\nextension Fn {\n    /// String and non-string concatenation\n    /// e.g. `'Post' || 'greSQL'` will return `PostgreSQL`\n    /// so in Swift you can write it like `\"Post\" || \"greSQL\"`\n    /// or using KeyPath like \\User.firstName || \" \" || \\User.lastName\n    /// and KeyPath alias like u+\\.firstName || \" \" || u+\\.lastName\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/concat2.php)\n    public static func concatStrings(lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = lhs.parts\n        parts.append(o: .space)\n        parts.append(o: .custom(\"||\"))\n        parts.append(o: .space)\n        parts.append(contentsOf: rhs.parts)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    /// Number of bits in string\n    /// e.g. `bit_length('jose')` will return 32\n    /// [Learn more →]()\n    public static func bit_length(_ string: SwifQLable) -> SwifQLable {\n        build(.bit_length, body: string.parts)\n    }\n    \n    /// Removes all specified characters from both the beginning and the end of a string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/btrim.php)\n    public static func btrim(_ string: SwifQLable, _ characters: String) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(safe: characters)\n        return build(.btrim, body: parts)\n    }\n    \n    /// Returns the length of the specified string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/char_length.php)\n    public static func char_length(_ string: SwifQLable) -> SwifQLable {\n        build(.char_length, body: string.parts)\n    }\n    \n    /// Returns the length of the specified string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/character_length.php)\n    public static func character_length(_ string: SwifQLable) -> SwifQLable {\n        build(.character_length, body: string.parts)\n    }\n    \n    /// Converts the first letter of each word to uppercase and all other letters are converted to lowercase\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/initcap.php)\n    public static func initcap(_ string: SwifQLable) -> SwifQLable {\n        build(.initcap, body: string.parts)\n    }\n    \n    /// Concatenate all arguments. NULL arguments are ignored.\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.concat(\"Hello \", \\User.name)\n    /// ```\n    /// # Result\n    /// ```\n    /// concat('Hello ', \"User\".\"name\")\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/9.1/functions-string.html)\n    public static func concat(_ values: SwifQLable...) -> SwifQLable {\n        concat(values)\n    }\n    \n    /// Concatenate all arguments. NULL arguments are ignored.\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.concat(\"Hello \", \\User.name)\n    /// ```\n    /// # Result\n    /// ```\n    /// concat('Hello ', \"User\".\"name\")\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/9.1/functions-string.html)\n    public static func concat(_ values: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        values.enumerated().forEach { offset, value in\n            parts.append(contentsOf: value.parts)\n            if offset < values.count - 1 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n        }\n        return build(.concat, body: parts)\n    }\n    \n    /// Concatenate all arguments. NULL arguments are ignored.\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.concat_ws(\", \", \"Hello\", \\User.name)\n    /// ```\n    /// # Result\n    /// ```\n    /// concat_ws(', ', 'Hello', \"User\".\"name\")\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/9.1/functions-string.html)\n    public static func concat_ws(_ values: SwifQLable...) -> SwifQLable {\n        concat_ws(values)\n    }\n    \n    /// Concatenate all arguments. NULL arguments are ignored.\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.concat_ws(\", \", \"Hello\", \\User.name)\n    /// ```\n    /// # Result\n    /// ```\n    /// concat_ws(', ', 'Hello', \"User\".\"name\")\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/9.1/functions-string.html)\n    public static func concat_ws(_ values: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        values.enumerated().forEach { offset, value in\n            parts.append(contentsOf: value.parts)\n            if offset < values.count - 1 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n        }\n        return build(.concat_ws, body: parts)\n    }\n    \n    /// Returns the length of the requested array dimension\n    public static func array_length(_ anyArray: SwifQLable, _ dimension: Int = 1) -> SwifQLable {\n        var parts: [SwifQLPart] = anyArray.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(safe: dimension)\n        return build(.array_length, body: parts)\n    }\n    \n    /// Returns the length of the specified string, expressed as the number of characters.\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/length.php)\n    public static func length(_ string: SwifQLable) -> SwifQLable {\n        build(.length, body: string.parts)\n    }\n    \n    /// Converts all characters in the specified string to lowercase\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/lower.php)\n    public static func lower(_ string: SwifQLable) -> SwifQLable {\n        build(.lower, body: string.parts)\n    }\n    \n    /// Returns a string that is left-padded with a specified string to a certain length\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/lpad.php)\n    public static func lpad(_ string: SwifQLable, _ length: Int, _ padString: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(safe: length)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: padString.parts)\n        return build(.lpad, body: parts)\n    }\n    \n    /// Removes all specified characters from the left-hand side of a string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/ltrim.php)\n    public static func ltrim(_ string: SwifQLable, _ characters: String) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(safe: characters)\n        return build(.ltrim, body: parts)\n    }\n    \n    /// Returns the location of a substring in a string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/position.php)\n    public static func position(_ substring: SwifQLable, in string: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = substring.parts\n        parts.append(o: .space)\n        parts.append(o: .in)\n        parts.append(o: .space)\n        parts.append(contentsOf: string.parts)\n        return build(.position, body: parts)\n    }\n    \n    /// Repeats a string a specified number of times\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/repeat.php)\n    public static func `repeat`(_ string: SwifQLable, _ number: Int) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(safe: number)\n        return build(.repeat, body: parts)\n    }\n    \n    /// Replaces all occurrences of a specified string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/replace.php)\n    public static func replace(_ string: SwifQLable, _ fromSubstring: SwifQLable, _ toSubstring: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: fromSubstring.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: toSubstring.parts)\n        return build(.replace, body: parts)\n    }\n    \n    /// Returns a string that is right-padded with a specified string to a certain length\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/rpad.php)\n    public static func rpad(_ string: SwifQLable, _ length: Int, _ padString: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(safe: length)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: padString.parts)\n        return build(.rpad, body: parts)\n    }\n    \n    /// Removes all specified characters from the right-hand side of a string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/rtrim.php)\n    public static func rtrim(_ string: SwifQLable, _ characters: String) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(safe: characters)\n        return build(.rtrim, body: parts)\n    }\n    \n    /// Returns the location of a substring in a string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/strpos.php)\n    public static func strpos(_ string: SwifQLable, _ substring: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: substring.parts)\n        return build(.strpos, body: parts)\n    }\n    \n    /// Allows you to extract a substring from a string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/substring.php)\n    public static func substring(_ string: SwifQLable, from startPosition: Int) -> SwifQLable {\n        _substring(string, from: startPosition)\n    }\n    /// Allows you to extract a substring from a string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/substring.php)\n    public static func substring(_ string: SwifQLable, for length: Int) -> SwifQLable {\n        _substring(string, for: length)\n    }\n    /// Allows you to extract a substring from a string\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/substring.php)\n    public static func substring(_ string: SwifQLable, from startPosition: Int, for length: Int) -> SwifQLable {\n        _substring(string, from: startPosition, for: length)\n    }\n    private static func _substring(_ string: SwifQLable, from startPosition: Int? = nil, for length: Int? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        if let startPosition = startPosition {\n            parts.append(o: .space)\n            parts.append(o: .from)\n            parts.append(o: .space)\n            parts.append(safe: startPosition)\n        }\n        if let length = length {\n            parts.append(o: .space)\n            parts.append(o: .for)\n            parts.append(o: .space)\n            parts.append(safe: length)\n        }\n        return build(.substring, body: parts)\n    }\n    \n    /// Replaces a sequence of characters in a string with another set of characters. However, it replaces a single character at a time.\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/translate.php)\n    public static func translate(_ string: SwifQLable, _ stringToReplace: SwifQLable, _ replacementString: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = string.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: stringToReplace.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: replacementString.parts)\n        return build(.translate, body: parts)\n    }\n    \n    /// Removes all specified characters either from the beginning or the end of a string.\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/trim.php)\n    public static func trim(_ string: SwifQLable) -> SwifQLable {\n        build(.trim, body: string.parts)\n    }\n    \n    /// Removes all specified characters either from the beginning or the end of a string.\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/trim.php)\n    public static func trim(leading trimCharacter: SwifQLable? = nil, from string: SwifQLable) -> SwifQLable {\n        _trim(\"leading\", trimCharacter, from: string)\n    }\n    /// Removes all specified characters either from the beginning or the end of a string.\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/trim.php)\n    public static func trim(trailing trimCharacter: SwifQLable? = nil, from string: SwifQLable) -> SwifQLable {\n        _trim(\"trailing\", trimCharacter, from: string)\n    }\n    /// Removes all specified characters either from the beginning or the end of a string.\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/trim.php)\n    public static func trim(both trimCharacter: SwifQLable? = nil, from string: SwifQLable) -> SwifQLable {\n        _trim(\"both\", trimCharacter, from: string)\n    }\n    \n    /// Private `trim` builder method\n    private static func _trim(_ type: String, _ trimCharacter: SwifQLable? = nil, from string: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        parts.append(o: .custom(type))\n        if let trimCharacter = trimCharacter {\n            parts.append(o: .space)\n            parts.append(contentsOf: trimCharacter.parts)\n        }\n        parts.append(o: .space)\n        parts.append(o: .from)\n        parts.append(o: .space)\n        parts.append(contentsOf: string.parts)\n        return build(.trim, body: string.parts)\n    }\n    \n    /// Converts all characters in the specified string to uppercase\n    /// [Learn more →](https://www.techonthenet.com/postgresql/functions/upper.php)\n    public static func upper(_ string: SwifQLable) -> SwifQLable {\n        build(.upper, body: string.parts)\n    }\n\n    /// Concatenates non-null input values into a string, separated by delimiter\n    /// [Learn more →](https://www.postgresql.org/docs/11/functions-aggregate.html)\n    public static func string_agg(_ string: SwifQLable, _ separator: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        parts.append(contentsOf: string.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: separator.parts)\n        return build(.string_agg, body: parts)\n    }\n    \n    /// Replaces a sequence of characters in a string with another set of characters using regular expression pattern matching\n    /// [Learn more →](https://www.techonthenet.com/oracle/functions/regexp_replace.php)\n    public static func regexp_replace(_ string: SwifQLable, _ fromRegexp: SwifQLable, _ toSubstring: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        parts.append(contentsOf: string.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: fromRegexp.parts)\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: toSubstring.parts)\n        return build(.regexp_replace, body: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+TextSearch.swift",
    "content": "//\n//  Functions+TextSearch.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var to_tsvector: Self = .init(\"to_tsvector\")\n    public static var to_tsquery: Self = .init(\"to_tsquery\")\n    public static var plainto_tsquery: Self = .init(\"plainto_tsquery\")\n    public static var ts_rank_cd: Self = .init(\"ts_rank_cd\")\n}\n\nextension Fn {\n    /// PostgreSQL provides the function to_tsvector for converting a document to the tsvector data type.\n    /// to_tsvector([ config regconfig, ] document text) returns tsvector\n    /// # Example\n    /// ```swift\n    /// Fn.to_tsvector(\"english\", \"a fat  cat sat on a mat - it ate a fat rats\")\n    /// ```\n    /// # Result\n    /// ```\n    /// 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/9.1/textsearch-controls.html)\n    public static func to_tsvector(_ config: SwifQLable, _ text: SwifQLable? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = config.parts\n        if let text = text {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: text.parts)\n        }\n        return build(.to_tsvector, body: parts)\n    }\n    \n    /// PostgreSQL provides to_tsquery function for converting a query to the tsquery data type.\n    /// to_tsquery offers access to more features than plainto_tsquery, but is less forgiving about its input.\n    /// to_tsquery([ config regconfig, ] querytext text) returns tsquery\n    /// # Example\n    /// ```swift\n    /// Fn.to_tsquery(\"english\", \"The & Fat & Rats\")\n    /// ```\n    /// # Result\n    /// ```\n    /// 'fat' & 'rat'\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/9.1/textsearch-controls.html)\n    public static func to_tsquery(_ config: SwifQLable, _ text: SwifQLable? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = config.parts\n        if let text = text {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: text.parts)\n        }\n        return build(.to_tsquery, body: parts)\n    }\n    \n    /// `plainto_tsquery` transforms unformatted text querytext to tsquery\n    /// plainto_tsquery([ config regconfig, ] querytext text) returns tsquery\n    /// # Example\n    /// ```swift\n    /// Fn.plainto_tsquery(\"english\", \"The Fat Rats\")\n    /// ```\n    /// # Result\n    /// ```\n    /// 'fat' & 'rat'\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/9.1/textsearch-controls.html)\n    public static func plainto_tsquery(_ config: SwifQLable, _ text: SwifQLable? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = config.parts\n        if let text = text {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: text.parts)\n        }\n        return build(.plainto_tsquery, body: parts)\n    }\n    \n    /// PostgreSQL provides two predefined ranking functions, which take into account lexical, proximity,\n    /// and structural information; that is, they consider how often the query terms appear in the document,\n    /// how close together the terms are in the document, and how important is the part of the document where they occur.\n    \n    /// `ts_rank_rd` calculates the rank of the provided tsquery\n    /// ts_rank_rd(vector tsvector, query tsquery [, normalization integer ]) returns tsquery\n    /// # Example\n    /// ```swift\n    /// Fn.ts_rank_cd(\"rats\", Fn.to_tsquery(\"The Fat Rats\"))\n    /// ```\n    /// # Result\n    /// ```\n    /// ts_rank_cd(\"rats\", to_tsquery('The Fat Rats'))\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/9.6/textsearch-controls.html#TEXTSEARCH-RANKING)\n    public static func ts_rank_cd(_ vector: SwifQLable, _ query: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = vector.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: query.parts)\n        return build(.ts_rank_cd, body: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions+Window.swift",
    "content": "//\n//  Functions+Window.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nextension Fn.Name {\n    public static var row_number: Self = .init(\"row_number\")\n    public static var rank: Self = .init(\"rank\")\n    public static var dense_rank: Self = .init(\"dense_rank\")\n    public static var percent_rank: Self = .init(\"percent_rank\")\n    public static var cume_dist: Self = .init(\"cume_dist\")\n    public static var ntile: Self = .init(\"ntile\")\n    public static var lag: Self = .init(\"lag\")\n    public static var lead: Self = .init(\"lead\")\n    public static var first_value: Self = .init(\"first_value\")\n    public static var last_value: Self = .init(\"last_value\")\n    public static var nth_value: Self = .init(\"nth_value\")\n}\n\nextension Fn {\n    /// Number of the current row within its partition, counting from 1\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.row_number()\n    /// ```\n    /// # Result\n    /// ```\n    /// row_number()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func row_number() -> SwifQLable {\n        build(.row_number, body: [])\n    }\n    \n    /// Rank of the current row with gaps\n    /// same as row_number of its first peer\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.rank()\n    /// ```\n    /// # Result\n    /// ```\n    /// rank()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func rank() -> SwifQLable {\n        build(.rank, body: [])\n    }\n    \n    /// Rank of the current row without gaps\n    /// this function counts peer groups\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.dense_rank()\n    /// ```\n    /// # Result\n    /// ```\n    /// dense_rank()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func dense_rank() -> SwifQLable {\n        build(.dense_rank, body: [])\n    }\n    \n    /// Relative rank of the current row: (rank - 1) / (total partition rows - 1)\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.percent_rank()\n    /// ```\n    /// # Result\n    /// ```\n    /// percent_rank()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func percent_rank() -> SwifQLable {\n        build(.percent_rank, body: [])\n    }\n    \n    /// Cumulative distribution: (number of partition rows preceding or peer with current row) / total partition rows\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.cume_dist()\n    /// ```\n    /// # Result\n    /// ```\n    /// cume_dist()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func cume_dist() -> SwifQLable {\n        build(.cume_dist, body: [])\n    }\n    \n    /// Integer ranging from 1 to the argument value, dividing the partition as equally as possible\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.ntile()\n    /// ```\n    /// # Result\n    /// ```\n    /// ntile()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func ntile(_ num_buckets: SwifQLable) -> SwifQLable {\n        build(.ntile, body: num_buckets.parts)\n    }\n    \n    /// Returns `value` evaluated at the row that is `offset` rows before the current row within the partition\n    /// if there is no such row, instead return `default` (which must be of the same type as `value`).\n    /// Both `offset` and `default` are evaluated with respect to the current row.\n    /// If omitted, `offset` defaults to 1 and `default` to null\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.lag()\n    /// ```\n    /// # Result\n    /// ```\n    /// lag()\n    /// ```\n    /// [Examples →](https://www.postgresqltutorial.com/postgresql-lag-function/)\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func lag(_ value: SwifQLable, _ offset: SwifQLable? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = value.parts\n        if let offset = offset {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: offset.parts)\n        }\n        return build(.lag, body: parts)\n    }\n    \n    /// Returns value evaluated at the row that is `offset` rows after the current row within the partition\n    /// if there is no such row, instead return `default` (which must be of the same type as `value`).\n    /// Both `offset` and `default` are evaluated with respect to the current row.\n    /// If omitted, `offset` defaults to 1 and `default` to null\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.lead()\n    /// ```\n    /// # Result\n    /// ```\n    /// lead()\n    /// ```\n    /// [Examples →](https://www.postgresqltutorial.com/postgresql-lead-function/)\n    ///\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func lead(_ value: SwifQLable, _ offset: SwifQLable? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = value.parts\n        if let offset = offset {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n            parts.append(contentsOf: offset.parts)\n        }\n        return build(.lead, body: parts)\n    }\n    \n    /// Returns value evaluated at the row that is the first row of the window frame\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.first_value()\n    /// ```\n    /// # Result\n    /// ```\n    /// first_value()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func first_value(_ value: SwifQLable) -> SwifQLable {\n        build(.first_value, body: value.parts)\n    }\n    \n    /// Returns value evaluated at the row that is the last row of the window frame\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.last_value()\n    /// ```\n    /// # Result\n    /// ```\n    /// last_value()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func last_value(_ value: SwifQLable) -> SwifQLable {\n        build(.last_value, body: value.parts)\n    }\n    \n    /// Returns `value` evaluated at the row that is the `nth` row of the window frame (counting from 1)\n    /// null if no such row\n    ///\n    /// # Example\n    /// ```swift\n    /// Fn.nth_value()\n    /// ```\n    /// # Result\n    /// ```\n    /// nth_value()\n    /// ```\n    /// [Learn more →](https://www.postgresql.org/docs/current/functions-window.html)\n    public static func nth_value(_ value: SwifQLable, _ nth: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = value.parts\n        parts.append(o: .comma)\n        parts.append(o: .space)\n        parts.append(contentsOf: nth.parts)\n        return build(.nth_value, body: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Functions/Functions.swift",
    "content": "//\n//  Functions.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 04/11/2018.\n//\n\nimport Foundation\n\npublic struct Fn {}\n\nextension Fn {\n    public struct Name: Sendable {\n        let name: String\n        \n        public init (_ name: String) {\n            self.name = name\n        }\n        \n        public static func custom(_ name: String) -> Name { .init(name) }\n        \n        var part: SwifQLPartOperator { .init(name) }\n    }\n}\n\n//MARK: Function builders\n\nextension Fn {\n    public static func build(_ fn: Name) -> SwifQLable {\n        build(fn, body: nil)\n    }\n    public static func build(_ fn: Name, body: SwifQLPart...) -> SwifQLable {\n        build(fn, body: body)\n    }\n    public static func build(_ fn: Name, body: [SwifQLPart]? = nil) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        parts.append(f: fn)\n        if let body = body {\n            parts.append(o: .openBracket)\n            parts.append(contentsOf: body)\n            parts.append(o: .closeBracket)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n\npublic func Select(_ queryPart: SwifQLable...) -> SwifQLable {\n    Select(queryPart)\n}\n\npublic func Select(_ queryParts: [SwifQLable]) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(o: .select)\n    parts.append(o: .space)\n    for (i, q) in queryParts.enumerated() {\n        if i > 0 {\n            parts.append(o: .comma)\n            parts.append(o: .space)\n        }\n        parts.append(contentsOf: q.parts)\n    }\n    return SwifQLableParts(parts: parts)\n}\n\npublic var Select: SwifQLable { Fn.build(.custom(\"SELECT\")) }\n\n//MARK: [SwifQLPart] extension\n\nextension Array where Element == SwifQLPart {\n    public mutating func appendSpaceIfNeeded() {\n        if count == 0 { return }\n        if let last = last as? SwifQLPartOperator, last._value == \" \" {\n            return\n        }\n        append(o: .space)\n    }\n    public mutating func append(f: Fn.Name) {\n        append(f.part)\n    }\n    public mutating func append(o: SwifQLPartOperator...) {\n        o.forEach { append($0) }\n    }\n    public mutating func append(h: SwifQLHybridOperator...) {\n        h.forEach { append($0) }\n    }\n    public mutating func append(safe value: Any) {\n        append(SwifQLPartSafeValue(value))\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/HybridOperator.swift",
    "content": "//\n//  HybridOperator.swift\n//  \n//\n//  Created by TierraCero on 5/30/23.\n//\n\nimport Foundation\n\nextension SwifQLHybridOperator {\n    \n    public typealias HybridResult = SwifQLHybridOperator\n    \n    public static var random: HybridResult { .init(\"random()\".operator, \"rand()\".operator) }\n    \n    private func concatWith(_ hybrid: HybridResult) -> HybridResult {\n        return hybrid\n    }\n}\nextension String {\n    fileprivate var `operator`: SwifQLPartOperator { .init(self) }\n}\n"
  },
  {
    "path": "Sources/SwifQL/IndexItem.swift",
    "content": "//\n//  IndexItem.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 18.08.2020.\n//\n\npublic class IndexItem: SwifQLable {\n    public var parts: [SwifQLPart] {\n        var parts: [SwifQLPart] = []\n        switch item {\n        case .column(let name):\n            parts.append(SwifQLPartColumn(name))\n        case .expression(let expression):\n            parts.append(o: .openBracket)\n            parts.append(contentsOf: expression.parts)\n            parts.append(o: .closeBracket)\n        }\n        if order.parts.count > 0 {\n            parts.append(o: .space)\n            parts.append(contentsOf: order.parts)\n        }\n        return parts\n    }\n    \n    public enum Order: SwifQLable {\n        public var parts: [SwifQLPart] {\n            var parts: [SwifQLPart] = []\n            switch self {\n            case .asc: break\n            case .ascNullsFirst:\n                parts.append(o: .nulls)\n                parts.append(o: .space)\n                parts.append(o: .first)\n            case .desc:\n                parts.append(o: .desc)\n            case .descNullsLast:\n                parts.append(o: .desc)\n                parts.append(o: .space)\n                parts.append(o: .nulls)\n                parts.append(o: .space)\n                parts.append(o: .last)\n            }\n            return parts\n        }\n        \n        case asc, ascNullsFirst, desc, descNullsLast\n    }\n    \n    public enum Item {\n        case column(String)\n        case expression(SwifQLable)\n    }\n    \n    let order: Order\n    let item: Item\n    \n    public init (item: Item, order: Order) {\n        self.item = item\n        self.order = order\n    }\n    \n    public static func column(_ column: String, order: Order = .asc) -> IndexItem {\n        .init(item: .column(column), order: order)\n    }\n    \n    public static func expression(_ expression: SwifQLable, order: Order = .asc) -> IndexItem {\n        .init(item: .expression(expression), order: order)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/IndexType.swift",
    "content": "//\n//  IndexType.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 18.08.2020.\n//\n\nimport Foundation\n\npublic class IndexType: SwifQLable {\n    public var parts: [SwifQLPart] {\n        var parts: [SwifQLPart] = []\n        parts.append(o: .custom(name))\n        return parts\n    }\n    \n    let name: String\n    \n    public init (name: String) {\n        self.name = name\n    }\n    \n    public static var btree: IndexType {\n        .init(name: \"BTREE\")\n    }\n    \n    public static var hash: IndexType {\n        .init(name: \"HASH\")\n    }\n    \n    public static var gist: IndexType {\n        .init(name: \"GIST\")\n    }\n    \n    public static var gin: IndexType {\n        .init(name: \"GIN\")\n    }\n    \n    public static var spgist: IndexType {\n        .init(name: \"SPGIST\")\n    }\n    \n    public static var brin: IndexType {\n        .init(name: \"BRIN\")\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/KeyPath.swift",
    "content": "//\n//  KeyPath.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 05/11/2018.\n//\n\nimport Foundation\n\npublic protocol KeyPathLastPath {\n    var lastPath: String { get }\n}\n\nextension String: KeyPathLastPath {\n    public var lastPath: String { self }\n}\n\npublic protocol SwifQLUniversalKeyPathSimple: KeyPathLastPath {\n    var path: String { get }\n    var lastPath: String { get }\n}\n\npublic protocol SwifQLUniversalKeyPath {\n    associatedtype AType\n    associatedtype AModel: Decodable\n    associatedtype ARoot\n    \n    var path: String { get }\n    var lastPath: String { get }\n    var originalKeyPath: KeyPath<AModel, AType> { get }\n}\n\n//MARK: - Casting\n\ninfix operator => : AdditionPrecedence\n/// e.g. `\"1\"::.text`\npublic func => (lhs: SwifQLable, rhs: Type) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .custom(\"::\"))\n    parts.append(o: .custom(rhs.name))\n    return SwifQLableParts(parts: parts)\n}\n/// e.g. `\"hello\" as \"title\"`\npublic func => (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .space)\n    parts.append(o: .as)\n    parts.append(o: .space)\n    if let rhs = rhs as? SwifQLUniversalKeyPathSimple {\n        parts.append(SwifQLPartAlias(rhs.lastPath))\n    } else if let _ = rhs as? _AliasKeyPath {\n        parts.append(contentsOf: rhs.parts)\n    } else if let _ = rhs as? TableAlias {\n        parts.append(contentsOf: rhs.parts)\n    } else if let schemaWithTable = rhs as? Path.SchemaWithTable {\n        parts.append(SwifQLPartAlias(schemaWithTable.table))\n    } else if let table = rhs as? Path.Table {\n        parts.append(SwifQLPartAlias(table.name))\n    } else if let kp = rhs as? Keypathable {\n        parts.append(SwifQLPartAlias(kp.lastPath))\n    } else {\n        parts.append(SwifQLPartAlias(String(describing: rhs)))\n    }\n    return SwifQLableParts(parts: parts)\n}\n\nprefix operator =>\n/// write `=>\"aliasName\"` in Swift\n/// to reach `\"aliasName\"` in SQL\npublic prefix func => (rhs: String) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(SwifQLPartAlias(rhs))\n    return SwifQLableParts(parts: parts)\n}\n\n//MARK: - Basic arithmetic functions\npublic func + (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .space)\n    parts.append(o: .custom(\"+\"))\n    parts.append(o: .space)\n    parts.append(contentsOf: rhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\ninfix operator ++: AdditionPrecedence\npublic func ++ (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .space)\n    parts.append(o: .custom(\"+\"))\n    parts.append(o: .space)\n    parts.append(contentsOf: rhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\npublic func - (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .space)\n    parts.append(o: .custom(\"-\"))\n    parts.append(o: .space)\n    parts.append(contentsOf: rhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\ninfix operator --: AdditionPrecedence\npublic func -- (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .space)\n    parts.append(o: .custom(\"-\"))\n    parts.append(o: .space)\n    parts.append(contentsOf: rhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\npublic func * (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .space)\n    parts.append(o: .custom(\"*\"))\n    parts.append(o: .space)\n    parts.append(contentsOf: rhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\ninfix operator **: AdditionPrecedence\npublic func ** (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .space)\n    parts.append(o: .custom(\"*\"))\n    parts.append(o: .space)\n    parts.append(contentsOf: rhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\npublic func / (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = lhs.parts\n    parts.append(o: .space)\n    parts.append(o: .custom(\"/\"))\n    parts.append(o: .space)\n    parts.append(contentsOf: rhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\n//% prefix for LIKE\nprefix operator %\nprefix public func %(lhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(o: .custom(\"%\"))\n    parts.append(contentsOf: lhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\n//% postfix for LIKE\npostfix operator %\npostfix public func %(rhs: SwifQLable) -> SwifQLable {\n    var parts = rhs.parts\n    parts.append(o: .custom(\"%\"))\n    return SwifQLableParts(parts: parts)\n}\n\n//1 opening bracket\nprefix operator |\nprefix public func |(lhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(o: .openBracket)\n    parts.append(contentsOf: lhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n//2 opening brackets\nprefix operator ||\nprefix public func ||(lhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(contentsOf: lhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n//3 opening brackets\nprefix operator |||\nprefix public func |||(lhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(contentsOf: lhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n//4 opening brackets\nprefix operator ||||\nprefix public func ||||(lhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(contentsOf: lhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n//5 opening brackets\nprefix operator |||||\nprefix public func |||||(lhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(contentsOf: lhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n//6 opening brackets\nprefix operator ||||||\nprefix public func ||||||(lhs: SwifQLable) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(o: .openBracket)\n    parts.append(contentsOf: lhs.parts)\n    return SwifQLableParts(parts: parts)\n}\n\n//1 closing bracket\npostfix operator |\npostfix public func |(rhs: SwifQLable) -> SwifQLable {\n    var parts = rhs.parts\n    parts.append(o: .closeBracket)\n    return SwifQLableParts(parts: parts)\n}\n//2 closing brackets\npostfix operator ||\npostfix public func ||(rhs: SwifQLable) -> SwifQLable {\n    var parts = rhs.parts\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    return SwifQLableParts(parts: parts)\n}\n//3 closing brackets\npostfix operator |||\npostfix public func |||(rhs: SwifQLable) -> SwifQLable {\n    var parts = rhs.parts\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    return SwifQLableParts(parts: parts)\n}\n//4 closing brackets\npostfix operator ||||\npostfix public func ||||(rhs: SwifQLable) -> SwifQLable {\n    var parts = rhs.parts\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    return SwifQLableParts(parts: parts)\n}\n//5 closing brackets\npostfix operator |||||\npostfix public func |||||(rhs: SwifQLable) -> SwifQLable {\n    var parts = rhs.parts\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    return SwifQLableParts(parts: parts)\n}\n//6 closing brackets\npostfix operator ||||||\npostfix public func ||||||(rhs: SwifQLable) -> SwifQLable {\n    var parts = rhs.parts\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    parts.append(o: .closeBracket)\n    return SwifQLableParts(parts: parts)\n}\n\npostfix operator *\npostfix public func *(lhs: SwifQLable) -> SwifQLable {\n    var parts = lhs.parts\n    parts.appendSpaceIfNeeded()\n    parts.append(o: .custom(\"*\"))\n    return SwifQLableParts(parts: parts)\n}\n\npostfix operator .*\npostfix public func .*(lhs: SwifQLable) -> SwifQLable {\n    var parts = lhs.parts\n    parts.append(o: .custom(\".*\"))\n    parts.append(o: .space)\n    return SwifQLableParts(parts: parts)\n}\n"
  },
  {
    "path": "Sources/SwifQL/Keypathable.swift",
    "content": "//\n//  Keypathable.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 11/11/2018.\n//\n\nimport Foundation\n\npublic protocol Keypathable: KeyPathLastPath {\n    var schema: String? { get }\n    var table: String { get }\n    var paths: [String] { get }\n    var shortPath: String { get }\n    var lastPath: String { get }\n}\n\nextension KeyPath: KeyPathLastPath where Root: Table, Value: ColumnRepresentable {\n    public var lastPath: String {\n        Root.key(for: self)\n    }\n}\n\nextension KeyPath: Keypathable where Root: Table, Value: ColumnRepresentable {\n    public var schema: String? {\n        (Root.self as? Schemable.Type)?.schemaName\n    }\n    \n    public var table: String {\n        Root.tableName\n    }\n    \n    public var paths: [String] {\n        [Root.key(for: self)]\n    }\n    \n    public var shortPath: String {\n        Root.key(for: self)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Operators.swift",
    "content": "//\n//  Operator.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 02/08/2019.\n//\n\nimport Foundation\n\npublic typealias Op = Operator\npublic typealias Operator = SwifQLPartOperator\n\nextension SwifQLPartOperator {\n    public typealias Result = SwifQLPartOperator\n    \n    public static var left: Result { \"LEFT\".operator }\n    public static var right: Result { \"RIGHT\".operator }\n    public static var inner: Result { \"INNER\".operator }\n    public static var outer: Result { \"OUTER\".operator }\n    public static var cross: Result { \"CROSS\".operator }\n    public static var lateral: Result { \"LATERAL\".operator }\n    public static var action: Result { \"ACTION\".operator }\n    public static var no: Result { \"NO\".operator }\n    public static var references: Result { \"REFERENCES\".operator }\n    public static var check: Result { \"CHECK\".operator }\n    public static var add: Result { \"ADD\".operator }\n    public static var primary: Result { \"PRIMARY\".operator }\n    public static var key: Result { \"KEY\".operator }\n    public static var unique: Result { \"UNIQUE\".operator }\n    public static var select: Result { \"SELECT\".operator }\n    public static var distinct: Result { \"DISTINCT\".operator }\n    public static var `as`: Result { \"as\".operator }\n    public static var any: Result { \"ANY\".operator }\n    public static var delete: Result { \"DELETE\".operator }\n    public static var from: Result { \"FROM\".operator }\n    public static var join: Result { \"JOIN\".operator }\n    public static var `where`: Result { \"WHERE\".operator }\n    public static var having: Result { \"HAVING\".operator }\n    public static var group: Result { \"GROUP\".operator }\n    public static var order: Result { \"ORDER\".operator }\n    public static var by: Result { \"BY\".operator }\n    public static var insert: Result { \"INSERT\".operator }\n    public static var into: Result { \"INTO\".operator }\n    public static var values: Result { \"VALUES\".operator }\n    public static var union: Result { \"UNION\".operator }\n    public static var all: Result { \"ALL\".operator }\n    public static var returning: Result { \"RETURNING\".operator }\n    public static var exists: Result { \"EXISTS\".operator }\n    public static var and: Result { \"AND\".operator }\n    public static var or: Result { \"OR\".operator }\n    public static var greaterThan: Result { \">\".operator }\n    public static var lessThan: Result { \"<\".operator }\n    public static var greaterThanOrEqual: Result { \">=\".operator }\n    public static var lessThanOrEqual: Result { \"<=\".operator }\n    public static var equal: Result { \"=\".operator }\n    public static var notEqual: Result { \"!=\".operator }\n    public static var `if`: Result { \"IF\".operator }\n    public static var `in`: Result { \"IN\".operator }\n    public static var notIn: Result { \"NOT IN\".operator }\n    public static var like: Result { \"LIKE\".operator }\n    public static var notLike: Result { \"NOT LIKE\".operator }\n    public static var ilike: Result { \"ILIKE\".operator }\n    public static var notILike: Result { \"NOT ILIKE\".operator }\n    public static var fulltext: Result { \"@@\".operator }\n    public static var isNull: Result { \"IS NULL\".operator }\n    public static var isNotNull: Result { \"IS NOT NULL\".operator }\n    public static var contains: Result { \"@>\".operator }\n    public static var containedBy: Result { \"<@\".operator }\n    public static var on: Result { \"ON\".operator }\n    public static var `case`: Result { \"CASE\".operator }\n    public static var when: Result { \"WHEN\".operator }\n    public static var then: Result { \"THEN\".operator }\n    public static var `else`: Result { \"ELSE\".operator }\n    public static var end: Result { \"END\".operator }\n    public static var null: Result { \"NULL\".operator }\n    public static var `do`: Result { \"DO\".operator }\n    public static var conflict: Result { \"CONFLICT\".operator }\n    public static var constraint: Result { \"CONSTRAINT\".operator }\n    public static var nothing: Result { \"NOTHING\".operator }\n    public static var asc: Result { \"ASC\".operator }\n    public static var desc: Result { \"DESC\".operator }\n    public static var limit: Result { \"LIMIT\".operator }\n    public static var offset: Result { \"OFFSET\".operator }\n    public static var `for`: Result { \"FOR\".operator }\n    public static var filter: Result { \"FILTER\".operator }\n    public static var array: Result { \"ARRAY\".operator }\n    public static var doubleDollar: Result { \"$$\".operator }\n    public static var between: Result { \"BETWEEN\".operator }\n    public static var notBetween: Result { \"NOT BETWEEN\".operator }\n    public static var not: Result { \"NOT\".operator }\n    public static var timestamp: Result { \"TIMESTAMP\".operator }\n    public static var with: Result { \"WITH\".operator }\n    public static var timeZone: Result { \"TIME ZONE\".operator }\n    public static var epoch: Result { \"EPOCH\".operator }\n    public static var interval: Result { \"INTERVAL\".operator }\n    public static var date: Result { \"DATE\".operator }\n    public static var millenium: Result { \"MILLENNIUM\".operator }\n    public static var microseconds: Result { \"MICROSECONDS\".operator }\n    public static var milliseconds: Result { \"MILLISECONDS\".operator }\n    public static var isoYear: Result { \"ISOYEAR\".operator }\n    public static var isoDoW: Result { \"ISODOW\".operator }\n    public static var hour: Result { \"HOUR\".operator }\n    public static var time: Result { \"TIME\".operator }\n    public static var minute: Result { \"MINUTE\".operator }\n    public static var month: Result { \"MONTH\".operator }\n    public static var quarter: Result { \"QUARTER\".operator }\n    public static var second: Result { \"SECOND\".operator }\n    public static var week: Result { \"WEEK\".operator }\n    public static var year: Result { \"YEAR\".operator }\n    public static var decade: Result { \"DECADE\".operator }\n    public static var century: Result { \"CENTURY\".operator }\n    public static var overlaps: Result { \"OVERLAPS\".operator }\n    public static var over: Result { \"OVER\".operator }\n    public static var doublePrecision: Result { \"DOUBLE PRECISION\".operator }\n    public static var nulls: Result { \"NULLS\".operator }\n    public static var first: Result { \"FIRST\".operator }\n    public static var last: Result { \"LAST\".operator }\n    public static var create: Result { \"CREATE\".operator }\n    public static var index: Result { \"INDEX\".operator }\n    public static var type: Result { \"TYPE\".operator }\n    public static var function: Result { \"FUNCTION\".operator }\n    public static var table: Result { \"TABLE\".operator }\n    public static var `enum`: Result { \"ENUM\".operator }\n    public static var range: Result { \"RANGE\".operator }\n    public static var subtype: Result { \"SUBTYPE\".operator }\n    public static var subtypeOpClass: Result { \"SUBTYPE_OPCLASS\".operator }\n    public static var collate: Result { \"COLLATE\".operator }\n    public static var collation: Result { \"COLLATION\".operator }\n    public static var collatable: Result { \"COLLATABLE\".operator }\n    public static var canonical: Result { \"CANONICAL\".operator }\n    public static var subtypeDiff: Result { \"SUBTYPE_DIFF\".operator }\n    public static var input: Result { \"INPUT\".operator }\n    public static var output: Result { \"OUTPUT\".operator }\n    public static var receive: Result { \"RECEIVE\".operator }\n    public static var send: Result { \"SEND\".operator }\n    public static var typmodIn: Result { \"TYPMOD_IN\".operator }\n    public static var typmodOut: Result { \"TYPMOD_OUT\".operator }\n    public static var analyze: Result { \"ANALYZE\".operator }\n    public static var internalLength: Result { \"INTERNALLENGTH\".operator }\n    public static var variable: Result { \"VARIABLE\".operator }\n    public static var passedByValue: Result { \"PASSEDBYVALUE\".operator }\n    public static var alignment: Result { \"ALIGNMENT\".operator }\n    public static var storage: Result { \"STORAGE\".operator }\n    public static var category: Result { \"CATEGORY\".operator }\n    public static var preferred: Result { \"PREFERRED\".operator }\n    public static var `default`: Result { \"DEFAULT\".operator }\n    public static var element: Result { \"ELEMENT\".operator }\n    public static var delimiter: Result { \"DELIMITER\".operator }\n    public static var returns: Result { \"RETURNS\".operator }\n    public static var setOf: Result { \"SETOF\".operator }\n    public static var begin: Result { \"BEGIN\".operator }\n    public static var commit: Result { \"COMMIT\".operator }\n    public static var rollback: Result { \"ROLLBACK\".operator }\n    public static var `return`: Result { \"RETURN\".operator }\n    public static var raise: Result { \"RAISE\".operator }\n    public static var exception: Result { \"EXCEPTION\".operator }\n    public static var replace: Result { \"REPLACE\".operator }\n    public static var semicolon: Result { \";\".operator }\n    public static var openBracket: Result { \"(\".operator }\n    public static var closeBracket: Result { \")\".operator }\n    public static var openSquareBracket: Result { \"[\".operator }\n    public static var closeSquareBracket: Result { \"]\".operator }\n    public static var openBrace: Result { \"{\".operator }\n    public static var closeBrace: Result { \"}\".operator }\n    public static var comma: Result { \",\".operator }\n    public static var period: Result { \".\".operator }\n    public static var space: Result { `_` }\n    public static var `_`: Result { \" \".operator }\n    public static var using: Result { \"USING\".operator }\n    public static var owner: Result { \"OWNER\".operator }\n    public static var to: Result { \"TO\".operator }\n    public static var currentUser: Result { \"CURRENT_USER\".operator }\n    public static var sessionUser: Result { \"SESSION_USER\".operator }\n    public static var rename: Result { \"RENAME\".operator }\n    public static var column: Result { \"COLUMN\".operator }\n    public static var attribute: Result { \"ATTRIBUTE\".operator }\n    public static var cascade: Result { \"CASCADE\".operator }\n    public static var restrict: Result { \"RESTRICT\".operator }\n    public static var schema: Result { \"SCHEMA\".operator }\n    public static var foreign: Result { \"FOREIGN\".operator }\n    public static var value: Result { \"VALUE\".operator }\n    public static var before: Result { \"BEFORE\".operator }\n    public static var after: Result { \"AFTER\".operator }\n    public static var drop: Result { \"DROP\".operator }\n    public static var update: Result { \"UPDATE\".operator }\n    public static var alter: Result { \"ALTER\".operator }\n    public static var set: Result { \"SET\".operator }\n    public static var data: Result { \"DATA\".operator }\n    public static var partition: Result { \"PARTITION\".operator }\n    public static var window: Result { \"WINDOW\".operator }\n    public static func custom(_ v: String) -> Result { v.operator }\n    \n    public var left: Result { concatWith(.left) }\n    public var right: Result { concatWith(.right) }\n    public var inner: Result { concatWith(.inner) }\n    public var outer: Result { concatWith(.outer) }\n    public var cross: Result { concatWith(.cross) }\n    public var lateral: Result { concatWith(.lateral) }\n    public var no: Result { concatWith(.no) }\n    public var action: Result { concatWith(.action) }\n    public var references: Result { concatWith(.references) }\n    public var add: Result { concatWith(.add) }\n    public var check: Result { concatWith(.check) }\n    public var primary: Result { concatWith(.primary) }\n    public var key: Result { concatWith(.key) }\n    public var unique: Result { concatWith(.unique) }\n    public var select: Result { concatWith(.select) }\n    public var distinct: Result { concatWith(.distinct) }\n    public var `as`: Result { concatWith(.as) }\n    public var any: Result { concatWith(.any) }\n    public var delete: Result { concatWith(.delete) }\n    public var from: Result { concatWith(.from) }\n    public var join: Result { concatWith(.join) }\n    public var `where`: Result { concatWith(.where) }\n    public var having: Result { concatWith(.having) }\n    public var group: Result { concatWith(.group) }\n    public var order: Result { concatWith(.order) }\n    public var by: Result { concatWith(.by) }\n    public var insert: Result { concatWith(.insert) }\n    public var into: Result { concatWith(.into) }\n    public var values: Result { concatWith(.values) }\n    public var union: Result { concatWith(.union) }\n    public var returning: Result { concatWith(.returning) }\n    public var exists: Result { concatWith(.exists) }\n    public var and: Result { concatWith(.and) }\n    public var or: Result { concatWith(.or) }\n    public var greaterThan: Result { concatWith(.greaterThan) }\n    public var lessThan: Result { concatWith(.lessThan) }\n    public var greaterThanOrEqual: Result { concatWith(.greaterThanOrEqual) }\n    public var lessThanOrEqual: Result { concatWith(.lessThanOrEqual) }\n    public var equal: Result { concatWith(.equal) }\n    public var notEqual: Result { concatWith(.notEqual) }\n    public var `if`: Result { concatWith(.if) }\n    public var `in`: Result { concatWith(.in) }\n    public var notIn: Result { concatWith(.notIn) }\n    public var like: Result { concatWith(.like) }\n    public var notLike: Result { concatWith(.notLike) }\n    public var ilike: Result { concatWith(.ilike) }\n    public var notILike: Result { concatWith(.notILike) }\n    public var fulltext: Result { concatWith(.fulltext) }\n    public var isNull: Result { concatWith(.isNull) }\n    public var isNotNull: Result { concatWith(.isNotNull) }\n    public var contains: Result { concatWith(.contains) }\n    public var containedBy: Result { concatWith(.containedBy) }\n    public var on: Result { concatWith(.on) }\n    public var `case`: Result { concatWith(.case) }\n    public var when: Result { concatWith(.when) }\n    public var then: Result { concatWith(.then) }\n    public var `else`: Result { concatWith(.else) }\n    public var end: Result { concatWith(.end) }\n    public var null: Result { concatWith(.null) }\n    public var `do`: Result { concatWith(.do) }\n    public var conflict: Result { concatWith(.conflict) }\n    public var constraint: Result { concatWith(.constraint) }\n    public var nothing: Result { concatWith(.nothing) }\n    public var asc: Result { concatWith(.asc) }\n    public var desc: Result { concatWith(.desc) }\n    public var limit: Result { concatWith(.limit) }\n    public var offset: Result { concatWith(.offset) }\n    public var `for`: Result { concatWith(.for) }\n    public var filter: Result { concatWith(.filter) }\n    public var array: Result { concatWith(.array) }\n    public var doubleDollar: Result { concatWith(.doubleDollar) }\n    public var between: Result { concatWith(.between) }\n    public var notBetween: Result { concatWith(.notBetween) }\n    public var not: Result { concatWith(.not) }\n    public var timestamp: Result { concatWith(.timestamp) }\n    public var with: Result { concatWith(.with) }\n    public var timeZone: Result { concatWith(.timeZone) }\n    public var epoch: Result { concatWith(.epoch) }\n    public var interval: Result { concatWith(.interval) }\n    public var date: Result { concatWith(.date) }\n    public var millenium: Result { concatWith(.millenium) }\n    public var microseconds: Result { concatWith(.microseconds) }\n    public var milliseconds: Result { concatWith(.milliseconds) }\n    public var isoYear: Result { concatWith(.isoYear) }\n    public var isoDoW: Result { concatWith(.isoDoW) }\n    public var hour: Result { concatWith(.hour) }\n    public var time: Result { concatWith(.time) }\n    public var minute: Result { concatWith(.minute) }\n    public var month: Result { concatWith(.month) }\n    public var quarter: Result { concatWith(.quarter) }\n    public var second: Result { concatWith(.second) }\n    public var week: Result { concatWith(.week) }\n    public var year: Result { concatWith(.year) }\n    public var decade: Result { concatWith(.decade) }\n    public var century: Result { concatWith(.century) }\n    public var overlaps: Result { concatWith(.overlaps) }\n    public var over: Result { concatWith(.over) }\n    public var doublePrecision: Result { concatWith(.doublePrecision) }\n    public var nulls: Result { concatWith(.nulls) }\n    public var first: Result { concatWith(.first) }\n    public var last: Result { concatWith(.last) }\n    public var create: Result { concatWith(.create) }\n    public var index: Result { concatWith(.index) }\n    public var type: Result { concatWith(.type) }\n    public var function: Result { concatWith(.function) }\n    public var table: Result { concatWith(.table) }\n    public var `enum`: Result { concatWith(.enum) }\n    public var range: Result { concatWith(.range) }\n    public var subtype: Result { concatWith(.subtype) }\n    public var subtypeOpClass: Result { concatWith(.subtypeOpClass) }\n    public var collate: Result { concatWith(.collate) }\n    public var collation: Result { concatWith(.collation) }\n    public var collatable: Result { concatWith(.collatable) }\n    public var canonical: Result { concatWith(.canonical) }\n    public var subtypeDiff: Result { concatWith(.subtypeDiff) }\n    public var input: Result { concatWith(.input) }\n    public var output: Result { concatWith(.output) }\n    public var receive: Result { concatWith(.receive) }\n    public var send: Result { concatWith(.send) }\n    public var typmodIn: Result { concatWith(.typmodIn) }\n    public var typmodOut: Result { concatWith(.typmodOut) }\n    public var analyze: Result { concatWith(.analyze) }\n    public var internalLength: Result { concatWith(.internalLength) }\n    public var variable: Result { concatWith(.variable) }\n    public var passedByValue: Result { concatWith(.passedByValue) }\n    public var alignment: Result { concatWith(.alignment) }\n    public var storage: Result { concatWith(.storage) }\n    public var category: Result { concatWith(.category) }\n    public var preferred: Result { concatWith(.preferred) }\n    public var `default`: Result { concatWith(.default) }\n    public var element: Result { concatWith(.element) }\n    public var delimiter: Result { concatWith(.delimiter) }\n    public var returns: Result { concatWith(.returns) }\n    public var setOf: Result { concatWith(.setOf) }\n    public var begin: Result { concatWith(.begin) }\n    public var commit: Result { concatWith(.commit) }\n    public var rollback: Result { concatWith(.rollback) }\n    public var `return`: Result { concatWith(.return) }\n    public var raise: Result { concatWith(.raise) }\n    public var exception: Result { concatWith(.exception) }\n    public var replace: Result { concatWith(.replace) }\n    public var semicolon: Result { concatWith(.semicolon) }\n    public var openBracket: Result { concatWith(.openBracket) }\n    public var closeBracket: Result { concatWith(.closeBracket) }\n    public var openSquareBracket: Result { concatWith(.openSquareBracket) }\n    public var closeSquareBracket: Result { concatWith(.closeSquareBracket) }\n    public var openBrace: Result { concatWith(.openBrace) }\n    public var closeBrace: Result { concatWith(.closeBrace) }\n    public var comma: Result { concatWith(.comma) }\n    public var period: Result { concatWith(.period) }\n    public var space: Result { concatWith(.space) }\n    public var `_`: Result { concatWith(.`_`) }\n    public var using: Result { concatWith(.using) }\n    public var owner: Result { concatWith(.owner) }\n    public var to: Result { concatWith(.to) }\n    public var currentUser: Result { concatWith(.currentUser) }\n    public var sessionUser: Result { concatWith(.sessionUser) }\n    public var rename: Result { concatWith(.rename) }\n    public var column: Result { concatWith(.column) }\n    public var attribute: Result { concatWith(.attribute) }\n    public var cascade: Result { concatWith(.cascade) }\n    public var restrict: Result { concatWith(.restrict) }\n    public var schema: Result { concatWith(.schema) }\n    public var foreign: Result { concatWith(.foreign) }\n    public var value: Result { concatWith(.value) }\n    public var before: Result { concatWith(.before) }\n    public var after: Result { concatWith(.after) }\n    public var drop: Result { concatWith(.drop) }\n    public var update: Result { concatWith(.update) }\n    public var alter: Result { concatWith(.alter) }\n    public var set: Result { concatWith(.set) }\n    public var data: Result { concatWith(.data) }\n    public var partition: Result { concatWith(.partition) }\n    public var window: Result { concatWith(.window) }\n    public func custom(_ v: String) -> Result { concatWith(.custom(v)) }\n    \n    private func concatWith(_ operator: Result) -> Result {\n        (_value + `operator`._value).operator\n    }\n}\n\nextension String {\n    fileprivate var `operator`: SwifQLPartOperator { .init(self) }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/AliasPart.swift",
    "content": "//\n//  AliasPart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartAlias: SwifQLPart {\n    var alias: String\n    \n    init (_ alias: String) {\n        self.alias = alias\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/ArrayPart.swift",
    "content": "//\n//  ArrayPart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 06.06.2020.\n//\n\nimport Foundation\n\npublic protocol SwifQLPartArray: SwifQLPart {\n    var elements: [SwifQLable] { get }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/BoolPart.swift",
    "content": "//\n//  BoolPart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic typealias SwifQLBool = SwifQLPartBool\n\npublic struct SwifQLPartBool: SwifQLPart, SwifQLable {\n    public var parts: [SwifQLPart] { [self] }\n    \n    let value: Bool\n    \n    public init (_ value: Bool) {\n        self.value = value\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/ColumnPart.swift",
    "content": "//\n//  ColumnPart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartColumn: SwifQLPart {\n    public var name: String\n    \n    public init (_ name: String) {\n        self.name = name\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/DatePart.swift",
    "content": "//\n//  DatePart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartDate: SwifQLPart {\n    public var date: Date\n    \n    public init (_ date: Date) {\n        self.date = date\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/HybridOperatorPart.swift",
    "content": "//\n//  HybridOperatorPart.swift\n//  \n//\n//  Created by TierraCero on 5/30/23.\n//\n\nimport Foundation\n\npublic struct SwifQLHybridOperator: SwifQLPart, Equatable {\n    \n    var _psql: SwifQLPartOperator\n    \n    var _mysql: SwifQLPartOperator\n    \n    public init (_ psql: SwifQLPartOperator, _ mysql: SwifQLPartOperator) {\n        self._psql = psql\n        self._mysql = mysql\n    }\n}\n\nextension SwifQLHybridOperator: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [self]\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/KeyPathPart.swift",
    "content": "//\n//  KeyPathPart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartKeyPath: SwifQLKeyPathable {\n    public var schema: String?\n    public var table: String?\n    public var paths: [String]\n    public var asText: Bool\n    // FIXME: instead of `asText` here create some protocol for path which will support `asText` for each part of path\n    public init (schema: String? = nil, table: String? = nil, paths: String..., asText: Bool = false) {\n        self.init(schema: schema, table: table, paths: paths, asText: asText)\n    }\n    public init (schema: String? = nil, table: String? = nil, paths: [String], asText: Bool = false) {\n        self.schema = schema\n        self.table = table\n        self.paths = paths\n        self.asText = asText\n    }\n    public var column: SwifQLPartColumn {\n        .init(paths[0])\n    }\n}\n\nextension SwifQLPartKeyPath: SwifQLable {\n    public var parts: [SwifQLPart] {\n        SwifQLableParts(parts: self).parts\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/NullPart.swift",
    "content": "//\n//  NullPart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 31.10.2020.\n//\n\nimport Foundation\n\npublic var SwifQLNull: SwifQLPartNull { .init() }\n\npublic struct SwifQLPartNull: SwifQLPart, SwifQLable {\n    public var parts: [SwifQLPart] { [self] }\n    public init () {}\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/OperatorPart.swift",
    "content": "//\n//  OperatorPart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartOperator: SwifQLPart, Equatable {\n    var _value: String\n    \n    public init (_ value: String) {\n        self._value = value\n    }\n}\n\nextension SwifQLPartOperator: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [self]\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/SafeValuePart.swift",
    "content": "//\n//  SafeValuePart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartSafeValue: SwifQLPart {\n    var safeValue: Any?\n    \n    public init (_ value: Any?) {\n        safeValue = value\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/TablePart.swift",
    "content": "//\n//  TablePart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartSchema: SwifQLPart {\n    public var schema: String?\n    public init (_ schema: String?) {\n        self.schema = schema\n    }\n}\n\npublic struct SwifQLPartTable: SwifQLPart {\n    public var schema: String?\n    public var table: String\n    public init (_ table: String) {\n        self.table = table\n    }\n    public init (schema: String?, table: String) {\n        self.schema = schema\n        self.table = table\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/TableWithAliasPart.swift",
    "content": "//\n//  TableWithAliasPart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartTableWithAlias: SwifQLPart {\n    public var schema: String?\n    public var table, alias: String\n    \n    public init (schema: String?, table: String, alias: String) {\n        self.schema = schema\n        self.table = table\n        self.alias = alias\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Parts/UnsafeValuePart.swift",
    "content": "//\n//  UnsafeValuePart.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPartUnsafeValue: SwifQLPart {\n    var unsafeValue: Encodable\n    \n    public init (_ value: Encodable) {\n        unsafeValue = value\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Path/Path+Column.swift",
    "content": "//\n//  Path+Column.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 04.01.2020.\n//\n\nimport Foundation\n\nextension Path {\n    public struct Column {\n        public let paths: [String]\n        \n        public init (_ paths: String...) {\n            self.paths = paths\n        }\n        \n        public init (_ paths: [String]) {\n            self.paths = paths\n        }\n    }\n}\n\nextension Path.Column: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [SwifQLPartKeyPath(table: nil, paths: paths)]\n    }\n}\n\nextension Path.Column: KeyPathLastPath {\n    public var lastPath: String { paths.last ?? \"\" }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Path/Path+Schema.swift",
    "content": "//\n//  Path+Schema.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\nextension Path {\n    public struct Schema {\n        public let name: String?\n        \n        public init (_ name: String?) {\n            self.name = name\n        }\n        \n        @discardableResult\n        public func table(_ table: Table) -> SchemaWithTable {\n            self.table(table.name)\n        }\n        \n        @discardableResult\n        public func table(_ table: String) -> SchemaWithTable {\n            .init(schema: name, table: table)\n        }\n    }\n}\n\nextension Path.Schema: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [SwifQLPartSchema(name)]\n    }\n}\n\nextension Path.Schema: KeyPathLastPath {\n    public var lastPath: String { \"\" }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Path/Path+SchemaWithTable.swift",
    "content": "//\n//  Path+SchemaWithTable.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\nextension Path {\n    public struct SchemaWithTable {\n        public let schema: String?\n        public let table: String\n        \n        public init (schema: String?, table: String) {\n            self.schema = schema\n            self.table = table\n        }\n        \n        @discardableResult\n        public func column(_ column: Column) -> SchemaWithTableAndColumn {\n            self.column(column.paths)\n        }\n        \n        @discardableResult\n        public func column(_ paths: String...) -> SchemaWithTableAndColumn {\n            column(paths)\n        }\n        \n        @discardableResult\n        public func column(_ paths: [String]) -> SchemaWithTableAndColumn {\n            SchemaWithTableAndColumn(schema: schema, table: table, paths: paths)\n        }\n    }\n}\n\nextension Path.SchemaWithTable: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [SwifQLPartTable(schema: schema, table: table)]\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Path/Path+SchemaWithTableAndColumn.swift",
    "content": "//\n//  Path+SchemaWithTableAndColumn.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\nextension Path {\n    public struct SchemaWithTableAndColumn {\n        let schema: String?\n        let table: String\n        let paths: [String]\n    }\n}\n\nextension Path.SchemaWithTableAndColumn: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [SwifQLPartKeyPath(schema: schema, table: table, paths: paths)]\n    }\n}\n\nextension Path.SchemaWithTableAndColumn: KeyPathLastPath {\n    public var lastPath: String { paths.last ?? \"\" }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Path/Path+Table.swift",
    "content": "//\n//  Path+Table.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 07.01.2020.\n//\n\nimport Foundation\n\nextension Path {\n    public struct Table {\n        public let name: String\n        \n        public init (_ name: String) {\n            self.name = name\n        }\n        \n        @discardableResult\n        public func column(_ column: Column) -> TableWithColumn {\n            self.column(column.paths)\n        }\n        \n        @discardableResult\n        public func column(_ paths: String...) -> TableWithColumn {\n            column(paths)\n        }\n        \n        @discardableResult\n        public func column(_ paths: [String]) -> TableWithColumn {\n            TableWithColumn(table: name, paths: paths)\n        }\n    }\n}\n\nextension Path.Table: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [SwifQLPartTable(name)]\n    }\n}\n\nextension Path.Table: KeyPathLastPath {\n    public var lastPath: String { \"\" }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Path/Path+TableWithColumn.swift",
    "content": "//\n//  TableWithColumn.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 07.01.2020.\n//\n\nimport Foundation\n\nextension Path {\n    public struct TableWithColumn {\n        let table: String\n        let paths: [String]\n    }\n}\n\nextension Path.TableWithColumn: SwifQLable {\n    public var parts: [SwifQLPart] {\n        [SwifQLPartKeyPath(table: table, paths: paths)]\n    }\n}\n\nextension Path.TableWithColumn: KeyPathLastPath {\n    public var lastPath: String { paths.last ?? \"\" }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Path/Path.swift",
    "content": "//\n//  Path.swift\n//  \n//\n//  Created by Mihael Isaev on 26.01.2020.\n//\n\nimport Foundation\n\npublic struct Path {}\n"
  },
  {
    "path": "Sources/SwifQL/Predicates.swift",
    "content": "//\n//  Predicates.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\npublic struct SwifQLPredicate: SwifQLable {\n    public var parts: [SwifQLPart]\n    \n    public init (operator: SwifQLPartOperator, lhs: SwifQLable, rhs: SwifQLable?) {\n        parts = lhs.parts\n        parts.append(o: .space)\n        if let rhs = rhs {\n            parts.append(o: `operator`)\n            parts.append(o: .space)\n            parts.append(contentsOf: rhs.parts)\n        } else {\n            switch `operator` {\n            case .equal: parts.append(o: .isNull)\n            case .notEqual: parts.append(o: .isNotNull)\n            default: parts.append(o: .null)\n            }\n        }\n    }\n}\n\npublic func > (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .greaterThan, lhs: lhs, rhs: rhs)\n}\n\npublic func < (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .lessThan, lhs: lhs, rhs: rhs)\n}\n\npublic func >= (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .greaterThanOrEqual, lhs: lhs, rhs: rhs)\n}\n\npublic func <= (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .lessThanOrEqual, lhs: lhs, rhs: rhs)\n}\n\npublic func == <T>(lhs: T, rhs: T.AType) -> SwifQLable\n    where T: SwifQLUniversalKeyPath, T: SwifQLable, T.AType: RawRepresentable, T.AType: Encodable {\n    SwifQLPredicate(operator: .equal, lhs: lhs, rhs: SwifQLableParts(parts: SwifQLPartSafeValue(rhs.rawValue)))\n}\npublic func == <T>(lhs: T, rhs: T.AType.RawValue) -> SwifQLable\n    where T: SwifQLUniversalKeyPath, T: SwifQLable, T.AType: RawRepresentable, T.AType.RawValue: SwifQLable {\n    SwifQLPredicate(operator: .equal, lhs: lhs, rhs: SwifQLableParts(parts: SwifQLPartSafeValue(rhs)))\n}\npublic func != <T>(lhs: T, rhs: T.AType) -> SwifQLable\n    where T: SwifQLUniversalKeyPath, T: SwifQLable, T.AType: RawRepresentable, T.AType: Encodable {\n    SwifQLPredicate(operator: .notEqual, lhs: lhs, rhs: SwifQLableParts(parts: SwifQLPartSafeValue(rhs.rawValue)))\n}\npublic func != <T>(lhs: T, rhs: T.AType.RawValue) -> SwifQLable\n    where T: SwifQLUniversalKeyPath, T: SwifQLable, T.AType: RawRepresentable, T.AType.RawValue: SwifQLable {\n    SwifQLPredicate(operator: .notEqual, lhs: lhs, rhs: SwifQLableParts(parts: SwifQLPartSafeValue(rhs)))\n}\n\npublic func == (lhs: SwifQLable, rhs: SwifQLable?) -> SwifQLable {\n    SwifQLPredicate(operator: .equal, lhs: lhs, rhs: rhs)\n}\n\npublic func != (lhs: SwifQLable, rhs: SwifQLable?) -> SwifQLable {\n    SwifQLPredicate(operator: .notEqual, lhs: lhs, rhs: rhs)\n}\n\npublic func == (lhs: SwifQLable, rhs: Bool) -> SwifQLable {\n    SwifQLPredicate(operator: .equal, lhs: lhs, rhs: SwifQLPartBool(rhs))\n}\n\npublic func != (lhs: SwifQLable, rhs: Bool) -> SwifQLable {\n    SwifQLPredicate(operator: .notEqual, lhs: lhs, rhs: SwifQLPartBool(rhs))\n}\n\npublic func == (lhs: Bool, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .equal, lhs: SwifQLPartBool(lhs), rhs: rhs)\n}\n\npublic func != (lhs: Bool, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .notEqual, lhs: SwifQLPartBool(lhs), rhs: rhs)\n}\n\npublic func && (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .and, lhs: lhs, rhs: rhs)\n}\n\npublic func || (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .or, lhs: lhs, rhs: rhs)\n}\n\n/// Originally: @>\ninfix operator ||> : AdditionPrecedence\npublic func ||> (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .contains, lhs: lhs, rhs: rhs)\n}\n\n/// Originally: <@\ninfix operator <|| : AdditionPrecedence\npublic func <|| (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .containedBy, lhs: lhs, rhs: rhs)\n}\n\n/// Originally: BETWEEN\ninfix operator <> : AdditionPrecedence\npublic func <> (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    SwifQLPredicate(operator: .between, lhs: lhs, rhs: rhs)\n}\n\n// TBD: Table 9.43. json and jsonb Operators (https://www.postgresql.org/docs/current/functions-json.html)\n// TBD: Table 9.44. Additional jsonb Operators (https://www.postgresql.org/docs/current/functions-json.html)\n\n//OR ||\n"
  },
  {
    "path": "Sources/SwifQL/Prepared.swift",
    "content": "//\n//  Prepared.swift\n//\n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLPrepared {\n    var _dialect: SQLDialect\n    var _query: String\n    var _values: [Encodable]\n    var _formattedValues: [String]\n    \n    init (dialect: SQLDialect, query: String, values: [Encodable], formattedValues: [String]) {\n        _dialect = dialect\n        _query = query\n        _values = values\n        _formattedValues = formattedValues\n    }\n    \n    public var plain: String {\n        guard _values.count > 0 else { return _query }\n        let formatter = SwifQLFormatter(_dialect, mode: .plain)\n        return formatter.string(from: _query, with: _formattedValues)\n    }\n    \n    public var splitted: SwifQLSplittedQuery {\n        guard _values.count > 0 else { return .init(query: _query, values: _values) }\n        let formatter = SwifQLFormatter(_dialect, mode: .binded)\n        let result = formatter.string(from: _query, with: _formattedValues)\n        return .init(query: result, values: _values)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/QueryBuilderable.swift",
    "content": "//\n//  QueryBuilderable.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 18.05.2020.\n//\n\nimport Foundation\n\npublic protocol QueryBuilderable: AnyObject {\n    var queryParts: QueryParts { get set }\n}\n\nextension QueryBuilderable {\n    // MARK: Join\n    \n    @discardableResult\n    public func join(_ mode: JoinMode, _ table: SwifQLable, on predicates: SwifQLable) -> Self {\n        join(SwifQLJoinBuilder(mode, table, on: predicates))\n    }\n    \n    @discardableResult\n    public func join(_ item: SwifQLJoinBuilder...) -> Self {\n        join(item)\n    }\n    \n    @discardableResult\n    public func join(_ items: [SwifQLJoinBuilder]) -> Self {\n        queryParts.joins.append(contentsOf: items)\n        return self\n    }\n    \n    // MARK: Where\n    \n    @discardableResult\n    public func `where`(_ item: SwifQLable...) -> Self {\n        `where`(item)\n    }\n    \n    @discardableResult\n    public func `where`(_ items: [SwifQLable]) -> Self {\n        queryParts.wheres.append(contentsOf: items)\n        return self\n    }\n    \n    // MARK: Group by\n    \n    @discardableResult\n    public func groupBy(_ item: SwifQLable...) -> Self {\n        groupBy(item)\n    }\n    \n    @discardableResult\n    public func groupBy(_ items: [SwifQLable]) -> Self {\n        queryParts.groupBy.append(contentsOf: items)\n        return self\n    }\n    \n    // MARK: Having\n    \n    @discardableResult\n    public func having(_ item: SwifQLable...) -> Self {\n        having(item)\n    }\n    \n    @discardableResult\n    public func having(_ items: [SwifQLable]) -> Self {\n        queryParts.havings.append(contentsOf: items)\n        return self\n    }\n    \n    // MARK: Order by\n    \n    @discardableResult\n    public func orderBy(_ item: OrderByItem...) -> Self {\n        orderBy(item)\n    }\n    \n    @discardableResult\n    public func orderBy(_ items: [OrderByItem]) -> Self {\n        queryParts.orderBy.append(contentsOf: items)\n        return self\n    }\n    \n    // MARK: Offset\n    \n    @discardableResult\n    public func offset(_ value: Int) -> Self {\n        queryParts.offset = value\n        return self\n    }\n    \n    // MARK: Limit\n    \n    @discardableResult\n    public func limit(_ value: Int) -> Self {\n        queryParts.limit = value\n        return self\n    }\n    @discardableResult\n    public func limit(_ offset: Int,_ limit: Int) -> Self {\n        queryParts.limit = limit\n        queryParts.offset = offset\n        return self\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/QueryParts.swift",
    "content": "//\n//  QueryParts.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 18.05.2020.\n//\n\nimport Foundation\n\npublic class QueryParts {\n    public var joins: [SwifQLJoinBuilder] = []\n    public var wheres: [SwifQLable] = []\n    public var groupBy: [SwifQLable] = []\n    public var havings: [SwifQLable] = []\n    public var orderBy: [OrderByItem] = []\n    public var offset: Int?\n    public var limit: Int?\n    \n    public init () {}\n    \n    public func copy() -> QueryParts {\n        let copy = QueryParts()\n        \n        copy.joins = joins\n        copy.wheres = wheres\n        copy.groupBy = groupBy\n        copy.havings = havings\n        copy.orderBy = orderBy\n        copy.offset = offset\n        copy.limit = limit\n        \n        return copy\n    }\n    \n    public func buildQuery() -> SwifQLable {\n        var query = SwifQL\n        joins.forEach {\n            query = query.join($0.mode, $0.table, on: $0.predicates)\n        }\n        wheres.enumerated().forEach {\n            if $0.offset == 0 {\n                query = query.where($0.element)\n            } else {\n                query = query && $0.element\n            }\n        }\n        if groupBy.count > 0 {\n            query = query.groupBy(groupBy)\n        }\n        havings.enumerated().forEach {\n            if $0.offset == 0 {\n                query = query.having($0.element)\n            } else {\n                query = query && $0.element\n            }\n        }\n        if orderBy.count > 0 {\n            query = query.orderBy(orderBy)\n        }\n        if let limit = limit {\n            query = query.limit(limit)\n        }\n        if let offset = offset {\n            query = query.offset(offset)\n        }\n        return query\n    }\n    \n    public func appended(to query: SwifQLable) -> SwifQLable {\n        let q = buildQuery()\n        guard q.parts.count > 0 else { return query }\n        return query.addQuery(q)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/ReferentialAction.swift",
    "content": "//\n//  ReferentialAction.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\npublic struct ReferentialAction: SwifQLable {\n    public var parts: [SwifQLPart] { query.parts }\n    var query: SwifQLable\n    \n    public init (_ expression: SwifQLable) {\n        query = expression\n    }\n    \n    /// Produce an error indicating that the deletion or update\n    /// would create a foreign key constraint violation.\n    /// If the constraint is deferred, this error will be produced at constraint\n    /// check time if there still exist any referencing rows. This is the default action.\n    public static var noAction: ReferentialAction { .init(SwifQL.no.action) }\n\n    /// Produce an error indicating that the deletion or update\n    /// would create a foreign key constraint violation.\n    /// This is the same as NO ACTION except that the check is not deferrable.\n    public static var restrict: ReferentialAction { .init(SwifQL.restrict) }\n\n    /// Delete any rows referencing the deleted row,\n    /// or update the values of the referencing column(s)\n    /// to the new values of the referenced columns, respectively.\n    public static var cascade: ReferentialAction { .init(SwifQL.cascade) }\n\n    /// Set the referencing column(s) to null.\n    public static var setNull: ReferentialAction { .init(SwifQL.set.null) }\n\n    /// Set the referencing column(s) to their default values.\n    /// (There must be a row in the referenced table matching the default values,\n    /// if they are not null, or the operation will fail.)\n    public static var setDefault: ReferentialAction { .init(SwifQL.set.default) }\n}\n"
  },
  {
    "path": "Sources/SwifQL/ResultBuilders/SwifQLableResultBuilder.swift",
    "content": "////\n////  SwifQLableResultBuilder.swift\n////  SwifQL\n////\n////  Created by Mihael Isaev on 11.04.2020.\n////\n//\n//import Foundation\n//\n//@resultBuilder public struct SwifQLableResultBuilder {\n//    public typealias Block = () -> SwifQLable\n//    \n//    /// Builds an empty view from an block containing no statements, `{ }`.\n//    public static func buildBlock() -> SwifQLable { [] }\n//    \n//    /// Passes a single view written as a child view (e..g, `{ Text(\"Hello\") }`) through unmodified.\n//    public static func buildBlock(_ attrs: SwifQLable...) -> SwifQLable {\n//        buildBlock(attrs)\n//    }\n//    \n//    /// Passes a single view written as a child view (e..g, `{ Text(\"Hello\") }`) through unmodified.\n//    public static func buildBlock(_ attrs: [SwifQLable]) -> SwifQLable {\n//        \n//        ViewBuilderItems(items: attrs.flatMap { $0.viewBuilderItems })\n//    }\n//    \n//    /// Provides support for \"if\" statements in multi-statement closures, producing an `Optional` view\n//    /// that is visible only when the `if` condition evaluates `true`.\n//    public static func buildIf(_ content: SwifQLable?) -> SwifQLable {\n//        guard let content = content else { return [] }\n//        return content\n//    }\n//    \n//    /// Provides support for \"if\" statements in multi-statement closures, producing\n//    /// ConditionalContent for the \"then\" branch.\n//    public static func buildEither(first: SwifQLable) -> SwifQLable {\n//        first\n//    }\n//\n//    /// Provides support for \"if-else\" statements in multi-statement closures, producing\n//    /// ConditionalContent for the \"else\" branch.\n//    public static func buildEither(second: SwifQLable) -> SwifQLable {\n//        second\n//    }\n//}\n//\n//public protocol SwifQLableResultBuilderItem {\n//    var expressions: [SwifQLable] { get }\n//}\n//\n//extension SwifQLable: SwifQLableResultBuilderItem {\n//    public var expressions: [SwifQLable] { [self] }\n//}\n//extension Array: SwifQLableResultBuilderItem where Element: SwifQLable {\n//    public var expressions: [SwifQLable] { self }\n//}\n//extension Optional: SwifQLableResultBuilderItem where Wrapped: SwifQLable {\n//    public var expressions: [SwifQLable] {\n//        switch self {\n//        case .none: return []\n//        case .some(let value): return [value]\n//        }\n//    }\n//}\n"
  },
  {
    "path": "Sources/SwifQL/Schema.swift",
    "content": "//\n//  Schema.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\n@dynamicMemberLookup\npublic struct Schema<T: AnyTable> {\n    let name: String\n    \n    public init (_ name: String) {\n        self.name = name\n    }\n\n    public subscript<V>(dynamicMember keyPath: KeyPath<T, V>) -> SwifQLable {\n        guard let k = keyPath as? Keypathable else { return \"<keyPath should conform to Keypathable>\" }\n        return SwifQLPartKeyPath(schema: name, table: k.table, paths: k.paths)\n    }\n    \n    public var table: SwifQLable {\n        Path.SchemaWithTable(schema: name, table: T.tableName)\n    }\n    \n    public func column(_ paths: String...) -> Path.SchemaWithTableAndColumn {\n        column(paths)\n    }\n    \n    public func column(_ paths: [String]) -> Path.SchemaWithTableAndColumn {\n        .init(schema: name, table: T.tableName, paths: paths)\n    }\n    \n    public func `as`(_ alias: String) -> GenericTableAlias<T> {\n        .init(alias, schema: name)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Schemable.swift",
    "content": "//\n//  Schemable.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\npublic protocol Schemable {\n    /// This schema's unique name. By default, this property is set to a `String` describing the type.\n    static var schemaName: String { get }\n}\n\n// MARK: Optional\n\nextension Schemable {\n    public static var schemaName: String { \"public\" }\n    \n    public static func table(_ table: Path.Table) -> Path.SchemaWithTable {\n        Path.Schema(schemaName).table(table.name)\n    }\n    \n    public static func table(_ table: String) -> Path.SchemaWithTable {\n        Path.Schema(schemaName).table(table)\n    }\n    \n    public static func path(_ table: String, _ paths: String...) -> Path.SchemaWithTableAndColumn {\n        path(table, paths)\n    }\n    \n    public static func path(_ table: String, _ paths: [String]) -> Path.SchemaWithTableAndColumn {\n        Path.Schema(schemaName).table(table).column(paths)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SplittedQuery.swift",
    "content": "//\n//  SplittedQuery.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\npublic struct SwifQLSplittedQuery {\n    public var query: String\n    public var values: [Encodable]\n    \n    init (query: String, values: [Encodable]) {\n        self.query = query\n        self.values = values\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQL.swift",
    "content": "//\n//  SwifQL.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 04/11/2018.\n//\n\nimport Foundation\n\npublic let SwifQL: SwifQLable = _SwifQL()\n\npublic func SwifQL(_ query: SwifQLable) -> SwifQLable {\n    _SwifQL(query)\n}\n\nprivate struct _SwifQL: SwifQLable {\n    public var parts: [SwifQLPart] = []\n    \n    public init (_ query: SwifQLable? = nil) {\n        if let parts = query?.parts {\n            self.parts = parts\n        }\n    }\n}\n\ninfix operator ~\npublic func ~ (lhs: SwifQLable, rhs: SwifQLable) -> SwifQLable {\n    var parts = lhs.parts\n    parts.append(contentsOf: rhs.parts)\n    return SwifQLableParts(parts: parts)\n}\npublic func ~ (lhs: SwifQLable, rhs: SwifQLPartOperator) -> SwifQLable {\n    var parts = lhs.parts\n    parts.append(o: rhs)\n    return SwifQLableParts(parts: parts)\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Action.swift",
    "content": "//\n//  SwifQLable+Action.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\n//MARK: ACTION\n\nextension SwifQLable {\n    public var action: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .action)\n        return SwifQLableParts(parts: parts)\n    }\n}\n\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Add.swift",
    "content": "//\n//  SwifQLable+Add.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var add: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .add)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+AddQuery.swift",
    "content": "//\n//  SwifQLable+AddQuery.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 18.05.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    func addQuery(_ q: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(contentsOf: q.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+After.swift",
    "content": "//\n//  SwifQLable+After.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\n//MARK: AFTER\n\nextension SwifQLable {\n    public var after: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .after)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+All.swift",
    "content": "//\n//  SwifQLable+All.swift\n//  App\n//\n//  Created by Mihael Isaev on 30.09.2021.\n//\n\nimport Foundation\n\n//MARK: ALL\n\nextension SwifQLable {\n    public var all: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .all)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Alter.swift",
    "content": "//\n//  SwifQLable+Alter.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 26/11/2018.\n//\n\nimport Foundation\n\n//MARK: ALTER\n\nextension SwifQLable {\n    public var alter: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .alter)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+And.swift",
    "content": "//\n//  SwifQLable+And.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: AND\n\nextension SwifQLable {\n    public var and: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .and)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func and(_ predicate: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .and)\n        parts.append(o: .space)\n        parts.append(contentsOf: predicate.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Any.swift",
    "content": "//\n//  SwifQLable+Any.swift\n//\n//\n//  Created by Mihael Isaev on 26.10.2020.\n//\n\nimport Foundation\n\n//MARK: ANY\n\nextension SwifQLable {\n    public var any: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .any)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func any(_ subquery: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .any)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: subquery.parts)\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+As.swift",
    "content": "//\n//  SwifQLable+As.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: AS\n\nextension SwifQLable {\n    public var `as`: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .as)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func `as`(_ type: Type) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .as)\n        parts.append(o: .space)\n        parts.append(o: .custom(type.name))\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Asterisk.swift",
    "content": "//\n//  SwifQLable+Asterisk.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 31.01.2020.\n//\n\nimport Foundation\n\n//MARK: *\n\nextension SwifQLable {\n    public var asterisk: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .custom(\"*\"))\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Before.swift",
    "content": "//\n//  SwifQLable+Before.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\n//MARK: BEFORE\n\nextension SwifQLable {\n    public var before: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .before)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Begin.swift",
    "content": "//\n//  SwifQLable+Begin.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: BEGIN\n\nextension SwifQLable {\n    public var begin: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .begin)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Between.swift",
    "content": "//\n//  SwifQLable+Between.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: BETWEEN\n\nextension SwifQLable {\n    public func between(_ part: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .between)\n        parts.append(o: .space)\n        parts.append(contentsOf: part.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Cascade.swift",
    "content": "//\n//  SwifQLable+Cascade.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\n//MARK: CASCADE\n\nextension SwifQLable {\n    public var cascade: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .cascade)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Check.swift",
    "content": "//\n//  SwifQLable+Check.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\n//MARK: CHECK\n\nextension SwifQLable {\n    public var check: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .check)\n        return SwifQLableParts(parts: parts)\n    }\n}\n\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Column.swift",
    "content": "//\n//  SwifQLable+Rename.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 17.08.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var column: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .column)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Commit.swift",
    "content": "//\n//  SwifQLable+Commit.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\n//MARK: COMMIT\n\nextension SwifQLable {\n    public var commit: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .commit)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Conflict.swift",
    "content": "//\n//  SwifQLable+Conflict.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 24/07/2019.\n//\n\nimport Foundation\n\n//MARK: Conflict\n\nextension SwifQLable {\n    public var conflict: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .conflict)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func conflict(_ paths: KeyPathLastPath...) -> SwifQLable {\n        conflict(paths)\n    }\n    \n    public func conflict(_ paths: [KeyPathLastPath]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .conflict)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        for (i, p) in paths.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(SwifQLPartAlias(p.lastPath))\n        }\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Constraint.swift",
    "content": "//\n//  SwifQLable+Constraint.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 24/07/2019.\n//\n\nimport Foundation\n\n//MARK: Constraint\n\nextension SwifQLable {\n    public var constraint: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .constraint)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func constraint(_ value: KeyPathLastPath) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .constraint)\n        parts.append(o: .space)\n        parts.append(SwifQLPartAlias(value.lastPath))\n        return SwifQLableParts(parts: parts)\n    }\n}\n\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Create.swift",
    "content": "//\n//  SwifQLable+CreateType.swift\n//  \n//\n//  Created by Mihael Isaev on 23.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var create: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .create)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Default.swift",
    "content": "//\n//  SwifQLable+Default.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\n//MARK: DEFAULT\n\nextension SwifQLable {\n    public var `default`: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .default)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Delete.swift",
    "content": "//\n//  SwifQLable+Delete.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 26/11/2018.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var delete: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .delete)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func delete(from table: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .delete)\n        parts.append(o: .space)\n        parts.append(o: .from)\n        parts.append(o: .space)\n        parts.append(contentsOf: table.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Distinct.swift",
    "content": "//\n//  SwifQLable+Distinct.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: DISTINCT\n\nextension SwifQLable {\n    public var distinct: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .distinct)\n        return SwifQLableParts(parts: parts)\n    }\n}\n\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Do.swift",
    "content": "//\n//  SwifQLable+Do.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 24/07/2019.\n//\n\nimport Foundation\n\n//MARK: Do\n\nextension SwifQLable {\n    public var `do`: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .do)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Drop.swift",
    "content": "//\n//  SwifQLable+Drop.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var drop: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .drop)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+End.swift",
    "content": "//\n//  SwifQLable+End.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: END\n\nextension SwifQLable {\n    public var end: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .end)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Epoch.swift",
    "content": "//\n//  SwifQLable+Epoch.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 02/08/2019.\n//\n\nimport Foundation\n\n//MARK: Epoch\n\nextension SwifQLable {\n    public var epoch: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .epoch)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func epoch(with value: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .custom(Op.epoch._value.singleQuotted))\n        parts.append(o: .space)\n        parts.append(o: .custom(\"+\"))\n        parts.append(o: .space)\n        parts.append(contentsOf: value.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Exists.swift",
    "content": "//\n//  SwifQLable+Exists.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 23/07/2019.\n//\n\nimport Foundation\n\n//MARK: Exists\n\nextension SwifQLable {\n    public var exists: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .exists)\n        return SwifQLableParts(parts: parts)\n    }\n    public func exists(_ predicates: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .exists)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: predicates.parts)\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Filter.swift",
    "content": "//\n//  SwifQLable+Filter.swift\n//  App\n//\n//  Created by Mihael Isaev on 01/03/2019.\n//\n\nimport Foundation\n\n//MARK: Filter\n\nextension SwifQLable {\n    public func filter(where predicates: SwifQLable...) -> SwifQLable {\n        filter(where: predicates)\n    }\n    \n    public func filter(where predicates: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .filter)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(o: .where)\n        parts.append(o: .space)\n        predicates.enumerated().forEach { i, v in\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+From.swift",
    "content": "//\n//  SwifQLable+From.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 13/11/2018.\n//\n\nimport Foundation\n\n//MARK: From\n\nextension SwifQLable {\n    public func from(_ tables: SwifQLable...) -> SwifQLable {\n        from(tables)\n    }\n    public func from(_ tables: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .from)\n        parts.append(o: .space)\n        for (i, v) in tables.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Fulltext.swift",
    "content": "//\n//  SwifQLable+Fulltext.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: @@\n\nextension SwifQLable {\n    public func fulltext(_ part: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .fulltext)\n        parts.append(o: .space)\n        parts.append(contentsOf: part.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Function.swift",
    "content": "//\n//  SwifQLable+Function.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var `function`: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .function)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+GroupBy.swift",
    "content": "//\n//  SwifQLable+GroupBy.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\n//MARK: GROUP BY\n\nextension SwifQLable {\n    public func groupBy(_ fields: SwifQLable...) -> SwifQLable {\n        groupBy(fields)\n    }\n    public func groupBy(_ fields: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .group)\n        parts.append(o: .space)\n        parts.append(o: .by)\n        parts.append(o: .space)\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Having.swift",
    "content": "//\n//  SwifQLable+Having.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\n//MARK: Having\n\nextension SwifQLable {\n    public func having(_ predicates: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .having)\n        parts.append(o: .space)\n        parts.append(contentsOf: predicates.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+ILike.swift",
    "content": "//\n//  SwifQLable+iLike.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: ILIKE\n\nextension SwifQLable {\n    /// Builds query with `ILIKE` parameter\n    ///\n    /// Example usage:\n    /// ```swift\n    /// let name = \"John\"\n    /// SwifQL.select\n    ///     // ...\n    ///     .where((\\User.$name).iLike(name))\n    /// ```\n    /// - Parameter part: `SwifQLable` element\n    ///\n    public func iLike(_ part: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .ilike)\n        parts.append(o: .space)\n        parts.append(contentsOf: part.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+If.swift",
    "content": "//\n//  SwifQLable+If.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: IF\n\nextension SwifQLable {\n    public var `if`: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .if)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+In.swift",
    "content": "//\n//  SwifQLable+In.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: IN\n\nextension SwifQLable {\n    /// Builds query with `IN` parameter\n    ///\n    /// Example usage:\n    /// ```swift\n    /// SwifQL.select\n    ///     // ...\n    ///     .where((\\User.$id).in(aUserID, bUserID))\n    /// ```\n    /// - Parameter items: comma separated list of  `SwifQLable` elements\n    ///\n    public func `in`(_ items: SwifQLable...) -> SwifQLable {\n        `in`(items)\n    }\n\n    /// Builds query with `IN` parameter\n    ///\n    /// Example usage:\n    /// ```swift\n    /// SwifQL.select\n    ///     // ...\n    ///     .where((\\User.$id).in(userIDsArray))\n    /// ```\n    /// - Parameter items: Array of `[SwifQLable]` elements\n    ///\n    public func `in`(_ items: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .in)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        if items.count == 1, let array = items.first as? AnySwifQLEnumArray {\n            array.items.enumerated().forEach { i, v in\n                if i > 0 {\n                    parts.append(o: .comma)\n                    parts.append(o: .space)\n                }\n                parts.append(safe: v.anyRawValue)\n            }\n        } else {\n            items.enumerated().forEach { i, v in\n                if i > 0 {\n                    parts.append(o: .comma)\n                    parts.append(o: .space)\n                }\n                parts.append(contentsOf: v.parts)\n            }\n        }\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+InsertInto.swift",
    "content": "//\n//  SwifQLable+InsertInto.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 13/11/2018.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public subscript (newColumns items: NewColumn...) -> SwifQLable {\n        newColumns(items)\n    }\n    \n    public subscript (newColumns items: [NewColumn]) -> SwifQLable {\n        newColumns(items)\n    }\n    \n    public func newColumns(_ items: NewColumn...) -> SwifQLable {\n        newColumns(items)\n    }\n    \n    public func newColumns(_ items: [NewColumn]) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .openBracket)\n        items.enumerated().forEach { i, v in\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public subscript (fields items: SwifQLable...) -> SwifQLable {\n        fields(items)\n    }\n    \n    public subscript (fields items: [SwifQLable]) -> SwifQLable {\n        fields(items)\n    }\n    \n    /// Represent just a list of fields in round brackets separated by comma\n    public func fields(_ items: SwifQLable...) -> SwifQLable {\n        fields(items)\n    }\n    \n    /// Represent just a list of fields in round brackets separated by comma\n    public func fields(_ items: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .openBracket)\n        items.compactMap { v -> SwifQLPart? in\n            if let part = v.parts.first as? SwifQLKeyPathable, let lastPath = part.paths.last {\n                return SwifQLPartColumn(lastPath)\n            } else if let name = v as? String {\n                return SwifQLPartColumn(name)\n            }\n            return nil\n        }\n        .enumerated()\n        .forEach { i, v in\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(v)\n        }\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public var insert: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .insert)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public var into: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .into)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public subscript (table item: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        if let name = item as? String {\n            parts.append(SwifQLPartTable(name))\n        } else {\n            parts.append(contentsOf: item.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func insertInto(_ table: SwifQLable, fields: SwifQLable...) -> SwifQLable {\n        insertInto(table, fields: fields)\n    }\n    public func insertInto(_ table: SwifQLable, fields: [SwifQLable]) -> SwifQLable {\n        insert.into[table: table].fields(fields)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Interval.swift",
    "content": "//\n//  SwifQLable+Interval.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 02/08/2019.\n//\n\nimport Foundation\n\n//MARK: Interval\n\nextension SwifQLable {\n    public var interval: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .interval)\n        return SwifQLableParts(parts: parts)\n    }\n    public func interval(_ expression: String) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .interval)\n        parts.append(o: .space)\n        parts.append(o: .custom(expression.singleQuotted))\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+IsNotNull.swift",
    "content": "//\n//  SwifQLable+IsNotNull.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: IS NOT NULL\n\nextension SwifQLable {\n    public var isNotNull: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .isNotNull)\n        parts.append(o: .space)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+IsNull.swift",
    "content": "//\n//  SwifQLable+IsNull.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: IS NULL\n\nextension SwifQLable {\n    public var isNull: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .isNull)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Items.swift",
    "content": "//\n//  SwifQLable+Items.swift\n//  App\n//\n//  Created by Mihael Isaev on 04.02.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public subscript (items items: SwifQLable...) -> SwifQLable {\n        self.items(items)\n    }\n    \n    public subscript (items items: [SwifQLable]) -> SwifQLable {\n        self.items(items)\n    }\n    \n    /// Represent provided values in round brackets separated with comma\n    public func items(_ items: SwifQLable...) -> SwifQLable {\n        self.items(items)\n    }\n    /// Represent values provided as array\n    public func items(_ items: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        for (i, v) in items.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            for p in v.parts {\n                switch p {\n                case let p as SwifQLPartKeyPath:\n                    parts.append(p.column)\n                default:\n                    parts.append(p)\n                }\n            }\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Join.swift",
    "content": "//\n//  SwifQLable+Join.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\n//MARK: JOIN\n\nextension SwifQLable {\n    /// Join tables\n    ///\n    /// Example usage:\n    /// - join with subquery\n    /// ```swift\n    /// let u = TableAlias(\"u\")\n    /// let subquery = |SwifQL\n    ///     .select(Fn.count(\\User.$id) => \"users\",\n    ///             \\User.$groupID => \"groupID\")\n    ///     .from(User.table)\n    ///     .groupBy(\\User.$groupID)| => u\n    /// let query = SwifQL.select(..., u.users)\n    ///     .from(...)\n    ///     .join(.left, subquery, on: u.groupID == \\Group.$id)\n    ///     .groupBy(..., u.users)\n    /// ```\n    ///\n    /// - Parameters:\n    ///   - mode: type of JOIN `JoinMode`\n    ///   - expression: `Table` or `subquery`\n    ///   - predicates: which columns should be used to make `JOIN`\n    /// - Returns: `SwifQLable`\n    public func join(_ mode: JoinMode = .none, _ expression: SwifQLable, on predicates: SwifQLable? = nil) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        let join = SwifQLJoinBuilder(mode, expression, on: predicates)\n        parts.append(contentsOf: join.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Key.swift",
    "content": "//\n//  SwifQLable+Key.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: KEY\n\nextension SwifQLable {\n    public var key: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .key)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Like.swift",
    "content": "//\n//  SwifQLable+Like.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: LIKE\n\nextension SwifQLable {\n    /// Builds query with `LIKE` parameter\n    ///\n    /// Example usage:\n    /// ```swift\n    /// let name = \"John\"\n    /// SwifQL.select\n    ///     // ...\n    ///     .where((\\User.$name).like(name))\n    /// ```\n    /// - Parameter part: `SwifQLable` element\n    ///\n    public func like(_ part: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .like)\n        parts.append(o: .space)\n        parts.append(contentsOf: part.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Limit.swift",
    "content": "//\n//  SwifQLable+Limit.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\n//MARK: LIMIT\n\nextension SwifQLable {\n    public func limit(_ value: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .limit)\n        parts.append(o: .space)\n        parts.append(contentsOf: value.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+No.swift",
    "content": "//\n//  SwifQLable+No.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\n//MARK: NO\n\nextension SwifQLable {\n    public var no: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .no)\n        return SwifQLableParts(parts: parts)\n    }\n}\n\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Not.swift",
    "content": "//\n//  SwifQLable+Not.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: NOT\n\nextension SwifQLable {\n    public var not: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .not)\n        return SwifQLableParts(parts: parts)\n    }\n    public func not(_ part: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .not)\n        parts.append(o: .space)\n        parts.append(contentsOf: part.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+NotBetween.swift",
    "content": "//\n//  SwifQLable+NotBetween.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: NOT BETWEEN\n\nextension SwifQLable {\n    public func notBetween(_ part: SwifQLable) -> SwifQLable {\n        SwifQLableParts(parts: self.parts).not.between(part)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+NotExists.swift",
    "content": "//\n//  SwifQLable+NotExists.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 23/07/2019.\n//\n\nimport Foundation\n\n//MARK: Exists\n\nextension SwifQLable {\n    public func notExists(_ predicates: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .not)\n        parts.append(o: .space)\n        parts.append(o: .exists)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: predicates.parts)\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+NotILike.swift",
    "content": "//\n//  SwifQLable+NotILike.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n// MARK: NOT ILIKE\n\nextension SwifQLable {\n    /// Builds query with `NOT ILIKE` parameter\n    ///\n    /// Example usage:\n    /// ```swift\n    /// let name = \"John\"\n    /// SwifQL.select\n    ///     // ...\n    ///     .where((\\User.$name).notILike(name))\n    /// ```\n    /// - Parameter part: `SwifQLable` element\n    ///\n    public func notILike(_ part: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .notILike)\n        parts.append(o: .space)\n        parts.append(contentsOf: part.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+NotIn.swift",
    "content": "//\n//  SwifQLable+NotIn.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n// MARK: IN\n\nextension SwifQLable {\n    /// Builds query with `NOT IN` parameter\n    ///\n    /// Example usage:\n    /// ```swift\n    /// SwifQL.select\n    ///     // ...\n    ///     .where((\\User.$id).notIn(aUserID, bUserID))\n    /// ```\n    /// - Parameter items: comma separated list of  `SwifQLable` elements\n    ///\n    public func notIn(_ items: SwifQLable...) -> SwifQLable {\n        notIn(items)\n    }\n\n    /// Builds query with `NOT IN` parameter\n    ///\n    /// Example usage:\n    /// ```swift\n    /// SwifQL.select\n    ///     // ...\n    ///     .where((\\User.$id).notIn(userIDsArray))\n    /// ```\n    /// - Parameter items: Array of `[SwifQLable]` elements\n    ///\n    public func notIn(_ items: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .notIn)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        for (i, v) in items.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+NotLike.swift",
    "content": "//\n//  SwifQLable+NotLike.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n// MARK: NOT LIKE\n\nextension SwifQLable {\n    /// Builds query with `NOT LIKE` parameter\n    ///\n    /// Example usage:\n    /// ```swift\n    /// let name = \"John\"\n    /// SwifQL.select\n    ///     // ...\n    ///     .where((\\User.$name).notLike(name))\n    /// ```\n    /// - Parameter part: `SwifQLable` element\n    ///\n    public func notLike(_ part: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .notLike)\n        parts.append(o: .space)\n        parts.append(contentsOf: part.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Nothing.swift",
    "content": "//\n//  SwifQLable+Nothing.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 24/07/2019.\n//\n\nimport Foundation\n\n//MARK: Nothing\n\nextension SwifQLable {\n    public var nothing: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .nothing)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Null.swift",
    "content": "//\n//  SwifQLable+Null.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: NULL\n\nextension SwifQLable {\n\n    /// use `null` property to compare column value with `SQL NULL` (aka Swift nil)\n    ///\n    /// Usage:\n    /// ```swift\n    /// SwifQL.select\n    ///     // ...\n    ///     .where(\\User.$name == username\n    ///         && |\\User.$status == \"active\" || \\User.$updatedAt == SwifQL.null|)\n    /// ```\n    public var null: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .null)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Offset.swift",
    "content": "//\n//  SwifQLable+Offset.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\n//MARK: OFFSET\n\nextension SwifQLable {\n    public func offset(_ value: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .offset)\n        parts.append(o: .space)\n        parts.append(contentsOf: value.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+On.swift",
    "content": "//\n//  SwifQLable+On.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 24/07/2019.\n//\n\nimport Foundation\n\n//MARK: On\n\nextension SwifQLable {\n    public var on: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .on)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Or.swift",
    "content": "//\n//  SwifQLable+Or.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: OR\n\nextension SwifQLable {\n    public func or(_ predicate: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .or)\n        parts.append(o: .space)\n        parts.append(contentsOf: predicate.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+OrderBy.swift",
    "content": "//\n//  SwifQLable+OrderBy.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\npublic struct OrderByItem: SwifQLable {\n    // MARK: - Elements\n    \n    let elements: [SwifQLable]\n    \n    // MARK: - Direction\n    \n    public enum Direction {\n        case asc, desc\n        \n        var `operator`: SwifQLPartOperator {\n            switch self {\n            case .asc: return .asc\n            case .desc: return .desc\n            }\n        }\n    }\n    \n    let direction: Direction\n    \n    // MARK: - Nulls\n    \n    public enum Nulls {\n        case first, last\n        \n        var `operator`: SwifQLPartOperator {\n            switch self {\n            case .first: return .first\n            case .last: return .last\n            }\n        }\n    }\n    \n    let nulls: Nulls?\n    \n    // MARK: - Public static initializers\n\n    // MARK: Direction\n\n    /// Convenient method for situations if ascending flag is known only during runtime\n    public static func direction(_ value: Direction, _ elements: SwifQLable..., nulls: Nulls? = nil) -> OrderByItem {\n        direction(value, elements, nulls: nulls)\n    }\n\n    /// Convenient method for situations if ascending flag is known only during runtime\n    public static func direction(_ value: Direction, _ elements: [SwifQLable], nulls: Nulls? = nil) -> OrderByItem {\n        OrderByItem(elements: elements, direction: value, nulls: nulls)\n    }\n    \n    // MARK: Ascending\n    \n    public static func asc(_ elements: SwifQLable...) -> OrderByItem {\n        asc(elements, nulls: nil)\n    }\n    \n    public static func asc(_ elements: [SwifQLable]) -> OrderByItem {\n        asc(elements, nulls: nil)\n    }\n    \n    public static func asc(_ elements: SwifQLable..., nulls: Nulls?) -> OrderByItem {\n        asc(elements, nulls: nulls)\n    }\n    \n    public static func asc(_ elements: [SwifQLable], nulls: Nulls?) -> OrderByItem {\n        OrderByItem(elements: elements, direction: .asc, nulls: nulls)\n    }\n    \n    // MARK: Descending\n    \n    public static func desc(_ elements: SwifQLable...) -> OrderByItem {\n        desc(elements, nulls: nil)\n    }\n    \n    public static func desc(_ elements: [SwifQLable]) -> OrderByItem {\n        desc(elements, nulls: nil)\n    }\n    \n    public static func desc(_ elements: SwifQLable..., nulls: Nulls?) -> OrderByItem {\n        desc(elements, nulls: nulls)\n    }\n    \n    public static func desc(_ elements: [SwifQLable], nulls: Nulls?) -> OrderByItem {\n        OrderByItem(elements: elements, direction: .desc, nulls: nulls)\n    }\n    \n    // MARK: Random\n    \n    /// Returns results in a random order. Hybrid operator that provides proper sintaxis acording to used language.\n    public static var random: SwifQLHybridOperator {\n        .random\n    }\n    \n    // MARK: - SwifQLable\n    \n    public var parts: [SwifQLPart] {\n        var parts: [SwifQLPart] = []\n        for (i, v) in elements.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        parts.append(o: .space)\n        parts.append(o: direction.operator)\n        if let nulls = nulls {\n            parts.append(o: .space)\n            parts.append(o: .nulls)\n            parts.append(o: .space)\n            parts.append(o: nulls.operator)\n        }\n        return parts\n    }\n}\n\n//MARK: ORDER BY\n\nextension SwifQLable {\n    /// Order query results by some rows ascending or descending\n    /// # Simple example\n    /// ```swift\n    /// .orderBy(.asc(\\User.email), .desc(\\User.firstName))\n    /// ```\n    /// # Raw SQL (in PostgreSQL syntax)\n    /// ```sql\n    /// ORDER BY \"User\".\"email\" ASC, \"User\".\"firstName\" DESC\n    /// ```\n    /// # Raw SQL (in MySQL syntax)\n    /// ```sql\n    /// ORDER BY \"User\".\"email\" ASC, \"User\".\"firstName\" DESC\n    /// ```\n    ///\n    /// # PostgreSQL nulls example\n    /// ```swift\n    /// .orderBy(.asc(\\User.email, nulls: .first), .desc(\\User.firstName, nulls: .last))\n    /// ```\n    /// # Raw SQL\n    /// ```sql\n    /// ORDER BY \"User\".\"email\" ASC NULLS FIRST, \"User\".\"firstName\" DESC NULLS LAST\n    /// ```\n    ///\n    /// # MySQL nulls example\n    /// ```swift\n    /// .orderBy(.asc(\\User.email == nil, \\User.email), .desc(\\User.firstName != nil, \\User.firstName))\n    /// ```\n    /// # Raw SQL\n    /// ```sql\n    /// ORDER BY User.email IS NULL, User.email ASC, User.firstName IS NOT NULL, User.firstName DESC\n    /// ```\n    ///\n    \n    public func orderBy(_ field: SwifQLHybridOperator) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .order)\n        parts.append(o: .space)\n        parts.append(o: .by)\n        parts.append(o: .space)\n        parts.append(h: .random)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func orderBy(_ fields: OrderByItem...) -> SwifQLable {\n        orderBy(fields)\n    }\n    \n    public func orderBy(_ fields: [OrderByItem]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .order)\n        parts.append(o: .space)\n        parts.append(o: .by)\n        parts.append(o: .space)\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Over.swift",
    "content": "//\n//  SwifQLable+Over.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nimport Foundation\n\n//MARK: Over\n\nextension SwifQLable {\n    public var over: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .over)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    /// [Learn more →](https://www.postgresqltutorial.com/postgresql-window-function/)\n    public func over(_ query: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .over)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: query.parts)\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    /// [Learn more →](https://www.postgresqltutorial.com/postgresql-window-function/)\n    public func over(partitionBy partition_expression: SwifQLable, orderBy: OrderByItem...) -> SwifQLable {\n        over(partitionBy: partition_expression, orderBy: orderBy)\n    }\n    \n    /// [Learn more →](https://www.postgresqltutorial.com/postgresql-window-function/)\n    public func over(partitionBy partition_expression: SwifQLable, orderBy: [OrderByItem]) -> SwifQLable {\n        var query = SwifQL.partition(by: partition_expression)\n        if orderBy.count > 0 {\n            query = query.orderBy(orderBy)\n        }\n        return over(query)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Overlaps.swift",
    "content": "//\n//  SwifQLable+Overlaps.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 02/08/2019.\n//\n\nimport Foundation\n\n//MARK: Overlaps\n\nextension SwifQLable {\n    public var overlaps: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .overlaps)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func overlaps(_ fields: SwifQLable...) -> SwifQLable {\n        overlaps(fields)\n    }\n    \n    public func overlaps(_ fields: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .overlaps)\n        if fields.count > 0 {\n            parts.append(o: .space)\n            parts.append(o: .openBracket)\n        }\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        if fields.count > 0 {\n            parts.append(o: .closeBracket)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Owner.swift",
    "content": "//\n//  SwifQLable+Owner.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var owner: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .owner)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+PartitionBy.swift",
    "content": "//\n//  SwifQLable+PartitionBy.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nimport Foundation\n\n//MARK: Partition By\n\nextension SwifQLable {\n    public var partition: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .partition)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public var by: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .by)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func partition(by expression: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .partition)\n        parts.append(o: .space)\n        parts.append(o: .by)\n        parts.append(o: .space)\n        parts.append(contentsOf: expression.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Primary.swift",
    "content": "//\n//  SwifQLable+Primary.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: PRIMARY\n\nextension SwifQLable {\n    public var primary: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .primary)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Raw.swift",
    "content": "//\n//  SwifQLable+Raw.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 14/02/2019.\n//\n\nimport Foundation\n\n//MARK: Ability to append anything to query as a raw string\n\nextension SwifQLable {\n    public func raw(_ anything: String) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .custom(anything))\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public static func raw(_ anything: String) -> SwifQLable {\n        var parts: [SwifQLPart] = []\n        parts.append(o: .space)\n        parts.append(safe: value)\n        return SwifQLableParts(parts: parts)\n    }\n}\n\nextension String {\n    public var raw: SwifQLable {\n        SwifQL.raw(self)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+References.swift",
    "content": "//\n//  SwifQLable+References.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\n//MARK: REFERENCES\n\nextension SwifQLable {\n    public var references: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .references)\n        return SwifQLableParts(parts: parts)\n    }\n}\n\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Rename.swift",
    "content": "//\n//  SwifQLable+Rename.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var rename: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .rename)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Restrict.swift",
    "content": "//\n//  SwifQLable+Restrict.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\n//MARK: RESTRICT\n\nextension SwifQLable {\n    public var restrict: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .restrict)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Return.swift",
    "content": "//\n//  SwifQLable+Return.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var `return`: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .return)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Returning.swift",
    "content": "//\n//  SwifQLable+Returning.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 11/07/2019.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var returning: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .returning)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func returning(_ paths: KeyPathLastPath...) -> SwifQLable {\n        returning(paths)\n    }\n    \n    public func returning(_ paths: [KeyPathLastPath]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .returning)\n        parts.append(o: .space)\n        for (i, p) in paths.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(SwifQLPartAlias(p.lastPath))\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Rollback.swift",
    "content": "//\n//  SwifQLable+Rollback.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\n//MARK: ROLLBACK\n\nextension SwifQLable {\n    public var rollback: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .rollback)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Schema.swift",
    "content": "//\n//  SwifQLable+Schema.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var schema: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .schema)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func schema(_ name: String) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .schema)\n        parts.append(o: .space)\n        parts.append(SwifQLPartSchema(name))\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Select.swift",
    "content": "//\n//  SwifQLable+Select.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 13/11/2018.\n//\n\nimport Foundation\n\n//MARK: Select\n\nextension SwifQLable {\n    public var select: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .select)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func select(_ fields: SwifQLable...) -> SwifQLable {\n        select(fields)\n    }\n    \n    public func select(_ fields: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .select)\n        parts.append(o: .space)\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Semicolon.swift",
    "content": "//\n//  SwifQLable+Semicolon.swift\n//  \n//\n//  Created by Mihael Isaev on 24.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    /// Represent just `;` symbol\n    public var semicolon: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.append(o: .semicolon)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Set.swift",
    "content": "//\n//  SwifQLable+Set.swift\n//  \n//\n//  Created by Mihael Isaev on 26.01.2020.\n//\n\nimport Foundation\n\n//MARK: SET\n\nextension SwifQLable {\n    public var set: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .set)\n        return SwifQLableParts(parts: parts)\n    }\n    public func set(_ predicates: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .set)\n        parts.append(o: .space)\n        parts.append(contentsOf: predicates.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Space.swift",
    "content": "//\n//  SwifQLable+Space.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 31.01.2020.\n//\n\nimport Foundation\n\n//MARK: simpel whitespace\n\nextension SwifQLable {\n    public var space: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .space)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Subscript.swift",
    "content": "//\n//  SwifQLable+Subscript.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 20/03/2019.\n//\n\nimport Foundation\n\nextension SwifQLable  {\n    /// Gives ability to append something wrapped into square brackets\n    /// # Example\n    /// ```swift\n    /// Fn.array_agg(Fn.to_jsonb(\"Attachment\"))[1]\n    /// ```\n    /// # SQL representation\n    /// ```\n    /// array_agg(to_jsonb(\"Attachment\"))[1]\n    /// ```\n    public subscript (_ items: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.append(o: .openSquareBracket)\n        parts.append(contentsOf: items.parts)\n        parts.append(o: .closeSquareBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Table.swift",
    "content": "//\n//  SwifQLable+Table.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var table: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .table)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func table(_ name: String) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .table)\n        parts.append(o: .space)\n        parts.append(SwifQLPartTable(name))\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Timestamp.swift",
    "content": "//\n//  SwifQLable+Timestamp.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 02/08/2019.\n//\n\nimport Foundation\n\n//MARK: Timestamp\n\nextension SwifQLable {\n    public var timestamp: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .timestamp)\n        return SwifQLableParts(parts: parts)\n    }\n    public func timestamp(_ fields: SwifQLable...) -> SwifQLable {\n        timestamp(fields)\n    }\n    public func timestamp(_ fields: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .timestamp)\n        parts.append(o: .space)\n        for (i, v) in fields.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+To.swift",
    "content": "//\n//  SwifQLable+To.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12.04.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var to: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .to)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Type.swift",
    "content": "//\n//  SwifQLable+Type.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public var type: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .type)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func type(_ name: String) -> SwifQLable {\n        type(nil, name)\n    }\n    \n    public func type(_ schema: String?, _ name: String) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .type)\n        if let schema = schema {\n            parts.append(o: .space)\n            parts.append(contentsOf: Path.Schema(schema).table(name).parts)\n        } else {\n            parts.append(o: .space)\n            parts.append(contentsOf: Path.Table(name).parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Union.swift",
    "content": "//\n//  SwifQLable+Union.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 16/11/2018.\n//\n\nimport Foundation\n\n//MARK: Union\n\nextension SwifQLable {\n    public var union: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .union)\n        parts.append(o: .space)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Unique.swift",
    "content": "//\n//  SwifQLable+Unique.swift\n//  \n//\n//  Created by Mihael Isaev on 25.01.2020.\n//\n\nimport Foundation\n\n//MARK: UNIQUE\n\nextension SwifQLable {\n    public var unique: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .unique)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Update.swift",
    "content": "//\n//  SwifQLable+Update.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 26/11/2018.\n//\n\nimport Foundation\n\n//MARK: UPDATE\n\nextension SwifQLable {\n    public var update: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .update)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    public func update(_ tables: SwifQLable...) -> SwifQLable {\n        update(tables)\n    }\n    \n    public func update(_ tables: [SwifQLable]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .update)\n        parts.append(o: .space)\n        for (i, v) in tables.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Value.swift",
    "content": "//\n//  SwifQLable+Value.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 27.01.2020.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public subscript (any item: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(contentsOf: item.parts)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    /// Represent just `VALUE` keyword\n    public var value: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .value)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    /// Represent `VALUE _` where _ is provided item\n    public func value(_ item: SwifQLable) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .value)\n        parts.append(o: .space)\n        parts.append(contentsOf: item.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Values.swift",
    "content": "//\n//  SwifQLable+Values.swift\n//  App\n//\n//  Created by Mihael Isaev on 25/11/2018.\n//\n\nimport Foundation\n\nextension SwifQLable {\n    public subscript (values items: SwifQLable...) -> SwifQLable {\n        values(items)\n    }\n    \n    public subscript (values items: [SwifQLable]) -> SwifQLable {\n        values(items)\n    }\n    \n    /// Represent just `VALUES` keyword\n    public var values: SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .values)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    /// Represent provided values in round brackets separated with comma\n    public func values(_ items: SwifQLable...) -> SwifQLable {\n        values(items)\n    }\n    /// Represent provided values in round brackets separated with comma\n    public func values(_ items: [SwifQLable]) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .openBracket)\n        for (i, v) in items.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    /// e.g. INSERT INTO CarBrands (name) VALUES (\"Acura\"), (\"Audi\"), (\"BMW\")\n    public func values(array: [SwifQLable]...) -> SwifQLable {\n        values(array: array)\n    }\n    /// e.g. INSERT INTO CarBrands (name) VALUES (\"Acura\"), (\"Audi\"), (\"BMW\")\n    public func values(array: [[SwifQLable]]) -> SwifQLable {\n        var parts: [SwifQLPart] = self.parts\n        parts.appendSpaceIfNeeded()\n        for (i, v) in array.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(o: .openBracket)\n            for (i, v) in v.enumerated() {\n                if i > 0 {\n                    parts.append(o: .comma)\n                    parts.append(o: .space)\n                }\n                parts.append(contentsOf: v.parts)\n            }\n            parts.append(o: .closeBracket)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Where.swift",
    "content": "//\n//  SwifQLable+Where.swift\n//  SwifQLCore\n//\n//  Created by Mihael Isaev on 13/11/2018.\n//\n\nimport Foundation\n\n//MARK: Where\n\nextension SwifQLable {\n    public var `where`: SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .where)\n        return SwifQLableParts(parts: parts)\n    }\n    public func `where`(_ predicates: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .where)\n        parts.append(o: .space)\n        parts.append(contentsOf: predicates.parts)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+WhereExists.swift",
    "content": "//\n//  SwifQLable+WhereExists.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 23/07/2019.\n//\n\nimport Foundation\n\n//MARK: Where Exists\n\nextension SwifQLable {\n    public func whereExists(_ predicates: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .where)\n        parts.append(o: .space)\n        parts.append(o: .exists)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: predicates.parts)\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+WhereNotExists.swift",
    "content": "//\n//  SwifQLable+WhereNotExists.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 23/07/2019.\n//\n\nimport Foundation\n\n//MARK: Where Not Exists\n\nextension SwifQLable {\n    public func whereNotExists(_ predicates: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .where)\n        parts.append(o: .space)\n        parts.append(o: .not)\n        parts.append(o: .space)\n        parts.append(o: .exists)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: predicates.parts)\n        parts.append(o: .closeBracket)\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+Window.swift",
    "content": "//\n//  SwifQLable+Window.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 22.05.2020.\n//\n\nimport Foundation\n\n//MARK: Window\n\nextension SwifQLable {\n    /// [Learn more →](https://www.postgresqltutorial.com/postgresql-window-function/)\n    public func window(_ expression: SwifQLable) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .window)\n        parts.append(o: .space)\n        parts.append(contentsOf: expression.parts)\n        return SwifQLableParts(parts: parts)\n    }\n    \n    /// [Learn more →](https://www.postgresqltutorial.com/postgresql-window-function/)\n    public func window(_ window: SwifQLable, as query: SwifQLable) -> SwifQLable {\n        var parts = window.parts\n        parts.append(contentsOf: window.parts)\n        parts.append(o: .space)\n        parts.append(o: .as)\n        parts.append(o: .space)\n        parts.append(o: .openBracket)\n        parts.append(contentsOf: query.parts)\n        parts.append(o: .closeBracket)\n        return self.window(SwifQLableParts(parts: parts))\n    }\n    \n    /// [Learn more →](https://www.postgresqltutorial.com/postgresql-window-function/)\n    public func window(_ window: SwifQLable, asPartitionBy expression: SwifQLable, orderBy: OrderByItem...) -> SwifQLable {\n        self.window(window, asPartitionBy: expression, orderBy: orderBy)\n    }\n    \n    /// [Learn more →](https://www.postgresqltutorial.com/postgresql-window-function/)\n    public func window(_ window: SwifQLable, asPartitionBy expression: SwifQLable, orderBy: [OrderByItem]) -> SwifQLable {\n        var query = SwifQL.partition(by: expression)\n        if orderBy.count > 0 {\n            query = query.orderBy(orderBy)\n        }\n        return self.window(window, as: query)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable+Parts/SwifQLable+With.swift",
    "content": "//\n//  SwifQLable+Timestamp.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 02/08/2019.\n//\n\nimport Foundation\n\n//MARK: With\n\n/// SELECT in WITH\n/// WITH provides a way to write auxiliary statements for use in a larger query.\n/// These statements, which are often referred to as Common Table Expressions or CTEs,\n/// can be thought of as defining temporary tables that exist just for one query.\n/// Each auxiliary statement in a WITH clause can be a SELECT, INSERT, UPDATE, or DELETE;\n/// and the WITH clause itself is attached to a primary statement that can also be a\n/// SELECT, INSERT, UPDATE, or DELETE.\n/// ```\n/// SwifQL\n///     .with(.init(Table(\"Table1\"), SwifQL.select(Table(\"Table2\").*).from(Table(\"Table2\"))))\n///     .select(Table(\"Table1\").*)\n///     .from(Table(\"Table1\"))\n/// ```\n/// Result\n/// ```\n/// WITH \"Table1\" as (SELECT \"Table2\".* FROM \"Table2\") SELECT \"Table1\".* FROM \"Table1\"\n/// ```\n/// https://www.postgresql.org/docs/11/queries-with.html\n///\nextension SwifQLable {\n    public func with(_ withs: With...) -> SwifQLable {\n        with(withs)\n    }\n    \n    public func with(_ withs: [With]) -> SwifQLable {\n        var parts = self.parts\n        parts.appendSpaceIfNeeded()\n        parts.append(o: .with)\n        parts.append(o: .space)\n        for (i, v) in withs.enumerated() {\n            if i > 0 {\n                parts.append(o: .comma)\n                parts.append(o: .space)\n            }\n            parts.append(contentsOf: v.parts)\n        }\n        return SwifQLableParts(parts: parts)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLable.swift",
    "content": "//\n//  SwifQLable.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 04/11/2018.\n//\n\nimport Foundation\n\npublic protocol SwifQLable: CustomStringConvertible {\n    var parts: [SwifQLPart] { get }\n}\n\nextension SwifQLable {\n    public var description: String { prepare(.psql).plain }\n}\n\npublic struct SwifQLableParts: SwifQLable {\n    public var parts: [SwifQLPart]\n    public init (parts: SwifQLPart...) {\n        self.init(parts: parts)\n    }\n    public init (parts: [SwifQLPart]) {\n        self.parts = parts\n    }\n}\n\npublic protocol SwifQLPart {}\n\npublic protocol SwifQLKeyPathable: SwifQLPart {\n    var schema: String? { get }\n    var table: String? { get }\n    var paths: [String] { get }\n}\n\nextension SwifQLable {\n    /// Good choice only for super short and universal queries like `BEGIN;`, `ROLLBACK;`, `COMMIT;`\n    public func prepare() -> SwifQLPrepared {\n        prepare(.any)\n    }\n    \n    public func prepare(_ dialect: SQLDialect) -> SwifQLPrepared {\n        var values: [Encodable] = []\n        var formattedValues: [String] = []\n        let query = parts.map { part in\n            switch part {\n            case let v as SwifQLPartArray:\n                guard v.elements.count > 0 else {\n                    return dialect.emptyArrayStart + dialect.emptyArrayEnd\n                }\n                var string = dialect.arrayStart\n                v.elements.enumerated().forEach { i, v in\n                    if i > 0 {\n                        string += dialect.arraySeparator\n                    }\n                    let prepared = v.prepare(dialect)\n                    values.append(contentsOf: prepared._values)\n                    formattedValues.append(contentsOf: prepared._formattedValues)\n                    string += prepared._query\n                }\n                return string + dialect.arrayEnd\n            case let v as SwifQLPartBool:\n                return dialect.boolValue(v.value)\n            case is SwifQLPartNull:\n                return dialect.null\n            case let v as SwifQLPartSchema:\n                guard let schema = v.schema else { return \"\" }\n                return dialect.schemaName(schema)\n            case let v as SwifQLPartTable:\n                if let schema = v.schema {\n                    return dialect.schemaName(schema) + \".\" + dialect.tableName(v.table)\n                }\n                return dialect.tableName(v.table)\n            case let v as SwifQLPartTableWithAlias:\n                if let schema = v.schema {\n                    return dialect.schemaName(schema) + \".\" + dialect.tableName(v.table, andAlias: v.alias)\n                }\n                return dialect.tableName(v.table, andAlias: v.alias)\n            case let v as SwifQLPartAlias:\n                return dialect.alias(v.alias)\n            case let v as SwifQLPartKeyPath:\n                return dialect.keyPath(v)\n            case let v as SwifQLPartColumn:\n                return dialect.column(v.name)\n            case let v as SwifQLPartOperator:\n                return v._value\n            case let v as SwifQLHybridOperator:\n                switch dialect{\n                case .psql:\n                    return v._psql._value\n                case .mysql:\n                    return v._mysql._value\n                default:\n                    return v._mysql._value\n                }\n            case let v as SwifQLPartDate:\n                return dialect.date(v.date)\n            case let v as SwifQLPartSafeValue:\n                return dialect.safeValue(v.safeValue)\n            case let v as SwifQLPartUnsafeValue:\n                values.append(v.unsafeValue)\n                formattedValues.append(dialect.safeValue(v.unsafeValue))\n                return dialect.bindSymbol\n            default: return \"\"\n            }\n        }.joined(separator: \"\")\n        return .init(dialect: dialect, query: query, values: values, formattedValues: formattedValues)\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/SwifQLableArraySeparator.swift",
    "content": "//\n//  SwifQLableArraySeparator.swift\n//  \n//\n//  Created by Mihael Isaev on 26.01.2020.\n//\n\nimport Foundation\n\npublic enum SwifQLableArraySeparator {\n    case comma\n    \n    var `operator`: SwifQLPartOperator {\n        switch self {\n        case .comma: return .comma\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Table.swift",
    "content": "//\n//  Tableable.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 05/11/2018.\n//\n\nimport Foundation\n\npublic protocol AnyTable: Codable {\n    /// This model's unique name. By default, this property is set to a `String` describing the type.\n    static var tableName: String { get }\n}\n\nextension AnyTable {\n    public static var tableName: String {\n        String(describing: Self.self)\n    }\n    \n    public static func column(_ paths: String...) -> Path.SchemaWithTableAndColumn {\n        Path.Schema((Self.self as? Schemable.Type)?.schemaName).table(tableName).column(paths)\n    }\n    \n    public static func inSchema(_ name: String) -> Schema<Self> {\n        .init(name)\n    }\n    \n    public static func inSchema(_ schema: Schemable.Type) -> Schema<Self> {\n        .init(schema.schemaName)\n    }\n}\n\npublic protocol KeyPathEncodable {}\n\n@dynamicMemberLookup\npublic protocol Table: AnyTable, ColumnRoot {\n    @_disfavoredOverload\n    init ()\n    \n    static subscript<V>(dynamicMember keyPath: KeyPath<Self, V>) -> SwifQLable { get }\n}\n\nextension Table {\n    public static subscript<V>(dynamicMember keyPath: KeyPath<Self, V>) -> SwifQLable {\n        guard let k = keyPath as? Keypathable else { return \"<keyPath should conform to Keypathable>\" }\n        let schema: String? = (Self.self as? Schemable.Type)?.schemaName\n        return SwifQLPartKeyPath(schema: schema, table: Self.tableName, paths: k.paths)\n    }\n}\n\npublic struct ColumnInfo {\n    public struct Name {\n        public let label, keyPath: String\n    }\n    public let name: Name\n    public let property: AnyColumn\n}\n\nextension String {\n    fileprivate var withoutLeadingUnderscore: String {\n        guard hasPrefix(\"_\") else { return self }\n        return String(self.dropFirst())\n    }\n}\n\nextension Table {\n    public var columns: [ColumnInfo] {\n        return Mirror(reflecting: self)\n            .children\n            .compactMap { child in\n                guard let property = child.value as? AnyColumn else {\n                    return nil\n                }\n                // remove underscore\n                return .init(name: .init(label: property.name, keyPath: child.label?.withoutLeadingUnderscore ?? property.name), property: property)\n            }\n    }\n    \n    /// See `Codable`\n    \n    public init(from decoder: Decoder) throws {\n        self.init()\n        let container = try decoder.container(keyedBy: TableCodingKey.self)\n        try self.columns.forEach {\n            let decoder = TableContainerDecoder(container: container, key: .string($0.name.label))\n            try $0.property.decode(from: decoder)\n        }\n    }\n\n    public func encode(to encoder: Encoder) throws {\n        let container = encoder.container(keyedBy: TableCodingKey.self)\n        for column in columns {\n            let key: TableCodingKey\n            switch self {\n            case _ as KeyPathEncodable:\n                key = .string(column.name.keyPath)\n            default:\n                key = .string(column.name.label)\n            }\n            let encoder = ContainerEncoder(container: container, key: key)\n            try column.property.encode(to: encoder)\n        }\n    }\n}\n\nenum TableCodingKey: CodingKey {\n    case string(String)\n    case int(Int)\n    \n    var stringValue: String {\n        switch self {\n        case .int(let int): return String(describing: int)\n        case .string(let string): return string\n        }\n    }\n    \n    var intValue: Int? {\n        switch self {\n        case .int(let int): return int\n        case .string(let string): return Int(string)\n        }\n    }\n    \n    init?(stringValue: String) {\n        self = .string(stringValue)\n    }\n    \n    init?(intValue: Int) {\n        self = .int(intValue)\n    }\n}\n\nprivate struct TableContainerDecoder: Decoder, SingleValueDecodingContainer {\n    let container: KeyedDecodingContainer<TableCodingKey>\n    let key: TableCodingKey\n    \n    var codingPath: [CodingKey] {\n        self.container.codingPath\n    }\n    \n    var userInfo: [CodingUserInfoKey : Any] {\n        [:]\n    }\n    \n    func container<Key>(keyedBy type: Key.Type) throws -> KeyedDecodingContainer<Key> where Key : CodingKey {\n        try self.container.nestedContainer(keyedBy: Key.self, forKey: self.key)\n    }\n    \n    func unkeyedContainer() throws -> UnkeyedDecodingContainer {\n        try self.container.nestedUnkeyedContainer(forKey: self.key)\n    }\n    \n    func singleValueContainer() throws -> SingleValueDecodingContainer {\n        self\n    }\n    \n    func decode<T>(_ type: T.Type) throws -> T where T : Decodable {\n        try self.container.decode(T.self, forKey: self.key)\n    }\n    \n    func decodeNil() -> Bool {\n        do {\n            return try self.container.decodeNil(forKey: self.key)\n        } catch {\n            return true\n        }\n    }\n}\n\nprivate struct ContainerEncoder: Encoder, SingleValueEncodingContainer {\n    var container: KeyedEncodingContainer<TableCodingKey>\n    let key: TableCodingKey\n    \n    var codingPath: [CodingKey] {\n        self.container.codingPath\n    }\n    \n    var userInfo: [CodingUserInfoKey : Any] {\n        [:]\n    }\n    \n    func container<Key>(keyedBy type: Key.Type) -> KeyedEncodingContainer<Key> where Key : CodingKey {\n        var container = self.container\n        return container.nestedContainer(keyedBy: Key.self, forKey: self.key)\n    }\n    \n    func unkeyedContainer() -> UnkeyedEncodingContainer {\n        var container = self.container\n        return container.nestedUnkeyedContainer(forKey: self.key)\n    }\n    \n    func singleValueContainer() -> SingleValueEncodingContainer {\n        self\n    }\n    \n    mutating func encode<T>(_ value: T) throws where T : Encodable {\n        try self.container.encode(value, forKey: self.key)\n    }\n    \n    mutating func encodeNil() throws {\n        try self.container.encodeNil(forKey: self.key)\n    }\n}\n\nextension Table {\n    public static func key<Column>(for column: KeyPath<Self, Column>) -> String where Column: ColumnRepresentable {\n        Self.init()[keyPath: column].column.name\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/TableAlias.swift",
    "content": "//\n//  TableAlias.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 11/11/2018.\n//\n\nimport Foundation\n\n\n/// Create alias for `Table`\n///\n/// Usage:\n/// * using `TableAlias` for _subquery_\n/// ```swift\n/// let u = TableAlias(\"u\")\n/// let subquery = |SwifQL\n///     .select(Fn.count(\\User.$id) => \"users\",\n///             \\User.$groupID => \"groupID\")\n///     .from(User.table)\n///     .groupBy(\\User.$groupID)| => u\n/// let query = SwifQL.select(..., u.users)\n///     .from(...)\n///     .join(.left, subquery, on: u.groupID == \\Group.$id)\n///     .groupBy(..., u.users)\n/// ```\n@dynamicMemberLookup\npublic class TableAlias: SwifQLable {\n    public var name: String\n\n    public init (_ name: String) {\n        self.name = name\n    }\n    \n    public subscript(dynamicMember path: String) -> SwifQLable {\n        Path.Table(name).column(path)\n    }\n    \n    public var parts: [SwifQLPart] {\n        [SwifQLPartAlias(name)]\n    }\n}\n\nprotocol AnyGenericTableAlias {\n    var alias: String { get }\n}\n\n@dynamicMemberLookup\npublic class GenericTableAlias<M: Decodable>: SwifQLable, AnyGenericTableAlias {\n    public typealias Model = M\n    \n    public var parts: [SwifQLPart] {\n        [SwifQLPartTable(schema: nil, table: alias)]\n    }\n    \n    public var table: SwifQLable {\n        SwifQLableParts(parts: SwifQLPartTableWithAlias(schema: schema, table: name, alias: alias))\n    }\n    \n    var name: String {\n        if let mmm = M.self as? AnyTable.Type {\n            return mmm.tableName\n        }\n        return String(describing: M.self)\n    }\n    \n    var schema: String?\n    \n    var alias: String\n    \n    public init(_ alias: String, schema: String?) {\n        self.alias = alias\n        self.schema = schema ?? (Model.self as? Schemable.Type)?.schemaName\n    }\n    \n    public func column(_ paths: String...) -> Path.TableWithColumn {\n        Path.Table(alias).column(paths)\n    }\n    \n    public subscript<V>(dynamicMember keyPath: KeyPath<Model, V>) -> SwifQLable {\n        guard let k = keyPath as? Keypathable else { return \"<keyPath should conform to Keypathable>\" }\n        return Path.Table(alias).column(k.paths)\n    }\n}\n\npostfix operator *\npostfix public func *<T: Decodable>(table: GenericTableAlias<T>) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(SwifQLPartTable(table.alias))\n    parts.append(o: .custom(\".*\"))\n    parts.append(o: .space)\n    return SwifQLableParts(parts: parts)\n}\npostfix public func *(table: AnyTable.Type) -> SwifQLable {\n    var parts: [SwifQLPart] = []\n    parts.append(SwifQLPartTable(table.tableName))\n    parts.append(o: .custom(\".*\"))\n    parts.append(o: .space)\n    return SwifQLableParts(parts: parts)\n}\n\n//MARK: Decodable extension\n\nextension Decodable {\n    public static func `as`(_ alias: String) -> GenericTableAlias<Self> {\n        .init(alias, schema: nil)\n    }\n}\n\n//MARK: AliasedKeyPath\n\npublic class AliasedKeyPath<K, T, V> where K: KeyPath<T, V>, T: Table, V: ColumnRepresentable {\n    var alias: String\n    var kp: K\n    init(_ alias: String, _ kp: K) {\n        self.alias = alias\n        self.kp = kp\n    }\n}\n\nextension AliasedKeyPath: SwifQLKeyPathable {\n    public var schema: String? { (AModel.self as? Schemable.Type)?.schemaName }\n    public var table: String? { alias }\n    public var paths: [String] { kp.paths }\n}\n\nextension AliasedKeyPath: SwifQLable {\n    public var parts: [SwifQLPart] {\n        if let kp = self.originalKeyPath as? FluentKitFieldable {\n            return [SwifQLPartKeyPath(table: table, paths: [kp.key])]\n        }\n        return [SwifQLPartKeyPath(table: table, paths: paths)]\n    }\n}\n\nextension AliasedKeyPath: SwifQLUniversalKeyPath, SwifQLUniversalKeyPathSimple {\n    public typealias AType = V\n    public typealias AModel = T\n    public typealias ARoot = AliasedKeyPath\n    \n    public var path: String { kp.shortPath }\n    public var lastPath: String { kp.lastPath }\n    public var originalKeyPath: KeyPath<T, V> { kp }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Type+Autodetect.swift",
    "content": "//\n//  Type+Autodetect.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\nimport Foundation\n\nextension Type {\n    public static func auto<T>(from type: T.Type, isPrimary: Bool = false) -> Type {\n        switch type {\n        case is Optional<String>.Type: fallthrough\n        case is String.Type: return .text\n        \n        case is Optional<[String]>.Type: fallthrough\n        case is [String].Type: return .textArray\n        \n        case is Optional<UUID>.Type: fallthrough\n        case is UUID.Type: return .uuid\n        \n        case is Optional<[UUID]>.Type: fallthrough\n        case is [UUID].Type: return .uuidArray\n        \n        case is Optional<Double>.Type: fallthrough\n        case is Double.Type: return .decimal\n        \n        case is Optional<[Double]>.Type: fallthrough\n        case is [Double].Type: return .decimalArray\n        \n        case is Optional<Float>.Type: fallthrough\n        case is Float.Type: return .float4\n        \n        case is Optional<[Float]>.Type: fallthrough\n        case is [Float].Type: return .float4Array\n        \n        case is Optional<UInt>.Type: fallthrough\n        case is UInt.Type: fallthrough\n        \n        case is Optional<UInt8>.Type: fallthrough\n        case is UInt8.Type: fallthrough\n        \n        case is Optional<UInt16>.Type: fallthrough\n        case is UInt16.Type: fallthrough\n        \n        case is Optional<UInt32>.Type: fallthrough\n        case is UInt32.Type: fallthrough\n        \n        case is Optional<UInt64>.Type: fallthrough\n        case is UInt64.Type: return .int\n        \n        case is Optional<[UInt]>.Type: fallthrough\n        case is [UInt].Type: fallthrough\n        \n        case is Optional<[UInt8]>.Type: fallthrough\n        case is [UInt8].Type: fallthrough\n        \n        case is Optional<[UInt16]>.Type: fallthrough\n        case is [UInt16].Type: fallthrough\n        \n        case is Optional<[UInt32]>.Type: fallthrough\n        case is [UInt32].Type: fallthrough\n        \n        case is Optional<[UInt64]>.Type: fallthrough\n        case is [UInt64].Type: return .intArray\n        \n        case is Optional<Int8>.Type: fallthrough\n        case is Int8.Type: fallthrough\n        \n        case is Optional<Int16>.Type: fallthrough\n        case is Int16.Type: fallthrough\n        \n        case is Optional<Int32>.Type: fallthrough\n        case is Int32.Type: fallthrough\n        \n        case is Optional<Int>.Type: fallthrough\n        case is Int.Type:\n            if isPrimary {\n                return .serial\n            } else {\n                return .int\n            }\n        \n        case is Optional<Int64>.Type: fallthrough\n        case is Int64.Type:\n            if isPrimary {\n                return .bigserial\n            } else {\n                return .bigint\n            }\n        \n        case is Optional<[Int8]>.Type: fallthrough\n        case is [Int8].Type: fallthrough\n        \n        case is Optional<[Int16]>.Type: fallthrough\n        case is [Int16].Type: fallthrough\n        \n        case is Optional<[Int32]>.Type: fallthrough\n        case is [Int32].Type: fallthrough\n        \n        case is Optional<[Int]>.Type: fallthrough\n        case is [Int].Type: return .intArray\n        \n        case is Optional<[Int64]>.Type: fallthrough\n        case is [Int64].Type: return .bigintArray\n        \n        case is Optional<Date>.Type: fallthrough\n        case is Date.Type: return .timestamptz\n        \n        case is Optional<[Date]>.Type: fallthrough\n        case is [Date].Type: return .timestamptzArray\n        \n        case is Optional<Data>.Type: fallthrough\n        case is Data.Type: return .bytea\n        \n        case is Optional<[Data]>.Type: fallthrough\n        case is [Data].Type: return .byteaArray\n        \n        case is AnyOptionalEnum.Type:\n            guard let t = type as? AnyOptionalEnum.Type else { fallthrough }\n            if let st = type as? Schemable.Type {\n                return .custom(st.schemaName + \".\" + t.name)\n            } else {\n                return .custom(t.name)\n            }\n            \n        case is AnyOptionalEnumArray.Type:\n            guard let t = type as? AnyOptionalEnumArray.Type else { fallthrough }\n            if let st = type as? Schemable.Type {\n                return .customArray(st.schemaName + \".\" + t.name)\n            } else {\n                return .customArray(t.name)\n            }\n            \n        case is AnySwifQLEnum.Type:\n            guard let t = type as? AnySwifQLEnum.Type else { fallthrough }\n            if let st = type as? Schemable.Type {\n                return .custom(st.schemaName + \".\" + t.name)\n            } else {\n                return .custom(t.name)\n            }\n            \n        case is _AnySwifQLEnumArray.Type:\n            guard let t = type as? _AnySwifQLEnumArray.Type else { fallthrough }\n            if let st = t.elementType as? Schemable.Type {\n                return .customArray(st.schemaName + \".\" + t.name)\n            } else {\n                return .customArray(t.name)\n            }\n            \n        case is Optional<[Encodable]>.Type: fallthrough\n        case is [Encodable].Type: return .jsonbArray\n        \n        case is ClosedRange<Date>.Type: return .daterange\n        case is Range<Date>.Type: return .daterange\n        \n        default: return .text\n        }\n    }\n}\nfileprivate protocol AnyOptionalEnum {\n    static var name: String { get }\n}\nextension Optional: AnyOptionalEnum where Wrapped: AnySwifQLEnum {\n    fileprivate static var name: String { return Wrapped.name }\n}\nextension Optional {\n    fileprivate static var trololo: Wrapped.Type { return Wrapped.self }\n}\nfileprivate protocol AnyOptionalEnumArray {\n    static var name: String { get }\n}\nextension Array: AnyOptionalEnumArray where Element: AnyOptionalEnum {\n    fileprivate static var name: String { Element.name }\n}\nfileprivate protocol _AnySwifQLEnumArray {\n    static var name: String { get }\n    static var elementType: AnySwifQLEnum.Type { get }\n}\nextension Array: _AnySwifQLEnumArray where Element: AnySwifQLEnum {\n    fileprivate static var name: String { Element.name }\n    fileprivate static var elementType: AnySwifQLEnum.Type { Element.self }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Type+SwifQLable.swift",
    "content": "//\n//  SwifQLable+Types.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 04/11/2018.\n//\n\nimport Foundation\n\nextension Optional: SwifQLable, CustomStringConvertible where Wrapped: SwifQLable {\n    public var parts: [SwifQLPart] {\n        switch self {\n        case .none:\n            return [SwifQLPartSafeValue(nil)]\n        case .some(let value):\n            return value.parts\n        }\n    }\n}\nextension String: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension UUID: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Decimal: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Double: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Float: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension UInt: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension UInt8: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension UInt16: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension UInt32: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension UInt64: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Int: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Int8: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Int16: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Int32: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Int64: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartUnsafeValue(self)] }\n}\nextension Date: SwifQLable {\n    public var parts: [SwifQLPart] { [SwifQLPartDate(self)] }\n}\nextension Data: SwifQLable {\n    public var parts: [SwifQLPart] {\n        return [\n            SwifQLPartOperator(\"decode\"),\n            SwifQLPartOperator.openBracket,\n            SwifQLPartSafeValue(base64EncodedString()),\n            SwifQLPartOperator.comma,\n            SwifQLPartOperator.space,\n            SwifQLPartSafeValue(\"base64\"),\n            SwifQLPartOperator.closeBracket\n        ]\n    }\n}\npublic protocol SwifQLRawRepresentable: RawRepresentable, SwifQLable {}\nextension SwifQLRawRepresentable {\n    public var parts: [SwifQLPart] {\n        if let a = self.rawValue as? SwifQLable {\n            return a.parts\n        }\n        return []\n    }\n}\n"
  },
  {
    "path": "Sources/SwifQL/Type.swift",
    "content": "//\n//  Type.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 12/10/2019.\n//\n\ntypealias CastType = Type\n\npublic struct Type {\n    let name: String\n    \n    public init (_ name: String) {\n        self.name = name\n    }\n    \n    // MARK: -\n    \n    /// enum\n    public static let `enum`: Type = .init(\"ENUM\")\n    \n    /// range\n    public static let range: Type = .init(\"RANGE\")\n    \n    \n    // MARK: -\n    // MARK: Numeric Types\n    \n    /// signed two-byte integer\n    public static let smallint: Type = .init(\"smallint\")\n    public static let smallintArray: Type = .init(\"smallint[]\")\n    \n    /// signed four-byte integer\n    public static let int4: Type = .init(\"int4\")\n    public static let int4Array: Type = .init(\"int4[]\")\n    \n    /// signed two-byte integer\n    public static let int2: Type = .init(\"int2\")\n    public static let int2Array: Type = .init(\"int2[]\")\n    \n    /// signed eight-byte integer\n    public static let int8: Type = .init(\"int8\")\n    public static let int8Array: Type = .init(\"int8[]\")\n    \n    /// signed four-byte integer\n    public static let int: Type = .init(\"int\")\n    public static let intArray: Type = .init(\"int[]\")\n    \n    /// signed four-byte integer\n    public static let integer: Type = .init(\"integer\")\n    public static let integerArray: Type = .init(\"integer[]\")\n    \n    /// signed eight-byte integer\n    public static let bigint: Type = .init(\"bigint\")\n    public static let bigintArray: Type = .init(\"bigint[]\")\n    \n    /// exact numeric of selectable precision\n    public static let decimal: Type = .init(\"decimal\")\n    public static let decimalArray: Type = .init(\"decimal[]\")\n    /// exact numeric of selectable precision\n    public static func decimal(_ p: Int, _ s: Int) -> Type { .init(\"decimal(\\(p), \\(s))\") }\n    \n    /// exact numeric of selectable precision\n    public static let numeric: Type = .init(\"numeric\")\n    public static let numericArray: Type = .init(\"numeric[]\")\n    /// exact numeric of selectable precision\n    public static func numeric(_ p: Int, _ s: Int) -> Type { .init(\"numeric(\\(p), \\(s))\") }\n    \n    /// single precision floating-point number (4 bytes)\n    public static let real: Type = .init(\"real\")\n    public static let realArray: Type = .init(\"real[]\")\n    \n    public static func float(_ v: Int) -> Type { .init(\"float(\\(v))\") }\n    \n    /// single precision floating-point number (4 bytes)\n    public static let float4: Type = .init(\"float4\")\n    public static let float4Array: Type = .init(\"float4[]\")\n    \n    /// double precision floating-point number (8 bytes)\n    public static let float8: Type = .init(\"float8\")\n    public static let float8Array: Type = .init(\"float8[]\")\n    \n    /// double precision floating-point number (8 bytes)\n    public static let doublePrecision: Type = .init(\"double precision\")\n    public static let doublePrecisionArray: Type = .init(\"double precision[]\")\n    \n    /// autoincrementing two-byte integer\n    public static let smallserial: Type = .init(\"smallserial\")\n    public static let smallserialArray: Type = .init(\"smallserial[]\")\n    \n    /// autoincrementing two-byte integer\n    public static let serial2: Type = .init(\"serial2\")\n    public static let serial2Array: Type = .init(\"serial2[]\")\n    \n    /// autoincrementing four-byte integer\n    public static let serial: Type = .init(\"serial\")\n    public static let serialArray: Type = .init(\"serial[]\")\n    \n    /// autoincrementing four-byte integer\n    public static let serial4: Type = .init(\"serial4\")\n    public static let serial4Array: Type = .init(\"serial4[]\")\n    \n    /// autoincrementing eight-byte integer\n    public static let serial8: Type = .init(\"serial8\")\n    public static let serial8Array: Type = .init(\"serial8[]\")\n    \n    /// autoincrementing eight-byte integer\n    public static let bigserial: Type = .init(\"bigserial\")\n    public static let bigserialArray: Type = .init(\"bigserial[]\")\n    \n    // MARK: Monetary Types\n    \n    /// currency amount\n    public static let money: Type = .init(\"money\")\n    public static let moneyArray: Type = .init(\"money[]\")\n    \n    // MARK: Character Types\n    \n    /// fixed-length character string\n    public static let char: Type = .init(\"char\")\n    public static let charArray: Type = .init(\"char[]\")\n    \n    /// variable-length character string\n    public static let varchar: Type = .init(\"varchar\")\n    public static func varchar(_ n: Int) -> Type { .init(\"varchar(\\(n))\") }\n    public static let varcharArray: Type = .init(\"varchar[]\")\n    \n    /// variable-length character string\n    public static let text: Type = .init(\"text\")\n    public static let textArray: Type = .init(\"text[]\")\n    \n    // MARK: Binary Data Types\n    \n    /// binary data (“byte array”)\n    public static let bytea: Type = .init(\"bytea\")\n    public static let byteaArray: Type = .init(\"bytea[]\")\n    \n    // MARK: Date/Time Types\n    \n    /// date and time (no time zone)\n    public static let timestamp: Type = .init(\"timestamp\")\n    public static let timestampArray: Type = .init(\"timestamp[]\")\n    \n    /// date and time (no time zone)\n    public static let timestampWithoutTimeZone: Type = .init(\"timestamp without time zone\")\n    public static let timestampWithoutTimeZoneArray: Type = .init(\"timestamp without time zone[]\")\n    \n    /// date and time, including time zone\n    public static let timestampWithTimeZone: Type = .init(\"timestamp with time zone\")\n    public static let timestampWithTimeZoneArray: Type = .init(\"timestamp with time zone[]\")\n    \n    /// date and time, including time zone\n    public static let timestamptz: Type = .init(\"timestamptz\")\n    public static let timestamptzArray: Type = .init(\"timestamptz[]\")\n    \n    /// date and time\n    public static func timestamp(_ p: Int, withTimeZone: Bool = false) -> Type {\n        return .init(\"timestamp(\\(p)) \\(withTimeZone ? \"without time zone\" : \"with time zone\")\")\n    }\n    \n    /// calendar date (year, month, day)\n    public static let date: Type = .init(\"date\")\n    public static let dateArray: Type = .init(\"date[]\")\n    \n    /// time of day (no time zone)\n    public static let time: Type = .init(\"time\")\n    public static let timeArray: Type = .init(\"time[]\")\n    \n    /// time of day (no time zone)\n    public static let timeWithoutTimeZone: Type = .init(\"time without time zone\")\n    public static let timeWithoutTimeZoneArray: Type = .init(\"time without time zone[]\")\n    \n    /// time of day, including time zone\n    public static let timeWithTimeZone: Type = .init(\"time with time zone\")\n    public static let timeWithTimeZoneArray: Type = .init(\"time with time zone[]\")\n    \n    /// time of day, including time zone\n    public static let timetz: Type = .init(\"timetz\")\n    public static let timetzArray: Type = .init(\"timetz[]\")\n    \n    /// time of day\n    public static func time(_ p: Int, withTimeZone: Bool = false) -> Type {\n        return .init(\"time(\\(p)) \\(withTimeZone ? \"without time zone\" : \"with time zone\")\")\n    }\n    \n    /// time span\n    public static let interval: Type = .init(\"interval\")\n    public static let intervalArray: Type = .init(\"interval[]\")\n    \n    /// time span\n    public static func interval(_ fields: String, p: Int) -> Type {\n        return .init(\"interval \\(fields) (\\(p))\")\n    }\n    \n    // MARK: Boolean Type\n    \n    /// logical Boolean (true/false)\n    public static let boolean: Type = .init(\"boolean\")\n    public static let booleanArray: Type = .init(\"boolean[]\")\n    \n    /// logical Boolean (true/false)\n    public static let bool: Type = .init(\"bool\")\n    public static let boolArray: Type = .init(\"bool[]\")\n    \n    // MARK: Geometric Types\n    \n    /// geometric point on a plane\n    public static let point: Type = .init(\"point\")\n    public static let pointArray: Type = .init(\"point[]\")\n    \n    /// infinite line on a plane\n    public static let line: Type = .init(\"line\")\n    public static let lineArray: Type = .init(\"line[]\")\n    \n    /// line segment on a plane\n    public static let lseg: Type = .init(\"lseg\")\n    public static let lsegArray: Type = .init(\"lseg[]\")\n    \n    /// rectangular box on a plane\n    public static let box: Type = .init(\"box\")\n    public static let boxArray: Type = .init(\"box[]\")\n    \n    /// geometric path on a plane\n    public static let path: Type = .init(\"path\")\n    public static let pathArray: Type = .init(\"path[]\")\n    \n    /// closed geometric path on a plane\n    public static let polygon: Type = .init(\"polygon\")\n    public static let polygonArray: Type = .init(\"polygon[]\")\n    \n    /// circle on a plane\n    public static let circle: Type = .init(\"circle\")\n    public static let circleArray: Type = .init(\"circle[]\")\n    \n    // MARK: Network Address Types\n    \n    /// IPv4 or IPv6 network address\n    public static let cidr: Type = .init(\"cidr\")\n    public static let cidrArray: Type = .init(\"cidr[]\")\n    \n    /// IPv4 or IPv6 host address\n    public static let inet: Type = .init(\"inet\")\n    public static let inetArray: Type = .init(\"inet[]\")\n    \n    /// MAC (Media Access Control) address\n    public static let macaddr: Type = .init(\"macaddr\")\n    public static let macaddrArray: Type = .init(\"macaddr[]\")\n    \n    /// MAC (Media Access Control) address (EUI-64 format)\n    public static let macaddr8: Type = .init(\"macaddr8\")\n    public static let macaddr8Array: Type = .init(\"macaddr8[]\")\n    \n    // MARK: Bit String Types\n    \n    /// fixed-length bit string\n    public static let bit: Type = .init(\"bit\")\n    public static let bitArray: Type = .init(\"bit[]\")\n    /// fixed-length bit string\n    public static func bit(_ v: Int) -> Type { .init(\"bit(\\(v))\") }\n    \n    /// variable-length bit string\n    public static let bitVarying: Type = .init(\"bit varying\")\n    public static let bitVaryingArray: Type = .init(\"bit varying[]\")\n    /// variable-length bit string\n    public static func bitVarying(_ v: Int) -> Type { .init(\"bit varying(\\(v))\") }\n    \n    /// variable-length bit string\n    public static let varbit: Type = .init(\"varbit\")\n    /// variable-length bit string\n    public static func varbit(_ v: Int) -> Type { .init(\"varbit(\\(v))\") }\n    \n    // MARK: Text Search Types\n    \n    /// text search document\n    public static let tsvector: Type = .init(\"tsvector\")\n    public static let tsvectorArray: Type = .init(\"tsvector[]\")\n    \n    /// text search query\n    public static let tsquery: Type = .init(\"tsquery\")\n    public static let tsqueryArray: Type = .init(\"tsquery[]\")\n    \n    // MARK: UUID Type\n    \n    /// universally unique identifier\n    public static let uuid: Type = .init(\"uuid\")\n    public static let uuidArray: Type = .init(\"uuid[]\")\n    \n    // MARK: XML Type\n    \n    /// XML data\n    public static let xml: Type = .init(\"xml\")\n    public static let xmlArray: Type = .init(\"xml[]\")\n    \n    // MARK: Postgres JSON Types\n    \n    /// textual JSON data\n    public static let json: Type = .init(\"json\")\n    public static let jsonArray: Type = .init(\"json[]\")\n    \n    /// binary JSON data, decomposed\n    public static let jsonb: Type = .init(\"jsonb\")\n    public static let jsonbArray: Type = .init(\"jsonb[]\")\n    \n    // MARK: Postgres Built-in Range Types\n    \n    /// Range of integer\n    public static let int4range: Type = .init(\"int4range\")\n    public static let int4rangeArray: Type = .init(\"int4range[]\")\n\n    /// Range of bigint\n    public static let int8range: Type = .init(\"int8range\")\n    public static let int8rangeArray: Type = .init(\"int8range[]\")\n\n    /// Range of numeric\n    public static let numrange: Type = .init(\"numrange\")\n    public static let numrangeArray: Type = .init(\"numrange[]\")\n\n    /// Range of timestamp without time zone\n    public static let tsrange: Type = .init(\"tsrange\")\n    public static let tsrangeArray: Type = .init(\"tsrange[]\")\n\n    /// Range of timestamp with time zone\n    public static let tstzrange: Type = .init(\"tstzrange\")\n    public static let tstzrangeArray: Type = .init(\"tstzrange[]\")\n\n    /// Range of date\n    public static let daterange: Type = .init(\"daterange\")\n    public static let daterangeArray: Type = .init(\"daterange[]\")\n    \n    // MARK: Object Identifier Types\n    \n    /// numeric object identifier\n    public static let oid: Type = .init(\"oid\")\n    public static let oidArray: Type = .init(\"oid[]\")\n    \n    /// function name\n    public static let regproc: Type = .init(\"regproc\")\n    public static let regprocArray: Type = .init(\"regproc[]\")\n    \n    /// function name\n    public static let pg_proc: Type = .init(\"pg_proc\")\n    public static let pg_procArray: Type = .init(\"pg_proc[]\")\n    \n    /// function with argument types\n    public static let regprocedure: Type = .init(\"regprocedure\")\n    public static let regprocedureArray: Type = .init(\"regprocedure[]\")\n    \n    /// operator name\n    public static let regoper: Type = .init(\"regoper\")\n    public static let regoperArray: Type = .init(\"regoper[]\")\n    \n    /// operator name\n    public static let pg_operator: Type = .init(\"pg_operator\")\n    public static let pg_operatorArray: Type = .init(\"pg_operator[]\")\n    \n    /// operator with argument types\n    public static let regoperator: Type = .init(\"regoperator\")\n    public static let regoperatorArray: Type = .init(\"regoperator[]\")\n    \n    /// relation name\n    public static let regclass: Type = .init(\"regclass\")\n    public static let regclassArray: Type = .init(\"regclass[]\")\n    \n    /// relation name\n    public static let pg_class: Type = .init(\"pg_class\")\n    public static let pg_classArray: Type = .init(\"pg_class[]\")\n    \n    /// data type name\n    public static let regtype: Type = .init(\"regtype\")\n    public static let regtypeArray: Type = .init(\"regtype[]\")\n    \n    /// data type name\n    public static let pg_type: Type = .init(\"pg_type\")\n    public static let pg_typeArray: Type = .init(\"pg_type[]\")\n    \n    /// role name\n    public static let regrole: Type = .init(\"regrole\")\n    public static let regroleArray: Type = .init(\"regrole[]\")\n    \n    /// role name\n    public static let pg_authid: Type = .init(\"pg_authid\")\n    public static let pg_authidArray: Type = .init(\"pg_authid[]\")\n    \n    /// namespace name\n    public static let regnamespace: Type = .init(\"regnamespace\")\n    public static let regnamespaceArray: Type = .init(\"regnamespace[]\")\n    \n    /// namespace name\n    public static let pg_namespace: Type = .init(\"pg_namespace\")\n    public static let pg_namespaceArray: Type = .init(\"pg_namespace[]\")\n    \n    /// text search configuration\n    public static let regconfig: Type = .init(\"regconfig\")\n    public static let regconfigArray: Type = .init(\"regconfig[]\")\n    \n    /// text search configuration\n    public static let pg_ts_config: Type = .init(\"pg_ts_config\")\n    public static let pg_ts_configArray: Type = .init(\"pg_ts_config[]\")\n    \n    /// text search dictionary\n    public static let regdictionary: Type = .init(\"regdictionary\")\n    public static let regdictionaryArray: Type = .init(\"regdictionary[]\")\n    \n    /// text search dictionary\n    public static let pg_ts_dict: Type = .init(\"pg_ts_dict\")\n    public static let pg_ts_dictArray: Type = .init(\"pg_ts_dict[]\")\n    \n    // MARK: Postgres Log Sequence Number\n    \n    /// PostgreSQL Log Sequence Number\n    public static let pgLsn: Type = .init(\"pg_lsn\")\n    public static let pgLsnArray: Type = .init(\"pg_lsn[]\")\n    \n    // MARK: Postgres Pseudo-Types\n    // The PostgreSQL type system contains a number of special-purpose entries that are collectively called pseudo-types.\n    // A pseudo-type cannot be used as a column data type, but it can be used to declare a function's argument or result type.\n    // Each of the available pseudo-types is useful in situations where a function's behavior does not correspond to\n    // simply taking or returning a value of a specific SQL data type.\n    \n    /// Indicates that a function accepts any input data type.\n    public static let any: Type = .init(\"any\")\n    \n    /// Indicates that a function accepts any data type (see Section 37.2.5).\n    public static let anyelement: Type = .init(\"anyelement\")\n    \n    /// Indicates that a function accepts any array data type (see Section 37.2.5).\n    public static let anyarray: Type = .init(\"anyarray\")\n    \n    /// Indicates that a function accepts any non-array data type (see Section 37.2.5).\n    public static let anynonarray: Type = .init(\"anynonarray\")\n    \n    /// Indicates that a function accepts any enum data type (see Section 37.2.5 and Section 8.7).\n    public static let anyenum: Type = .init(\"anyenum\")\n    \n    /// Indicates that a function accepts any range data type (see Section 37.2.5 and Section 8.17).\n    public static let anyrange: Type = .init(\"anyrange\")\n    \n    /// Indicates that a function accepts or returns a null-terminated C string.\n    public static let cstring: Type = .init(\"cstring\")\n    \n    /// Indicates that a function accepts or returns a server-internal data type.\n    public static let `internal`: Type = .init(\"internal\")\n    \n    /// A procedural language call handler is declared to return language_handler.\n    public static let language_handler: Type = .init(\"language_handler\")\n    \n    /// A foreign-data wrapper handler is declared to return fdw_handler.\n    public static let fdw_handler: Type = .init(\"fdw_handler\")\n    \n    /// An index access method handler is declared to return index_am_handler.\n    public static let index_am_handler: Type = .init(\"index_am_handler\")\n    \n    /// A tablesample method handler is declared to return tsm_handler.\n    public static let tsm_handler: Type = .init(\"tsm_handler\")\n    \n    /// Identifies a function taking or returning an unspecified row type.\n    public static let record: Type = .init(\"record\")\n    \n    /// A trigger function is declared to return trigger.\n    public static let trigger: Type = .init(\"trigger\")\n    \n    /// An event trigger function is declared to return event_trigger.\n    public static let event_trigger: Type = .init(\"event_trigger\")\n    \n    /// Identifies a representation of DDL commands that is available to event triggers.\n    public static let pg_ddl_command: Type = .init(\"pg_ddl_command\")\n    \n    /// Indicates that a function returns no value.\n    public static let void: Type = .init(\"void\")\n    \n    /// Identifies a not-yet-resolved type, e.g. of an undecorated string literal.\n    public static let unknown: Type = .init(\"unknown\")\n    \n    /// An obsolete type name that formerly served many of the above purposes.\n    public static let opaque: Type = .init(\"opaque\")\n    \n    // MARK: Other\n    \n    /// user-level transaction ID snapshot\n    public static let txid_snapshot: Type = .init(\"txid_snapshot\")\n    public static let txid_snapshotArray: Type = .init(\"txid_snapshot[]\")\n    \n    // MARK: -\n    // MARK: Array Subscript\n    \n    public subscript () -> Type { .init(\"\\(name)[]\") }\n    \n    // MARK: -\n    // MARK: Custom\n    \n    public static func custom(_ name: String) -> Type { .init(name) }\n    public static func customArray(_ name: String) -> Type { .init(name + \"[]\") }\n}\n"
  },
  {
    "path": "Sources/SwifQL/_Todo.swift",
    "content": "//\n//  Todo.swift\n//  SwifQL\n//\n//  Created by Mihael Isaev on 29.01.2020.\n//\n\n// MARK: - Improve drop table\n// https://www.postgresql.org/docs/8.2/sql-droptable.html\n\n// MARK: - Add Functions\n// array functions https://w3resource.com/PostgreSQL/postgresql_array_remove-function.php\n"
  },
  {
    "path": "Tests/SwifQLTests/BuilderTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Builder Tests\")\nstruct BuilderTests: SwifQLTests {\n    @Test(\"Test Select Builder Limit Short\")\n    func selectBuilderLimitShort() {\n        let builder = SwifQLSelectBuilder()\n        let query = builder.select(CarBrands.table.*).from(CarBrands.table).limit(0, 10).build()\n        check(\n            query,\n            .psql(#\"SELECT \"CarBrands\".* FROM \"CarBrands\" LIMIT 10 OFFSET 0\"#),\n            .mysql(\"SELECT CarBrands.* FROM CarBrands LIMIT 10 OFFSET 0\")\n        )\n    }\n    \n    @Test(\"Test Select Builder Copy\")\n    func selectBuilderCopy() {\n        let builder = SwifQLSelectBuilder()\n        builder.select(CarBrands.table.*).from(CarBrands.table).join(.left, CarBrands.table, on: \"id1 = id2\").where(\"item1 = item2\").groupBy(\"item1\").limit(10).offset(20).having(\"count > 10\").orderBy(.asc(\"item1\"))\n        \n        let copy = builder.copy()\n        let prepareBuildMySQL = builder.build().prepare(.mysql).plain\n        let prepareCopyMySQL = copy.build().prepare(.mysql).plain\n        \n        XCTAssertEqual(prepareBuildMySQL , prepareCopyMySQL)\n        \n        let prepareBuildPSQL = builder.build().prepare(.psql).plain\n        let prepareCopyPSQL = copy.build().prepare(.psql).plain\n        \n        XCTAssertEqual(prepareBuildPSQL , prepareCopyPSQL)\n    }\n    \n    @Test(\"Test Update Builder Add Column\")\n    func updateBuilderAddColumn() {\n        check(\n            UpdateTableBuilder<CarBrands>()\n                .addColumn(NewColumn.init(\"hello\", .text)),\n            .psql(#\"ALTER TABLE \"CarBrands\" ADD COLUMN \"hello\" text;\"#),\n            .mysql(\"ALTER TABLE CarBrands ADD COLUMN hello text;\")\n        )\n        check(\n            UpdateTableBuilder<CarBrands>()\n                .addColumn(\"hello\", .text),\n            .psql(#\"ALTER TABLE \"CarBrands\" ADD COLUMN \"hello\" text;\"#),\n            .mysql(\"ALTER TABLE CarBrands ADD COLUMN hello text;\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/CaseTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Case Tests\")\nstruct CaseTests: SwifQLTests {\n    // MARK: - Case When Then Else\n    \n    @Test(\"Test Case When Then Else 1\")\n    func caseWhenThenElse1() {\n        check(\n            Case\n                .when(CarBrands.column(\"name\") == \"BMW\")\n            .then(\"Crazy driver\")\n                .when(CarBrands.column(\"name\") == \"Tesla\")\n            .then(\"Fancy driver\")\n                .else(\"Normal driver\")\n            .end,\n            .psql(#\"CASE WHEN \"CarBrands\".\"name\" = 'BMW' THEN 'Crazy driver' WHEN \"CarBrands\".\"name\" = 'Tesla' THEN 'Fancy driver' ELSE 'Normal driver' END\"#),\n            .mysql(\"CASE WHEN CarBrands.name = 'BMW' THEN 'Crazy driver' WHEN CarBrands.name = 'Tesla' THEN 'Fancy driver' ELSE 'Normal driver' END\")\n        )\n    }\n    \n    @Test(\"Test Case When Then Else 2\")\n    func caseWhenThenElse2() {\n        check(\n            Case(CarBrands.column(\"name\"))\n                .when(\"BMW\")\n            .then(\"Crazy driver\")\n                .when(\"Tesla\")\n            .then(\"Fancy driver\")\n                .else(\"Normal driver\")\n            .end,\n            .psql(#\"CASE \"CarBrands\".\"name\" WHEN 'BMW' THEN 'Crazy driver' WHEN 'Tesla' THEN 'Fancy driver' ELSE 'Normal driver' END\"#),\n            .mysql(\"CASE CarBrands.name WHEN 'BMW' THEN 'Crazy driver' WHEN 'Tesla' THEN 'Fancy driver' ELSE 'Normal driver' END\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/DirectiveTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Directive Tests\")\nstruct DirectiveTests: SwifQLTests {\n    // MARK: - UPDATE\n    \n    @Test(\"Test Update\")\n    func update() {\n        check(\n            SwifQL.update(Path.Schema(nil).table(\"ttt\")),\n            .psql(#\"UPDATE \"ttt\"\"#),\n            .mysql(\"UPDATE ttt\")\n        )\n        check(\n            SwifQL.update(Path.Schema(\"sss\").table(\"ttt\")),\n            .psql(#\"UPDATE \"sss\".\"ttt\"\"#),\n            .mysql(\"UPDATE sss.ttt\")\n        )\n    }\n    \n    // MARK: - INSERT INTO\n    \n    @Test(\"Test Insert Into\")\n    func insertInto() {\n        check(\n            SwifQL.insertInto(Path.Schema(nil).table(\"ttt\"), fields: \"id\"),\n            .psql(#\"INSERT INTO \"ttt\" (\"id\")\"#),\n            .mysql(\"INSERT INTO ttt (id)\")\n        )\n        check(\n            SwifQL.insertInto(Path.Schema(\"sss\").table(\"ttt\"), fields: \"id\"),\n            .psql(#\"INSERT INTO \"sss\".\"ttt\" (\"id\")\"#),\n            .mysql(\"INSERT INTO sss.ttt (id)\")\n        )\n        check(\n            SwifQL.insertInto(CarBrands.table, fields: CarBrands.column(\"id\")),\n            .psql(#\"INSERT INTO \"CarBrands\" (\"id\")\"#),\n            .mysql(\"INSERT INTO CarBrands (id)\")\n        )\n        check(\n            SwifQL.insertInto(CarBrands.table, fields: CarBrands.column(\"id\"), CarBrands.column(\"name\"), CarBrands.column(\"createdAt\")),\n            .psql(#\"INSERT INTO \"CarBrands\" (\"id\", \"name\", \"createdAt\")\"#),\n            .mysql(\"INSERT INTO CarBrands (id, name, createdAt)\")\n        )\n        check(\n            SwifQL.insertInto(cb.table, fields: cb.column(\"id\")),\n            .psql(#\"INSERT INTO \"CarBrands\" AS \"cb\" (\"id\")\"#),\n            .mysql(\"INSERT INTO CarBrands AS cb (id)\")\n        )\n        check(\n            SwifQL.insertInto(cb.table, fields: cb.column(\"id\"), cb.column(\"name\"), cb.column(\"createdAt\")),\n            .psql(#\"INSERT INTO \"CarBrands\" AS \"cb\" (\"id\", \"name\", \"createdAt\")\"#),\n            .mysql(\"INSERT INTO CarBrands AS cb (id, name, createdAt)\")\n        )\n        check(\n            SwifQL.insertInto(cb.table, fields: CarBrands.column(\"id\"), cb.column(\"name\"), CarBrands.column(\"createdAt\")),\n            .psql(#\"INSERT INTO \"CarBrands\" AS \"cb\" (\"id\", \"name\", \"createdAt\")\"#),\n            .mysql(\"INSERT INTO CarBrands AS cb (id, name, createdAt)\")\n        )\n    }\n    \n    // MARK: - Delete\n    \n    @Test(\"Test Delete\")\n    func delete() {\n        check(\n            SwifQL.delete(from: CarBrands.table).where(CarBrands.column(\"name\") == \"BMW\"),\n            .psql(#\"DELETE FROM \"CarBrands\" WHERE \"CarBrands\".\"name\" = 'BMW'\"#),\n            .mysql(\"DELETE FROM CarBrands WHERE CarBrands.name = 'BMW'\")\n        )\n    }\n    \n    // MARK: - RETURNING\n    \n    @Test(\"Test Returning\")\n    func returning() {\n        check(\n            SwifQL.returning(\"hello_world\", \"bye_world\"),\n            .psql(#\"RETURNING \"hello_world\", \"bye_world\"\"#),\n            .mysql(\"RETURNING hello_world, bye_world\")\n        )\n        check(\n            SwifQL.returning(CarBrands.column(\"id\"), CarBrands.column(\"name\")),\n            .psql(#\"RETURNING \"id\", \"name\"\"#),\n            .mysql(\"RETURNING id, name\")\n        )\n    }\n    \n    // MARK: - ON CONFLICT DO NOTHING\n    \n    @Test(\"Test On Conflict\")\n    func onConflict() {\n        check(\n            SwifQL.on.conflict(CarBrands.column(\"id\"), CarBrands.column(\"name\")),\n            .psql(#\"ON CONFLICT (\"id\", \"name\")\"#),\n            .mysql(\"ON CONFLICT (id, name)\")\n        )\n        check(\n            SwifQL.on.conflict(CarBrands.column(\"id\"), CarBrands.column(\"name\")).do.nothing,\n            .psql(#\"ON CONFLICT (\"id\", \"name\") DO NOTHING\"#),\n            .mysql(\"ON CONFLICT (id, name) DO NOTHING\")\n        )\n    }\n    \n    // MARK: - ON CONFLICT ON CONSTRAINT DO NOTHING\n    \n    @Test(\"Test On Conflict On Constraint Do Nothing\")\n    func onConflictOnConstraintDoNothing() {\n        check(\n            SwifQL.on.conflict.on.constraint(\"hello_world\"),\n            .psql(#\"ON CONFLICT ON CONSTRAINT \"hello_world\"\"#),\n            .mysql(\"ON CONFLICT ON CONSTRAINT hello_world\")\n        )\n        check(\n            SwifQL.on.conflict.on.constraint(\"hello_world\").do.nothing,\n            .psql(#\"ON CONFLICT ON CONSTRAINT \"hello_world\" DO NOTHING\"#),\n            .mysql(\"ON CONFLICT ON CONSTRAINT hello_world DO NOTHING\")\n        )\n        check(\n            SwifQL.on.conflict.on.constraint(CarBrands.column(\"name\")),\n            .psql(#\"ON CONFLICT ON CONSTRAINT \"name\"\"#),\n            .mysql(\"ON CONFLICT ON CONSTRAINT name\")\n        )\n    }\n    \n    // MARK: - DO NOTHING\n    \n    @Test(\"Test Do Nothing\")\n    func doNothing() {\n        check(\n            SwifQL.do.nothing,\n            .psql(\"DO NOTHING\"),\n            .mysql(\"DO NOTHING\")\n        )\n    }\n    \n    // MARK: - NOT / NOT BETWEEN / BETWEEN\n    \n    @Test(\"Test Not And Between\")\n    func notAndBetween() {\n        check(\n            SwifQL.between(10.and(20)),\n            .psql(\"BETWEEN 10 AND 20\"),\n            .mysql(\"BETWEEN 10 AND 20\")\n        )\n        check(\n            SwifQL.not(SwifQL.between(10.and(20))),\n            .psql(\"NOT BETWEEN 10 AND 20\"),\n            .mysql(\"NOT BETWEEN 10 AND 20\")\n        )\n        check(\n            SwifQL.between((CarBrands.column(\"id\")).and(CarBrands.column(\"name\"))),\n            .psql(#\"BETWEEN \"CarBrands\".\"id\" AND \"CarBrands\".\"name\"\"#),\n            .mysql(\"BETWEEN CarBrands.id AND CarBrands.name\")\n        )\n        check(\n            SwifQL.not(SwifQL.between((CarBrands.column(\"id\")).and(CarBrands.column(\"name\")))),\n            .psql(#\"NOT BETWEEN \"CarBrands\".\"id\" AND \"CarBrands\".\"name\"\"#),\n            .mysql(\"NOT BETWEEN CarBrands.id AND CarBrands.name\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/ExistsTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Exists Tests\")\nstruct ExistsTests: SwifQLTests {\n    //MARK: - EXISTS\n    \n    @Test(\"Test Exists\")\n    func exists() {\n        check(\n            SwifQL.exists(1),\n            .psql(\"EXISTS (1)\"),\n            .mysql(\"EXISTS (1)\")\n        )\n    }\n    \n    //MARK: - NOT EXISTS\n    \n    @Test(\"Test Not Exists\")\n    func notExists() {\n        check(\n            SwifQL.notExists(1),\n            .psql(\"NOT EXISTS (1)\"),\n            .mysql(\"NOT EXISTS (1)\")\n        )\n    }\n    \n    //MARK: - WHERE EXISTS\n    \n    @Test(\"Test Where Exists\")\n    func whereExists() {\n        check(\n            SwifQL.whereExists(1),\n            .psql(\"WHERE EXISTS (1)\"),\n            .mysql(\"WHERE EXISTS (1)\")\n        )\n    }\n    \n    //MARK: - WHERE NOT EXISTS\n    \n    @Test(\"Test Where Not Exists\")\n    func whereNotExists() {\n        check(\n            SwifQL.whereNotExists(1),\n            .psql(\"WHERE NOT EXISTS (1)\"),\n            .mysql(\"WHERE NOT EXISTS (1)\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/FnTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Fn Tests\")\nstruct FnTests: SwifQLTests {\n    // MARK: - Fn.array_remove\n    \n    @Test(\"Test array_remove\")\n    func array_remove() {\n        check(\n            SwifQL.select(Fn.array_remove(PgArray(1,2,3,2), 2)),\n            .psql(\"SELECT array_remove(ARRAY[1, 2, 3, 2], 2)\"),\n            .mysql(\"SELECT array_remove(ARRAY[1, 2, 3, 2], 2)\")\n        )\n    }\n    \n    // MARK: - Concat\n    \n    @Test(\"Test concat\")\n    func concat() {\n        check(\n            Fn.concat(\"Hello \", CarBrands.column(\"name\")),\n            .psql(#\"concat('Hello ', \"CarBrands\".\"name\")\"#),\n            .mysql(\"concat('Hello ', CarBrands.name)\")\n        )\n        check(\n            Fn.concat_ws(\", \", \"Hello\", CarBrands.column(\"name\")),\n            .psql(#\"concat_ws(', ', 'Hello', \"CarBrands\".\"name\")\"#),\n            .mysql(\"concat_ws(', ', 'Hello', CarBrands.name)\")\n        )\n    }\n    \n    // MARK: - Fn.to_tsvector\n    \n    @Test(\"Test to_tsvector\")\n    func to_tsvector() {\n        check(\n            SwifQL.select(Fn.to_tsvector(\"english\", \"a fat  cat sat on a mat - it ate a fat rats\")),\n            .psql(#\"SELECT to_tsvector('english', 'a fat  cat sat on a mat - it ate a fat rats')\"#),\n            .mysql(\"SELECT to_tsvector('english', 'a fat  cat sat on a mat - it ate a fat rats')\")\n        )\n        check(\n            SwifQL.select(Fn.to_tsvector(\"english\")),\n            .psql(\"SELECT to_tsvector('english')\"),\n            .mysql(\"SELECT to_tsvector('english')\")\n        )\n    }\n    \n    // MARK: - Fn.to_tsquery\n    \n    @Test(\"Test to_tsquery\")\n    func to_tsquery() {\n        check(\n            SwifQL.select(Fn.to_tsquery(\"english\", \"The & Fat & Rats\")),\n            .psql(\"SELECT to_tsquery('english', 'The & Fat & Rats')\"),\n            .mysql(\"SELECT to_tsquery('english', 'The & Fat & Rats')\")\n        )\n        check(\n            SwifQL.select(Fn.to_tsquery(\"english\")),\n            .psql(\"SELECT to_tsquery('english')\"),\n            .mysql(\"SELECT to_tsquery('english')\")\n        )\n    }\n    \n    // MARK: - Fn.plainto_tsquery\n    \n    @Test(\"Test plainto_tsquery\")\n    func plainto_tsquery() {\n        check(\n            SwifQL.select(Fn.plainto_tsquery(\"english\", \"The Fat Rats\")),\n            .psql(\"SELECT plainto_tsquery('english', 'The Fat Rats')\"),\n            .mysql(\"SELECT plainto_tsquery('english', 'The Fat Rats')\")\n        )\n        check(\n            SwifQL.select(Fn.plainto_tsquery(\"english\")),\n            .psql(\"SELECT plainto_tsquery('english')\"),\n            .mysql(\"SELECT plainto_tsquery('english')\")\n        )\n    }\n    \n    // MARK: - Fn.ts_rank_cd\n    \n    @Test(\"Test ts_rank_cd\")\n    func ts_rank_cd() {\n        check(\n            SwifQL.select(Fn.ts_rank_cd(FormattedKeyPath(CarBrands.self, \"id\"), Fn.to_tsquery(\"The Fat Rats\"))),\n            .psql(#\"SELECT ts_rank_cd(\"CarBrands\".\"id\", to_tsquery('The Fat Rats'))\"#),\n            .mysql(\"SELECT ts_rank_cd(CarBrands.id, to_tsquery('The Fat Rats'))\")\n        )\n    }\n    \n    // MARK - Generate Series\n    \n    @Test(\"Test Generate Series Numbers\")\n    func generateSeriesNumbers() {\n        check(\n            SwifQL.select(Fn.generate_series(1, 4)),\n            .psql(\"SELECT generate_series(1, 4)\"),\n            .mysql(\"SELECT generate_series(1, 4)\")\n        )\n        check(\n            SwifQL.select(Fn.generate_series(1, 4, 2)),\n            .psql(\"SELECT generate_series(1, 4, 2)\"),\n            .mysql(\"SELECT generate_series(1, 4, 2)\")\n        )\n    }\n    \n    @Test(\"Test Generate Series Dates\")\n    func generateSeriesDates() {\n        check(\n            SwifQL.select(Fn.generate_series(\"2019-10-01\", \"2019-10-04\", \"1 day\")),\n            .psql(\"SELECT generate_series('2019-10-01', '2019-10-04', '1 day')\"),\n            .mysql(\"SELECT generate_series('2019-10-01', '2019-10-04', '1 day')\")\n        )\n        check(\n            SwifQL.select(Fn.generate_series(\"2019-10-01\" => .date, \"2019-10-04\" => .date, \"1 day\")),\n            .psql(\"SELECT generate_series('2019-10-01'::date, '2019-10-04'::date, '1 day')\"),\n            .mysql(\"SELECT generate_series('2019-10-01'::date, '2019-10-04'::date, '1 day')\")\n        )\n        let df = DateFormatter()\n        df.dateFormat = \"yyyy-MM-dd HH:mm:ss\"\n        df.timeZone = TimeZone(secondsFromGMT: 0)\n        let pdf = PostgresDateFormatter()\n        let date1 = df.date(from: \"2019-10-01 00:00:00\")!\n        let date2 = df.date(from: \"2019-10-04 00:00:00\")!\n        check(\n            SwifQL.select(Fn.generate_series(date1, date2, \"1 day\")),\n            .psql(\"SELECT generate_series(('\\(pdf.string(from: date1))'::timestamptz), ('\\(pdf.string(from: date2))'::timestamptz), '1 day')\"),\n            .mysql(\"SELECT generate_series(FROM_UNIXTIME(1569888000.0), FROM_UNIXTIME(1570147200.0), '1 day')\")\n        )\n    }\n\n    // MARK: - MySQL DATE_FORMAT\n\n    @Test(\"Test date_format\")\n    func date_format() {\n        check(\n            SwifQL.select(Fn.date_format(CarBrands.column(\"createdAt\"), \"%y-%m\")),\n            .psql(#\"SELECT DATE_FORMAT(\"CarBrands\".\"createdAt\", '%y-%m')\"#),\n            .mysql(\"SELECT DATE_FORMAT(CarBrands.createdAt, '%y-%m')\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/FromTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"From Tests\")\nstruct FromTests: SwifQLTests {\n    //MARK: - FROM\n    \n    @Test(\"Test Select From\")\n    func selectFrom() {\n        check(\n            SwifQL.select(1).from(),\n            .psql(\"SELECT 1 FROM \"),\n            .mysql(\"SELECT 1 FROM \")\n        )\n    }\n    \n    @Test(\"Test From\")\n    func from() {\n        check(\n            SwifQL.from(),\n            .psql(\"FROM \"),\n            .mysql(\"FROM \")\n        )\n    }\n    \n    @Test(\"Test From One Table\")\n    func fromOneTable() {\n        check(\n            SwifQL.from(CarBrands.table),\n            .psql(#\"FROM \"CarBrands\"\"#),\n            .mysql(\"FROM CarBrands\")\n        )\n    }\n    \n    @Test(\"Test From Two Tables\")\n    func fromTwoTables() {\n        check(\n            SwifQL.from(CarBrands.table, CarBrands.table),\n            .psql(#\"FROM \"CarBrands\", \"CarBrands\"\"#),\n            .mysql(\"FROM CarBrands, CarBrands\")\n        )\n    }\n    \n    @Test(\"Test From One Table Alias\")\n    func fromOneTableAlias() {\n        check(\n            SwifQL.from(cb.table),\n            .psql(#\"FROM \"CarBrands\" AS \"cb\"\"#),\n            .mysql(\"FROM CarBrands AS cb\")\n        )\n    }\n    \n    @Test(\"Test From Two Table Aliases\")\n    func fromTwoTableAliases() {\n        check(\n            SwifQL.from(cb.table, cb.table),\n            .psql(#\"FROM \"CarBrands\" AS \"cb\", \"CarBrands\" AS \"cb\"\"#),\n            .mysql(\"FROM CarBrands AS cb, CarBrands AS cb\")\n        )\n    }\n    \n    @Test(\"Test From Table And Table Alias\")\n    func fromTableAndTableAlias() {\n        check(\n            SwifQL.from(CarBrands.table, cb.table),\n            .psql(#\"FROM \"CarBrands\", \"CarBrands\" AS \"cb\"\"#),\n            .mysql(\"FROM CarBrands, CarBrands AS cb\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/JsonTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Json Tests\")\nstruct JsonTests: SwifQLTests {\n    // MARK: - JSON\n    \n    @Test(\"Test Json Extract Path\")\n    func jsonExtractPath() {\n        let json = #\"{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}\"#\n        check(\n            SwifQL.select(Fn.json_extract_path(json, path_elems: [\"f4\"])),\n            .psql(#\"SELECT json_extract_path('{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}', 'f4')\"#),\n            .mysql(#\"SELECT json_extract_path('{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}', 'f4')\"#)\n        )\n    }\n    \n    @Test(\"Test Json Extract Path Text\")\n    func jsonExtractPathText() {\n        let json = #\"{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}\"#\n        check(\n            SwifQL.select(Fn.json_extract_path_text(json, path_elems: [\"f4\", \"f6\"])),\n            .psql(#\"SELECT json_extract_path_text('{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}', 'f4', 'f6')\"#),\n            .mysql(#\"SELECT json_extract_path_text('{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}', 'f4', 'f6')\"#)\n        )\n    }\n    \n    @Test(\"Test Jsonb Extract Path\")\n    func jsonbExtractPath() {\n        let json = #\"{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}\"#\n        check(\n            SwifQL.select(Fn.jsonb_extract_path(json, path_elems: [\"f4\"])),\n            .psql(#\"SELECT jsonb_extract_path('{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}', 'f4')\"#),\n            .mysql(#\"SELECT jsonb_extract_path('{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}', 'f4')\"#)\n        )\n    }\n    \n    @Test(\"Test Jsonb Extract Path Text\")\n    func jsonbExtractPathText() {\n        let json = #\"{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}\"#\n        check(\n            SwifQL.select(Fn.jsonb_extract_path_text(json, path_elems: [\"f4\", \"f6\"])),\n            .psql(#\"SELECT jsonb_extract_path_text('{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}', 'f4', 'f6')\"#),\n            .mysql(#\"SELECT jsonb_extract_path_text('{\"f2\":{\"f3\":1},\"f4\":{\"f5\":99,\"f6\":\"foo\"}}', 'f4', 'f6')\"#)\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/OrderTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Order Tests\")\nstruct OrderTests: SwifQLTests {\n    // MARK: - Order by simple\n    \n    @Test(\"Test Order By Simple\")\n    func orderBySimple() {\n        check(\n            SwifQL.orderBy(.asc(CarBrands.column(\"name\")), .desc(CarBrands.column(\"id\"))),\n            .psql(#\"ORDER BY \"CarBrands\".\"name\" ASC, \"CarBrands\".\"id\" DESC\"#),\n            .mysql(\"ORDER BY CarBrands.name ASC, CarBrands.id DESC\")\n        )\n    }\n    \n    // MARK: - Order by with nulls\n    \n    @Test(\"Test Order By With Nulls\")\n    func orderByWithNulls() {\n        check(\n            SwifQL.orderBy(.asc(CarBrands.column(\"name\"), nulls: .first), .desc(CarBrands.column(\"id\"), nulls: .last)),\n            .psql(#\"ORDER BY \"CarBrands\".\"name\" ASC NULLS FIRST, \"CarBrands\".\"id\" DESC NULLS LAST\"#)\n        )\n        check(\n            SwifQL.orderBy(.asc(CarBrands.column(\"name\") == nil, CarBrands.column(\"name\")), .desc(CarBrands.column(\"id\") != nil, CarBrands.column(\"id\"))),\n            .mysql(\"ORDER BY CarBrands.name IS NULL, CarBrands.name ASC, CarBrands.id IS NOT NULL, CarBrands.id DESC\")\n        )\n    }\n    \n    // MARK: - Order by with direction\n    \n    @Test(\"Test Order By Direction\")\n    func orderByDirection() {\n        check(\n            SwifQL.orderBy(.direction(.asc, CarBrands.column(\"name\"), nulls: .last)),\n            .psql(#\"ORDER BY \"CarBrands\".\"name\" ASC NULLS LAST\"#)\n        )\n        check(\n            SwifQL.orderBy(.direction(.desc, CarBrands.column(\"id\"), nulls: .first)),\n            .mysql(\"ORDER BY CarBrands.id DESC NULLS FIRST\")\n        )\n    }\n    \n    // MARK: - Order by random() / Order by rand()\n    \n    @Test(\"Test Order By Random\")\n    func orderByRandom() {\n        check(\n            SwifQL.orderBy(.random),\n            .psql(#\"ORDER BY random()\"#)\n        )\n        check(\n            SwifQL.orderBy(.random),\n            .mysql(\"ORDER BY rand()\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/OtherTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Other Tests\")\nstruct OtherTests: SwifQLTests {\n    // MARK: String enum array\n    \n    @Test(\"Test String Enum Array\")\n    func stringEnumArray() {\n        enum UserRole: String, SwifQLEnum {\n            case admin\n            case staff\n            case vendor\n        }\n        check(\n            SwifQL.in([UserRole.admin, .staff, .vendor]),\n            .psql(#\"IN ('admin', 'staff', 'vendor')\"#),\n            .mysql(#\"IN ('admin', 'staff', 'vendor')\"#)\n        )\n    }\n    \n    // MARK: Int enum array\n    \n    @Test(\"Test Int Enum Array\")\n    func intEnumArray() {\n        enum UserRole: Int, SwifQLEnum {\n            case admin = 0\n            case staff = 1\n            case vendor = 2\n        }\n        check(\n            SwifQL.in([UserRole.admin, .staff, .vendor]),\n            .psql(#\"IN (0, 1, 2)\"#),\n            .mysql(#\"IN (0, 1, 2)\"#)\n        )\n    }\n    \n    // MARK: Int enum value alone\n    \n    @Test(\"Test Int Enum Array With Alone Value\")\n    func intEnumValueAlone() {\n        enum UserRole: Int, SwifQLEnum {\n            case admin = 0\n            case staff = 1\n            case vendor = 2\n        }\n        check(\n            0 == UserRole.admin,\n            .psql(#\"0 = 0\"#),\n            .mysql(#\"0 = 0\"#)\n        )\n    }\n    \n    // MARK: String enum value alone\n    \n    @Test(\"Test String Enum Array With Value Alone\")\n    func stringEnumValueAlone() {\n        enum UserRole: String, SwifQLEnum {\n            case admin\n            case staff\n            case vendor\n        }\n        check(\n            \"admin\" == UserRole.admin,\n            .psql(#\"'admin' = 'admin'\"#),\n            .mysql(#\"'admin' = 'admin'\"#)\n        )\n    }\n\n    // MARK: Null Condition\n    \n    @Test(\"Test Null Condition\")\n    func nullCondition() {\n        check(\n            \"hello\" == SwifQLNull,\n            .psql(#\"'hello' = NULL\"#),\n            .mysql(#\"'hello' = NULL\"#)\n        )\n        check(\n            \"hello\" == nil,\n            .psql(#\"'hello' IS NULL\"#),\n            .mysql(#\"'hello' IS NULL\"#)\n        )\n    }\n    \n    // MARK: Enum array\n    \n    @Test(\"Test Enum Array\")\n    func enumArray() {\n        check(\n            [GearboxType.manual],\n            .psql(#\"'{manual}'\"#),\n            .mysql(#\"'{manual}'\"#)\n        )\n        check(\n            [GearboxType.manual, .auto],\n            .psql(#\"'{manual,auto}'\"#),\n            .mysql(#\"'{manual,auto}'\"#)\n        )\n    }\n    \n    // MARK: Enum array type autodetect\n    \n    @Test(\"Test Array Type Autodetect\")\n    func enumArrayTypeAutodetect() {\n        XCTAssertEqual(Type.auto(from: [GearboxType].self).name, \"gearboxtype[]\")\n    }\n    \n    // MARK: ANY operator\n    \n    @Test(\"Test Operator\")\n    func anyOperator() {\n        check(\n            SwifQL.any(\"hello\"),\n            .psql(#\"ANY('hello')\"#),\n            .mysql(#\"ANY('hello')\"#)\n        )\n    }\n    \n    // MARK: Update\n    \n    @Test(\"Test Update With Schema\")\n    func updateWithSchema() {\n        let alias = CarBrands.inSchema(\"hello\")\n        check(\n            SwifQL.update(alias.table).set[items: alias.$id == 1, alias.$createdAt == 2],\n            .psql(#\"UPDATE \"hello\".\"CarBrands\" SET \"id\" = 1, \"createdAt\" = 2\"#),\n            .mysql(#\"UPDATE hello.CarBrands SET id = 1, createdAt = 2\"#)\n        )\n    }\n    \n    @Test(\"Test Update Already Schemable With Different Schema\")\n    func updateAlreadySchemableWithDifferentSchema() {\n        let alias = SchemableCarBrands.inSchema(\"hello\")\n        check(\n            SwifQL.update(alias.table).set[items: alias.$id == 1, alias.$createdAt == 2],\n            .psql(#\"UPDATE \"hello\".\"CarBrands\" SET \"id\" = 1, \"createdAt\" = 2\"#),\n            .mysql(#\"UPDATE hello.CarBrands SET id = 1, createdAt = 2\"#)\n        )\n    }\n    \n    // MARK: Alias\n    \n    @Test(\"Test Alias\")\n    func alias() {\n        check(\n            CarBrands.as(\"c\"),\n            .psql(#\"\"c\"\"#),\n            .mysql(#\"c\"#)\n        )\n        check(\n            CarBrands.as(\"c\").$id,\n            .psql(#\"\"c\".\"id\"\"#),\n            .mysql(#\"c.id\"#)\n        )\n        check(\n            CarBrands.as(\"c\").table,\n            .psql(#\"\"CarBrands\" AS \"c\"\"#),\n            .mysql(#\"CarBrands AS c\"#)\n        )\n        check(\n            SchemableCarBrands.as(\"c\").table,\n            .psql(#\"\"public\".\"CarBrands\" AS \"c\"\"#),\n            .mysql(#\"public.CarBrands AS c\"#)\n        )\n    }\n    \n    // MARK: Create Type\n    \n    @Test(\"Test Create Type\")\n    func createType() {\n        check(\n            SwifQL.type(\"mood\"),\n            .psql(#\"TYPE \"mood\"\"#),\n            .mysql(#\"TYPE mood\"#)\n        )\n        check(\n            SwifQL.type(\"trololo\", \"mood\"),\n            .psql(#\"TYPE \"trololo\".\"mood\"\"#),\n            .mysql(#\"TYPE trololo.mood\"#)\n        )\n    }\n    \n    // MARK: Select enum\n    \n    private enum Mood: String, SwifQLEnum {\n        case sad, happy\n    }\n    \n    @Test(\"Test Select Enum\")\n    func selectEnum() {\n        check(\n            SwifQL.select(Mood.happy),\n            .psql(#\"SELECT 'happy'\"#),\n            .mysql(#\"SELECT 'happy'\"#)\n        )\n    }\n    \n    // MARK: Rename Table\n    \n    @Test(\"Test Rename Table\")\n    func renameTable() {\n        check(UpdateTableBuilder<CarBrands>().renameTable(to: \"aaa\"),\n              .psql(#\"ALTER TABLE \"CarBrands\" RENAME TO \"aaa\";\"#))\n    }\n    \n    // MARK: Add Column\n    \n    @Test(\"Test Add Column\")\n    func addColumn() {\n        check(UpdateTableBuilder<CarBrands>().addColumn(\"aaa\", .bigint, .default(0), .notNull),\n              .psql(#\"ALTER TABLE \"CarBrands\" ADD COLUMN \"aaa\" bigint DEFAULT 0 NOT NULL;\"#))\n    }\n\n    @Test(\"Test Add Column If Not Exits\")\n    func addColumnIfNotExits() {\n        check(UpdateTableBuilder<CarBrands>().addColumn(\"aaa\", .bigint, .default(0), checkIfNotExists: true, .notNull),\n              .psql(#\"ALTER TABLE \"CarBrands\" ADD COLUMN IF NOT EXISTS \"aaa\" bigint DEFAULT 0 NOT NULL;\"#))\n    }\n\n    // MARK: Drop Column\n    \n    @Test(\"Test Drop Column\")\n    func dropColumn() {\n        check(UpdateTableBuilder<CarBrands>().dropColumn(\"aaa\"),\n              .psql(#\"ALTER TABLE \"CarBrands\" DROP COLUMN \"aaa\";\"#))\n    }\n\n    @Test(\"Test Drop Column If Exists\")\n    func dropColumnIfExists() {\n        check(UpdateTableBuilder<CarBrands>().dropColumn(\"aaa\", checkIfExists: true),\n              .psql(#\"ALTER TABLE \"CarBrands\" DROP COLUMN IF EXISTS \"aaa\";\"#))\n    }\n\n    @Test(\"Test Drop Column Cascade\")\n    func dropColumnCascade() {\n        check(UpdateTableBuilder<CarBrands>().dropColumn(\"aaa\", cascade: true),\n              .psql(#\"ALTER TABLE \"CarBrands\" DROP COLUMN \"aaa\" CASCADE;\"#))\n    }\n\n    @Test(\"Test Drop Column If Exists Cascade\")\n    func dropColumnIfExistsCascade() {\n        check(UpdateTableBuilder<CarBrands>().dropColumn(\"aaa\", checkIfExists: true, cascade: true),\n              .psql(#\"ALTER TABLE \"CarBrands\" DROP COLUMN IF EXISTS \"aaa\" CASCADE;\"#))\n    }\n\n    // MARK: Set Default\n    \n    @Test(\"Test Set Default\")\n    func setDefault() {\n        check(UpdateTableBuilder<CarBrands>().setDefault(\"aaa\", constant: 0),\n              .psql(#\"ALTER TABLE \"CarBrands\" ALTER COLUMN \"aaa\" SET DEFAULT 0;\"#))\n    }\n    \n    // MARK: Drop Default\n    \n    @Test(\"Test Drop Default\")\n    func dropDefault() {\n        check(UpdateTableBuilder<CarBrands>().dropDefault(\"aaa\"),\n              .psql(#\"ALTER TABLE \"CarBrands\" ALTER COLUMN \"aaa\" DROP DEFAULT;\"#))\n    }\n    \n    // MARK: Set Not Null\n    \n    @Test(\"Test Set Not Null\")\n    func setNotNull() {\n        check(UpdateTableBuilder<CarBrands>().setNotNull(\"aaa\"),\n              .psql(#\"ALTER TABLE \"CarBrands\" ALTER COLUMN \"aaa\" SET NOT NULL;\"#))\n    }\n    \n    // MARK: Drop Not Null\n    \n    @Test(\"Test Drop Not Null\")\n    func dropNotNull() {\n        check(UpdateTableBuilder<CarBrands>().dropNotNull(\"aaa\"),\n              .psql(#\"ALTER TABLE \"CarBrands\" ALTER COLUMN \"aaa\" DROP NOT NULL;\"#))\n    }\n    \n    // MARK: Rename Column\n    \n    @Test(\"Test Rename Column\")\n    func renameColumn() {\n        check(UpdateTableBuilder<CarBrands>().renameColumn(\"aaa\", to: \"bbb\"),\n              .psql(#\"ALTER TABLE \"CarBrands\" RENAME COLUMN \"aaa\" TO \"bbb\";\"#))\n    }\n    \n    // MARK: Add Unique\n    \n    @Test(\"Test Add Unique\")\n    func addUnique() {\n        check(UpdateTableBuilder<CarBrands>().addUnique(to: \"aaa\", \"bbb\"),\n              .psql(#\"ALTER TABLE \"CarBrands\" ADD UNIQUE (\"aaa\", \"bbb\");\"#))\n    }\n    \n    // MARK: Add Primary Key\n    \n    @Test(\"Test Add Primary Key\")\n    func addPrimaryKey() {\n        check(UpdateTableBuilder<CarBrands>().addPrimaryKey(to: \"aaa\", \"bbb\"),\n              .psql(#\"ALTER TABLE \"CarBrands\" ADD PRIMARY KEY (\"aaa\", \"bbb\");\"#))\n    }\n    \n    // MARK: Drop Constraint\n    \n    @Test(\"Test Drop Constraint\")\n    func dropConstraint() {\n        check(UpdateTableBuilder<CarBrands>().dropConstraint(\"aaa\"),\n              .psql(#\"DROP CONSTRAINT \"aaa\";\"#))\n    }\n    \n    // MARK: Drop Index\n    \n    @Test(\"Test Drop Index\")\n    func dropIndex() {\n        check(UpdateTableBuilder<CarBrands>().dropIndex(name: \"aaa\"),\n              .psql(#\"DROP INDEX \"aaa\";\"#))\n    }\n    \n    // MARK: Create Index\n    \n    @Test(\"Test Create Index\")\n    func createIndex() {\n        check(\n            UpdateTableBuilder<CarBrands>().createIndex(\n                unique: true,\n                name: \"aaa\",\n                items: .column(\"column3\", order: .desc),\n                       .expression(SwifQLBool(true) == SwifQLBool(true)),\n                type: .hash,\n                where: SwifQLBool(true) == SwifQLBool(true)\n            ),\n            .psql(#\"CREATE UNIQUE INDEX \"aaa\" ON \"CarBrands\" USING HASH (\"column3\" DESC, (TRUE = TRUE)) WHERE TRUE = TRUE;\"#)\n        )\n    }\n    \n    // MARK: Add Check\n    \n    @Test(\"Test Add Check\")\n    func addCheck() {\n        check(UpdateTableBuilder<CarBrands>().addCheck(constraintName: \"some_check\", SwifQLBool(true) == SwifQLBool(false)),\n              .psql(#\"ALTER TABLE \"CarBrands\" ADD CONSTRAINT \"some_check\" CHECK (TRUE = FALSE);\"#))\n    }\n    \n    // MARK: Add Foreign Key\n    \n    @Test(\"Test Add Foreign Key\")\n    func addForeignKey() {\n        check(UpdateTableBuilder<CarBrands>().addForeignKey(column: \"aaa\", constraintName: \"fk_aaa\", schema: \"deleted\", table: \"User\", columns: \"id\", onDelete: .cascade, onUpdate: .noAction),\n              .psql(#\"ALTER TABLE \"CarBrands\" ADD CONSTRAINT \"fk_aaa\" FOREIGN KEY (\"aaa\") REFERENCES \"deleted\".\"User\"(\"id\") ON DELETE CASCADE ON UPDATE NO ACTION;\"#))\n    }\n    \n    //MARK: - Operators\n    \n    @Test(\"Test Operator To SwifQLable\")\n    func operatorToSwifQLable() {\n        check(SwifQL.select(Operator.null), .mysql(\"SELECT NULL\"), .psql(\"SELECT NULL\"))\n    }\n        \n    //MARK: - ARRAY\n    \n    @Test(\"Test Array\")\n    func array() {\n        let emptyIntArray: [Int] = []\n        check(\n            emptyIntArray,\n//            .mysql(\"\"),\n            .psql(\"\")\n        )\n        check(\n            SwifQLableParts(parts: emptyIntArray),\n//            .mysql(\"''\"),\n            .psql(\"'{}'\")\n        )\n\n        let nonEmptyIntArray: [Int] = [1,3,7]\n        check(\n            nonEmptyIntArray,\n//            .mysql(\"1, 3, 7\"),\n            .psql(\"1, 3, 7\")\n        )\n        check(\n            SwifQLableParts(parts: nonEmptyIntArray),\n//            .mysql(\"'1,3,7'\"),\n            .psql(\"ARRAY[1,3,7]\", \"ARRAY[$1,$2,$3]\")\n        )\n        \n        let emptyStringArray: [Int] = []\n        check(\n            emptyStringArray,\n//            .mysql(\"\"),\n            .psql(\"\")\n        )\n        check(\n            SwifQLableParts(parts: emptyStringArray),\n//            .mysql(\"''\"),\n            .psql(\"'{}'\")\n        )\n\n        let nonEmptyStringArray: [String] = [\"a\", \"b\", \"c\"]\n        check(\n            nonEmptyStringArray,\n//            .mysql(\"'a', 'b', 'c'\"),\n            .psql(\"'a', 'b', 'c'\")\n        )\n        check(\n            SwifQLableParts(parts: nonEmptyStringArray),\n//            .mysql(\"'a','b','c'\"),\n            .psql(\"ARRAY['a','b','c']\", \"ARRAY[$1,$2,$3]\")\n        )\n    }\n    \n    //MARK: - WHERE\n    \n    @Test(\"Test Where\")\n    func `where`() {\n        check(SwifQL.where(\"\" == 1), all: \"WHERE '' = 1\")\n        check(SwifQL.where, all: \"WHERE\")\n    }\n    \n    //MARK: - UNION\n    \n    @Test(\"Test Union\")\n    func union() {\n        let table1 = Path.Table(\"Table1\")\n        let table2 = Path.Table(\"Table2\")\n        let table3 = Path.Table(\"Table3\")\n        check(\n            Union(\n                SwifQL.select(table1.*).from(table1),\n                SwifQL.select(table2.*).from(table2),\n                SwifQL.select(table3.*).from(table3)\n            ),\n            .psql(#\"(SELECT \"Table1\".* FROM \"Table1\") UNION (SELECT \"Table2\".* FROM \"Table2\") UNION (SELECT \"Table3\".* FROM \"Table3\")\"#),\n            .mysql(#\"(SELECT Table1.* FROM Table1) UNION (SELECT Table2.* FROM Table2) UNION (SELECT Table3.* FROM Table3)\"#)\n        )\n        \n        check(\n            SwifQL\n                .select(Distinct(Path.Column(\"uniqueName\")) => .text => \"name\")\n                .from(\n                    Union(\n                        SwifQL.select(Distinct(Path.Column(\"name\")) => .text => \"uniqueName\").from(table1),\n                        SwifQL.select(Distinct(Path.Column(\"name\")) => .text => \"uniqueName\").from(table2)\n                    )\n            ),\n            .psql(#\"SELECT DISTINCT \"uniqueName\"::text as \"name\" FROM (SELECT DISTINCT \"name\"::text as \"uniqueName\" FROM \"Table1\") UNION (SELECT DISTINCT \"name\"::text as \"uniqueName\" FROM \"Table2\")\"#),\n            .mysql(#\"SELECT DISTINCT uniqueName::text as name FROM (SELECT DISTINCT name::text as uniqueName FROM Table1) UNION (SELECT DISTINCT name::text as uniqueName FROM Table2)\"#)\n        )\n    }\n\n    //MARK: - VALUES\n    \n    @Test(\"Test Values\")\n    func values() {\n        check(\n            SwifQL.values(1, 1.2, 1.234, \"hello\"),\n            .psql(\"(1, 1.2, 1.234, 'hello')\"),\n            .mysql(\"(1, 1.2, 1.234, 'hello')\")\n        )\n        check(\n            SwifQL.values(array: [1, 1.2, 1.234, \"hello\"], [2, 2.3, 2.345, \"bye\"]),\n            .psql(\"(1, 1.2, 1.234, 'hello'), (2, 2.3, 2.345, 'bye')\"),\n            .mysql(\"(1, 1.2, 1.234, 'hello'), (2, 2.3, 2.345, 'bye')\")\n        )\n    }\n    \n    // MARK: - BINDINGS\n    \n    @Test(\"Test Binding For PostgreSQL\")\n    func bindingForPostgreSQL() {\n        let query = SwifQL.where(CarBrands.column(\"name\") == \"hello\" || CarBrands.column(\"name\") == \"world\").prepare(.psql).splitted.query\n        XCTAssertEqual(query, \"\"\"\n        WHERE \"CarBrands\".\"name\" = $1 OR \"CarBrands\".\"name\" = $2\n        \"\"\")\n    }\n    \n    @Test(\"Test Binding For MySQL\")\n    func bindingForMySQL() {\n        let query = SwifQL.where(CarBrands.column(\"name\") == \"hello\" || CarBrands.column(\"name\") == \"world\").prepare(.mysql).splitted.query\n        XCTAssertEqual(query, \"\"\"\n        WHERE CarBrands.name = ? OR CarBrands.name = ?\n        \"\"\")\n    }\n    \n    // MARK: - FormattedKeyPath\n    \n    @Test(\"Test Formatted KeyPath\")\n    func formattedKeyPath() {\n        check(\n            SwifQL.select(FormattedKeyPath(CarBrands.self, \"id\")),\n            .psql(#\"SELECT \"CarBrands\".\"id\"\"#),\n            .mysql(\"SELECT CarBrands.id\")\n        )\n        check(\n            SwifQL.select(CarBrands.mkp(\"id\")),\n            .psql(#\"SELECT \"CarBrands\".\"id\"\"#),\n            .mysql(\"SELECT CarBrands.id\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/PredicateTest.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Predicate Tests\")\nstruct PredicateTests: SwifQLTests {\n    \n    // MARK: - Greater Than (Number)\n    \n    @Test(\"Test Greater Than\")\n    func greaterThan() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$score > 10),\n            .psql(#\"WHERE \"CarBrandReferences\".\"score\" > 10\"#),\n            .mysql(\"WHERE CarBrandReferences.score > 10\")\n        )\n    }\n    \n    // MARK: - Less Than (Number)\n    \n    @Test(\"Test Less Than\")\n    func lessThan() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$score < 10),\n            .psql(#\"WHERE \"CarBrandReferences\".\"score\" < 10\"#),\n            .mysql(\"WHERE CarBrandReferences.score < 10\")\n        )\n    }\n    \n    // MARK: - Greater Than Or Equal (Number)\n    \n    @Test(\"Test Greater Than Or Equal\")\n    func greaterThanOrEqual() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$score >= 10),\n            .psql(#\"WHERE \"CarBrandReferences\".\"score\" >= 10\"#),\n            .mysql(\"WHERE CarBrandReferences.score >= 10\")\n        )\n    }\n    \n    // MARK: - Less Than Or Equal (Number)\n    \n    @Test(\"Test Less Than Or Equal\")\n    func lessThanOrEqual() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$score <= 10),\n            .psql(#\"WHERE \"CarBrandReferences\".\"score\" <= 10\"#),\n            .mysql(\"WHERE CarBrandReferences.score <= 10\")\n        )\n    }\n    \n    // MARK: - Equal (Number)\n    \n    @Test(\"Test Equal Number\")\n    func equalNumber() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$score == 10),\n            .psql(#\"WHERE \"CarBrandReferences\".\"score\" = 10\"#),\n            .mysql(\"WHERE CarBrandReferences.score = 10\")\n        )\n    }\n    \n    // MARK: - Equal (String)\n    \n    @Test(\"Test Equal String\")\n    func equalString() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$model == \"x001\"),\n            .psql(#\"WHERE \"CarBrandReferences\".\"model\" = 'x001'\"#),\n            .mysql(\"WHERE CarBrandReferences.model = 'x001'\")\n        )\n    }\n    \n    // MARK: - Equal (Boolean)\n    \n    @Test(\"Test Equal Boolean\")\n    func equalBoolean() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$available == true),\n            .psql(#\"WHERE \"CarBrandReferences\".\"available\" = TRUE\"#),\n            .mysql(\"WHERE CarBrandReferences.available = TRUE\")\n        )\n    }\n\n    // MARK: - Equal (Enum)\n    \n    @Test(\"Test Equal A Type\")\n    func equalAType() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$mainGers == GearboxType.manual),\n            .psql(#\"WHERE \"CarBrandReferences\".\"mainGers\" = 'manual'\"#),\n            .mysql(\"WHERE CarBrandReferences.mainGers = 'manual'\")\n        )\n    }\n    \n    // MARK: - Equal (Null)\n    \n    @Test(\"Test Equal NULL\")\n    func equalNULL() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$model == nil),\n            .psql(#\"WHERE \"CarBrandReferences\".\"model\" IS NULL\"#),\n            .mysql(\"WHERE CarBrandReferences.model IS NULL\")\n        )\n    }\n    \n    // MARK: - Not Equal (Number)\n    \n    @Test(\"Test Not Equal Number\")\n    func notEqualNumber() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$score != 10),\n            .psql(#\"WHERE \"CarBrandReferences\".\"score\" != 10\"#),\n            .mysql(\"WHERE CarBrandReferences.score != 10\")\n        )\n    }\n    \n    // MARK: - Not Equal (String)\n    \n    @Test(\"Test Not Equal String\")\n    func notEqualString() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$model != \"x001\"),\n            .psql(#\"WHERE \"CarBrandReferences\".\"model\" != 'x001'\"#),\n            .mysql(\"WHERE CarBrandReferences.model != 'x001'\")\n        )\n    }\n    \n    // MARK: - Not Equal (Boolean)\n    \n    @Test(\"Test Not Equal Boolean\")\n    func notEqualBoolean() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$available != true),\n            .psql(#\"WHERE \"CarBrandReferences\".\"available\" != TRUE\"#),\n            .mysql(\"WHERE CarBrandReferences.available != TRUE\")\n        )\n    }\n    \n    // MARK: - Not Equal (Enum)\n\n    @Test(\"Test Not Equal A Type\")\n    func notEqualAType() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$mainGers != GearboxType.manual),\n            .psql(#\"WHERE \"CarBrandReferences\".\"mainGers\" != 'manual'\"#),\n            .mysql(\"WHERE CarBrandReferences.mainGers != 'manual'\")\n        )\n    }\n    \n    // MARK: - Not Equal (Null)\n    \n    @Test(\"Test Not Equal NULL\")\n    func notEqualNULL() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$model != nil),\n            .psql(#\"WHERE \"CarBrandReferences\".\"model\" IS NOT NULL\"#),\n            .mysql(\"WHERE CarBrandReferences.model IS NOT NULL\")\n        )\n    }\n    \n    // MARK: - Between (Int)\n    \n    @Test(\"Test Between Int\")\n    func betweenInt () {\n        check(\n            SwifQL.where(\\CarBrandReferences.$score <> 5 && 20),\n            .psql(#\"WHERE \"CarBrandReferences\".\"score\" BETWEEN 5 AND 20\"#),\n            .mysql(\"WHERE CarBrandReferences.score BETWEEN 5 AND 20\")\n        )\n    }\n    \n    // MARK: - Between (String)\n    \n    @Test(\"Test Between String\")\n    func betweenString () {\n        check(\n            SwifQL.where(\\CarBrandReferences.$model <> \"a\" && \"t\"),\n            .psql(#\"WHERE \"CarBrandReferences\".\"model\" BETWEEN 'a' AND 't'\"#),\n            .mysql(\"WHERE CarBrandReferences.model BETWEEN 'a' AND 't'\")\n        )\n    }\n    \n    // MARK: - Range @> ([Enum])\n    \n    @Test(\"Test Range Left Enum\")\n    func rangeLeftEnum() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$availableGers ||> [GearboxType.manual]),\n            .psql(#\"WHERE \"CarBrandReferences\".\"availableGers\" @> '{manual}'\"#)\n        )\n    }\n    \n    // MARK: - Range <@ ([Enum])\n    \n    @Test(\"Test Range Right Enum\")\n    func rangeRightEnum() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$availableGers <|| [GearboxType.manual]),\n            .psql(#\"WHERE \"CarBrandReferences\".\"availableGers\" <@ '{manual}'\"#)\n        )\n    }\n    \n    // MARK: - Range @> ([String])\n    \n    @Test(\"Test Range Left String\")\n    func rangeLeftString() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$tags ||> PgArray([\"red\"])),\n            .psql(#\"WHERE \"CarBrandReferences\".\"tags\" @> ARRAY['red']\"#)\n        )\n    }\n    \n    // MARK: - Range <@ ([String])\n    \n    @Test(\"Test Range Right String\")\n    func rangeRightString() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$tags <|| PgArray([\"red\"])),\n            .psql(#\"WHERE \"CarBrandReferences\".\"tags\" <@ ARRAY['red']\"#)\n        )\n    }\n    \n    // MARK: - Range @> ([Int])\n    \n    @Test(\"Test Range Left Int\")\n    func rangeLeftInt() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$availableYears ||> PgArray([1, 2, 3])),\n            .psql(#\"WHERE \"CarBrandReferences\".\"availableYears\" @> ARRAY[1, 2, 3]\"#)\n        )\n    }\n    \n    // MARK: - Range <@ ([Int])\n    \n    @Test(\"Test Range Right Int\")\n    func rangeRightInt() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$availableYears <|| PgArray([1, 2, 3])),\n            .psql(#\"WHERE \"CarBrandReferences\".\"availableYears\" <@ ARRAY[1, 2, 3]\"#)\n        )\n    }\n    \n    // MARK: - Range @> ([UUID])\n    \n    @Test(\"Test Range Left UUID\")\n    func rangeLeftUUID() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$knowedIssues ||> PgArray([UUID(uuidString: \"25afebec-179e-43ff-8c7b-a0a460c7c996\")!, UUID(uuidString: \"25afebec-179e-43ff-8c7b-a0a460c7c996\")!])),\n            .psql(#\"WHERE \"CarBrandReferences\".\"knowedIssues\" @> ARRAY['25AFEBEC-179E-43FF-8C7B-A0A460C7C996', '25AFEBEC-179E-43FF-8C7B-A0A460C7C996']\"#)\n        )\n    }\n    \n    // MARK: - Range <@ ([UUID])\n    \n    @Test(\"Test Range Right UUID\")\n    func rangeRightUUID() {\n        check(\n            SwifQL.where(\\CarBrandReferences.$knowedIssues <|| PgArray([UUID(uuidString: \"25afebec-179e-43ff-8c7b-a0a460c7c996\")!, UUID(uuidString: \"25afebec-179e-43ff-8c7b-a0a460c7c996\")!])),\n            .psql(#\"WHERE \"CarBrandReferences\".\"knowedIssues\" <@ ARRAY['25AFEBEC-179E-43FF-8C7B-A0A460C7C996', '25AFEBEC-179E-43FF-8C7B-A0A460C7C996']\"#)\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/SelectTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport Foundation\n\n@Suite(\"Select Tests\")\nstruct SelectTests: SwifQLTests {\n    @Test(\"Test Select\")\n    func select() {\n        check(SwifQL.select, all: \"SELECT\")\n        check(SwifQL.select(), all: \"SELECT \")\n    }\n    \n    @Test(\"Test Select String\")\n    func selectString() {\n        check(\n            SwifQL.select(\"hello\"),\n            .psql(\"SELECT 'hello'\"),\n            .mysql(\"SELECT 'hello'\")\n        )\n    }\n    \n//    @Test(\"Test Select UUID Array\")\n//    func selectUUIDArray() {\n//        check(\n//            SwifQL ||> [PostgresArray(UUID(uuidString: \"00000000-0000-0000-0000-000000000001\"))],\n//            .psql(\"SELECT 'hello'\"),\n//            .mysql(\"SELECT 'hello'\")\n//        )\n//    }\n    \n    @Test(\"Test Select Int\")\n    func selectInt() {\n        check(\n            SwifQL.select(1),\n            .psql(\"SELECT 1\"),\n            .mysql(\"SELECT 1\")\n        )\n    }\n    \n    @Test(\"Test Select Double\")\n    func selectDouble() {\n        check(\n            SwifQL.select(1.234),\n            .psql(\"SELECT 1.234\"),\n            .mysql(\"SELECT 1.234\")\n        )\n    }\n\n    @Test(\"Test Select Date\")\n    func selectData() {\n        let base64 = \"Aa+/0w==\"\n        let data = Data(base64Encoded: base64)!\n        check(\n            SwifQL.select(data),\n            .psql(\"SELECT decode('\\(base64)', 'base64')\")\n        )\n    }\n    \n    @Test(\"Test Select Several Simple Values\")\n    func selectSeveralSimpleValues() {\n        check(\n            SwifQL.select(\"hello\", 1, 1.234),\n            .psql(\"SELECT 'hello', 1, 1.234\"),\n            .mysql(\"SELECT 'hello', 1, 1.234\")\n        )\n    }\n    \n    @Test(\"Test Select Column Path\")\n    func selectColumn_path() {\n        check(\n            SwifQL.select(Path.Column(\"id\")),\n            .psql(#\"SELECT \"id\"\"#),\n            .mysql(\"SELECT id\")\n        )\n    }\n    \n    @Test(\"Test Select Column KeyPath\")\n    func selectColumn_keyPath() {\n        check(\n            SwifQL.select(\\CarBrands.$id),\n            .psql(#\"SELECT \"CarBrands\".\"id\"\"#),\n            .mysql(\"SELECT CarBrands.id\")\n        )\n    }\n    \n    @Test(\"Test Select Column KeyPath Alias Simple\")\n    func selectColumn_keyPath_alias_simple() {\n        check(\n            SwifQL.select(\\CarBrands.$id => \"ident\"),\n            .psql(#\"SELECT \"CarBrands\".\"id\" as \"ident\"\"#),\n            .mysql(\"SELECT CarBrands.id as ident\")\n        )\n    }\n    \n    @Test(\"Test Select Column KeyPath Alias KeyPath\")\n    func selectColumn_keyPath_alias_keyPath() {\n        struct Result: Aliasable {\n            @Alias(\"ident\") var abc: UUID\n            init () {}\n        }\n        check(\n            SwifQL.select(\\CarBrands.$id => \\Result.$abc),\n            .psql(#\"SELECT \"CarBrands\".\"id\" as \"ident\"\"#),\n            .mysql(\"SELECT CarBrands.id as ident\")\n        )\n    }\n    \n    @Test(\"Test Select Column With Table\")\n    func selectColumnWithTable() {\n        check(\n            SwifQL.select(Path.Table(\"CarBrands\").column(\"id\")),\n            .psql(#\"SELECT \"CarBrands\".\"id\"\"#),\n            .mysql(\"SELECT CarBrands.id\")\n        )\n    }\n    \n    @Test(\"Test Select Column With Table And Schema\")\n    func selectColumnWithTableAndSchema() {\n        check(\n            SwifQL.select(Path.Schema(\"test\").table(\"CarBrands\").column(\"id\")),\n            .psql(#\"SELECT \"test\".\"CarBrands\".\"id\"\"#),\n            .mysql(\"SELECT test.CarBrands.id\")\n        )\n    }\n    \n    @Test(\"Test Select Column Without Table\")\n    func selectColumnWithoutTable() {\n        check(\n            SwifQL.select(Path.Column(\"id\")),\n            .psql(#\"SELECT \"id\"\"#),\n            .mysql(\"SELECT id\")\n        )\n    }\n    \n    @Test(\"Test Generic Selector All\")\n    func genericSelector_all() {\n        check(\n            CarBrands.select,\n            .psql(#\"SELECT \"CarBrands\".* FROM \"CarBrands\"\"#),\n            .mysql(\"SELECT CarBrands.* FROM CarBrands\")\n        )\n    }\n    \n    @Test(\"Select CarBrands\")\n    func selectCarBrands() {\n        check(\n            SwifQL.select(CarBrands.column(\"id\")),\n            .psql(#\"SELECT \"CarBrands\".\"id\"\"#),\n            .mysql(\"SELECT CarBrands.id\")\n        )\n    }\n    \n    @Test(\"Select Schemable CarBrands\")\n    func selectSchemableCarBrands() {\n        check(\n            SwifQL.select(SchemableCarBrands.column(\"id\")),\n            .psql(#\"SELECT \"public\".\"CarBrands\".\"id\"\"#),\n            .mysql(\"SELECT public.CarBrands.id\")\n        )\n    }\n    \n    @Test(\"Select CarBrands in Customer Schema\")\n    func selectCarBrandsInCustomSchema() {\n        let cb = Schema<CarBrands>(\"hello\")\n        check(\n            SwifQL.select(cb.column(\"id\")),\n            .psql(#\"SELECT \"hello\".\"CarBrands\".\"id\"\"#),\n            .mysql(\"SELECT hello.CarBrands.id\")\n        )\n    }\n    \n    @Test(\"Select CarBrands Several Fields\")\n    func selectCarBrandsSeveralFields() {\n        check(\n            SwifQL.select(CarBrands.column(\"id\"), CarBrands.column(\"name\")),\n            .psql(#\"SELECT \"CarBrands\".\"id\", \"CarBrands\".\"name\"\"#),\n            .mysql(\"SELECT CarBrands.id, CarBrands.name\")\n        )\n    }\n    \n    @Test(\"Select CarBrands With Alias\")\n    func selectCarBrandsWithAlias() {\n        check(\n            SwifQL.select(cb.column(\"id\")),\n            .psql(#\"SELECT \"cb\".\"id\"\"#),\n            .mysql(\"SELECT cb.id\")\n        )\n    }\n    \n    @Test(\"Select CarBrands With Alias Several Fields\")\n    func selectCarBrandsWithAliasSeveralFields() {\n        check(\n            SwifQL.select(cb.column(\"id\"), cb.column(\"name\")),\n            .psql(#\"SELECT \"cb\".\"id\", \"cb\".\"name\"\"#),\n            .mysql(\"SELECT cb.id, cb.name\")\n        )\n    }\n    \n    @Test(\"Select CarBrands Several Fields Mixed\")\n    func selectCarBrandsSeveralFieldsMixed() {\n        check(\n            SwifQL.select(CarBrands.column(\"id\"), cb.column(\"name\"), CarBrands.column(\"createdAt\")),\n            .psql(#\"SELECT \"CarBrands\".\"id\", \"cb\".\"name\", \"CarBrands\".\"createdAt\"\"#),\n            .mysql(\"SELECT CarBrands.id, cb.name, CarBrands.createdAt\")\n        )\n    }\n    \n    //MARK: PostgreSQL Functions\n    \n    @Test(\"Select abs\")\n    func selectFnAbs() {\n        check(\n            SwifQL.select(Fn.abs(1)),\n            .psql(\"SELECT abs(1)\"),\n            .mysql(\"SELECT abs(1)\")\n        )\n    }\n    \n    @Test(\"Select avg\")\n    func selectFnAvg() {\n        check(\n            SwifQL.select(Fn.avg(1)),\n            .psql(\"SELECT avg(1)\"),\n            .mysql(\"SELECT avg(1)\")\n        )\n    }\n    \n    @Test(\"Select bit_length\")\n    func selectFnBitLength() {\n        check(\n            SwifQL.select(Fn.bit_length(\"hello\")),\n            .psql(\"SELECT bit_length('hello')\"),\n            .mysql(\"SELECT bit_length('hello')\")\n        )\n    }\n    \n    @Test(\"Select btrim\")\n    func selectFnBtrim() {\n        check(\n            SwifQL.select(Fn.btrim(\"hello\", \"ll\")),\n            .psql(\"SELECT btrim('hello', 'll')\"),\n            .mysql(\"SELECT btrim('hello', 'll')\")\n        )\n    }\n    \n    @Test(\"Select ceil\")\n    func selectFnCeil() {\n        check(\n            SwifQL.select(Fn.ceil(1.5)),\n            .psql(\"SELECT ceil(1.5)\"),\n            .mysql(\"SELECT ceil(1.5)\")\n        )\n    }\n    \n    @Test(\"Select ceiling\")\n    func selectFnCeiling() {\n        check(\n            SwifQL.select(Fn.ceiling(1.5)),\n            .psql(\"SELECT ceiling(1.5)\"),\n            .mysql(\"SELECT ceiling(1.5)\")\n        )\n    }\n    \n    @Test(\"Select char_length\")\n    func selectFnCharLength() {\n        check(\n            SwifQL.select(Fn.char_length(\"hello\")),\n            .psql(\"SELECT char_length('hello')\"),\n            .mysql(\"SELECT char_length('hello')\")\n        )\n    }\n    \n    @Test(\"Select character_length\")\n    func selectFnCharacter_length() {\n        check(\n            SwifQL.select(Fn.character_length(\"hello\")),\n            .psql(\"SELECT character_length('hello')\"),\n            .mysql(\"SELECT character_length('hello')\")\n        )\n    }\n    \n    @Test(\"Select initcap\")\n    func selectFnInitcap() {\n        check(\n            SwifQL.select(Fn.initcap(\"hello\")),\n            .psql(\"SELECT initcap('hello')\"),\n            .mysql(\"SELECT initcap('hello')\")\n        )\n    }\n    \n    @Test(\"Select length\")\n    func selectFnLength() {\n        check(\n            SwifQL.select(Fn.length(\"hello\")),\n            .psql(\"SELECT length('hello')\"),\n            .mysql(\"SELECT length('hello')\")\n        )\n    }\n    \n    @Test(\"Select lower\")\n    func selectFnLower() {\n        check(\n            SwifQL.select(Fn.lower(\"hello\")),\n            .psql(\"SELECT lower('hello')\"),\n            .mysql(\"SELECT lower('hello')\")\n        )\n    }\n    \n    @Test(\"Select lpad\")\n    func selectFnLpad() {\n        check(\n            SwifQL.select(Fn.lpad(\"hello\", 3, \"lo\")),\n            .psql(\"SELECT lpad('hello', 3, 'lo')\"),\n            .mysql(\"SELECT lpad('hello', 3, 'lo')\")\n        )\n    }\n    \n    @Test(\"Select ltrim\")\n    func selectFnLtrim() {\n        check(\n            SwifQL.select(Fn.ltrim(\"hello\", \"he\")),\n            .psql(\"SELECT ltrim('hello', 'he')\"),\n            .mysql(\"SELECT ltrim('hello', 'he')\")\n        )\n    }\n    \n    @Test(\"Select position\")\n    func selectFnPosition() {\n        check(\n            SwifQL.select(Fn.position(\"el\", in: \"hello\")),\n            .psql(\"SELECT position('el' IN 'hello')\"),\n            .mysql(\"SELECT position('el' IN 'hello')\")\n        )\n    }\n    \n    @Test(\"Select repeat\")\n    func selectFnRepeat() {\n        check(\n            SwifQL.select(Fn.repeat(\"hello\", 2)),\n            .psql(\"SELECT repeat('hello', 2)\"),\n            .mysql(\"SELECT repeat('hello', 2)\")\n        )\n    }\n    \n    @Test(\"Select replace\")\n    func selectFnReplace() {\n        check(\n            SwifQL.select(Fn.replace(\"hello\", \"el\", \"ol\")),\n            .psql(\"SELECT replace('hello', 'el', 'ol')\"),\n            .mysql(\"SELECT replace('hello', 'el', 'ol')\")\n        )\n    }\n    \n    @Test(\"Select rpad\")\n    func selectFnRpad() {\n        check(\n            SwifQL.select(Fn.rpad(\"hello\", 2, \"ho\")),\n            .psql(\"SELECT rpad('hello', 2, 'ho')\"),\n            .mysql(\"SELECT rpad('hello', 2, 'ho')\")\n        )\n    }\n    \n    @Test(\"Select rtrim\")\n    func selectFnRtrim() {\n        check(\n            SwifQL.select(Fn.rtrim(\" hello \", \" \")),\n            .psql(\"SELECT rtrim(' hello ', ' ')\"),\n            .mysql(\"SELECT rtrim(' hello ', ' ')\")\n        )\n    }\n    \n    @Test(\"Select strpos\")\n    func selectFnStrpos() {\n        check(\n            SwifQL.select(Fn.strpos(\"hello\", \"ll\")),\n            .psql(\"SELECT strpos('hello', 'll')\"),\n            .mysql(\"SELECT strpos('hello', 'll')\")\n        )\n    }\n    \n    @Test(\"Select substring\")\n    func selectFnSubstring() {\n        check(\n            SwifQL.select(Fn.substring(\"hello\", from: 1)),\n            .psql(\"SELECT substring('hello' FROM 1)\"),\n            .mysql(\"SELECT substring('hello' FROM 1)\")\n        )\n        check(\n            SwifQL.select(Fn.substring(\"hello\", for: 4)),\n            .psql(\"SELECT substring('hello' FOR 4)\"),\n            .mysql(\"SELECT substring('hello' FOR 4)\")\n        )\n        check(\n            SwifQL.select(Fn.substring(\"hello\", from: 1, for: 4)),\n            .psql(\"SELECT substring('hello' FROM 1 FOR 4)\"),\n            .mysql(\"SELECT substring('hello' FROM 1 FOR 4)\")\n        )\n    }\n    \n    @Test(\"Select translate\")\n    func selectFnTranslate() {\n        check(\n            SwifQL.select(Fn.translate(\"hola\", \"hola\", \"hello\")),\n            .psql(\"SELECT translate('hola', 'hola', 'hello')\"),\n            .mysql(\"SELECT translate('hola', 'hola', 'hello')\")\n        )\n    }\n    \n    @Test(\"Select ltrim\")\n    func selectFnLTrim() {\n        check(\n            SwifQL.select(Fn.ltrim(\"hello\", \"he\")),\n            .psql(\"SELECT ltrim('hello', 'he')\"),\n            .mysql(\"SELECT ltrim('hello', 'he')\")\n        )\n    }\n    \n    @Test(\"Select upper\")\n    func selectFnUpper() {\n        check(\n            SwifQL.select(Fn.upper(\"hello\")),\n            .psql(\"SELECT upper('hello')\"),\n            .mysql(\"SELECT upper('hello')\")\n        )\n    }\n    \n    @Test(\"Select count\")\n    func selectFnCount() {\n        check(\n            SwifQL.select(Fn.count(CarBrands.column(\"id\"))),\n            .psql(#\"SELECT count(\"CarBrands\".\"id\")\"#),\n            .mysql(\"SELECT count(CarBrands.id)\")\n        )\n        check(\n            SwifQL.select(Fn.count(cb.column(\"id\"))),\n            .psql(#\"SELECT count(\"cb\".\"id\")\"#),\n            .mysql(\"SELECT count(cb.id)\")\n        )\n    }\n    \n    @Test(\"Select div\")\n    func selectFnDiv() {\n        check(\n            SwifQL.select(Fn.div(12, 4)),\n            .psql(\"SELECT div(12, 4)\"),\n            .mysql(\"SELECT div(12, 4)\")\n        )\n    }\n    \n    @Test(\"Select exp\")\n    func selectFnExp() {\n        check(\n            SwifQL.select(Fn.exp(12, 4)),\n            .psql(\"SELECT exp(12, 4)\"),\n            .mysql(\"SELECT exp(12, 4)\")\n        )\n    }\n    \n    @Test(\"Select floor\")\n    func selectFnFloor() {\n        check(\n            SwifQL.select(Fn.floor(12)),\n            .psql(\"SELECT floor(12)\"),\n            .mysql(\"SELECT floor(12)\")\n        )\n    }\n    \n    @Test(\"Select max\")\n    func selectFnMax() {\n        check(\n            SwifQL.select(Fn.max(CarBrands.column(\"id\"))),\n            .psql(#\"SELECT max(\"CarBrands\".\"id\")\"#),\n            .mysql(\"SELECT max(CarBrands.id)\")\n        )\n        check(\n            SwifQL.select(Fn.max(cb.column(\"id\"))),\n            .psql(#\"SELECT max(\"cb\".\"id\")\"#),\n            .mysql(\"SELECT max(cb.id)\")\n        )\n    }\n    \n    @Test(\"Select min\")\n    func selectFnMin() {\n        check(\n            SwifQL.select(Fn.min(CarBrands.column(\"id\"))),\n            .psql(#\"SELECT min(\"CarBrands\".\"id\")\"#),\n            .mysql(\"SELECT min(CarBrands.id)\")\n        )\n        check(\n            SwifQL.select(Fn.min(cb.column(\"id\"))),\n            .psql(#\"SELECT min(\"cb\".\"id\")\"#),\n            .mysql(\"SELECT min(cb.id)\")\n        )\n    }\n    \n    @Test(\"Select mod\")\n    func selectFnMod() {\n        check(\n            SwifQL.select(Fn.mod(12, 4)),\n            .psql(\"SELECT mod(12, 4)\"),\n            .mysql(\"SELECT mod(12, 4)\")\n        )\n    }\n    \n    @Test(\"Select power\")\n    func selectFnPower() {\n        check(\n            SwifQL.select(Fn.power(12, 4)),\n            .psql(\"SELECT power(12, 4)\"),\n            .mysql(\"SELECT power(12, 4)\")\n        )\n    }\n    \n    @Test(\"Select random\")\n    func selectFnRandom() {\n        check(\n            SwifQL.select(Fn.random()),\n            .psql(\"SELECT random()\"),\n            .mysql(\"SELECT random()\")\n        )\n    }\n    \n    @Test(\"Select round\")\n    func selectFnRound() {\n        check(\n            SwifQL.select(Fn.round(12.43)),\n            .psql(\"SELECT round(12.43)\"),\n            .mysql(\"SELECT round(12.43)\")\n        )\n        check(\n            SwifQL.select(Fn.round(12.43, 1)),\n            .psql(\"SELECT round(12.43, 1)\"),\n            .mysql(\"SELECT round(12.43, 1)\")\n        )\n    }\n    \n    @Test(\"Select setseed\")\n    func selectFnSetSeed() {\n        check(\n            SwifQL.select(Fn.setseed(12)),\n            .psql(\"SELECT setseed(12)\"),\n            .mysql(\"SELECT setseed(12)\")\n        )\n    }\n    \n    @Test(\"Select sign\")\n    func selectFnSign() {\n        check(\n            SwifQL.select(Fn.sign(12)),\n            .psql(\"SELECT sign(12)\"),\n            .mysql(\"SELECT sign(12)\")\n        )\n    }\n    \n    @Test(\"Select sqrt\")\n    func selectFnSqrt() {\n        check(\n            SwifQL.select(Fn.sqrt(16)),\n            .psql(\"SELECT sqrt(16)\"),\n            .mysql(\"SELECT sqrt(16)\")\n        )\n    }\n    \n    @Test(\"Select sum\")\n    func selectFnSum() {\n        check(\n            SwifQL.select(Fn.sum(CarBrands.column(\"id\"))),\n            .psql(#\"SELECT sum(\"CarBrands\".\"id\")\"#),\n            .mysql(\"SELECT sum(CarBrands.id)\")\n        )\n        check(\n            SwifQL.select(Fn.sum(cb.column(\"id\"))),\n            .psql(#\"SELECT sum(\"cb\".\"id\")\"#),\n            .mysql(\"SELECT sum(cb.id)\")\n        )\n    }\n\n    @Test(\"Select string_agg\")\n    func selectFnStringAgg() {\n        check(\n            SwifQL.select(Fn.string_agg(CarBrands.column(\"name\"), \", \")),\n            .psql(#\"SELECT string_agg(\"CarBrands\".\"name\", ', ')\"#),\n            .mysql(\"SELECT string_agg(CarBrands.name, ', ')\")\n        )\n    }\n\n    @Test(\"Select regexp_replace\")\n    func selectFnRegexpReplace() {\n        check(\n            SwifQL.select(Fn.regexp_replace(\"/full/path/to/filename\", \"^.+/\", \"\")),\n            .psql(#\"SELECT regexp_replace('/full/path/to/filename', '^.+/', '')\"#),\n            .mysql(\"SELECT regexp_replace('/full/path/to/filename', '^.+/', '')\")\n        )\n    }\n    \n    // MARK: - SELECT with alias in select params\n    \n    @Test(\"Select With Alias In Select Params\")\n    func selectWithAliasInSelectParams() {\n        check(\n            SwifQL.select(\"hello\", =>\"aaa\").from(|SwifQL.select(CarBrands.column(\"name\")).from(CarBrands.table))| => \"aaa\",\n            .psql(#\"SELECT 'hello', \"aaa\" FROM (SELECT \"CarBrands\".\"name\" FROM \"CarBrands\") as \"aaa\"\"#),\n            .mysql(\"SELECT 'hello', aaa FROM (SELECT CarBrands.name FROM CarBrands) as aaa\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/SubqueryTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Subquery Tests\")\nstruct SubqueryTests: SwifQLTests {\n    // MARK: - SUBQUERY WITH ALIAS\n    \n    @Test(\"Test Subquery With Alias\")\n    func subqueryWithAlias() {\n        let a = CarBrands.as(\"a\")\n        let b = CarBrands.as(\"b\")\n        // WRONG EXAMPLE because of `|` postfix operator near `alias1`\n//        let query = SwifQL.select(\n//            a~\\.name,\n//            |SwifQL.select(Fn.json_agg(=>\"alias1\") => \"test1\" )\n//                .from(\n//                    |SwifQL.select(b~\\.name => \"someName\")\n//                        .from(b.table)\n//                        .where(b~\\.id == a~\\.id)|\n//                ) => \"alias1\"|\n//            )\n//            .from(a.table)\n        // RIGHT EXAMPLE\n        // so use subquery inside brackets or even better move it into variable (it'd be more beautiful and easy to support)\n        check(\n            SwifQL\n                .select(\n                    a.column(\"name\"),\n                    |(SwifQL.select(Fn.json_agg(=>\"alias1\") => \"test1\")\n                        .from(\n                            |SwifQL.select(b.column(\"name\") => \"someName\")\n                                .from(b.table)\n                                .where(b.column(\"id\") == a.column(\"id\"))|\n                        ) => \"alias1\")|\n                )\n                .from(a.table),\n            .psql(#\"SELECT \"a\".\"name\", (SELECT json_agg(\"alias1\") as \"test1\" FROM (SELECT \"b\".\"name\" as \"someName\" FROM \"CarBrands\" AS \"b\" WHERE \"b\".\"id\" = \"a\".\"id\") as \"alias1\") FROM \"CarBrands\" AS \"a\"\"#),\n            .mysql(\"SELECT a.name, (SELECT json_agg(alias1) as test1 FROM (SELECT b.name as someName FROM CarBrands AS b WHERE b.id = a.id) as alias1) FROM CarBrands AS a\")\n        )\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/SwifQLTestCase.swift",
    "content": "import XCTest\n@testable import SwifQL\n\nprotocol SwifQLTests {}\nextension SwifQLTests {\n    func check(_ query: SwifQLable, _ dialects: QueryWithDialect...) {\n        dialects.forEach {\n            XCTAssertEqual(query.prepare($0.dialect).plain, $0.plainQuery)\n            if let bindedQuery = $0.bindedQuery {\n                let prepared = query.prepare($0.dialect)\n                let splitted = prepared.splitted\n                XCTAssertEqual(splitted.query, bindedQuery)\n            }\n        }\n    }\n    \n    func check(_ query: SwifQLable, all rawQuery: String) {\n        SQLDialect.all.forEach {\n            XCTAssertEqual(query.prepare($0).plain, rawQuery)\n        }\n    }\n}\n\nstruct DeletedSchema: Schemable {\n    static var schemaName: String { \"deleted\" }\n}\n\nenum GearboxType: String, SwifQLEnum {\n    case manual, auto, cvt\n}\n\nstruct SchemableCarBrands: Table, Schemable {\n    static var tableName: String { \"CarBrands\" }\n    \n    @Column(\"id\")\n    var id: UUID\n    @Column(\"name\")\n    var name: String\n    @Column(\"createdAt\")\n    var createdAt: Date\n    \n    init() {}\n}\n\nstruct CarBrands: Table {\n    @Column(\"id\")\n    var id: UUID\n    @Column(\"name\")\n    var name: String\n    @Column(\"createdAt\")\n    var createdAt: Date\n    \n    init() {}\n}\n\nstruct CarBrandReferences: Table {\n    @Column(\"id\")\n    var id: UUID\n    @Column(\"model\")\n    var model: String\n    @Column(\"available\")\n    var available: Bool\n    @Column(\"score\")\n    var score: Int\n    @Column(\"mainGers\")\n    var mainGers: GearboxType\n    @Column(\"availableGers\")\n    var availableGers: [GearboxType]\n    @Column(\"availableYears\")\n    var availableYears: [Int]\n    @Column(\"knowedIssues\")\n    var knowedIssues: [UUID]\n    @Column(\"tags\")\n    var tags: [String]\n    \n    init() {}\n}\n\nlet cb = CarBrands.as(\"cb\")\n\nstruct QueryWithDialect {\n    let dialect: SQLDialect\n    let plainQuery: String\n    let bindedQuery: String?\n    \n    static func psql(_ plainQuery: String, _ bindedQuery: String? = nil) -> Self {\n        .init(dialect: .psql, plainQuery: plainQuery, bindedQuery: bindedQuery)\n    }\n    \n    static func mysql(_ plainQuery: String, _ bindedQuery: String? = nil) -> Self {\n        .init(dialect: .mysql, plainQuery: plainQuery, bindedQuery: bindedQuery)\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/TableEncoding.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"Table Encoding Tests\")\nstruct TableEncodingTests: SwifQLTests {\n    @Test(\"Test Pure\")\n    func pure() {\n        guard let encodedData = try? JSONEncoder().encode(PureTable()) else {\n            XCTFail(\"Unable to encode PureTable\")\n            return\n        }\n        guard let _ = try? JSONDecoder().decode(PureStruct.self, from: encodedData) else {\n            XCTFail(\"Unable to decode PureTable into PureStruct\")\n            return\n        }\n    }\n    \n    @Test(\"Test With Optional Column\")\n    func withOptionalColumn() {\n        #if swift(>=5.4)\n        XCTAssertNil(TableWithOptionalColumn().firstName)\n        #endif\n    }\n    \n    @Test(\"Test With KeyPaths\")\n    func withKeyPaths() {\n        guard let encodedData = try? JSONEncoder().encode(KeyPathTable()) else {\n            XCTFail(\"Unable to encode PureTable\")\n            return\n        }\n        guard let _ = try? JSONDecoder().decode(KeyPathStruct.self, from: encodedData) else {\n            XCTFail(\"Unable to decode KeyPathTable into KeyPathStruct\")\n            return\n        }\n    }\n}\n\nfileprivate struct PureStruct: Codable {\n    let id: UUID\n    let first_name: String\n}\n\nfileprivate final class PureTable: Table {\n    @Column(\"id\")\n    var id: UUID\n    \n    @Column(\"first_name\")\n    var firstName: String\n\n    init () {\n        id = UUID()\n        firstName = \"\"\n    }\n}\n\nfileprivate final class TableWithOptionalColumn: Table {\n    @Column(\"first_name\")\n    var firstName: String?\n\n    init () {}\n}\n\nfileprivate struct KeyPathStruct: Codable {\n    let id: UUID\n    let firstName: String\n}\n\nfileprivate final class KeyPathTable: Table, KeyPathEncodable {\n    @Column(\"id\")\n    var id: UUID\n    \n    @Column(\"first_name\")\n    var firstName: String\n\n    init () {\n        id = UUID()\n        firstName = \"\"\n    }\n}\n"
  },
  {
    "path": "Tests/SwifQLTests/WithTests.swift",
    "content": "@testable import SwifQL\nimport Testing\nimport XCTest\n\n@Suite(\"With Tests\")\nstruct WithTests: SwifQLTests {\n    @Test(\"Test With\")\n    func with() {\n        check(\n            SwifQL\n                .with(.init(Path.Table(\"Table1\"), SwifQL.select(Path.Table(\"Table2\").*).from(Path.Table(\"Table2\"))))\n                .select(Path.Table(\"Table1\").*)\n                .from(Path.Table(\"Table1\")),\n            .psql(#\"WITH \"Table1\" as (SELECT \"Table2\".* FROM \"Table2\") SELECT \"Table1\".* FROM \"Table1\"\"#),\n            .mysql(\"WITH Table1 as (SELECT Table2.* FROM Table2) SELECT Table1.* FROM Table1\")\n        )\n    }\n    \n    @Test(\"Test With Columns\")\n    func withColumns() {\n        struct Table1: Table { init() {} }\n        check(\n            SwifQL\n                .with(\n                    .init(Table1.table, SwifQL.select(Table1.table.*).from(Table1.table)),\n                    .init(Path.Table(\"Table2\"), columns: [Path.Column(\"hi\"), Path.Column(\"there\")], SwifQL.select(Path.Table(\"Table2\").*).from(Path.Table(\"Table2\")))\n                )\n                .select(Path.Table(\"Table3\").*)\n                .from(Path.Table(\"Table3\")),\n            .psql(#\"WITH \"Table1\" as (SELECT \"Table1\".* FROM \"Table1\"), \"Table2\" (\"hi\", \"there\") as (SELECT \"Table2\".* FROM \"Table2\") SELECT \"Table3\".* FROM \"Table3\"\"#),\n            .mysql(\"WITH Table1 as (SELECT Table1.* FROM Table1), Table2 (hi, there) as (SELECT Table2.* FROM Table2) SELECT Table3.* FROM Table3\")\n        )\n    }\n}\n"
  }
]