Skip to main content

BPMN_CONFORMS

Description

BPMN_CONFORMS provides a way for simple binary yes/no conformance checking on a BPMN model to distinguish fitting traces from non-fitting traces.

Syntax

BPMN_CONFORMS ( flattened_events_table.column , bpmn_model, [ ALLOW( filter_or_shorthand [, filter_or_shorthand ... ] ) ] )
  • flattened_events_table.column: Used as the input column of the operator. Should be a column of a (flattened) event table. Its values are mapped to the referred events and returned as the result column.

BPMN_CONFORMS returns an INT column on the case table of the provided <flattened_events_table.column>. This column contains only two possible values: 0 if the case contains any deviations or 1 if the entire case is conforming. This column can then be used further, e.g. FILTER BPMN_CONFORMS(...) = 0; could be used to filter on all deviating cases, or AVG( BPMN_CONFORMS(...) ) could be used to compute the conformance rate.

BPMN model description syntax

[<vertices>], [<edges>]
  • vertices: A whitespace separated list of all vertices in the BPMN model. The vertices are encoded in the following way:

    [<vertex_id> <vertex_type>]
    [<vertex_id> BPMN_TASK '<task_name>']
    • vertex_id: Denotes a unique integer number used as the vertex identifier.

    • vertex_type: BPMN_START | BPMN_END | BPMN_EXCLUSIVE_CHOICE | BPMN_PARALLEL

      • BPMN_START: The start vertex of the BPMN model. Each model description should contain exactly one start vertex.

      • BPMN_END: The end vertex of the BPMN model. Each model description should contain exactly one end vertex.

      • BPMN_EXCLUSIVE_CHOICE: An exclusive choice gateway.

      • BPMN_PARALLEL: A parallel gateway.

    • task_name: Only used in combination with a vertex of type BPMN_TASK. Denotes the name of the task vertex, which should correspond to the activity name in the (flattened) event table. Must be a non-null STRING.

  • edges: A whitespace separated list of all edges in the BPMN model. An edge is encoded in the following way:

    [<start_vertex> <end_vertex>]
    • start_vertex: the vertex ID corresponding to the start vertex of this edge.

    • end_vertex: the vertex ID corresponding to the end vertex of this edge.

Allowlisting

As a last optional argument an allowlist of the format ALLOW( <filter_or_shorthand>, <filter_or_shorthand>, ... ) can be provided to BPMN_CONFORMS. This is a list of either conditional statements as used in PQL filters or the special shorthands 'BPMN_MATCH_EXCESSIVE', 'BPMN_MATCH_MISSING', 'BPMN_MATCH_OUT_OF_SEQUENCE', 'BPMN_MATCH_UNDESIRED', 'BPMN_MATCH_UNMAPPED' which are only allowed in BPMN_CONFORMS.

This can be used to allow certain deviations and still mark the case as conforming. For example, we might not want to mark cases executed by a specific resource as deviating, since that resource only handles manual overrides of process behaviour. Then we could provide an allowlist like ALLOW("EVENTLOG"."RESOURCE" = 'MANUAL_OVERRIDE') which would result in us not considering any events executed by the 'MANUAL_OVERRIDE' resource as deviating.

Another common use case is allowing certain additional process behaviour, such as certain activities happening too often, not often enough or in the wrong place. For this the shorthands BPMN_MATCH_EXCESSIVE, BPMN_MATCH_MISSING, BPMN_MATCH_OUT_OF_SEQUENCE, BPMN_MATCH_UNDESIRED, BPMN_MATCH_UNMAPPED can be used. These all have the same syntax BPMN_MATCH_[EXCESSIVE | MISSING | OUT_OF_SEQUENCE | UNDESIRED | UNMAPPED](ANY | <activity_name>) and can be used to allow the following specific deviation patterns: BPMN_MATCH_EXCESSIVE: The activity occurs in the trace at the right place at least once (SYNC_MOVE), but at least once out of place (LOG_MOVE) BPMN_MATCH_MISSING: The activity does not occur out of place in the trace (no LOG_MOVE) but is required at least once in the model (MODEL_MOVE). BPMN_MATCH_OUT_OF_SEQUENCE: The activity occurs out of place in the trace at least once (LOG_MOVE), but also is required at least once in the model (MODEL_MOVE). BPMN_MATCH_UNDESIRED: The activity occurs out of place in the trace at least once (LOG_MOVE) but is never required to execute the model (no MODEL_MOVE) nor executed regularly (no SYNC_MOVE). BPMN_MATCH_UNMAPPED: The activity happens in the trace but there is no BPMN_TASK with it in the model.

