Skip to content

Commit 3a6b658

Browse files
committed
Namespace queries
1 parent 9de35a2 commit 3a6b658

File tree

11 files changed

+333
-183
lines changed

11 files changed

+333
-183
lines changed

Sources/Compiler/Compiler.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public struct Compiler {
99
public private(set) var schema = Schema()
10-
public private(set) var queries: [Statement] = []
10+
public private(set) var queries: [Namespace: [Statement]] = [:]
1111
public private(set) var migrations: [Statement] = []
1212
public private(set) var diagnostics: [Namespace: Diagnostics] = [:]
1313

@@ -16,6 +16,11 @@ public struct Compiler {
1616
public enum Namespace: Hashable {
1717
case global
1818
case file(String)
19+
20+
public var file: String? {
21+
guard case .file(let name) = self else { return nil }
22+
return name
23+
}
1924
}
2025

2126
public init() {}
@@ -41,7 +46,7 @@ public struct Compiler {
4146
validator: IsValidForQueries(),
4247
context: "queries"
4348
)
44-
self.queries.append(contentsOf: stmts)
49+
self.queries[namespace, default: []].append(contentsOf: stmts)
4550
self.diagnostics[namespace] = diagnostics
4651
return diagnostics
4752
}
@@ -74,7 +79,7 @@ public struct Compiler {
7479
)
7580
)
7681

77-
self.queries.append(stmtWithDef)
82+
self.queries[namespace, default: []].append(stmtWithDef)
7883
self.diagnostics[namespace] = diagnostics
7984
return diagnostics
8085
}

Sources/Compiler/Gen/Language.swift

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ import SwiftSyntax
1010
import SwiftSyntaxBuilder
1111

1212
public protocol Language {
13+
static func queryTypeName(input: String, output: String) -> String
14+
15+
static func inputTypeName(input: BuiltinOrGenerated?) -> String
16+
17+
static func outputTypeName(
18+
output: BuiltinOrGenerated?,
19+
cardinality: Cardinality
20+
) -> String
21+
1322
/// Returns the Language builtin for the given SQL type
1423
static func builtinType(for type: Type) -> String
1524

@@ -19,7 +28,7 @@ public protocol Language {
1928
databaseName: String,
2029
migrations: [String],
2130
tables: [GeneratedModel],
22-
queries: [GeneratedQuery],
31+
queries: [(String?, [GeneratedQuery])],
2332
options: GenerationOptions
2433
) throws -> String
2534

@@ -39,7 +48,7 @@ extension Language {
3948
imports: [String],
4049
databaseName: String,
4150
migrations: [String],
42-
queries: [Statement],
51+
queries: [(String?, [Statement])],
4352
schema: Schema,
4453
options: GenerationOptions
4554
) throws -> String {
@@ -56,14 +65,14 @@ extension Language {
5665
}
5766

5867
public static func assemble(
59-
queries: [Statement],
68+
queries: [(String?, [Statement])],
6069
schema: Schema
6170
) throws -> (
6271
tables: [GeneratedModel],
63-
queries: [GeneratedQuery]
72+
queries: [(String?, [GeneratedQuery])]
6473
) {
6574
let tables = schema.mapValues(model(for:))
66-
let queries = queries.map { query(for: $0, tables: tables) }
75+
let queries = queries.map { ($0.map { "\($0)Queries" }, $1.map{ query(for: $0, tables: tables) }) }
6776
return (Array(tables.values), queries)
6877
}
6978

@@ -91,10 +100,18 @@ extension Language {
91100
}
92101
}.joined()
93102

103+
let inputTypeName = inputTypeName(input: input)
104+
let outputTypeName = outputTypeName(output: output, cardinality: statement.outputCardinality)
105+
94106
return GeneratedQuery(
95-
name: "\(definition.name)Query",
107+
name: definition.name.description,
108+
variableName: definition.name.lowercaseFirst,
109+
typeName: queryTypeName(input: inputTypeName, output: outputTypeName),
110+
typealiasName: "\(definition.name.capitalizedFirst)Query",
96111
input: input,
112+
inputName: inputTypeName,
97113
output: output,
114+
outputName: outputTypeName,
98115
outputCardinality: statement.outputCardinality,
99116
sourceSql: sql,
100117
isReadOnly: statement.isReadOnly,
@@ -230,9 +247,7 @@ extension Language {
230247

231248
public typealias GenerationOptions = Set<GenerationOption>
232249

233-
public enum GenerationOption: Hashable {
234-
case namespaceGeneratedModels
235-
}
250+
public enum GenerationOption: Hashable {}
236251

237252
public struct GeneratedModel {
238253
let name: String
@@ -261,8 +276,13 @@ public struct GeneratedField {
261276

262277
public struct GeneratedQuery {
263278
let name: String
279+
let variableName: String
280+
let typeName: String
281+
let typealiasName: String
264282
let input: BuiltinOrGenerated?
283+
let inputName: String
265284
let output: BuiltinOrGenerated?
285+
let outputName: String
266286
let outputCardinality: Cardinality
267287
let sourceSql: String
268288
let isReadOnly: Bool

Sources/Compiler/Gen/PositionalSequence.swift

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,18 @@
66
//
77

88
struct PositionalSequence<Base: Collection>: Sequence {
9-
typealias Element = (Position?, Base.Element)
9+
typealias Element = (Position, Base.Element)
1010

1111
let base: Base
1212

13-
enum Position {
14-
case first
15-
case last
13+
struct Position: OptionSet {
14+
let rawValue: UInt8
15+
16+
static var first: Position { Position(rawValue: 1 << 0) }
17+
static var last: Position { Position(rawValue: 1 << 1) }
18+
19+
var isFirst: Bool { contains(.first) }
20+
var isLast: Bool { contains(.last) }
1621
}
1722

1823
func makeIterator() -> Iterator {
@@ -28,14 +33,17 @@ struct PositionalSequence<Base: Collection>: Sequence {
2833

2934
mutating func next() -> Element? {
3035
guard let (offset, element) = base.next() else { return nil }
36+
var position: Position = []
3137

3238
if offset == 0 {
33-
return (.first, element)
34-
} else if offset == count - 1 {
35-
return (.last, element)
36-
} else {
37-
return (nil, element)
39+
position.insert(.first)
3840
}
41+
42+
if offset == count - 1 {
43+
position.insert(.last)
44+
}
45+
46+
return (position, element)
3947
}
4048
}
4149
}

0 commit comments

Comments
 (0)