implement Combine Sets Instance Op

This commit is contained in:
Michael Becker 2025-10-09 23:02:53 -04:00
parent 5351fe7735
commit 99ec3f703f
6 changed files with 314 additions and 24 deletions

View File

@ -211,8 +211,8 @@ namespace Mocha.Core
public static Guid Instance__get__Parent_Class { get; } = new Guid("{bac8c59f-8994-41e8-b0c0-659ec8efc4e2}");
public static Guid Instance__get__Parent_Class__for__Method_Binding__HACK { get; set; }
// public static Guid Method__get__Parent_Class__HACK { get; } = new Guid("{89034a1c-50e5-47a1-abb8-076ece5343a8}");
}
// public static Guid Method__get__Parent_Class__HACK { get; } = new Guid("{89034a1c-50e5-47a1-abb8-076ece5343a8}");
}
public static class ConditionalSelectAttribute
{
// public static Guid Method__get__Abbreviation { get; } = new Guid("{f0c64709-385d-481b-8f58-83e507fb261c}");
@ -231,6 +231,7 @@ namespace Mocha.Core
{
public static Guid BuildDynamicInstanceOp { get; } = new Guid("{622edf0d-5e3d-49fd-9764-33aa304addf4}");
public static Guid FilterByTypeOp { get; } = new Guid("{8344a933-bb49-4d1c-b92a-a044fc9b9611}");
public static Guid CombineSetsOp { get; } = new Guid("{a98844a5-ede8-4b4d-a94e-5f6f15db75c0}");
}
[ExportEntities(Prefix = "IDC_", Suffix = null)]
@ -242,13 +243,13 @@ namespace Mocha.Core
/// </summary>
public static Guid ProcessUpdatesMethod { get; } = new Guid("{f042c68d-8187-4dd6-93fa-7119bb949a16}");
public static Guid GetAttributeMethod { get; } = new Guid("{c3ecf8c9-597f-417b-ad65-fae0401719c6}"); // 12
// Perform System Routine Method - 13
// Perform System Routine Method - 13
public static Guid GetReferencedAttributeMethod { get; } = new Guid("{9205c54e-921a-484c-9be2-3d3deb877474}"); // 18
public static Guid SelectFromInstanceSetMethod { get; } = new Guid("{130637B4-17A7-4394-8F4D-E83A79114E6C}"); // 19
public static Guid EvaluateBooleanExpressionMethod { get; } = new Guid("{e1529108-2f84-4a4c-89b3-a647bc3e41d7}"); // 24
// AR - Assign Relationship Method - 25
// AR - Assign Relationship Method - 25
public static Guid GetReferencedInstanceSetMethod { get; } = new Guid("{bcfd0d64-3eba-4a97-9622-f3a960877d24}"); // 26
// BEM - Build Element Method - 29
// BEM - Build Element Method - 29
public static Guid BuildAttributeMethod { get; } = new Guid("{e5879955-0093-48c8-8042-813168578af2}"); // 30
/// <summary>
/// CN - Calculate Numeric Method
@ -294,17 +295,17 @@ namespace Mocha.Core
public static Guid AssignAttributeMethod { get; } = new Guid("{3312A789-3B7A-4478-B329-4FF781504F9C}");
// CS - Compare Instance Sets Method - 91
public static Guid CalculateDateMethod { get; } = new Guid("{1e58e284-56eb-42b4-88b9-e0a691559fa6}"); // 92
// EC - Evaluate Conditions Method - 94
// SIM - Spawn Internal Message Method - 169
// BWSR - Build Web Service Response Method - 171
// GRE - Get Referenced Element Method - 197
// EC - Evaluate Conditions Method - 94
// SIM - Spawn Internal Message Method - 169
// BWSR - Build Web Service Response Method - 171
// GRE - Get Referenced Element Method - 197
public static Guid GetRelationshipMethod { get; } = new Guid("{d53c9232-89ef-4cca-8520-261da6787450}"); // 207
// IWS - Invoke Web Service Method - 208
// IWS - Invoke Web Service Method - 208
public static Guid InstanceOpMethod { get; } = new Guid("{4c814982-938f-4116-bdc1-827bae6a5f71}");
public static Guid ConditionalSelectAttributeMethod { get; } = new Guid("{d534a369-321e-4c32-bd7f-8ff2017f191e}"); // 13038
// SSC - Conditional Select from Instance Set Method - 13039
// SSC - Conditional Select from Instance Set Method - 13039
public static Guid ConditionalSelectFromInstanceSetMethod { get; } = new Guid("{ffea8e52-06e5-4e95-8c40-da3ba54ce95f}"); // 13039
}
}
public static class SystemAttributeRoutines
{
public static Guid GetRuntimeVersion { get; } = new Guid("{dc4e6c8d-936d-457f-90e9-af47e229b80c}");
@ -314,7 +315,7 @@ namespace Mocha.Core
public static Guid GetIPAddress { get; } = new Guid("{45411e57-ef6e-44f5-8801-603e567d73d4}");
public static Guid UpdateMochafile { get; } = new Guid("{9c3ae605-b8a0-4e68-9225-96674a9fb34e}");
public static Guid GetGlobalIdentifier { get; } = new Guid("{1a7ebec3-dc02-4c9b-a5df-0c72646453c9}");
}
}
public static class SystemInstanceSetRoutines
{
// public static Guid SystemInstanceSetRoutine { get; } = new Guid("{d17a6d27-da03-4b5d-9256-f67f978f403d}");
@ -498,14 +499,14 @@ namespace Mocha.Core
}
public static class Languages
{
public static Guid English { get; } = new Guid ("{68BB6038-A4B5-4EE1-AAE9-326494942062}");
public static Guid Spanish { get; } = new Guid ("{6dc357cb-37c3-43ed-ae13-6259fb109213}");
public static Guid French { get; } = new Guid ("{6bf0cf09-87c9-4e21-b360-7eb5a1c279de}");
public static Guid German { get; } = new Guid ("{c7c1d740-0d3c-493f-ab0b-fe1b42546d0a}");
public static Guid Italian { get; } = new Guid ("{cf165170-0680-4a41-8f88-88f34b2b1986}");
public static Guid Chinese { get; } = new Guid ("{6f908a9b-7464-4a16-aed9-7eccb8d39032}");
public static Guid Japanese { get; } = new Guid ("{1e16de9d-0e49-4a79-b690-4905c46a94cc}");
public static Guid Korean { get; } = new Guid ("{d03a795e-906b-49ee-87ea-c1bef4b8ee9a}");
public static Guid English { get; } = new Guid("{68BB6038-A4B5-4EE1-AAE9-326494942062}");
public static Guid Spanish { get; } = new Guid("{6dc357cb-37c3-43ed-ae13-6259fb109213}");
public static Guid French { get; } = new Guid("{6bf0cf09-87c9-4e21-b360-7eb5a1c279de}");
public static Guid German { get; } = new Guid("{c7c1d740-0d3c-493f-ab0b-fe1b42546d0a}");
public static Guid Italian { get; } = new Guid("{cf165170-0680-4a41-8f88-88f34b2b1986}");
public static Guid Chinese { get; } = new Guid("{6f908a9b-7464-4a16-aed9-7eccb8d39032}");
public static Guid Japanese { get; } = new Guid("{1e16de9d-0e49-4a79-b690-4905c46a94cc}");
public static Guid Korean { get; } = new Guid("{d03a795e-906b-49ee-87ea-c1bef4b8ee9a}");
}
public static class GroupLayoutOptions
{
@ -532,6 +533,15 @@ namespace Mocha.Core
public static Guid ParentClass { get; } = new Guid("{98da8ac1-1fea-4cb4-a278-0c5460e625fd}");
public static Guid DestinationClassForRelationship { get; } = new Guid("{cc6bf015-ea36-4cc5-8855-5047095affee}");
public static Guid Set { get; } = new Guid("{40565aa8-892b-4a36-9a8e-54d55d1c6efe}");
public static Guid SetA { get; } = new Guid("{6a41b0e4-6089-45f6-8996-901e66d36f53}");
public static Guid SetB { get; } = new Guid("{4c7f240f-dd51-451d-afe9-73ba42971214}");
}
public static class SetFunctions
{
public static Guid Union { get; } = new Guid("{62f000a2-9b51-44ba-89dc-1d4735eb0015}");
public static Guid Intersection { get; } = new Guid("{3445c281-271d-405f-ba7d-65ea1fdff0f0}");
public static Guid Complement { get; } = new Guid("{fa69b904-315b-4bb1-80a6-c71708fbfde5}");
public static Guid Difference { get; } = new Guid("{ec67f62d-387c-4179-9b03-0d9b70195688}");
}
}
}

