DCR Engine Changes
[4.13.0]
- Remove notion of ActivityReference from Worklow.Model. (Use Workflow.Activity instead, or Workflow.Activity.Id for serialization.)
[4.12.9]
- Fix error on printing out DMN expressions, they now printed out same way as any DCR expression.
- Fix error on reading in graphs with spawnContainers turning it into a subprocess.
- Fix error on parsing spawned event ID's
This includes a remake of how ID's are auto-generated to not crash with special syntax for the
expression language.
Issues:
- Parsing a value in a log correctly if the graph we rerunning/testing against does not have the ability to spawn that particular event, and rather have it defined to begin with.
- Potentiall conflict between events provided on modelling time and auto generated ID's because we need ability to define events with a spawned ID for testing against logs (see DCR query language for Indicators research/development for potential reasons).
[4.12.3]
- Add workflow middleware delegate and curried execution
[4.12.2]
- Fix an error where reading in list constant values from the xml became list expressions internally and on output again.
- Update prototype DCR.Workflow
[4.12.1]
- Replace broken release 4.12.0
[4.12.0]
- Initial values on events can now be expressions.
- The "templatespawn" relation now admits a label expression, allowing one to compute a label for a new template instance on spawn.
- template instances are now contained inside a spawnContainer to help show what instance one activity is from.
- Fix bug in templateSpawn xml encoding.
[4.11.0]
- Allow ECMA-404 escape codes in string input
[4.10.0]
Fix error reporting breaking on errors on column 0
Add FEEL functionality round(), ceil(), floor() All of the above takes an integer (wont be rounded) float or duration as input. Duration rounding will round to the longest non zero timespan in the duration. The duration is first normalized so "P3Y14M" is considered "P4Y2M" for rounding. Normalization of days is not implemented as months do not have a set number of days. "P3Y1D" will round to years, where "PT3M2S" will go to minutes. Ceil() and floor() will go to first above and first bellow as expected, round() goes to nearest (So it looks at number of months to go up or down to nearest year, but not at the number of days). As days does not get normalized we implemented that the cutoff for rounding up or down using round() is 14 for down and 15 for up (oposite if it is negative). "round(P2M14D)" = "P2M" where "round(P2M15D)" = "P3M", "round(P2M-14D) = P2M" and "round(P2M-15D) = P1M"
Fix a bug in parsing of strings with unescaped backslash. Engine now understands what to do rather than being lost in thought.
[4.9.2]
- Add ReplaceParameters function to Workflow
[4.9.1]
- Add log-only variant of ExecuteTransactionWith ... to External API.
[4.9.0]
- Make Split properly interface events refered to in the dataSetActivity attribute for choice events.
- Add DMN-XML/expression language compiler
[4.8.3]
- Fix parsing/lexing of lists within lists so we do not need whitespaces between the list boarders.
- Fix parsing/lexing issue with needing a white space between the subtraction sign and an integer to subtract it from another. This means that "5 - 3" can be written as "5-3" now.
[4.8.2]
- Improve runtime error API
- Fix list null FEEL semantics
[4.8.1]
- Fix several issues in parsing / outputting strings with quoted string terminators
- Stop enabledness computation evaluating guards on effect relations
[4.8.0]
- Add Modulo operand to the expression language. This can be written "5 % 2" or "modulo(5,2)" depending on preference.
- TemplateSpawn Beta version added to the ACTA engine.
- Make values in a log be parsed acording to the executed events datatype.
- Add Lists to the expression language. Syntax is [1,3,5]. Expressions are allowed so [1+1,1+2,2+3,3+5,5+8] is a valid list. Any value type is allowed even mixed so the following list is valid [2,'lost',[P7D,3],4].
FEEL functions for lists added. Currently supported operations:
append([1,2],3,4,5) - Append one or more values to the end of the list. concatenate([2,4],[1,3],[5]) - Concatenate two or more lists together. list contains ([1,2,3],4) - Checks if the list contains the second parameter. count ([1,2,3]) - Gives the number of elements in the list.
[4.7.0]
- Improve error reporting on syntax and expression evaluation errors
[4.6.7]
- Fix bugs in filter-by-activations
- Improve testing
[4.6.6]
- Fix cause missing / misreported in replay
[4.6.5]
- Remove unnecessary typeparameter from FilterRelationsByActivations
[4.6.4]
- Record pending causation in VM
[4.6.3]
- Improve timing bound computation perf
[4.6.2]
- Fix VM/ACTA autoswitching
[4.6.1]
- Remove superfluous type annotation from FilterRelationsByActivations
[4.6.0]
- Support relation analysis (vm)
- Automatically switch between VM/ACTA engines in validation (analyser)
- Improve informal presentation of durations (core)
- Add deadline in message on deadline violations (loki)
- Fix filter relations by activations
[4.5.2]
- Add Sequence computation to Workflow
[4.5.1]
- Add Floor / Ceil to Duration
[4.5.0]
- Add timing bounds computation to replay
[4.4.0]
[156475] Make DMN input allow any dcr-expression as input. This includes the values in DMN sequences (careful of type errors on creation).
Add GetTag, IsLocallyAccepting to Workflow
[4.3.14]
- Add pending-under, block functionality to Workflow
[4.3.13]
- Locate unresolved interface-from-outer events
[4.3.12]
- Allow unresolved interface-from-outer in child splice
- Improve splice error messages
[4.3.11]
- Add Robot, REST to Workflow layer
[4.3.10]
- Align use of quotes in user-facing violation messages
[4.3.9]
- Add "cause" attribute to reason output for deadline violations
[4.3.8]
- Remove ModelSummary from workflow
[4.3.7]
- Fix workflow reporting effectively excluded deadlines
[4.3.6]
- Fix replay API not reporting late subprocesses
[4.3.5]
- Add FilterByActivation to validation API
[4.3.4]
- Update Worklow.Model serialization properties for EF SqlServer compatibility
[4.3.3]
- Add missing files
[4.3.2]
- [144127] Fix issue where exception was thrown if an event had a phase that was not defined in current graph. (This occurs when you splice in a fragment with different phases than the mother graph)
- Fix issue where workdays was not used propperly for time calculations.
[4.3.0]
- Add "now()" and "today()" to expression language, they work the same as "now" do.
- Fix some errors in FEEL where functions using "months" and "years" was using "month" and "year" instead.
- Add workdays in to the expression language and as datatype. Use "P2WD" for 2 workdays or "workday(2)" for the same. can be and subtracted from eachother and to and from a date. If date will skip over saturdays and sundays when calculating the next workday.
[4.1.2]
- Add DateTimeOffset constructor to Value
[4.1.1]
- Add Xml serializer to workflow model
[4.1.0]
- Add prototype workflow library
[4.0.15]
- Add phase support to light serialiser
[4.0.14]
- Add datatype support to light serialiser
[4.0.13]
- Add form type to light serialiser
[4.0.12]
- Correctly add parent attribute to getenabledorpending
- Add included, executed attributes to light serialiser
[4.0.11]
- Update Light deserializer to correctly localise contained activities
[4.0.10]
- Add parent attribute to getenabledorpending
[4.0.9]
- Update Light deserializer to handle deadlines, activity types, logical include, precondition
[4.0.8]
- Revert External API to report full path for IDs
- Expose certain analyser utilities in DCR.IO
[4.0.7]
- Partially revert External API fix for GetEnabledOrPending
[4.0.6]
- Fix atomic remove event exception
[4.0.5]
- Fix content not removed by remove event
[4.0.4]
- Fix 139525
[4.0.3]
- Update semantics of phase computation
[4.0.2]
- Test release for devops Nuget feed
[4.0.1]
- Update build process
[4.0.0]
- Fix unnecessary guard evaluation on delay computation
- Now Removes fragment specific attributes on splice.
[3.12.0]
- Fix parser shift/reduction error
- Add propper escaping of JSON strings to JSON's
- Integrate TEO External API a.k.a. "ProcessEngine"
[3.11.0]
- Added the following FEEL functions
- year and month duration (date d1, date d2) -> duration. Gives the difference between the two dates in whole years and months.
- year duration (date d1, date d2) -> duration. Gives the difference between the two dates in whole years
- month duration (date d1, date d2) -> duration. Gives the difference between the two dates in whole months.
[3.10.0]
- Implemented following FEEL functions
- number(string x) -> float. Parses the string x into a floating point number (exception if x cannot be converted to a float)
- string(any x) -> string. Converts the value of x into its string representation.
- string length(string x) -> integer. Returns the length of x
- substring(string x, int y) -> string. Returns the substring of x starting on character y (first character is considered 1)
- substring(string x, int y, int z) -> string. Returns the substring of x with length z starting on character y.
- date(int x, int y, int z) -> string. Returns a datetime with year set to x, month set to y and day set to z.
- Attributes: "year", "month", "weekday", "day", "hour", "minute" to DateTime types so you can extract the requested component, usage: "1999-01-01T00:00:00.0000000Z.year" will be "1999" as an int.
- Attributes: "years", "months", "days", "hours", "minutes", to Durations
- Implemented the value relation. This relation sets the value of the target event to the value of the expression on it when the relation source executes.
- Fix issue of splitting of forms inside a spawn, where value from the spawned event was used in an expression
- Find and report 'Deserialization error' on XML load
- Fix issue where a pending nest would make a graph non-accepting
- Fix default activity-weight ignored in generator
- Add validatelog call to Bifrost
- Fix issue where "@" notations would cause a crash of the engine when trying to split a graph.
[3.9.0]
- Fix bug in phase-computation
- Add action-required computation
- Fix bug where tryCalculayeLeafPhase and tryCalculatePhase was using as old calculation.
- [132198] Added accepting attribute to runtime part of xml. Attribute states if graph is in an accepting state or not.
[v3.8.0]
- Add alternative phase computation
[v3.7.4]
- [128968] Error now returned if one try splice two graphs with an event each where neither is interfaces but they have same ID.
- Fix bug where excluded deadlines are returned as next deadline.
- next deadline and next delay now ignore effectively Excluded events.
[v3.7.3]
- Fix incorrect use of nesting inclusion state in inhibited computation
[v3.7.2]
- [5941] Add Whynot serialization to IEvent
- [128186] Resolve conflicting attrs under split
- [126506] Set initial values to be value from "default" attribute in event datatype xml node. Values in globalStore take precedence
[v3.7.1]
- Add "parent" field to IEvent.
- Make split transport some attributes from event to new graph
- Fix bad UI in analysis summary
[v3.7.0]
- Add "if then else" structure to the expression language
- Fix next delay calculation to ignore excluded delayed events.
[v3.6.1]
- Fix splice failure when target is a subprocess contained in another subprocess
[v3.6.0]
- Improve analyser performance (parallellisation, memoisation)
- Fix (excluded) nestings being reported as enabled
- Add ability to obtain the marking of an event to be used in guards:
For an event "e" we have that:
e@included -> gives the included state of e as a bool e@executed -> gives the executed state of e as a bool e@pending -> gives the pending state of e as a bool e@timestamp -> gives the time e was executed or null if not executed e@deadline -> gives the deadline e has to be executed if it is pending with a deadline, or null if not pending or set to "eventually".
- Choice now treated as string inputs.
- Add ability to parse data values according to event data type. (new api call, graph.ParseToValue(Path path, String value) ) If type not implemented treated as string.
- Add functionality to parse choice as string or int, depending on attribute in xml for choice datatype.
[v3.5.1]
- [120136] Fix incorrect analyser HTML/JS output
[v3.5.0]
- [119612] Fix analyser breaking on null percentage/weight
- [#171] Add new call TryComputePhase(out success) to the APi. If a phase can be
computed success is set to "true", else "false". In the former case,
a tuple (key, label) representing the current phase of the graph; in the latter
the graph is not in a well-defined phase.
- Sideeffect: The call Analyser.AnalyseTrace(int, ref XElement) now has the following type: Analyser.AnalyseTrace(int, out XElement), which is more in line with C# standards.
- [119632] Any empty or missing delta attribute in advance tags is treated as the zero duration.
[v3.4.0]
- [119420] Report trace violations indexed by top-level tag placement
- [119140] Allow rewrites of PLACEHOLDER__LOG to suppress console chatter in business intelligence module
While functionally a patch, this release changes engine internals in ways that /may/ break binary compatibility, hence the minor version increase.
v3.3.11
- Fix incorrect "valid" attribute on single-trace rerun
- Fix non-HTTPS loading of fonts in analyser
Fix console chatter in analyser
v3.3.10
[118674] Fix incorrect analyser output on non-zero weights
v3.3.9
[#132] Add role violation check to rerun
- Handle time in logs with advance entries and not execution times for Analyser
- Remove exception's thrown from empty logs and traces in Analyser
v3.3.8
- Add business intelligence v1 to analyser library
- Update styling for LTS analyser
v3.3.7
- Add react business intelligence analysis viewer
- Add activity and trace timings to trace summary analysis
- Fix incorrect parent non-execution under recoverable deadline violations
v3.3.6
- Use HTTPS to request fonts in analyser
- Update Engine API samples
v3.3.5
Bugfixes
- ExecuteTransaction now recovers from deadline violations
- ExecuteTransaction now returns correct error messages on failure
v3.3.4
- Add EvalExpression to Engine API
- [#133] Add ValidateLog and ValidateTrace to Engine API
- Updated ExecutionService to handle exception UserNotAllowed
- Fix error number sequencing
- Treat the empty string and None identically for return message in exception UserNotAllowed
- [#169] Deserialize logs with attributes "init" and "initTime" the same way. If both are present, "init" is taken as the correct one. This solves an issue with Analysis.AnnotateLog which would give negative timestamps if the trace used the wrong attribute for its initialisation time.
- [#168] Allows empty expressions to be parsed. They will be parsed as the expression "true"
v3.3.2
1 October 2020
- Fix missing output in block analyser on dotnet core 2.x
- Add full-page output option to block analyser
v3.3.1
29 September 2020
- Fix bug in log annotation when transactions are present
v3.3.0
28 September 2020
- Add block-diagram trace breakdown analyser
v3.2.2
23 September 2020
- Allow split on graphs with replication ("forms inside spawn")
v3.2.1
16 September 2020
- [#167] Add event preconditions, run-time state access, and run-time i user-id id access
- Compress visualisation of multiple self-edges in transition system output
v3.2.0
16 September 2020
- [#166] Add timing statistics to analyser
- Fix log replay allowing all violations when asked to allow deadline violations
v3.1.4
2 September 2020
- Performance enhancements for log replay
- [#165] Add field
Name
toIEvent
returning event name - [#164] Add effectively-pending and -included to
IEvent
- Fix bug in evaluation of expressions with relative paths after on spawn
- [#163] Fix bug in event removal API
v3.1.3
15 June 2020
- [#161] Fix bug in placement of transaction markers
v3.1.2
4 June 2020
Merges 3.0.8--3.0.10 bugfixes into 3.1.x mainline.
- [#157] [#158] Execution an event with data null is now marked in the log, where executing without data is not marked with any data. Example format:
<log>
<trace init="2020-02-26T09:28:21.8176780+00:00">
<event id="String" timestamp="2020-02-26T09:28:21.8176780+00:00" label="String" isNull="false" data="string" type="string" />
<event id="Int" timestamp="2020-02-26T09:28:21.8176780+00:00" label="Int" isNull="false" data="123" type="null" />
<event id="Double" timestamp="2020-02-26T09:28:21.8176780+00:00" label="Double" isNull="true" data="2.2" type="null" />
<event id="Date" timestamp="2020-02-26T09:28:21.8176780+00:00" label="Date" isNull="true" data="2020-07-06T10:07:13.0000001+00:00" type="date" />
</trace>
</log>
- [#159] Duration calculations now cut the milis as these cause the engine to crash when timestamps was automatically generated.
- Split fails on non--top-level subprocess
v3.0.10
18 May 2020
Bug fixes
- [#157] [#158] Execution an event with data null is now marked in the log, where executing without data is not marked with any data. Example format:
<log>
<trace init="2020-02-26T09:28:21.8176780+00:00">
<event id="String" timestamp="2020-02-26T09:28:21.8176780+00:00" label="String" isNull="false" data="string" type="string" />
<event id="Int" timestamp="2020-02-26T09:28:21.8176780+00:00" label="Int" isNull="false" data="123" type="null" />
<event id="Double" timestamp="2020-02-26T09:28:21.8176780+00:00" label="Double" isNull="true" data="2.2" type="null" />
<event id="Date" timestamp="2020-02-26T09:28:21.8176780+00:00" label="Date" isNull="true" data="2020-07-06T10:07:13.0000001+00:00" type="date" />
</trace>
</log>
- [#159] Duration calculations now cut the milis as these cause the engine to crash when timestamps was automatically generated.
v3.0.8
Bug fixes
- Split fails on non--top-level subprocess
v3.1.1
9 May 2020
Bug fixes
- [#160] Response fails to override old deadline
- [#142] Labels in logs incorrectly includes full path
v3.1.0
Features
- [#153] Add transactional sub-run marker in log. Example format:
<log> <trace init="2016-05-07T09:00:00.0000000+00:00"> <transaction id="S"> <event id="A" timestamp="2016-05-07T09:00:00.0000000+00:00" label="A" /> <event id="B" timestamp="2016-05-07T10:00:00.0000000+00:00" label="B" /> <event id="C" timestamp="2016-05-07T11:00:00.0000000+00:00" label="C" /> </transaction> </trace> </log>
[#149] Add support for split on atomic (non-subprocess) events. See API documentation for C# Split.
[#142] Add path expansion ("flexible path matching").
This feature should fix problems with correctly identifying events in forms nested inside subprocesses etc. In general, if provided a pathA.B
, the engine will attempt to expand this any unique path containingA.B
as non-consecutive substring. E.g.,A.B
will match any of the pathsX.A.B X.A.Y.B X.A.Y.Z.B
It will not match a path not ending in
B
, and it will throw an error if more than one path matches.
Bug fixes
- [#152] Fix split/rerun failures on paths with nestings
- [#151] Fix serialisation of null Data values for logs
- [#150] Fix deadline ordering bug
- [#148] Correctly treat special builtins such as "now"
- [#530fe80] Correctly build Analyser on net461
Closed issues
- [#154] Delay ordering possibly wrong. Testing revealed no issue; see issue.
v3.0.7
4 March 2020
Bug fixes
- [#147] now also parses negative years in durations.
v3.0.6
3 March 2020
Bug fixes
- [#147] Propperly parses durations with negative parts.
v3.0.5
28 Feburary 2020
Updates to log format
- [#145] Datatype added to execution log of events.
Updates to interfaces
- [#140] Interface attributes changed from "interfaceFromInner" and "interfaceFromOuter" to one attribute "interfaceType = " with possible parameters "inner" and "outer". Engine parses the old attributes as before.
Bug fixes
- [#139] Floats now printed with at least one decimal precision.
- [#141] Events referred in Computations now propperly become interfaces
- [#143] Split now allows for less specific paths of events.
- [#144] Replay should no longer misreport type errors as EID not found
- [#146] Date time should now support 3-digit sub-second precision
v3.0.4
23 January 2020
Bug fixes
- A null value variable does not break duration expressions, rather treated as 0 in de-serializing
v3.0.3
23 January 2020
Bug fixes
- [#136] Remove "-" from eventID's to sort out parsing of expressions.
- [#137] Split returns inner graph without logs now.
- [#138] Propper handling of pinned delays.
- A null value variable does not break duration expressions, rather treated as 0.
v3.0.2
16 January 2020
Bug fixes
- [#134] Correclty parse old representation of zero time
0001-01-01T00:00:00.0000000
- Parse date/time with no offset/timezone in CET
v3.0.1
6 January 2020
Updates to log format
[#128] Durations are now allowed in timestamp
attributes on events in logs.
A timestamp P2D
means "2 days after previous event execution". This change is
only relevant in the analyser; the engine does not output durations as timestamps.
API reversion in ExecutionService
[#127,#130] To faciliate backwards compatibility with use of the old
IExecutionService
API in the context of SOAP services, the
IExecutionService
API has been reverted from using DateTimeOffset
to
DateTime
. Provided dates are assumed to be in UTC (the old assumption) and
translated to offset 0.
Bug fixes
- [#129] The analyser now produces correct output for the empty log.
- [#131] CET timezone is now correctly retrieved on non-unix platforms.
[#126] AssemblyVersion and FileVersion are now correctly set.
The version is also accessible within the expression language as the special symbol
__ENGINE_VERSION__
.
v3.0.0
18 December 2019
Represent time differences as ISO8601 durations (#98)
Previous versions of the engine would only accept time differences given in number of days. Using ISO8601 durations allow specification of time differences at the granularity of years, months, days, hours, minutes, and seconds.
Refer to the API documentation for details. In particular, the string serialisation is given here; it is a generalisation of the ISO8601 duration to allow also negative durations.
Add pinned-duration syntax (#49, #123)
This change allows users to specify deadlines as "7 days from now at 10am", which is expressed as P7D @ 10:00
. We call such a value a "pinned duration". The syntax allowed is in general <duration> @ hh:mm
, where duration
is an ISO8601 duration (see above.)
When a response has a deadline given as a pinned duration, this duration is
serialised in the time
attribute as usual, e.g.:
<responses>
<response
sourceId="A" targetId="B"
filterLevel="0" description=""
time="(P2D @ 10:30)"
groups="" />
</responses>
Since pinned durations are values in the expression language, they are allowed wherever any other value is allowed. Most notably, they may be values of events, in which case they are serialised as follows:
<variable id="Activity1" value="P2D @ 10:00" isNull="false" type="pinned-duration" />
The meaning of a pinned duration necessarily depends on the timezone in which
it is evaluated. Setting the time to 10:00
produces a different outcome in
CET than it does in PST. Therefore, the TimeManager
mechanism of the engine
now allows specifying the
timezone
in which pins should be interpreted. If no timezone is specified, the engine
defaults to CET.
Allow time offset specification in absolute dates
The engine now accepts also the ISO offset format, e.g.,
2019-12-24T18:00:00.0000000+01:00
. This also means that the engine will
output dates on the form 2019-12-24T18:00:00.0000000+00:00
as opposed to the
previous 2019-12-24T18:00:00.0000000Z
.
Allow arbitrary expressions for initial time (#104)
The engine now allows any expression as the initial value of executed times and pending deadlines. This feature is useful for setting deadlines that are dependent on initialisation time; e.g., setting an initial deadline of P3M
means "exactly three months after initialisation", or setting an initial deadline which depends on the value of a variable P3M + start_date
(where start_date
is an event id).
Use this feature by supplying arbitrary expressions in runtime/marking/executed
(for executed times) or runtime/marking/pendingResponses
(for deadlines). For instance:
<executed>
<event id="A" time="P3M" />
</executed>
<pendingResponses>
<event id="B" deadline="P3M + start_date" />
</pendingResponses>
Allow absolute dates as deadlines/delays
This change allows users to specify deadlines as absolute days such as 2019-12-24T18:00:00.0000000+01:00
. This is most useful when deadlines are the data of input events, e.g.:
┌─────┬─┐
│ └─┤
│ Date │
│ │
└───────┘
┌───────┐ ┌───────┐
│ │ Date │ │
│ A │●─────────▶│ B │
│ │ │ │
└───────┘ └───────┘
Executing first Date
with data "2019-12-24T18:00:00.0000000+01:00", then A
will set the deadline for B
to the value of Date
, in this case Christmas Eve.
Use this feature in time attributes of <response>
and <condition>
elements, e.g.,:
<responses>
<response sourceId="A" targetId="B" filterLevel="0" description=""
time="2019-12-24T18:00:00.0000000+01:00"
groups="" />
</responses>
Add partial and local matching of event ids (#95, #110)
This change is only relevant if for graphs using subprocesses or applications of the splice/insert API (including the forms engine). In these cases, events have to be specified by paths through the nesting/subprocess structure of the graph. Here is an example graph, where N is a nesting, S is subprocess, and A and B are events:
┌───────────────────────────────────┐
│ N │
│ │
│ ┌───────────────┐ │
│ │ S │ │
│ │ │ │
│ │ ┌───────┐ │ │
│ │ │ │ │ ┌───────┐ │
│ │ │ A │ │ │ │ │
│ │ │ │ │ │ B │ │
│ │ └───────┘ │ │ │ │
│ └───────────────┘ └───────┘ │
└───────────────────────────────────┘
Previously, a guard mentioning A
would have to say N.S.A
. This change means that the engine will fill in the blanks if you give it a partial path. All of A
, S.A
, N.A
, and N.S.A
will correctly identify the event A
.
Moreover, paths are now allowed to start with .
, in which case they are interpreted not from the root of the graph but from wherever the expression is located. This makes it possible to have guards inside spawned subprocesses that refer to other things inside the same spawn instance. E.g.:
┌───────┐ ┌─────────────────────────────────────────────┐
│ │ │ Multi-instance │
│ X │───────────◎│ subprocess template │
│ │ │ │
└───────┘ │ │
│ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ │ │ │ .A > 0 │ │ │
│ │ A │ │ B │●─────────▶│ C │ │
│ │ │ │ │ │ │ │
│ └───────┘ └───────┘ └───────┘ │
└─────────────────────────────────────────────┘
Note the path .A
with a leading dot: This means that the path is interpreted starting inside the instance, where it will properly match the A
to the left of it. This means that if you spawn multiple instances (by executing X
several times), the guard .A
in each instance will refer to "its own" copy of the event A
.
Miscellaneous changes
- Remove tests from samples [#116]
- Improve error-reporting for splice API [#121]
- Fix precedence issue with
*
,+
[#124] - Add coercion from Bool to Int [#125]
Compatibility
C# API Compatibility
The changes above include the following breaking changes to the C# API.
- In
IExecutionService
, the methodCheckTimeSpan
has been replaced with a methodCheckDuration
. - In Graph, the method
ParseTimeSpan
has been replaced by ParseDuration. - In TimeManager the type of the method OffsetBy has changed to now accept a Duration (as opposed to previously a TimeSpan).
- In Graph, the AddCondition and AddResponse methods now take a Duration where they previously took a
TimeSpan
.
Serialisation Compatibility
The version of the engine will correctly read and interpret XML serialised by previous versions.
This version of the engine will produce serialised XML that cannot be read by previous versions of the engine.