Skip to content

Commit

Permalink
Merge pull request #342 from camunda-community-hub/decision-evaluatio…
Browse files Browse the repository at this point in the history
…n-from-process

feat: Fetch decision evaluations by process instance
  • Loading branch information
saig0 authored Mar 2, 2023
2 parents 2f5160a + e4d2c19 commit bc928e2
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,9 @@ interface DecisionEvaluationRepository : PagingAndSortingRepository<DecisionEval

fun findAllByProcessInstanceKey(processInstanceKey: Long): List<DecisionEvaluation>

fun countByProcessInstanceKey(processInstanceKey: Long): Long

fun findAllByElementInstanceKey(elementInstanceKey: Long): List<DecisionEvaluation>

fun countByElementInstanceKey(elementInstanceKey: Long): Long
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,37 @@ import io.zeebe.zeeqs.data.entity.*
import io.zeebe.zeeqs.data.repository.*
import io.zeebe.zeeqs.data.service.ProcessService
import io.zeebe.zeeqs.data.service.VariableService
import io.zeebe.zeeqs.graphql.resolvers.connection.DecisionEvaluationConnection
import org.springframework.data.repository.findByIdOrNull
import org.springframework.graphql.data.method.annotation.Argument
import org.springframework.graphql.data.method.annotation.SchemaMapping
import org.springframework.stereotype.Controller

