Skip to content

Commit 9efa287

Browse files
committed
move named tuple querable to new file
1 parent 5c606bf commit 9efa287

File tree

8 files changed

+73
-69
lines changed

8 files changed

+73
-69
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package scalasql.namedtuples
2+
3+
import scala.NamedTuple.NamedTuple
4+
import scalasql.core.{Queryable, Expr}
5+
6+
object NamedTupleQueryable {
7+
8+
opaque type Rows[X <: Tuple, +Y <: Tuple] = List[Queryable.Row[?, ?]]
9+
10+
object Rows {
11+
// currently "traditional" recursive implicit search
12+
// because we only know the Q type, and it appears compiletime.summonAll cannot be used to refined the R type
13+
// e.g. compiletime.summonAll[Tuple.Map[Qs, [X] =>> Queryable.Row[X, ?]]] does nothing because its static type is fixed.
14+
given concatRows: [Q, R, Qs <: Tuple, Rs <: Tuple]
15+
=> (x: Queryable.Row[Q, R])
16+
=> (xs: Rows[Qs, Rs])
17+
=> Rows[Q *: Qs, R *: Rs] =
18+
x :: xs
19+
20+
given emptyRows: Rows[EmptyTuple, EmptyTuple] = Nil
21+
}
22+
23+
given NamedTupleRow: [N <: Tuple, X <: Tuple, Y <: Tuple]
24+
=> (rs: Rows[X, Y]) => Queryable.Row[NamedTuple[N, X], NamedTuple[N, Y]]:
25+
def walkExprs(q: NamedTuple[N, X]): Seq[Expr[?]] = {
26+
val walkExprs0 = {
27+
val ps = q.toTuple.productIterator
28+
rs.iterator
29+
.zip(ps)
30+
.map({ (row, p) =>
31+
type Q
32+
type R
33+
val q = p.asInstanceOf[Q]
34+
row.asInstanceOf[Queryable.Row[Q, R]].walkExprs(q)
35+
})
36+
}
37+
38+
walkExprs0.zipWithIndex
39+
.map { case (v, i) => (i.toString, v) }
40+
.flatMap { case (prefix, vs0) => vs0 }
41+
.toIndexedSeq
42+
}
43+
def walkLabels(): Seq[List[String]] = {
44+
val walkLabels0 = rs.iterator.map(_.walkLabels())
45+
walkLabels0.zipWithIndex
46+
.map { case (v, i) => (i.toString, v) }
47+
.flatMap { case (prefix, vs0) => vs0.map { k => prefix +: k } }
48+
.toIndexedSeq
49+
}
50+
def construct(args: scalasql.core.Queryable.ResultSetIterator): NamedTuple.NamedTuple[N, Y] =
51+
val data = IArray.from(rs.iterator.map(_.construct(args)))
52+
Tuple.fromIArray(data).asInstanceOf[NamedTuple.NamedTuple[N, Y]]
53+
54+
def deconstruct(r: NamedTuple.NamedTuple[N, Y]): NamedTuple.NamedTuple[N, X] =
55+
val data = IArray.from {
56+
val ps = r.toTuple.productIterator
57+
rs.iterator
58+
.zip(ps)
59+
.map({ (row, p) =>
60+
type Q
61+
type R
62+
val r = p.asInstanceOf[R]
63+
row.asInstanceOf[Queryable.Row[Q, R]].deconstruct(r)
64+
})
65+
}
66+
Tuple.fromIArray(data).asInstanceOf[NamedTuple.NamedTuple[N, X]]
67+
}