Examples

[1]

An example with a simple BPMN model: SEQUENCE("Create Order", EXCLUSIVE_CHOICE( "Process Order", "Cancel Order")). The event table contains four events, one fitting trace and one non-fitting trace.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."ACTIVITY" , [ [ 0 BPMN_START ] [ 1 BPMN_END ] [ 2 BPMN_TASK 'Create Order' ] [ 3 BPMN_EXCLUSIVE_CHOICE ] [ 4 BPMN_TASK 'Process Order' ] [ 5 BPMN_TASK 'Cancel Order' ] [ 6 BPMN_EXCLUSIVE_CHOICE ] ] , [ [ 0 2 ] [ 2 3 ] [ 3 4 ] [ 3 5 ] [ 4 6 ] [ 5 6 ] [ 6 1 ] ] )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'Create Order'

Sat Jan 01 2022 00:00:00.000

'001'

'Cancel Order'

Sun Jan 02 2022 00:00:00.000

'002'

'Create Order'

Tue Feb 01 2022 00:00:00.000

'002'

'Create Order'

Wed Feb 02 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

1

0

[2]

This example computes the BPMN_CONFORMS operator on a more complex BPMN model containing both an exclusive and a parallel path: SEQUENCE ("A", EXCLUSIVE_CHOICE("B", PARALLEL("C", "D")), "E"). The event table contains three traces that all conform to the model.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."ACTIVITY" , [ [ 0 BPMN_START ] [ 1 BPMN_END ] [ 2 BPMN_TASK 'A' ] [ 3 BPMN_TASK 'B' ] [ 4 BPMN_TASK 'C' ] [ 5 BPMN_TASK 'D' ] [ 6 BPMN_TASK 'E' ] [ 7 BPMN_EXCLUSIVE_CHOICE ] [ 8 BPMN_EXCLUSIVE_CHOICE ] [ 9 BPMN_PARALLEL ] [ 10 BPMN_PARALLEL ] ] , [ [ 0 2 ] [ 2 7 ] [ 7 3 ] [ 7 9 ] [ 9 4 ] [ 9 5 ] [ 4 10 ] [ 5 10 ] [ 3 8 ] [ 10 8 ] [ 8 6 ] [ 6 1 ] ] )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'A'

Sat Jan 01 2022 00:00:00.000

'001'

'B'

Mon Jan 03 2022 00:00:00.000

'002'

'A'

Wed Jan 05 2022 00:00:00.000

'001'

'E'

Fri Jan 07 2022 00:00:00.000

'002'

'C'

Thu Jan 06 2022 00:00:00.000

'002'

'D'

Fri Jan 07 2022 00:00:00.000

'002'

'E'

Sun Jan 09 2022 00:00:00.000

'003'

'A'

Mon Jan 10 2022 00:00:00.000

'003'

'D'

Sat Jan 15 2022 00:00:00.000

'003'

'C'

Mon Jan 17 2022 00:00:00.000

'003'

'E'

Wed Jan 19 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

'003'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

1

1

1

[3]

This example computes the BPMN_CONFORMS operator for a BPMN model with a redo loop on a flattened MO table: SEQUENCE (TASK(C),TASK(B),TASK(E) ). The flattened event table over O_Obj2 contains two traces, with object 'X' conforming to the model and 'Y' not conforming.