View File

@ -462,5 +462,7 @@ namespace Mocha.Core
public static Guid Build_Dynamic_Instance_Op__assigns_instance_data_from__Parameter_Assignment { get; } = new Guid("{f5b1f747-fae3-4318-958b-a64f7cdd8b42}");
public static Guid Filter_By_Type_Op__uses__Class { get; } = new Guid("{2f5fddc8-5ab0-4c59-8a83-536a2ce0a30c}");
public static Guid Combine_Sets_Op__uses__Set_Function { get; } = new Guid("{b20e54d4-2535-44c0-8c99-0411f27a69df}");
}
}

View File

@ -69,6 +69,33 @@ public class InstanceOpMethodImplementation : MethodImplementation
context.SetWorkData(workSet, list);
}
else if (oms.IsInstanceOf(op, oms.GetInstance(KnownInstanceGuids.InstanceOpClasses.CombineSetsOp)))
{
InstanceHandle setFunction = oms.GetRelatedInstance(op, oms.GetInstance(KnownRelationshipGuids.Combine_Sets_Op__uses__Set_Function));
InstanceHandle ihSetA = oms.GetInstance(KnownInstanceGuids.WorkSets.SetA);
InstanceHandle ihSetB = oms.GetInstance(KnownInstanceGuids.WorkSets.SetB);
object? oSetA = oms.Evaluate(context, context.GetWorkData(ihSetA), InstanceHandle.Empty);
object? oSetB = oms.Evaluate(context, context.GetWorkData(ihSetB), InstanceHandle.Empty);
if (oSetA is IEnumerable<InstanceHandle> setA && oSetB is IEnumerable<InstanceHandle> setB)
{
if (setFunction == oms.GetInstance(KnownInstanceGuids.SetFunctions.Union))
{
IEnumerable<InstanceHandle> ih = setA.Union(setB);
context.SetWorkData(workSet, ih);
}
else if (setFunction == oms.GetInstance(KnownInstanceGuids.SetFunctions.Intersection))
{
IEnumerable<InstanceHandle> ih = setA.Intersect(setB);
context.SetWorkData(workSet, ih);
}
else if (setFunction == oms.GetInstance(KnownInstanceGuids.SetFunctions.Difference))
{
IEnumerable<InstanceHandle> ih = setA.Except(setB);
context.SetWorkData(workSet, ih);
}
}
}
return workSet;
}
}

