TypedQuery serviceHub.withEntityManager возвращает потребленные состояния - PullRequest
0 голосов
/ 17 апреля 2020

Мой вопрос похож на serviceHub.vaultQueryService.queryBy возвращает все связанные состояния по умолчанию? за исключением того, что мы сопоставили схемы для состояний и используем TypedQueries для извлечения состояний из базы данных.

Поток который запрашивает состояние из базы данных:

@StartableByRPC
@Transactional
open class FetchServiceById(
    private val serviceId: UniqueIdentifier
) : FlowLogic<List<ServiceSchemaV1.PersistentService>>() {

    @Suspendable
    override fun call(): List<ServiceSchemaV1.PersistentService> {

        return serviceHub.withEntityManager {
            createQuery(
                "SELECT s FROM $TABLE_NAME s WHERE s.linearId = ?1",
                ServiceSchemaV1.PersistentService::class.java
            ).setParameter(
                1,
                serviceId.id
            ).resultList
        }
    }

    private companion object {
        val TABLE_NAME = ServiceSchemaV1.PersistentService::class.jvmName
    }
}

Это возвращает состояние правильно, но после обновления определенного состояния и повторного выполнения запроса возвращает как старое, использованное состояние, так и новое неизрасходованное состояние.

Я проверил базу данных h2 и вижу, что после обновления состояния в VAULT_STATE есть дата в CONSUMED_TIMESTAMP, и ее STATE_STATUS равно 1.

Как мы можем запрашивать только неиспользованные состояния с помощью типизированных запросов? Я знаю, что мы могли бы просто использовать линейные запросы, но когда нам нужно запрашивать и объединять данные из разных состояний, я не думаю, что это было бы осуществимо в вычислительном отношении.

Схема, которую использует состояние


object ServiceSchema

object ServiceSchemaV1 : MappedSchema(
    schemaFamily = ServiceSchema.javaClass,
    version = 1,
    mappedTypes = listOf(
        PersistentService::class.java
    )) {
    @Entity
    @Table(name = "service_states")

    class PersistentService(
        @Column(name = "accountoperator")
        var accountOperator: String,

        @Column(name = "serviceprovider")
        var serviceProvider: String,

        @Column(name = "servicename")
        var serviceName: String,

        @Column(name = "servicedescription")
        var serviceDescription: String,

        @Column(name = "datacreated")
        var dataCreated: LocalDate,

        @Column(name = "linear_id")
        var linearId: UUID,

        @ElementCollection
        @Column(name = "service_data_ids")
        var serviceDataIds: MutableList<UUID>,

        @ElementCollection
        @Column(name = "service_partners")
        var servicePartners: MutableList<String>

    ) : PersistentState() {
        constructor() : this(
            "",
            "",
            "",
            "",
            LocalDate.now(),
            UUID.randomUUID(),
            mutableListOf(),
            mutableListOf()
        )
    }
}

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Вы должны убедиться, что все необходимые стороны включены в сервисный звонок. В противном случае вы можете видеть только состояния, в которые конкретный узел был включен в контракт последнего обновления состояния.

0 голосов
/ 17 апреля 2020

Вы можете выполнить запрос на присоединение к схеме вашего штата и таблице VAULT_STATE на основе TRANSACTION_ID и OUTPUT_INDEX и отфильтровать на основе STATE_STATUS.

Select X, Y Z, from MY_STATE M, VAULT_STATES V WHERE M.TRANSACTION_ID = 
V.TRANSACTION_ID AND M.OUTPUT_INDEX = V.OUTPUT_INDEX AND STATE_STATUS = 0
...