Query

Column1

BPMN_CONFORMS ( CREATE_EVENTLOG("o_celonis_obj_2")."ACTIVITY" , [ [ 0 BPMN_START ] [ 1 BPMN_TASK 'B' ] [ 2 BPMN_TASK 'C' ] [ 3 BPMN_TASK 'D' ] [ 4 BPMN_END ] ] , [ [ 0 1 ] [ 1 2 ] [ 2 2 ] [ 2 3 ] [ 3 4 ] ] )

Input

Output

e_celonis_event_A

ID : string

TIME : date

'0'

Sat Jan 01 2022 00:00:00.000

'1'

Tue Jan 04 2022 00:00:00.000

'2'

Thu Jan 06 2022 00:00:00.000

e_celonis_event_B

ID : string

TIME : date

OBJECT_ID : string

'005'

Sun Jan 09 2022 00:00:00.000

'X'

e_celonis_event_C

ID : string

TIME : date

OBJECT_ID : string

'007'

Fri Jan 07 2022 00:00:00.000

'Y'

e_celonis_event_E

ID : string

TIME : date

OBJECT_ID : string

'006'

Mon Jan 10 2022 00:00:00.000

'X'

e_celonis_mixed_event_B

ID : string

TIME : date

PHONE : string

'001'

Sun Jan 02 2022 00:00:00.000

null

'002'

Mon Jan 03 2022 00:00:00.000

'01768'

'004'

Tue Jan 11 2022 00:00:00.000

'01273'

e_celonis_mixed_event_C

ID : string

TIME : date

PHONE : string

'003'

Wed Jan 05 2022 00:00:00.000

'01273'

e_celonis_mixed_event_D

ID : string

TIME : date

PHONE : string

'020'

Sat Jan 08 2022 00:00:00.000

null

o_celonis_obj_1

ID : int

Data : string

Obj2_ID : string

0

'foo'

'X'

1

'bar'

'X'

2

'This is a longer string'

'Y'

o_celonis_obj_2

ID : string

Value : int

'X'

100

'Y'

250

r_e_celonis_obj_1_event_A

OBJECT_ID : int

ID : string

0

'0'

0

'1'

1

'0'

r_e_celonis_obj_1_mixed_events_B

OBJECT_ID : int

ID : string

2

'004'

r_e_celonis_obj_1_mixed_events_C

OBJECT_ID : int

ID : string

0

'003'

r_e_celonis_obj_1_mixed_events_D

OBJECT_ID : int

ID : string

2

'020'

r_e_celonis_obj_2_mixed_events_B

OBJECT_ID : string

ID : string

'Y'

'001'

r_e_celonis_obj_2_mixed_events_C

OBJECT_ID : string

ID : string

'Y'

'003'

'X'

'003'

r_e_celonis_obj_2_mixed_events_D

OBJECT_ID : string

ID : string

'Y'

'020'

Foreign Keys

o_celonis_obj_2.ID

o_celonis_obj_1.Obj2_ID

o_celonis_obj_2.ID

e_celonis_event_B.OBJECT_ID

o_celonis_obj_2.ID

e_celonis_event_E.OBJECT_ID

o_celonis_obj_2.ID

e_celonis_event_C.OBJECT_ID

e_celonis_event_A.ID

r_e_celonis_obj_1_event_A.ID

o_celonis_obj_1.ID

r_e_celonis_obj_1_event_A.OBJECT_ID

e_celonis_mixed_event_C.ID

r_e_celonis_obj_1_mixed_events_C.ID

o_celonis_obj_1.ID

r_e_celonis_obj_1_mixed_events_C.OBJECT_ID

e_celonis_mixed_event_B.ID

r_e_celonis_obj_1_mixed_events_B.ID

o_celonis_obj_1.ID

r_e_celonis_obj_1_mixed_events_B.OBJECT_ID

