From d40ec70132ebb324873cb8c3868eb65309f46f8c Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 6 Dec 2023 23:52:07 +0100 Subject: feat: state-based store for cross references Efficiently store cross references even if default ref(*, *): false. Uses propagation rules instead of view queries to reason about type constraints and multiplicity. --- .../translator/metamodel/MetamodelBuilderTest.java | 34 ++++++++++++++++------ .../translator/metamodel/MetamodelTest.java | 30 +++++++++++++------ 2 files changed, 46 insertions(+), 18 deletions(-) (limited to 'subprojects/store-reasoning/src/test/java') diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilderTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilderTest.java index 0f1a1006..ba6ba6da 100644 --- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilderTest.java +++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilderTest.java @@ -8,7 +8,6 @@ package tools.refinery.store.reasoning.translator.metamodel; import org.junit.jupiter.api.Test; import tools.refinery.store.reasoning.representation.PartialRelation; import tools.refinery.store.reasoning.translator.TranslationException; -import tools.refinery.store.reasoning.translator.multiplicity.ConstrainedMultiplicity; import tools.refinery.store.representation.cardinality.CardinalityIntervals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -24,8 +23,13 @@ class MetamodelBuilderTest { var builder = Metamodel.builder() .type(university) .type(course) - .reference(courses, university, course, location) - .reference(location, course, university); + .reference(courses, referenceBuilder -> referenceBuilder + .source(university) + .target(course) + .opposite(location)) + .reference(location, referenceBuilder -> referenceBuilder + .source(course) + .target(university)); assertThrows(TranslationException.class, builder::build); } @@ -35,8 +39,14 @@ class MetamodelBuilderTest { var builder = Metamodel.builder() .type(university) .type(course) - .reference(courses, university, course, location) - .reference(location, course, course, courses); + .reference(courses, referenceBuilder -> referenceBuilder + .source(university) + .target(course) + .opposite(location)) + .reference(location, referenceBuilder -> referenceBuilder + .source(course) + .target(course) + .opposite(courses)); assertThrows(TranslationException.class, builder::build); } @@ -48,10 +58,16 @@ class MetamodelBuilderTest { var builder = Metamodel.builder() .type(university) .type(course) - .reference(courses, university, true, course, location) - .reference(location, course, - ConstrainedMultiplicity.of(CardinalityIntervals.atLeast(2), invalidMultiplicity), - university, courses); + .reference(courses, referenceBuilder -> referenceBuilder + .containment(true) + .source(university) + .target(course) + .opposite(location)) + .reference(location, referenceBuilder -> referenceBuilder + .source(course) + .multiplicity(CardinalityIntervals.atLeast(2), invalidMultiplicity) + .target(university) + .opposite(courses)); assertThrows(TranslationException.class, builder::build); } diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java index 6c2f55af..88e6a4d7 100644 --- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java +++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java @@ -16,7 +16,6 @@ import tools.refinery.store.reasoning.representation.PartialRelation; import tools.refinery.store.reasoning.seed.ModelSeed; import tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator; import tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator; -import tools.refinery.store.reasoning.translator.multiplicity.ConstrainedMultiplicity; import tools.refinery.store.representation.TruthValue; import tools.refinery.store.representation.cardinality.CardinalityIntervals; import tools.refinery.store.tuple.Tuple; @@ -45,12 +44,23 @@ class MetamodelTest { .type(teacher, person) .type(university) .type(course) - .reference(courses, university, true, course, location) - .reference(location, course, university, courses) - .reference(lecturer, course, - ConstrainedMultiplicity.of(CardinalityIntervals.ONE, invalidLecturerCount), teacher) - .reference(enrolledStudents, course, - ConstrainedMultiplicity.of(CardinalityIntervals.SOME, invalidStudentCount), student) + .reference(courses, builder -> builder + .containment(true) + .source(university) + .target(course) + .opposite(location)) + .reference(location, builder -> builder + .source(course) + .target(university) + .opposite(courses)) + .reference(lecturer, builder -> builder + .source(course) + .multiplicity(CardinalityIntervals.ONE, invalidLecturerCount) + .target(teacher)) + .reference(enrolledStudents, builder -> builder + .source(course) + .multiplicity(CardinalityIntervals.SOME, invalidStudentCount) + .target(student)) .build(); var seed = ModelSeed.builder(5) @@ -105,10 +115,12 @@ class MetamodelTest { var metamodel = Metamodel.builder() .type(university) .type(course) - .reference(courses, university, true, course) + .reference(courses, builder -> builder + .containment(true) + .source(university) + .target(course)) .build(); - var seed = ModelSeed.builder(4) .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder .reducedValue(CardinalityIntervals.ONE) -- cgit v1.2.3-54-g00ecf