/// <summary> /// Create the <see cref="ActualFiniteState"/>s for a <see cref="ActualFiniteStateList"/> /// </summary> /// <param name="pslCollection">The ordered collection of <see cref="PossibleFiniteStateList"/></param> /// <param name="pslIndex">The index of the <see cref="PossibleFiniteStateList"/> in the collection to process</param> /// <param name="possibleStateIds">The current collection of <see cref="Guid"/> to use for the <see cref="ActualFiniteState"/> to create</param> /// <param name="container">The <see cref="ActualFiniteStateList"/></param> /// <param name="transaction">The current <see cref="NpgsqlTransaction"/></param> /// <param name="partition">The partition in the database</param> /// <param name="oldActualStates">The old <see cref="ActualFiniteState"/></param> /// <param name="newOldStateMap">The resulting map that links the new to old <see cref="ActualFiniteState"/></param> private void CreateActualStates(IReadOnlyList <PossibleFiniteStateList> pslCollection, int pslIndex, IEnumerable <Guid> possibleStateIds, ActualFiniteStateList container, NpgsqlTransaction transaction, string partition, IReadOnlyList <ActualFiniteState> oldActualStates, ref Dictionary <ActualFiniteState, ActualFiniteState> newOldStateMap) { var currentPossibleStateIds = possibleStateIds == null ? new List <Guid>() : possibleStateIds.ToList(); // build the different PossibleStates combination taken from the PossibleFiniteStateLists and create an ActualState for each of these combinations foreach (var orderedItem in pslCollection[pslIndex].PossibleState.OrderBy(x => x.K)) { var newPossibleStateIds = currentPossibleStateIds.ToList(); newPossibleStateIds.Add(Guid.Parse(orderedItem.V.ToString())); // Last PossibleFiniteStateList in the ordered collection if (pslIndex == pslCollection.Count - 1) { // create actual state var newActualstate = new ActualFiniteState(Guid.NewGuid(), 1); newActualstate.PossibleState.AddRange(newPossibleStateIds); this.ActualFiniteStateService.CreateConcept(transaction, partition, newActualstate, container); var oldActualState = oldActualStates.FirstOrDefault(x => x.PossibleState.All(ps => newPossibleStateIds.Contains(ps))); newActualstate.Kind = oldActualState?.Kind ?? ActualFiniteStateKind.MANDATORY; newOldStateMap.Add(newActualstate, oldActualState); continue; } this.CreateActualStates(pslCollection, pslIndex + 1, newPossibleStateIds, container, transaction, partition, oldActualStates, ref newOldStateMap); } }
/// <summary> /// Instantiate and deserialize the properties of a <paramref name="ActualFiniteState"/> /// </summary> /// <param name="jObject">The <see cref="JObject"/> containing the data</param> /// <returns>The <see cref="ActualFiniteState"/> to instantiate</returns> public static CDP4Common.DTO.ActualFiniteState FromJsonObject(JObject jObject) { var iid = jObject["iid"].ToObject <Guid>(); var revisionNumber = jObject["revisionNumber"].IsNullOrEmpty() ? 0 : jObject["revisionNumber"].ToObject <int>(); var actualFiniteState = new CDP4Common.DTO.ActualFiniteState(iid, revisionNumber); if (!jObject["excludedDomain"].IsNullOrEmpty()) { actualFiniteState.ExcludedDomain.AddRange(jObject["excludedDomain"].ToObject <IEnumerable <Guid> >()); } if (!jObject["excludedPerson"].IsNullOrEmpty()) { actualFiniteState.ExcludedPerson.AddRange(jObject["excludedPerson"].ToObject <IEnumerable <Guid> >()); } if (!jObject["kind"].IsNullOrEmpty()) { actualFiniteState.Kind = jObject["kind"].ToObject <ActualFiniteStateKind>(); } if (!jObject["modifiedOn"].IsNullOrEmpty()) { actualFiniteState.ModifiedOn = jObject["modifiedOn"].ToObject <DateTime>(); } if (!jObject["possibleState"].IsNullOrEmpty()) { actualFiniteState.PossibleState.AddRange(jObject["possibleState"].ToObject <IEnumerable <Guid> >()); } if (!jObject["thingPreference"].IsNullOrEmpty()) { actualFiniteState.ThingPreference = jObject["thingPreference"].ToObject <string>(); } return(actualFiniteState); }