e_celonis_mixed_event_D.ID

r_e_celonis_obj_1_mixed_events_D.ID

o_celonis_obj_1.ID

r_e_celonis_obj_1_mixed_events_D.OBJECT_ID

e_celonis_mixed_event_B.ID

r_e_celonis_obj_2_mixed_events_B.ID

o_celonis_obj_2.ID

r_e_celonis_obj_2_mixed_events_B.OBJECT_ID

e_celonis_mixed_event_C.ID

r_e_celonis_obj_2_mixed_events_C.ID

o_celonis_obj_2.ID

r_e_celonis_obj_2_mixed_events_C.OBJECT_ID

e_celonis_mixed_event_D.ID

r_e_celonis_obj_2_mixed_events_D.ID

o_celonis_obj_2.ID

r_e_celonis_obj_2_mixed_events_D.OBJECT_ID

Result

Column1 : int

0

0

[4]

This example computes the BPMN_CONFORMS operator on a more complex BPMN model containing both an exclusive and a parallel path: SEQUENCE ("A", EXCLUSIVE_CHOICE("B", PARALLEL("C", "D")), "E"). The event table contains three traces that all conform to the model.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."ACTIVITY" , [ [ 0 BPMN_START ] [ 1 BPMN_END ] [ 2 BPMN_TASK 'A' ] [ 3 BPMN_TASK 'B' ] [ 4 BPMN_TASK 'C' ] [ 5 BPMN_TASK 'D' ] [ 6 BPMN_TASK 'E' ] [ 7 BPMN_EXCLUSIVE_CHOICE ] [ 8 BPMN_EXCLUSIVE_CHOICE ] [ 9 BPMN_PARALLEL ] [ 10 BPMN_PARALLEL ] ] , [ [ 0 2 ] [ 2 7 ] [ 7 3 ] [ 7 9 ] [ 9 4 ] [ 9 5 ] [ 4 10 ] [ 5 10 ] [ 3 8 ] [ 10 8 ] [ 8 6 ] [ 6 1 ] ] )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'A'

Sat Jan 01 2022 00:00:00.000

'001'

'B'

Mon Jan 03 2022 00:00:00.000

'002'

'A'

Wed Jan 05 2022 00:00:00.000

'001'

'E'

Fri Jan 07 2022 00:00:00.000

'002'

'C'

Thu Jan 06 2022 00:00:00.000

'002'

'D'

Fri Jan 07 2022 00:00:00.000

'002'

'E'

Sun Jan 09 2022 00:00:00.000

'003'

'A'

Mon Jan 10 2022 00:00:00.000

'003'

'D'

Sat Jan 15 2022 00:00:00.000

'003'

'C'

Mon Jan 17 2022 00:00:00.000

'003'

'E'

Wed Jan 19 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

'003'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

1

1

1

[5]

Normal filters are allowed in Allowlist. A trace is conforming if any of the allowlist terms evaluates to true. This filter does not contain a shorthand and only allows the second trace since all its non-conforming moves happen after the given date.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."Activity" , [ [ 0 BPMN_START ] [ 1 BPMN_EXCLUSIVE_CHOICE ] [ 2 BPMN_TASK 'Process Order' ] [ 3 BPMN_TASK 'Cancel Order' ] [ 4 BPMN_EXCLUSIVE_CHOICE ] [ 5 BPMN_END ] ] , [ [ 0 1 ] [ 1 2 ] [ 1 3 ] [ 2 4 ] [ 3 4 ] [ 4 5 ] ] , ALLOW ( "ActivityTable"."TIMESTAMP" > {d '2022-01-15' } ) )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'Create Order'

Sat Jan 01 2022 00:00:00.000

'001'

'Cancel Order'

Sun Jan 02 2022 00:00:00.000

'002'

'Create Order'

Tue Feb 01 2022 00:00:00.000

'002'

'Process Order'

Wed Feb 02 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

0

1

[6]

