Transaction note retrieval now using indexed field on database table.

This commit is contained in:
Jose Coll
2016-11-15 18:14:01 +00:00
parent 5dfffb1b84
commit 1427baf797
2 changed files with 13 additions and 5 deletions

View File

@ -18,6 +18,7 @@ import net.corda.core.utilities.loggerFor
import net.corda.core.utilities.trace import net.corda.core.utilities.trace
import net.corda.node.utilities.* import net.corda.node.utilities.*
import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.ResultRow
import org.jetbrains.exposed.sql.select
import org.jetbrains.exposed.sql.statements.InsertStatement import org.jetbrains.exposed.sql.statements.InsertStatement
import rx.Observable import rx.Observable
import rx.subjects.PublishSubject import rx.subjects.PublishSubject
@ -50,7 +51,8 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT
} }
private object TransactionNotesTable : JDBCHashedTable("${NODE_DATABASE_PREFIX}vault_txn_notes") { private object TransactionNotesTable : JDBCHashedTable("${NODE_DATABASE_PREFIX}vault_txn_notes") {
val txnNote = txnNote("txnId", "note") val txnId = secureHash("txnId").index()
val note = text("note")
} }
private val mutex = ThreadBox(content = object { private val mutex = ThreadBox(content = object {
@ -64,11 +66,16 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT
} }
val transactionNotes = object : AbstractJDBCHashSet<TxnNote, TransactionNotesTable>(TransactionNotesTable) { val transactionNotes = object : AbstractJDBCHashSet<TxnNote, TransactionNotesTable>(TransactionNotesTable) {
override fun elementFromRow(row: ResultRow): TxnNote = TxnNote(row[table.txnNote.txId], row[table.txnNote.note]) override fun elementFromRow(row: ResultRow): TxnNote = TxnNote(row[table.txnId], row[table.note])
override fun addElementToInsert(insert: InsertStatement, entry: TxnNote, finalizables: MutableList<() -> Unit>) { override fun addElementToInsert(insert: InsertStatement, entry: TxnNote, finalizables: MutableList<() -> Unit>) {
insert[table.txnNote.txId] = entry.txnId insert[table.txnId] = entry.txnId
insert[table.txnNote.note] = entry.note insert[table.note] = entry.note
}
// TODO: caching (2nd tier db cache) and db results filtering (max records, date, other)
fun select(txnId: SecureHash) : Iterable<String> {
return table.select { table.txnId.eq(txnId) }.map { row -> row[table.note] }.toSet().asIterable()
} }
} }
@ -134,7 +141,7 @@ class NodeVaultService(private val services: ServiceHub) : SingletonSerializeAsT
override fun getTransactionNotes(txnId: SecureHash): Iterable<String> { override fun getTransactionNotes(txnId: SecureHash): Iterable<String> {
mutex.locked { mutex.locked {
return transactionNotes.filter { it.txnId == txnId }.map { it.note } return transactionNotes.select(txnId)
} }
} }

View File

@ -112,6 +112,7 @@ class NodeVaultServiceTest {
services.vaultService.addNoteToTransaction(usefulTX.id, "USD Sample Note 1") services.vaultService.addNoteToTransaction(usefulTX.id, "USD Sample Note 1")
services.vaultService.addNoteToTransaction(usefulTX.id, "USD Sample Note 2") services.vaultService.addNoteToTransaction(usefulTX.id, "USD Sample Note 2")
services.vaultService.addNoteToTransaction(usefulTX.id, "USD Sample Note 3") services.vaultService.addNoteToTransaction(usefulTX.id, "USD Sample Note 3")
val results = services.vaultService.getTransactionNotes(usefulTX.id)
assertEquals(3, services.vaultService.getTransactionNotes(usefulTX.id).count()) assertEquals(3, services.vaultService.getTransactionNotes(usefulTX.id).count())
// Issue more Money (GBP) // Issue more Money (GBP)