@Controller
class ElementInstanceResolver(
val elementInstanceRepository: ElementInstanceRepository,
val processInstanceRepository: ProcessInstanceRepository,
val incidentRepository: IncidentRepository,
val elementInstanceStateTransitionRepository: ElementInstanceStateTransitionRepository,
val timerRepository: TimerRepository,
val processService: ProcessService,
val messageSubscriptionRepository: MessageSubscriptionRepository,
val variableService: VariableService
val elementInstanceRepository: ElementInstanceRepository,
val processInstanceRepository: ProcessInstanceRepository,
val incidentRepository: IncidentRepository,
val elementInstanceStateTransitionRepository: ElementInstanceStateTransitionRepository,
val timerRepository: TimerRepository,
val processService: ProcessService,
val messageSubscriptionRepository: MessageSubscriptionRepository,
val variableService: VariableService,
private val decisionEvaluationRepository: DecisionEvaluationRepository
) {

@SchemaMapping(typeName = "ElementInstance", field = "startTime")
fun startTime(
elementInstance: ElementInstance,
@Argument zoneId: String
elementInstance: ElementInstance,
@Argument zoneId: String
): String? {
return elementInstance.startTime?.let { ResolverExtension.timestampToString(it, zoneId) }
}

@SchemaMapping(typeName = "ElementInstance", field = "endTime")
fun endTime(
elementInstance: ElementInstance,
@Argument zoneId: String
elementInstance: ElementInstance,
@Argument zoneId: String
): String? {
return elementInstance.endTime?.let { ResolverExtension.timestampToString(it, zoneId) }
}
Expand Down Expand Up @@ -60,9 +62,9 @@ class ElementInstanceResolver(
@SchemaMapping(typeName = "ElementInstance", field = "elementName")
fun elementName(elementInstance: ElementInstance): String? {
return processService
.getBpmnElementInfo(elementInstance.processDefinitionKey)
?.get(elementInstance.elementId)
?.elementName
.getBpmnElementInfo(elementInstance.processDefinitionKey)
?.get(elementInstance.elementId)
?.elementName
}

@SchemaMapping(typeName = "ElementInstance", field = "timers")
Expand All @@ -78,21 +80,30 @@ class ElementInstanceResolver(
@SchemaMapping(typeName = "ElementInstance", field = "element")
fun element(elementInstance: ElementInstance): BpmnElement {
return BpmnElement(
processDefinitionKey = elementInstance.processDefinitionKey,
elementId = elementInstance.elementId,
elementType = elementInstance.bpmnElementType
processDefinitionKey = elementInstance.processDefinitionKey,
elementId = elementInstance.elementId,
elementType = elementInstance.bpmnElementType
)
}

@SchemaMapping(typeName = "ElementInstance", field = "variables")
fun variables(
elementInstance: ElementInstance,
@Argument localOnly: Boolean,
@Argument shadowing: Boolean): List<Variable> {
elementInstance: ElementInstance,
@Argument localOnly: Boolean,
@Argument shadowing: Boolean
): List<Variable> {
return variableService.getVariables(
elementInstanceKey = elementInstance.key,
localOnly = localOnly,
shadowing = shadowing
elementInstanceKey = elementInstance.key,
localOnly = localOnly,
shadowing = shadowing
)
}

@SchemaMapping(typeName = "ElementInstance", field = "decisionEvaluations")
fun decisionEvaluations(elementInstance: ElementInstance): DecisionEvaluationConnection {
return DecisionEvaluationConnection(
getItems = { decisionEvaluationRepository.findAllByElementInstanceKey(elementInstanceKey = elementInstance.key) },
getCount = { decisionEvaluationRepository.countByElementInstanceKey(elementInstanceKey = elementInstance.key) }
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package io.zeebe.zeeqs.graphql.resolvers.type

import io.zeebe.zeeqs.data.entity.*
import io.zeebe.zeeqs.data.repository.*
import io.zeebe.zeeqs.graphql.resolvers.connection.DecisionEvaluationConnection
import io.zeebe.zeeqs.graphql.resolvers.connection.UserTaskConnection
import io.zeebe.zeeqs.graphql.resolvers.type.ResolverExtension.timestampToString
import org.springframework.data.domain.PageRequest
Expand All @@ -12,38 +13,39 @@ import org.springframework.stereotype.Controller

@Controller
class ProcessInstanceResolver(
val processInstanceRepository: ProcessInstanceRepository,
val variableRepository: VariableRepository,
val processRepository: ProcessRepository,
val jobRepository: JobRepository,
val userTaskRepository: UserTaskRepository,
val incidentRepository: IncidentRepository,
val elementInstanceRepository: ElementInstanceRepository,
val timerRepository: TimerRepository,
val messageSubscriptionRepository: MessageSubscriptionRepository,
val errorRepository: ErrorRepository
val processInstanceRepository: ProcessInstanceRepository,
val variableRepository: VariableRepository,
val processRepository: ProcessRepository,
val jobRepository: JobRepository,
val userTaskRepository: UserTaskRepository,
val incidentRepository: IncidentRepository,
val elementInstanceRepository: ElementInstanceRepository,
val timerRepository: TimerRepository,
val messageSubscriptionRepository: MessageSubscriptionRepository,
val errorRepository: ErrorRepository,
private val decisionEvaluationRepository: DecisionEvaluationRepository
) {

@SchemaMapping(typeName = "ProcessInstance", field = "startTime")
fun startTime(
processInstance: ProcessInstance,
@Argument zoneId: String
processInstance: ProcessInstance,
@Argument zoneId: String
): String? {
return processInstance.startTime?.let { timestampToString(it, zoneId) }
}

@SchemaMapping(typeName = "ProcessInstance", field = "endTime")
fun endTime(
processInstance: ProcessInstance,
@Argument zoneId: String
processInstance: ProcessInstance,
@Argument zoneId: String
): String? {
return processInstance.endTime?.let { timestampToString(it, zoneId) }
}

@SchemaMapping(typeName = "ProcessInstance", field = "variables")
fun variables(
processInstance: ProcessInstance,
@Argument globalOnly: Boolean
processInstance: ProcessInstance,
@Argument globalOnly: Boolean
): List<Variable> {
return if (globalOnly) {
variableRepository.findByScopeKey(scopeKey = processInstance.key)
Expand All @@ -54,40 +56,42 @@ class ProcessInstanceResolver(

@SchemaMapping(typeName = "ProcessInstance", field = "jobs")
fun jobs(
processInstance: ProcessInstance,
@Argument stateIn: List<JobState>,
@Argument jobTypeIn: List<String>
processInstance: ProcessInstance,
@Argument stateIn: List<JobState>,
@Argument jobTypeIn: List<String>
): List<Job> {
return if (jobTypeIn.isEmpty()) {
jobRepository.findByProcessInstanceKeyAndStateIn(processInstance.key, stateIn)
} else {
jobRepository.findByProcessInstanceKeyAndStateInAndJobTypeIn(
processInstanceKey = processInstance.key,
stateIn = stateIn,
jobTypeIn = jobTypeIn
processInstanceKey = processInstance.key,
stateIn = stateIn,
jobTypeIn = jobTypeIn
)
}
}

@SchemaMapping(typeName = "ProcessInstance", field = "userTasks")
fun userTasks(
processInstance: ProcessInstance,
@Argument perPage: Int,
@Argument page: Int,
@Argument stateIn: List<UserTaskState>): UserTaskConnection {
processInstance: ProcessInstance,
@Argument perPage: Int,
@Argument page: Int,
@Argument stateIn: List<UserTaskState>
): UserTaskConnection {
return UserTaskConnection(
getItems = {
userTaskRepository.findByProcessInstanceKeyAndStateIn(
processInstanceKey = processInstance.key,
stateIn = stateIn,
pageable = PageRequest.of(page, perPage))
},
getCount = {
userTaskRepository.countByProcessInstanceKeyAndStateIn(
processInstanceKey = processInstance.key,
stateIn = stateIn
)
}
getItems = {
userTaskRepository.findByProcessInstanceKeyAndStateIn(
processInstanceKey = processInstance.key,
stateIn = stateIn,
pageable = PageRequest.of(page, perPage)
)
},
getCount = {
userTaskRepository.countByProcessInstanceKeyAndStateIn(
processInstanceKey = processInstance.key,
stateIn = stateIn
)
}
)
}

Expand All @@ -98,18 +102,22 @@ class ProcessInstanceResolver(

@SchemaMapping(typeName = "ProcessInstance", field = "incidents")
fun incidents(
processInstance: ProcessInstance,
@Argument stateIn: List<IncidentState>
processInstance: ProcessInstance,
@Argument stateIn: List<IncidentState>
): List<Incident> {
return incidentRepository.findByProcessInstanceKeyAndStateIn(
processInstanceKey = processInstance.key,
stateIn = stateIn
processInstanceKey = processInstance.key,
stateIn = stateIn
)
}

@SchemaMapping(typeName = "ProcessInstance", field = "parentElementInstance")
fun parentElementInstance(processInstance: ProcessInstance): ElementInstance? {
return processInstance.parentElementInstanceKey?.let { elementInstanceRepository.findByIdOrNull(it) }
return processInstance.parentElementInstanceKey?.let {
elementInstanceRepository.findByIdOrNull(
it
)
}
}

@SchemaMapping(typeName = "ProcessInstance", field = "childProcessInstances")
Expand All @@ -119,12 +127,12 @@ class ProcessInstanceResolver(

@SchemaMapping(typeName = "ProcessInstance", field = "elementInstances")
fun elementInstances(
processInstance: ProcessInstance,
@Argument stateIn: List<ElementInstanceState>
processInstance: ProcessInstance,
@Argument stateIn: List<ElementInstanceState>
): List<ElementInstance> {
return elementInstanceRepository.findByProcessInstanceKeyAndStateIn(
processInstanceKey = processInstance.key,
stateIn = stateIn
processInstanceKey = processInstance.key,
stateIn = stateIn
)
}

Expand All @@ -143,4 +151,11 @@ class ProcessInstanceResolver(
return errorRepository.findByProcessInstanceKey(processInstance.key)
}

@SchemaMapping(typeName = "ProcessInstance", field = "decisionEvaluations")
fun decisionEvaluations(processInstance: ProcessInstance): DecisionEvaluationConnection {
return DecisionEvaluationConnection(
getItems = { decisionEvaluationRepository.findAllByProcessInstanceKey(processInstanceKey = processInstance.key) },
getCount = { decisionEvaluationRepository.countByProcessInstanceKey(processInstanceKey = processInstance.key) }
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ type ElementInstance {
# If false, it returns all variables, including variables with the same name.
shadowing: Boolean = true
): [Variable!]!

# The evaluated decisions that are called by this element instance if the element is a business rule task.
decisionEvaluations: DecisionEvaluationConnection
}

type ElementInstanceStateTransition {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ type ProcessInstance {
timers: [Timer!]
# the opened message subscriptions related to the process instance (e.g. message catch events)
messageSubscriptions: [MessageSubscription!]
# The evaluated decisions that are called by a business rule task of this process instance.
decisionEvaluations: DecisionEvaluationConnection
# the occurred error related to the process instance
error: Error
}
Expand Down

0 comments on commit bc928e2

Please sign in to comment.