Allowing one unmapped activity means the trace with SYNC(Create Order), UNMAPPED (Cancel Order) is conforming, but SYNC(Create Order), UNMAPPED(Process Order) is deviating.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."Activity" , [ [ 0 BPMN_START ] [ 1 BPMN_TASK 'Create Order' ] [ 2 BPMN_END ] ] , [ [ 0 1 ] [ 1 2 ] ] , ALLOW ( BPMN_MATCH_UNMAPPED ( 'Cancel Order' ) ) )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'Create Order'

Sat Jan 01 2022 00:00:00.000

'001'

'Cancel Order'

Sun Jan 02 2022 00:00:00.000

'002'

'Create Order'

Tue Feb 01 2022 00:00:00.000

'002'

'Process Order'

Wed Feb 02 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

1

0

[7]

A simple sequential model: A,B,C. The first trace conforms, the second and third do not due to an excessive B and C respectively. Allowing an excessive B and an excessive C marks the second and third trace as conforming.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."Activity" , [ [ 0 BPMN_START ] [ 1 BPMN_TASK 'A' ] [ 2 BPMN_TASK 'B' ] [ 3 BPMN_TASK 'C' ] [ 4 BPMN_END ] ] , [ [ 0 1 ] [ 1 2 ] [ 2 3 ] [ 3 4 ] ] , ALLOW ( BPMN_MATCH_EXCESSIVE ( 'B' ) , BPMN_MATCH_EXCESSIVE ( 'C' ) ) )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'A'

Sat Jan 01 2022 00:00:00.000

'001'

'B'

Sun Jan 02 2022 00:00:00.000

'001'

'C'

Tue Jan 04 2022 00:00:00.000

'002'

'A'

Sat Jan 01 2022 00:00:00.000

'002'

'B'

Sun Jan 02 2022 00:00:00.000

'002'

'C'

Mon Jan 03 2022 00:00:00.000

'002'

'B'

Sat Jan 08 2022 00:00:00.000

'003'

'A'

Tue Jan 11 2022 00:00:00.000

'003'

'B'

Wed Jan 12 2022 00:00:00.000

'003'

'C'

Thu Jan 13 2022 00:00:00.000

'003'

'C'

Tue Jan 18 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

'003'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

1

1

1

[8]

A simple model starting with A, then allowing for a choice between the sequence B,C and the choice between D and E. The first trace A,B,C is conforming, the second A,B,C,D contains an undesired D, the third A,B,C,E an undesired E. Allowing any undesired activities, marks all traces conforming.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."Activity" , [ [ 0 BPMN_START ] [ 1 BPMN_TASK 'A' ] [ 2 BPMN_EXCLUSIVE_CHOICE ] [ 3 BPMN_TASK 'B' ] [ 4 BPMN_TASK 'C' ] [ 5 BPMN_EXCLUSIVE_CHOICE ] [ 6 BPMN_TASK 'D' ] [ 7 BPMN_TASK 'E' ] [ 8 BPMN_EXCLUSIVE_CHOICE ] [ 9 BPMN_EXCLUSIVE_CHOICE ] [ 10 BPMN_END ] ] , [ [ 0 1 ] [ 1 2 ] [ 2 3 ] [ 2 5 ] [ 3 4 ] [ 4 9 ] [ 5 6 ] [ 5 7 ] [ 6 8 ] [ 7 8 ] [ 8 9 ] [ 9 10 ] ] , ALLOW ( BPMN_MATCH_UNDESIRED ( ANY ) ) )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'A'

Sat Jan 01 2022 00:00:00.000

'001'

'B'

Sun Jan 02 2022 00:00:00.000

'001'

'C'

Tue Jan 04 2022 00:00:00.000

'002'

'A'

Sat Jan 01 2022 00:00:00.000

'002'

'B'

Sun Jan 02 2022 00:00:00.000

'002'

'C'

Mon Jan 03 2022 00:00:00.000

