1
1
package scalasql .namedtuples
2
2
3
- import scala .NamedTuple .AnyNamedTuple
4
-
5
- import scalasql .query .Table
3
+ import scalasql .core .DbApi .Impl
6
4
import scalasql .core .DialectTypeMappers
5
+ import scalasql .core .Expr
7
6
import scalasql .core .Queryable
8
- import scalasql .query . Column
7
+ import scalasql .core . Queryable . ResultSetIterator
9
8
import scalasql .core .Sc
10
- import scalasql .core .Expr
9
+ import scalasql .dialects .Dialect
10
+ import scalasql .dialects .TableOps
11
+ import scalasql .namedtuples .SimpleTable .Internal .Tombstone
12
+ import scalasql .query .Column
13
+ import scalasql .query .Query
14
+ import scalasql .query .Table
15
+ import scalasql .query .Table .ImplicitMetadata
16
+ import sourcecode .Name
17
+
18
+ import scala .NamedTuple .AnyNamedTuple
19
+ import scala .language .implicitConversions
20
+
21
+ class SimpleTable [C ]()(
22
+ using val name0 : sourcecode.Name ,
23
+ metadata0 : => SimpleTable .Metadata [C ]
24
+ ) extends Table .Base
25
+ with SimpleTable .LowPri [C ] {
26
+
27
+ lazy val metadata : SimpleTable .Metadata [C ] = metadata0
28
+
29
+ override protected [scalasql] def tableName : String = name0.value
30
+
31
+ override protected [scalasql] def schemaName : String = " "
32
+
33
+ override protected [scalasql] def tableLabels : Seq [String ] = {
34
+ metadata.metadata0.walkLabels0()
35
+ }
36
+
37
+ override protected [scalasql] def escape : Boolean = false
11
38
12
- class SimpleTable [C <: SimpleTable .Source ]()(
13
- using name : sourcecode.Name ,
14
- metadata0 : SimpleTable .Metadata [C ]
15
- ) extends Table [SimpleTable .Lift [C ]](using name, metadata0.metadata0) {
16
39
given simpleTableImplicitMetadata : SimpleTable .WrappedMetadata [C ] =
17
- SimpleTable .WrappedMetadata (metadata0)
40
+ SimpleTable .WrappedMetadata (metadata)
41
+
42
+ implicit def containerQr (
43
+ implicit dialect : DialectTypeMappers ,
44
+ f : SimpleTableMacros .Mask [C ]
45
+ ): Queryable .Row [f.Result [Expr ], C ] =
46
+ val tableMetadata = metadata.metadata0
47
+ tableMetadata
48
+ .queryable(
49
+ tableMetadata.walkLabels0,
50
+ dialect,
51
+ new Table .Metadata .QueryableProxy (tableMetadata.queryables(dialect, _))
52
+ )
53
+ .asInstanceOf [Queryable .Row [f.Result [Expr ], C ]]
18
54
}
19
55
20
56
object SimpleTable {
21
57
22
- /**
23
- * Marker class that signals that a data type is convertable to an SQL table row.
24
- * @note this must be a class to convince the match type reducer that it provably can't be mixed
25
- * into various column types such as java.util.Date, geny.Bytes, or scala.Option.
26
- */
27
- abstract class Source
28
-
29
- type Lift [C ] = [T [_]] =>> T [Internal .Tombstone .type ] match {
30
- case Expr [? ] => Record [C , T ]
31
- case _ => C
58
+ trait LowPri [C ] { this : SimpleTable [C ] =>
59
+ implicit def containerQr2 (
60
+ implicit dialect : DialectTypeMappers ,
61
+ f : SimpleTableMacros .Mask [C ]
62
+ ): Queryable .Row [f.Result [Column ], C ] =
63
+ containerQr.asInstanceOf [Queryable .Row [f.Result [Column ], C ]]
32
64
}
33
65
34
- final class Record [C , T [_]](data : IArray [AnyRef ]) extends Selectable :
35
- type Fields = NamedTuple .Map [
36
- NamedTuple .From [C ],
37
- [X ] =>> X match {
38
- case Source => Record [X , T ]
39
- case _ => T [X ]
40
- }
41
- ]
66
+ implicit def TableOpsConv [C : {SimpleTableMacros .Mask as f }](
67
+ t : SimpleTable [C ]
68
+ )(using dialect : Dialect ): TableOps [f.Result ] =
69
+ // assume types in f.Result matches
70
+ val tableMetadata = t.metadata.metadata0.asInstanceOf [Table .Metadata [f.Result ]]
71
+ dialect.TableOpsConv (new Table [f.Result ](using t.name0, tableMetadata) {
72
+ override protected [scalasql] def tableName : String = t.tableName
73
+
74
+ override protected [scalasql] def schemaName : String = t.schemaName
75
+
76
+ override protected [scalasql] def tableLabels : Seq [String ] = t.tableLabels
77
+
78
+ override protected [scalasql] def escape : Boolean = t.escape
79
+ })
80
+
81
+ final class Record [C , Mask <: AnyNamedTuple ](data : IArray [AnyRef ]) extends Selectable :
82
+ type Fields = Mask
42
83
def recordIterator : Iterator [Any ] = data.iterator.asInstanceOf [Iterator [Any ]]
43
84
def apply (i : Int ): AnyRef = data(i)
44
- def updates (fs : ((u : RecordUpdater [C , T ]) => u.Patch )* ): Record [C , T ] =
45
- val u = recordUpdater[C , T ]
85
+ def updates (fs : ((u : RecordUpdater [C , Mask ]) => u.Patch )* ): Record [C , Mask ] =
86
+ val u = recordUpdater[C , Mask ]
46
87
val arr = IArray .genericWrapArray(data).toArray
47
88
fs.foreach: f =>
48
89
val patch = f(u)
@@ -53,17 +94,14 @@ object SimpleTable {
53
94
inline def selectDynamic (name : String ): AnyRef =
54
95
apply(compiletime.constValue[Record .IndexOf [name.type , Record .Names [C ], 0 ]])
55
96
56
- private object RecordUpdaterImpl extends RecordUpdater [Any , [ T ] =>> Any ]
57
- def recordUpdater [C , T [_]] : RecordUpdater [C , T ] =
58
- RecordUpdaterImpl .asInstanceOf [RecordUpdater [C , T ]]
59
- sealed trait RecordUpdater [C , T [_] ] extends Selectable :
97
+ private object RecordUpdaterImpl extends RecordUpdater [Any , AnyNamedTuple ]
98
+ def recordUpdater [C , Mask <: AnyNamedTuple ] : RecordUpdater [C , Mask ] =
99
+ RecordUpdaterImpl .asInstanceOf [RecordUpdater [C , Mask ]]
100
+ sealed trait RecordUpdater [C , Mask <: AnyNamedTuple ] extends Selectable :
60
101
final case class Patch (idx : Int , f : AnyRef => AnyRef )
61
102
type Fields = NamedTuple .Map [
62
- NamedTuple .From [C ],
63
- [X ] =>> X match {
64
- case Source => (Record [X , T ] => Record [X , T ]) => Patch
65
- case _ => (T [X ] => T [X ]) => Patch
66
- }
103
+ Mask ,
104
+ [X ] =>> (X => X ) => Patch
67
105
]
68
106
def apply (i : Int ): (AnyRef => AnyRef ) => Patch =
69
107
f => Patch (i, f)
@@ -78,7 +116,7 @@ object SimpleTable {
78
116
case N *: _ => Acc
79
117
case _ *: t => IndexOf [N , t, S [Acc ]]
80
118
}
81
- def fromIArray (data : IArray [AnyRef ]): Record [Any , [ T ] =>> Any ] =
119
+ def fromIArray (data : IArray [AnyRef ]): Record [Any , AnyNamedTuple ] =
82
120
Record (data)
83
121
84
122
object Internal {
@@ -92,17 +130,19 @@ object SimpleTable {
92
130
def metadata : Metadata [C ] = m
93
131
}
94
132
}
95
- class Metadata [C ](val metadata0 : Table .Metadata [Lift [C ]]):
133
+ class Metadata [C ](val f : SimpleTableMacros .Mask [C ])(
134
+ val metadata0 : Table .Metadata [f.Result ]
135
+ ):
96
136
def rowExpr (
97
137
mappers : DialectTypeMappers
98
- ): Queryable .Row [Record [ C , Expr ], C ] =
138
+ ): Queryable .Row [f. Result [ Expr ], C ] =
99
139
metadata0
100
140
.queryable(
101
141
metadata0.walkLabels0,
102
142
mappers,
103
143
new Table .Metadata .QueryableProxy (metadata0.queryables(mappers, _))
104
144
)
105
- .asInstanceOf [Queryable .Row [Record [ C , Expr ], C ]]
145
+ .asInstanceOf [Queryable .Row [f. Result [ Expr ], C ]]
106
146
107
147
object Metadata extends SimpleTableMacros
108
148
}
0 commit comments