From d1f980b3e604584a4bdabf232db5ba9bc8910d98 Mon Sep 17 00:00:00 2001 From: Tanner Nelson Date: Tue, 30 Apr 2019 15:00:16 -0400 Subject: [PATCH] fluentkit updates --- .../FluentPostgresDriver/Postgres+Fluent.swift | 18 ++++++++++++++++-- .../PostgresDataDecoder.swift | 7 ++++++- .../PostgresDatabase.swift | 2 +- .../FluentTests.swift | 12 ++++++------ .../XCTestManifests.swift | 4 ++-- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Sources/FluentPostgresDriver/Postgres+Fluent.swift b/Sources/FluentPostgresDriver/Postgres+Fluent.swift index 28246e5..05bd153 100644 --- a/Sources/FluentPostgresDriver/Postgres+Fluent.swift +++ b/Sources/FluentPostgresDriver/Postgres+Fluent.swift @@ -69,8 +69,12 @@ extension PostgresConnection: Database { sql = PostgresReturning(sql) default: break } - return self.sqlQuery(sql) { row in - try onOutput(row.fluentOutput) + var serializer = SQLSerializer(dialect: PostgresDialect()) + sql.serialize(to: &serializer) + return try! self.query(serializer.sql, serializer.binds.map { encodable in + return try PostgresDataEncoder().encode(encodable) + }) { row in + try onOutput(row) } } @@ -81,6 +85,16 @@ extension PostgresConnection: Database { } } +extension PostgresRow: DatabaseOutput { + public func contains(field: String) -> Bool { + return self.column(field) != nil + } + + public func decode(field: String, as type: T.Type) throws -> T where T : Decodable { + return try self.decode(column: field, as: T.self) + } +} + private struct PostgresReturning: SQLExpression { let base: SQLExpression init(_ base: SQLExpression) { diff --git a/Sources/FluentPostgresDriver/PostgresDataDecoder.swift b/Sources/FluentPostgresDriver/PostgresDataDecoder.swift index c0b37a8..57b5c41 100644 --- a/Sources/FluentPostgresDriver/PostgresDataDecoder.swift +++ b/Sources/FluentPostgresDriver/PostgresDataDecoder.swift @@ -1,4 +1,5 @@ import Foundation +import NIOPostgres #warning("TODO: move to codable kit") struct DecoderUnwrapper: Decodable { @@ -14,7 +15,11 @@ public struct PostgresDataDecoder { public func decode(_ type: T.Type, from data: PostgresData) throws -> T where T: Decodable { - return try T.init(from: _Decoder(data: data)) + if let convertible = T.self as? PostgresDataCustomConvertible.Type { + return convertible.init(postgresData: data)! as! T + } else { + return try T.init(from: _Decoder(data: data)) + } } #warning("TODO: finish implementing") diff --git a/Sources/FluentPostgresDriver/PostgresDatabase.swift b/Sources/FluentPostgresDriver/PostgresDatabase.swift index 68ff211..21a1048 100644 --- a/Sources/FluentPostgresDriver/PostgresDatabase.swift +++ b/Sources/FluentPostgresDriver/PostgresDatabase.swift @@ -111,7 +111,7 @@ extension PostgresConnection: ConnectionPoolItem { extension PostgresRow: SQLRow { public func decode(column: String, as type: D.Type) throws -> D where D : Decodable { guard let data = self.column(column) else { - fatalError() + fatalError("Column \(column) is missing") } return try PostgresDataDecoder().decode(D.self, from: data) } diff --git a/Tests/FluentPostgresDriverTests/FluentTests.swift b/Tests/FluentPostgresDriverTests/FluentTests.swift index 46351e5..129d142 100644 --- a/Tests/FluentPostgresDriverTests/FluentTests.swift +++ b/Tests/FluentPostgresDriverTests/FluentTests.swift @@ -37,12 +37,8 @@ final class FluentPostgresDriverTests: XCTestCase { try self.benchmarker.testEagerLoadParentJoin() } - func testEagerLoadSubqueryJSONEncode() throws { - try self.benchmarker.testEagerLoadSubqueryJSONEncode() - } - - func testEagerLoadJoinJSONEncode() throws { - try self.benchmarker.testEagerLoadJoinJSONEncode() + func testEagerLoadJSON() throws { + try self.benchmarker.testEagerLoadJSON() } func testMigrator() throws { @@ -88,6 +84,10 @@ final class FluentPostgresDriverTests: XCTestCase { func testUniqueFields() throws { try self.benchmarker.testUniqueFields() } + + func testAsyncCreate() throws { + try self.benchmarker.testAsyncCreate() + } override func setUp() { let eventLoop = MultiThreadedEventLoopGroup(numberOfThreads: 1).next() diff --git a/Tests/FluentPostgresDriverTests/XCTestManifests.swift b/Tests/FluentPostgresDriverTests/XCTestManifests.swift index 0849d3a..bdceca4 100644 --- a/Tests/FluentPostgresDriverTests/XCTestManifests.swift +++ b/Tests/FluentPostgresDriverTests/XCTestManifests.swift @@ -8,16 +8,16 @@ extension FluentPostgresDriverTests { static let __allTests__FluentPostgresDriverTests = [ ("testAggregates", testAggregates), ("testAll", testAll), + ("testAsyncCreate", testAsyncCreate), ("testBatchCreate", testBatchCreate), ("testBatchUpdate", testBatchUpdate), ("testChunkedFetch", testChunkedFetch), ("testCreate", testCreate), ("testDelete", testDelete), ("testEagerLoadChildren", testEagerLoadChildren), - ("testEagerLoadJoinJSONEncode", testEagerLoadJoinJSONEncode), + ("testEagerLoadJSON", testEagerLoadJSON), ("testEagerLoadParent", testEagerLoadParent), ("testEagerLoadParentJoin", testEagerLoadParentJoin), - ("testEagerLoadSubqueryJSONEncode", testEagerLoadSubqueryJSONEncode), ("testIdentifierGeneration", testIdentifierGeneration), ("testJoin", testJoin), ("testMigrator", testMigrator),