scalasql/namedtuples/src/SimpleTable.scala

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -19,69 +19,6 @@ class SimpleTable[C]()(
1919

2020
object SimpleTable {
2121

22-
object NamedTupleOps {
23-
24-
opaque type Rows[X <: Tuple, +Y <: Tuple] = List[Queryable.Row[?, ?]]
25-
26-
object Rows {
27-
// currently "traditional" recursive implicit search
28-
// because we only know the Q type, and it appears compiletime.summonAll cannot be used to refined the R type
29-
// e.g. compiletime.summonAll[Tuple.Map[Qs, [X] =>> Queryable.Row[X, ?]]] does nothing because its static type is fixed.
30-
given concatRows: [Q, R, Qs <: Tuple, Rs <: Tuple]
31-
=> (x: Queryable.Row[Q, R])
32-
=> (xs: Rows[Qs, Rs])
33-
=> Rows[Q *: Qs, R *: Rs] =
34-
x :: xs
35-
36-
given emptyRows: Rows[EmptyTuple, EmptyTuple] = Nil
37-
}
38-
39-
given NamedTupleExprRow: [N <: Tuple, X <: Tuple, Y <: Tuple]
40-
=> (rs: Rows[X, Y]) => Queryable.Row[NamedTuple[N, X], NamedTuple[N, Y]]:
41-
def walkExprs(q: NamedTuple[N, X]): Seq[Expr[?]] = {
42-
val walkExprs0 = {
43-
val ps = q.toTuple.productIterator
44-
rs.iterator
45-
.zip(ps)
46-
.map({ (row, p) =>
47-
type Q
48-
type R
49-
val q = p.asInstanceOf[Q]
50-
row.asInstanceOf[Queryable.Row[Q, R]].walkExprs(q)
51-
})
52-
}
53-
54-
walkExprs0.zipWithIndex
55-
.map { case (v, i) => (i.toString, v) }
56-
.flatMap { case (prefix, vs0) => vs0 }
57-
.toIndexedSeq
58-
}
59-
def walkLabels(): Seq[List[String]] = {
60-
val walkLabels0 = rs.iterator.map(_.walkLabels())
61-
walkLabels0.zipWithIndex
62-
.map { case (v, i) => (i.toString, v) }
63-
.flatMap { case (prefix, vs0) => vs0.map { k => prefix +: k } }
64-
.toIndexedSeq
65-
}
66-
def construct(args: scalasql.core.Queryable.ResultSetIterator): NamedTuple.NamedTuple[N, Y] =
67-
val data = IArray.from(rs.iterator.map(_.construct(args)))
68-
Tuple.fromIArray(data).asInstanceOf[NamedTuple.NamedTuple[N, Y]]
69-
70-
def deconstruct(r: NamedTuple.NamedTuple[N, Y]): NamedTuple.NamedTuple[N, X] =
71-
val data = IArray.from {
72-
val ps = r.toTuple.productIterator
73-
rs.iterator
74-
.zip(ps)
75-
.map({ (row, p) =>
76-
type Q
77-
type R
78-
val r = p.asInstanceOf[R]
79-
row.asInstanceOf[Queryable.Row[Q, R]].deconstruct(r)
80-
})
81-
}
82-
Tuple.fromIArray(data).asInstanceOf[NamedTuple.NamedTuple[N, X]]
83-
}
84-
8522
/**
8623
* Marker class that signals that a data type is convertable to an SQL table row.
8724
* @note this must be a class to convince the match type reducer that it provably can't be mixed

scalasql/namedtuples/test/src/datatypes/LargeObjectTest.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ object LargeObjectB extends SimpleTable[LargeObjectB]
431431
// so hopefully 75 is large enough. (works with -Xss900k)
432432
def foo: Unit = {
433433
import scalasql.dialects.H2Dialect.*
434-
import scalasql.namedtuples.SimpleTable.NamedTupleOps.given
434+
import scalasql.namedtuples.NamedTupleQueryable.given
435435
val db: DbApi = ???
436436
val m = db.run(
437437
LargeObjectB.select.map(_ =>

scalasql/namedtuples/test/src/example/SimpleTableH2Example.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
package scalasql.namedtuples.example
33

44
import scalasql.namedtuples.SimpleTable
5-
import scalasql.namedtuples.SimpleTable.NamedTupleOps.given
5+
import scalasql.namedtuples.NamedTupleQueryable.given
66
import scalasql.H2Dialect.*
77

88
object SimpleTableH2Example {

scalasql/namedtuples/test/src/example/SimpleTableMySqlExample.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
package scalasql.namedtuples.example
33

44
import scalasql.namedtuples.SimpleTable
5-
import scalasql.namedtuples.SimpleTable.NamedTupleOps.given
5+
import scalasql.namedtuples.NamedTupleQueryable.given
66
import org.testcontainers.containers.MySQLContainer
77
import scalasql.MySqlDialect.*
88

scalasql/namedtuples/test/src/example/SimpleTablePostgresExample.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package scalasql.namedtuples.example
33

44
import org.testcontainers.containers.PostgreSQLContainer
55
import scalasql.namedtuples.SimpleTable
6-
import scalasql.namedtuples.SimpleTable.NamedTupleOps.given
6+
import scalasql.namedtuples.NamedTupleQueryable.given
77

88
import scalasql.PostgresDialect.*
99

scalasql/namedtuples/test/src/example/SimpleTableSqliteExample.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
package scalasql.namedtuples.example
33

44
import scalasql.namedtuples.SimpleTable
5-
import scalasql.namedtuples.SimpleTable.NamedTupleOps.given
5+
import scalasql.namedtuples.NamedTupleQueryable.given
66

77
import scalasql.SqliteDialect.*
88
object SimpleTableSqliteExample {

scalasql/namedtuples/test/src/example/foo.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package scalasql.example
22

33
import scalasql.dialects.H2Dialect.*
44
import scalasql.namedtuples.*
5-
import scalasql.namedtuples.SimpleTable.NamedTupleOps.given
5+
import scalasql.namedtuples.NamedTupleQueryable.given
66
import scalasql.*
77
import scalasql.dialects.Dialect
88

0 commit comments

Comments
 (0)