File tree Expand file tree Collapse file tree 7 files changed +82
-6
lines changed Expand file tree Collapse file tree 7 files changed +82
-6
lines changed Original file line number Diff line number Diff line change @@ -68,6 +68,14 @@ object Queryable {
68
68
var nulls = 0
69
69
var nonNulls = 0
70
70
71
+ def restAreNulls (columnsCount : Int ): Boolean = {
72
+ val result = Range .inclusive(index + 1 , index + columnsCount).map { i =>
73
+ r.getObject(i) == null
74
+ }.forall(identity)
75
+ if (result) index = index + columnsCount
76
+ result
77
+ }
78
+
71
79
def get [T ](mt : TypeMapper [T ]) = {
72
80
index += 1
73
81
val res = mt.get(r, index)
@@ -143,10 +151,11 @@ object Queryable {
143
151
def walkExprs (q : JoinNullable [Q ]) = qr.walkExprs(q.get)
144
152
145
153
def construct (args : Queryable .ResultSetIterator ): Option [R ] = {
146
- val startNonNulls = args.nonNulls
147
- val res = qr.construct(args)
148
- if (startNonNulls == args.nonNulls) None
149
- else Option (res)
154
+ if (args.restAreNulls(qr.walkLabels().length)) {
155
+ None
156
+ } else {
157
+ Option (qr.construct(args))
158
+ }
150
159
}
151
160
152
161
def deconstruct (r : Option [R ]): JoinNullable [Q ] = JoinNullable (qr.deconstruct(r.get))
Original file line number Diff line number Diff line change @@ -228,8 +228,7 @@ trait Dialect extends DialectTypeMappers {
228
228
def jdbcType : JDBCType = JDBCType .VARCHAR
229
229
def get (r : ResultSet , idx : Int ): T = {
230
230
val str = r.getString(idx)
231
- if (str == null ) null .asInstanceOf [T ]
232
- else constructor(str)
231
+ constructor(str)
233
232
}
234
233
def put (r : PreparedStatement , idx : Int , v : T ) =
235
234
r.setObject(idx, v, java.sql.Types .OTHER )
Original file line number Diff line number Diff line change @@ -3,6 +3,8 @@ DROP TABLE IF EXISTS product CASCADE;
3
3
DROP TABLE IF EXISTS shipping_info CASCADE;
4
4
DROP TABLE IF EXISTS purchase CASCADE;
5
5
DROP TABLE IF EXISTS data_types CASCADE;
6
+ DROP TABLE IF EXISTS a CASCADE;
7
+ DROP TABLE IF EXISTS b CASCADE;
6
8
DROP TABLE IF EXISTS non_round_trip_types CASCADE;
7
9
DROP TABLE IF EXISTS opt_cols CASCADE;
8
10
DROP TABLE IF EXISTS nested CASCADE;
@@ -58,6 +60,16 @@ CREATE TABLE data_types (
58
60
-- my_offset_time TIME WITH TIME ZONE,
59
61
);
60
62
63
+ CREATE TABLE a (
64
+ id INTEGER ,
65
+ b_id INTEGER
66
+ );
67
+
68
+ CREATE TABLE b (
69
+ id INTEGER ,
70
+ custom VARCHAR (256 )
71
+ );
72
+
61
73
CREATE TABLE non_round_trip_types (
62
74
my_zoned_date_time TIMESTAMP WITH TIME ZONE ,
63
75
my_offset_date_time TIMESTAMP WITH TIME ZONE
Original file line number Diff line number Diff line change @@ -4,6 +4,8 @@ DROP TABLE IF EXISTS `product` CASCADE;
4
4
DROP TABLE IF EXISTS ` shipping_info` CASCADE;
5
5
DROP TABLE IF EXISTS ` purchase` CASCADE;
6
6
DROP TABLE IF EXISTS ` data_types` CASCADE;
7
+ DROP TABLE IF EXISTS ` a` CASCADE;
8
+ DROP TABLE IF EXISTS ` b` CASCADE;
7
9
DROP TABLE IF EXISTS ` non_round_trip_types` CASCADE;
8
10
DROP TABLE IF EXISTS ` opt_cols` CASCADE;
9
11
DROP TABLE IF EXISTS ` nested` CASCADE;
@@ -57,6 +59,16 @@ CREATE TABLE data_types (
57
59
my_enum ENUM (' foo' , ' bar' , ' baz' )
58
60
);
59
61
62
+ CREATE TABLE a (
63
+ id INTEGER ,
64
+ b_id INTEGER
65
+ );
66
+
67
+ CREATE TABLE b (
68
+ id INTEGER ,
69
+ custom VARCHAR (256 )
70
+ );
71
+
60
72
CREATE TABLE non_round_trip_types (
61
73
my_zoned_date_time TIMESTAMP ,
62
74
my_offset_date_time TIMESTAMP
Original file line number Diff line number Diff line change @@ -3,6 +3,8 @@ DROP TABLE IF EXISTS product CASCADE;
3
3
DROP TABLE IF EXISTS shipping_info CASCADE;
4
4
DROP TABLE IF EXISTS purchase CASCADE;
5
5
DROP TABLE IF EXISTS data_types CASCADE;
6
+ DROP TABLE IF EXISTS a CASCADE;
7
+ DROP TABLE IF EXISTS b CASCADE;
6
8
DROP TABLE IF EXISTS non_round_trip_types CASCADE;
7
9
DROP TABLE IF EXISTS opt_cols CASCADE;
8
10
DROP TABLE IF EXISTS nested CASCADE;
@@ -61,6 +63,16 @@ CREATE TABLE data_types (
61
63
62
64
);
63
65
66
+ CREATE TABLE a (
67
+ id INTEGER ,
68
+ b_id INTEGER
69
+ );
70
+
71
+ CREATE TABLE b (
72
+ id INTEGER ,
73
+ custom VARCHAR (256 )
74
+ );
75
+
64
76
CREATE TABLE non_round_trip_types (
65
77
my_zoned_date_time TIMESTAMP WITH TIME ZONE ,
66
78
my_offset_date_time TIMESTAMP WITH TIME ZONE
Original file line number Diff line number Diff line change @@ -3,6 +3,8 @@ DROP TABLE IF EXISTS product;
3
3
DROP TABLE IF EXISTS shipping_info;
4
4
DROP TABLE IF EXISTS purchase;
5
5
DROP TABLE IF EXISTS data_types;
6
+ DROP TABLE IF EXISTS a;
7
+ DROP TABLE IF EXISTS b;
6
8
DROP TABLE IF EXISTS non_round_trip_types;
7
9
DROP TABLE IF EXISTS nested;
8
10
DROP TABLE IF EXISTS enclosing;
@@ -56,6 +58,16 @@ CREATE TABLE data_types (
56
58
-- my_offset_time TIME WITH TIME ZONE,
57
59
);
58
60
61
+ CREATE TABLE a (
62
+ id INTEGER ,
63
+ b_id INTEGER
64
+ );
65
+
66
+ CREATE TABLE b (
67
+ id INTEGER ,
68
+ custom VARCHAR (256 )
69
+ );
70
+
59
71
CREATE TABLE non_round_trip_types (
60
72
my_zoned_date_time TIMESTAMP ,
61
73
my_offset_date_time TIMESTAMP
Original file line number Diff line number Diff line change @@ -212,5 +212,25 @@ trait DataTypesTests extends ScalaSqlSuite {
212
212
213
213
}
214
214
)
215
+ test(" JoinNullable proper type mapping" ) - checker.recorded(
216
+ " ???" ,
217
+ Text {
218
+ case class A [T [_]](id : T [Int ], bId : T [Option [Int ]])
219
+ object A extends Table [A ]
220
+
221
+ object Custom extends Enumeration {
222
+ val Foo, Bar = Value
223
+
224
+ implicit def make : String => Value = withName
225
+ // implicit val mapper: TypeMapper[Custom.Value] = StringType.bimap(_.toString, Custom.withName)
226
+ }
227
+
228
+ case class B [T [_]](id : T [Int ], custom : T [Custom .Value ])
229
+ object B extends Table [B ]
230
+ db.run(A .insert.columns(_.id := 1 , _.bId := None ))
231
+ val result = db.run(A .select.leftJoin(B )(_.id === _.id).single)
232
+ result._2 ==> None
233
+ }
234
+ )
215
235
}
216
236
}
You can’t perform that action at this time.
0 commit comments