View File

@ -35,4 +35,11 @@ public class OmsInstanceOpBuilder
Oms.AssignRelationship(iop, Oms.GetInstance(KnownRelationshipGuids.Filter_By_Type_Op__uses__Class), usesClass.GetHandle());
return new FilterByTypeOp(iop);
}
public CombineSetsOp CreateCombineSetsOp(IInstanceReference setFunction)
{
InstanceHandle iop = Oms.CreateInstanceOf(Oms.GetInstance(KnownInstanceGuids.InstanceOpClasses.CombineSetsOp));
Oms.AssignRelationship(iop, Oms.GetInstance(KnownRelationshipGuids.Combine_Sets_Op__uses__Set_Function), setFunction.GetHandle());
return new CombineSetsOp(iop);
}
}

View File

@ -0,0 +1,8 @@
namespace Mocha.Core.Oop.InstanceOps;
public class CombineSetsOp : InstanceOp
{
public CombineSetsOp(InstanceHandle handle) : base(handle) { }
}

View File

@ -111,6 +111,242 @@ namespace Mocha.Core.Tests.MethodTests
Assert.That(data.Count(), Is.EqualTo(2));
Assert.That(data.Contains(ihDate1) && data.Contains(ihDate2));
}
[Test]
public void CombineSetsOp_Intersection()
{
InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA);
InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB);
InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID);
InstanceHandle iA1 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA2 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA3 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA4 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB1 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB2 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB3 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB4 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle[] irSetA = new InstanceHandle[]
{
iA1,
iA2,
iA3,
iA4,
iB4
};
InstanceHandle[] irSetB = new InstanceHandle[]
{
iA2,
iB1,
iB2,
iB3,
iB4
};
OmsContext context = Oms.CreateContext();
context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA), irSetA);
context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB), irSetB);
WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets");
InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Intersection)));
InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp);
InstanceHandle workSet2 = Oms.Execute(context, iop);
IEnumerable<InstanceHandle> irSetC = context.GetWorkData<IEnumerable<InstanceHandle>>(workSet);
Assert.That(irSetC.Count(), Is.EqualTo(2));
Assert.That(irSetC.Contains(iA2) && irSetC.Contains(iB4));
}
[Test]
public void CombineSetsOp_Union()
{
InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA);
InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB);
InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID);
InstanceHandle iA1 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA2 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA3 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA4 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB1 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB2 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB3 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB4 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle[] irSetA = new InstanceHandle[]
{
iA1,
iA2,
iA3,
iA4,
iB4
};
InstanceHandle[] irSetB = new InstanceHandle[]
{
iA2,
iB1,
iB2,
iB3,
iB4
};
OmsContext context = Oms.CreateContext();
context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA), irSetA);
context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB), irSetB);
WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets");
InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Union)));
InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp);
InstanceHandle workSet2 = Oms.Execute(context, iop);
IEnumerable<InstanceHandle> irSetC = context.GetWorkData<IEnumerable<InstanceHandle>>(workSet);
Assert.That(irSetC.Count(), Is.EqualTo(8));
Assert.That(irSetC.Contains(iA2) && irSetC.Contains(iB4));
}
[Test]
public void CombineSetsOp_Difference()
{
InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA);
InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB);
InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID);
InstanceHandle iA1 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA2 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA3 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iA4 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB1 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB2 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB3 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle iB4 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle[] irSetA = new InstanceHandle[]
{
iA1,
iA2,
iA3,
iA4,
iB4
};
InstanceHandle[] irSetB = new InstanceHandle[]
{
iA2,
iB1,
iB2,
iB3,
iB4
};
OmsContext context = Oms.CreateContext();
context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA), irSetA);
context.SetWorkData(Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB), irSetB);
WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets");
InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Difference)));
InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp);
InstanceHandle workSet2 = Oms.Execute(context, iop);
IEnumerable<InstanceHandle> irSetC = context.GetWorkData<IEnumerable<InstanceHandle>>(workSet);
Assert.That(irSetC.Count(), Is.EqualTo(3));
Assert.That(irSetC.Contains(iA1) && irSetC.Contains(iA3) && irSetC.Contains(iA4));
}
[Test]
public void CombineSetsOp_Union_using_Executables()
{
InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA);
InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB);
InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID);
InstanceHandle i_TestClass1 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle i_TestClass2 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle i_TestClass3 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle i_TestClass4 = Oms.CreateInstanceOf(c_TestClass);
WorkSet wsTmp = Oms.CreateWorkSet("Temporary Work Set");
GetSpecifiedInstancesMethod m1 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_TestClass, "get", "Set A Instances", wsTmp, new InstanceHandle[] { i_TestClass1, i_TestClass2 });
ReturnInstanceSetMethodBinding rsmb1 = m1.CreateMethodBinding(Oms);
GetSpecifiedInstancesMethod m2 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_TestClass, "get", "Set B Instances", wsTmp, new InstanceHandle[] { i_TestClass3, i_TestClass4 });
ReturnInstanceSetMethodBinding rsmb2 = m2.CreateMethodBinding(Oms);
OmsContext context = Oms.CreateContext();
WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets");
InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Union)));
InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp);
MethodBinding mb = iop.CreateMethodBinding(Oms, new KeyValuePair<InstanceHandle, object?>[]
{
new KeyValuePair<InstanceHandle, object?>(ihSetA, rsmb1),
new KeyValuePair<InstanceHandle, object?>(ihSetB, rsmb2)
});
InstanceHandle workSet2 = Oms.Execute(context, mb);
IEnumerable<InstanceHandle> irSetC = context.GetWorkData<IEnumerable<InstanceHandle>>(workSet);
Assert.That(irSetC.Count(), Is.EqualTo(4));
Assert.That(irSetC.Contains(i_TestClass1) && irSetC.Contains(i_TestClass2) && irSetC.Contains(i_TestClass3) && irSetC.Contains(i_TestClass4));
}
[Test]
public void CombineSetsOp_Difference_using_Executables()
{
InstanceHandle ihSetA = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetA);
InstanceHandle ihSetB = Oms.GetInstance(KnownInstanceGuids.WorkSets.SetB);
InstanceHandle c_TestClass = Oms.GetInstance(TEST_CLASS_GUID);
InstanceHandle i_TestClass1 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle i_TestClass2 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle i_TestClass3 = Oms.CreateInstanceOf(c_TestClass);
InstanceHandle i_TestClass4 = Oms.CreateInstanceOf(c_TestClass);
WorkSet wsTmp = Oms.CreateWorkSet("Temporary Work Set");
GetSpecifiedInstancesMethod m1 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_TestClass, "get", "Set A Instances", wsTmp, new InstanceHandle[] { i_TestClass1, i_TestClass2, i_TestClass3 });
ReturnInstanceSetMethodBinding rsmb1 = m1.CreateMethodBinding(Oms);
GetSpecifiedInstancesMethod m2 = Oms.MethodBuilder.CreateGetSpecifiedInstancesMethod(c_TestClass, "get", "Set B Instances", wsTmp, new InstanceHandle[] { i_TestClass3 });
ReturnInstanceSetMethodBinding rsmb2 = m2.CreateMethodBinding(Oms);
OmsContext context = Oms.CreateContext();
WorkSet workSet = Oms.CreateWorkSet("Test Work Set for Combine Sets");
InstanceOp combineSetsOp = ((new OmsInstanceOpBuilder(Oms)).CreateCombineSetsOp(Oms.GetInstance(KnownInstanceGuids.SetFunctions.Difference)));
InstanceOpMethod iop = Oms.MethodBuilder.CreateInstanceOpMethod(c_TestClass, "combine", "Set A and Set B", AccessModifier.Public, true, workSet, combineSetsOp);
MethodBinding mb = iop.CreateMethodBinding(Oms, new KeyValuePair<InstanceHandle, object?>[]
{
new KeyValuePair<InstanceHandle, object?>(ihSetA, rsmb1),
new KeyValuePair<InstanceHandle, object?>(ihSetB, rsmb2)
});
InstanceHandle workSet2 = Oms.Execute(context, mb);
IEnumerable<InstanceHandle> irSetC = context.GetWorkData<IEnumerable<InstanceHandle>>(workSet);
Assert.That(irSetC.Count(), Is.EqualTo(2));
Assert.That(irSetC.Contains(i_TestClass1) && irSetC.Contains(i_TestClass2));
}
}
}