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

@ -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)]
@ -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));
}
}
}