@@ -12,6 +12,7 @@ import scala.concurrent.Future
12
12
import scala .concurrent .duration .Duration
13
13
import scala .concurrent .duration .FiniteDuration
14
14
15
+ import io .r2dbc .spi .Row
15
16
import io .r2dbc .spi .Statement
16
17
import org .slf4j .Logger
17
18
import org .slf4j .LoggerFactory
@@ -137,23 +138,44 @@ private[r2dbc] class PostgresQueryDao(executorProvider: R2dbcExecutorProvider) e
137
138
protected def selectOneEventSql (slice : Int ): String =
138
139
sqlCache.get(slice, " selectOneEventSql" ) {
139
140
sql """
140
- SELECT slice, entity_type, db_timestamp, $sqlDbTimestamp AS read_db_timestamp, event_ser_id, event_ser_manifest, event_payload, meta_ser_id, meta_ser_manifest, meta_payload, tags
141
+ SELECT entity_type, db_timestamp, $sqlDbTimestamp AS read_db_timestamp, event_ser_id, event_ser_manifest, event_payload, meta_ser_id, meta_ser_manifest, meta_payload, tags
141
142
FROM ${journalTable(slice)}
142
143
WHERE persistence_id = ? AND seq_nr = ? AND deleted = $sqlFalse"""
143
144
}
144
145
145
146
protected def selectOneEventWithoutPayloadSql (slice : Int ): String =
146
147
sqlCache.get(slice, " selectOneEventWithoutPayloadSql" ) {
147
148
sql """
148
- SELECT slice, entity_type, db_timestamp, CURRENT_TIMESTAMP AS read_db_timestamp, event_ser_id, event_ser_manifest, meta_ser_id, meta_ser_manifest, meta_payload, tags
149
+ SELECT entity_type, db_timestamp, $sqlDbTimestamp AS read_db_timestamp, event_ser_id, event_ser_manifest, meta_ser_id, meta_ser_manifest, meta_payload, tags
149
150
FROM ${journalTable(slice)}
150
151
WHERE persistence_id = ? AND seq_nr = ? AND deleted = $sqlFalse"""
151
152
}
152
153
154
+ protected def selectLastEventSql (slice : Int ): String =
155
+ sqlCache.get(slice, " selectLastEventSql" ) {
156
+ sql """
157
+ SELECT entity_type, seq_nr, db_timestamp, $sqlDbTimestamp AS read_db_timestamp, event_ser_id, event_ser_manifest, event_payload, writer, adapter_manifest, meta_ser_id, meta_ser_manifest, meta_payload, tags
158
+ FROM ${journalTable(slice)}
159
+ WHERE persistence_id = ? AND seq_nr <= ? AND deleted = $sqlFalse
160
+ ORDER BY seq_nr DESC
161
+ LIMIT 1 """
162
+ }
163
+
164
+ protected def selectLastEventIncludeDeletedSql (slice : Int ): String =
165
+ sqlCache.get(slice, " selectLastEventIncludeDeletedSql" ) {
166
+ sql """
167
+ SELECT entity_type, seq_nr, db_timestamp, $sqlDbTimestamp AS read_db_timestamp, event_ser_id, event_ser_manifest, event_payload, writer, adapter_manifest, meta_ser_id, meta_ser_manifest, meta_payload, tags, deleted
168
+ FROM ${journalTable(slice)}
169
+ WHERE persistence_id = ? AND seq_nr <= ?
170
+ ORDER BY seq_nr DESC
171
+ LIMIT 1
172
+ """
173
+ }
174
+
153
175
protected def selectEventsSql (slice : Int ): String =
154
176
sqlCache.get(slice, " selectEventsSql" ) {
155
177
sql """
156
- SELECT slice, entity_type, seq_nr, db_timestamp, CURRENT_TIMESTAMP AS read_db_timestamp, event_ser_id, event_ser_manifest, event_payload, writer, adapter_manifest, meta_ser_id, meta_ser_manifest, meta_payload, tags
178
+ SELECT entity_type, seq_nr, db_timestamp, $sqlDbTimestamp AS read_db_timestamp, event_ser_id, event_ser_manifest, event_payload, writer, adapter_manifest, meta_ser_id, meta_ser_manifest, meta_payload, tags
157
179
from ${journalTable(slice)}
158
180
WHERE persistence_id = ? AND seq_nr >= ? AND seq_nr <= ?
159
181
AND deleted = false
@@ -164,7 +186,7 @@ private[r2dbc] class PostgresQueryDao(executorProvider: R2dbcExecutorProvider) e
164
186
protected def selectEventsIncludeDeletedSql (slice : Int ): String =
165
187
sqlCache.get(slice, " selectEventsIncludeDeletedSql" ) {
166
188
sql """
167
- SELECT slice, entity_type, seq_nr, db_timestamp, CURRENT_TIMESTAMP AS read_db_timestamp, event_ser_id, event_ser_manifest, event_payload, writer, adapter_manifest, meta_ser_id, meta_ser_manifest, meta_payload, tags, deleted
189
+ SELECT entity_type, seq_nr, db_timestamp, $sqlDbTimestamp AS read_db_timestamp, event_ser_id, event_ser_manifest, event_payload, writer, adapter_manifest, meta_ser_id, meta_ser_manifest, meta_payload, tags, deleted
168
190
from ${journalTable(slice)}
169
191
WHERE persistence_id = ? AND seq_nr >= ? AND seq_nr <= ?
170
192
ORDER BY seq_nr
@@ -393,7 +415,7 @@ private[r2dbc] class PostgresQueryDao(executorProvider: R2dbcExecutorProvider) e
393
415
Some (row.getPayload(" event_payload" ))
394
416
else None
395
417
SerializedJournalRow (
396
- slice = row.get[ Integer ]( " slice" , classOf [ Integer ]) ,
418
+ slice = slice,
397
419
entityType = row.get(" entity_type" , classOf [String ]),
398
420
persistenceId,
399
421
seqNr,
@@ -408,6 +430,42 @@ private[r2dbc] class PostgresQueryDao(executorProvider: R2dbcExecutorProvider) e
408
430
})
409
431
}
410
432
433
+ override def loadLastEvent (
434
+ persistenceId : String ,
435
+ toSeqNr : Long ,
436
+ includeDeleted : Boolean ): Future [Option [SerializedJournalRow ]] = {
437
+ val slice = persistenceExt.sliceForPersistenceId(persistenceId)
438
+ val executor = executorProvider.executorFor(slice)
439
+ val selectSql = if (includeDeleted) selectLastEventIncludeDeletedSql(slice) else selectLastEventSql(slice)
440
+ executor.selectOne(" select last event" )(
441
+ connection => {
442
+ connection
443
+ .createStatement(selectSql)
444
+ .bind(0 , persistenceId)
445
+ .bind(1 , toSeqNr)
446
+ },
447
+ row => {
448
+ if (includeDeleted && row.get[java.lang.Boolean ](" deleted" , classOf [java.lang.Boolean ])) {
449
+ // deleted row
450
+ deletedJournalRow(slice, persistenceId, row)
451
+ } else {
452
+ SerializedJournalRow (
453
+ slice = slice,
454
+ entityType = row.get(" entity_type" , classOf [String ]),
455
+ persistenceId,
456
+ seqNr = row.get[java.lang.Long ](" seq_nr" , classOf [java.lang.Long ]),
457
+ dbTimestamp = row.getTimestamp(" db_timestamp" ),
458
+ readDbTimestamp = row.getTimestamp(" read_db_timestamp" ),
459
+ payload = Some (row.getPayload(" event_payload" )),
460
+ serId = row.get[Integer ](" event_ser_id" , classOf [Integer ]),
461
+ serManifest = row.get(" event_ser_manifest" , classOf [String ]),
462
+ writerUuid = row.get(" writer" , classOf [String ]),
463
+ tags = row.getTags(" tags" ),
464
+ metadata = readMetadata(row))
465
+ }
466
+ })
467
+ }
468
+
411
469
override def eventsByPersistenceId (
412
470
persistenceId : String ,
413
471
fromSequenceNr : Long ,
@@ -424,22 +482,10 @@ private[r2dbc] class PostgresQueryDao(executorProvider: R2dbcExecutorProvider) e
424
482
row =>
425
483
if (includeDeleted && row.get[java.lang.Boolean ](" deleted" , classOf [java.lang.Boolean ])) {
426
484
// deleted row
427
- SerializedJournalRow (
428
- slice = row.get[Integer ](" slice" , classOf [Integer ]),
429
- entityType = row.get(" entity_type" , classOf [String ]),
430
- persistenceId = persistenceId,
431
- seqNr = row.get[java.lang.Long ](" seq_nr" , classOf [java.lang.Long ]),
432
- dbTimestamp = row.getTimestamp(" db_timestamp" ),
433
- readDbTimestamp = row.getTimestamp(" read_db_timestamp" ),
434
- payload = None ,
435
- serId = 0 ,
436
- serManifest = " " ,
437
- writerUuid = " " ,
438
- tags = Set .empty,
439
- metadata = None )
485
+ deletedJournalRow(slice, persistenceId, row)
440
486
} else {
441
487
SerializedJournalRow (
442
- slice = row.get[ Integer ]( " slice" , classOf [ Integer ]) ,
488
+ slice = slice,
443
489
entityType = row.get(" entity_type" , classOf [String ]),
444
490
persistenceId = persistenceId,
445
491
seqNr = row.get[java.lang.Long ](" seq_nr" , classOf [java.lang.Long ]),
@@ -459,6 +505,22 @@ private[r2dbc] class PostgresQueryDao(executorProvider: R2dbcExecutorProvider) e
459
505
Source .futureSource(result.map(Source (_))).mapMaterializedValue(_ => NotUsed )
460
506
}
461
507
508
+ private def deletedJournalRow (slice : Int , persistenceId : String , row : Row ): SerializedJournalRow = {
509
+ SerializedJournalRow (
510
+ slice = slice,
511
+ entityType = row.get(" entity_type" , classOf [String ]),
512
+ persistenceId = persistenceId,
513
+ seqNr = row.get[java.lang.Long ](" seq_nr" , classOf [java.lang.Long ]),
514
+ dbTimestamp = row.getTimestamp(" db_timestamp" ),
515
+ readDbTimestamp = row.getTimestamp(" read_db_timestamp" ),
516
+ payload = None ,
517
+ serId = 0 ,
518
+ serManifest = " " ,
519
+ writerUuid = " " ,
520
+ tags = Set .empty,
521
+ metadata = None )
522
+ }
523
+
462
524
protected def bindPersistenceIdsForEntityTypeAfterSql (
463
525
stmt : Statement ,
464
526
entityType : String ,
0 commit comments