'002'

'D'

Sat Jan 08 2022 00:00:00.000

'003'

'A'

Tue Jan 11 2022 00:00:00.000

'003'

'B'

Wed Jan 12 2022 00:00:00.000

'003'

'C'

Thu Jan 13 2022 00:00:00.000

'003'

'E'

Tue Jan 18 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

'003'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

1

1

1

[9]

A simple sequential model A, B, C, D. The first trace A,B,C,D is conforming, the second D,A,B,C contains an out of sequence D, the third D,B,C,A an out of sequence A and D. Allowing an out of sequence D marks the second trace conforming.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."Activity" , [ [ 0 BPMN_START ] [ 1 BPMN_TASK 'A' ] [ 2 BPMN_TASK 'B' ] [ 3 BPMN_TASK 'C' ] [ 4 BPMN_TASK 'D' ] [ 5 BPMN_END ] ] , [ [ 0 1 ] [ 1 2 ] [ 2 3 ] [ 3 4 ] [ 4 5 ] ] , ALLOW ( BPMN_MATCH_OUT_OF_SEQUENCE ( 'D' ) ) )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'A'

Sat Jan 01 2022 00:00:00.000

'001'

'B'

Sun Jan 02 2022 00:00:00.000

'001'

'C'

Tue Jan 04 2022 00:00:00.000

'001'

'D'

Wed Jan 05 2022 00:00:00.000

'002'

'D'

Sat Jan 01 2022 00:00:00.000

'002'

'A'

Sun Jan 02 2022 00:00:00.000

'002'

'B'

Mon Jan 03 2022 00:00:00.000

'002'

'C'

Tue Jan 04 2022 00:00:00.000

'003'

'D'

Tue Jan 11 2022 00:00:00.000

'003'

'B'

Wed Jan 12 2022 00:00:00.000

'003'

'C'

Thu Jan 13 2022 00:00:00.000

'003'

'A'

Tue Jan 18 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

'003'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

1

1

0

[10]

A simple model first requiring an activity A, then a looping choice between B and C, and finally ending with an E. Allowing a missing E marks both traces conforming.

Query

Column1

BPMN_CONFORMS ( "ActivityTable"."Activity" , [ [ 0 BPMN_START ] [ 1 BPMN_TASK 'A' ] [ 2 BPMN_EXCLUSIVE_CHOICE ] [ 3 BPMN_TASK 'B' ] [ 4 BPMN_TASK 'C' ] [ 5 BPMN_EXCLUSIVE_CHOICE ] [ 6 BPMN_TASK 'E' ] [ 7 BPMN_END ] ] , [ [ 0 1 ] [ 1 2 ] [ 2 3 ] [ 2 4 ] [ 3 5 ] [ 4 5 ] [ 5 2 ] [ 5 6 ] [ 6 7 ] ] , ALLOW ( BPMN_MATCH_MISSING ( 'E' ) ) )

Input

Output

ActivityTable

OBJECT_ID : string

ACTIVITY : string

TIMESTAMP : date

'001'

'A'

Sat Jan 01 2022 00:00:00.000

'001'

'C'

Sun Jan 02 2022 00:00:00.000

'001'

'C'

Tue Jan 04 2022 00:00:00.000

'001'

'C'

Wed Jan 05 2022 00:00:00.000

'002'

'A'

Sat Jan 01 2022 00:00:00.000

'002'

'B'

Sun Jan 02 2022 00:00:00.000

'002'

'C'

Mon Jan 03 2022 00:00:00.000

'002'

'C'

Tue Jan 04 2022 00:00:00.000

'002'

'C'

Fri Jan 07 2022 00:00:00.000

'002'

'B'

Sat Jan 08 2022 00:00:00.000

ObjectTable

OBJECT_ID : string

'001'

'002'

Foreign Keys

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

ObjectTable.OBJECT_ID

ActivityTable.OBJECT_ID

Result

Column1 : int

1

1