From 120d06f27bfab54027f27a15787510397af06f4b Mon Sep 17 00:00:00 2001 From: Dominic Burger Date: Mon, 18 Dec 2023 11:16:51 +0100 Subject: [PATCH] Remove AreaAttr from Union function and return MULTIAREA --- .../extensions/functions/UnionIoxPlugin.java | 26 ++++------------ src/model/GeoW_FunctionsExt.ili | 6 ++-- ...> MandatoryConstraintMergedInnerRings.ili} | 12 ++++--- .../data/Union/MandatoryConstraintThis.ili | 4 +-- src/test/data/Union/SetConstraintAll.ili | 31 ------------------- .../data/Union/TestDataMergedInnerRings.xtf | 2 -- .../functions/UnionIoxPluginTest.java | 14 ++------- 7 files changed, 20 insertions(+), 75 deletions(-) rename src/test/data/Union/{SetConstraintMergedInnerRings.ili => MandatoryConstraintMergedInnerRings.ili} (62%) delete mode 100644 src/test/data/Union/SetConstraintAll.ili diff --git a/src/main/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPlugin.java b/src/main/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPlugin.java index 4c355a3..e0b7aec 100644 --- a/src/main/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPlugin.java +++ b/src/main/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPlugin.java @@ -1,12 +1,11 @@ package ch.geowerkstatt.ilivalidator.extensions.functions; import ch.ehi.basics.types.OutParam; -import ch.interlis.ili2c.metamodel.PathEl; -import ch.interlis.ili2c.metamodel.Viewable; import ch.interlis.iom.IomObject; import ch.interlis.iox.IoxException; import ch.interlis.iox_j.jts.Iox2jtsException; import ch.interlis.iox_j.jts.Iox2jtsext; +import ch.interlis.iox_j.jts.Jts2iox; import ch.interlis.iox_j.jts.Jtsext2iox; import ch.interlis.iox_j.validator.Value; import com.vividsolutions.jts.geom.Geometry; @@ -30,28 +29,15 @@ public String getQualifiedIliName() { @Override protected Value evaluateInternal(String validationKind, String usageScope, IomObject contextObject, Value[] actualArguments) { - Value argObjects = actualArguments[0]; // OBJECTS OF ANYCLASS - Value argPath = actualArguments[1]; // TEXT + Value argGeometries = actualArguments[0]; - if (argObjects.isUndefined()) { + if (argGeometries.isUndefined()) { return Value.createSkipEvaluation(); } - if (argObjects.getComplexObjects() == null) { - return Value.createUndefined(); - } - - Collection surfaces; - if (argPath.isUndefined()) { - surfaces = argObjects.getComplexObjects(); - } else { - Viewable contextClass = EvaluationHelper.getContextClass(td, contextObject, argObjects); - if (contextClass == null) { - throw new IllegalStateException("unknown class in " + usageScope); - } - - PathEl[] attributePath = EvaluationHelper.getAttributePathEl(validator, contextClass, argPath); - surfaces = EvaluationHelper.evaluateAttributes(validator, argObjects, attributePath); + Collection surfaces = argGeometries.getComplexObjects(); + if (surfaces == null) { + return Value.createUndefined(); } UnionSurfaceKey key = new UnionSurfaceKey(surfaces); diff --git a/src/model/GeoW_FunctionsExt.ili b/src/model/GeoW_FunctionsExt.ili index 5cc1eee..b2104f9 100644 --- a/src/model/GeoW_FunctionsExt.ili +++ b/src/model/GeoW_FunctionsExt.ili @@ -34,9 +34,9 @@ MODEL GeoW_FunctionsExt !!@ fn.since = "2022-12-05"; FUNCTION IsInsideExternalDataset (DatasetName: TEXT; Objects: TEXT; TestObject: OBJECT OF ANYCLASS; TestObjectgeometry: TEXT): BOOLEAN; - !!@ fn.description = "Fasst die Flächen-Geometrien aus der Eingabemenge zu einer Flächen-Geometrie zusammen. Für 'Objects' können Objekte oder Geometrien angegeben werden. Für 'AreaAttr' soll der Pfad zur Flächen-Geometrie in INTERLIS 2 Syntax angegeben werden. Falls 'Objects' bereits die Geometrien enthält, soll für 'AreaAttr' 'UNDEFINED' übergeben werden."; - !!@ fn.param = "Objects: Ausgangsobjekte oder Geometrien. AreaAttr: Pfad zum Geometrieattribut oder UNDEFINED"; + !!@ fn.description = "Fasst die Flächen-Geometrien aus der Eingabemenge zu einer Flächen-Geometrie zusammen. Für 'Geometries' können nur Geometrien angegeben werden."; + !!@ fn.param = "Geometries: Geometrien, die zusammengefasst werden sollen"; !!@ fn.return = "Zusammengefasste Flächen-Geometrie"; !!@ fn.since = "2023-12-13"; - FUNCTION Union (Objects: OBJECTS OF ANYCLASS; AreaAttr: TEXT): OBJECT OF ANYCLASS; + FUNCTION Union (Geometries: ANYSTRUCTURE): MULTIAREA; END GeoW_FunctionsExt. \ No newline at end of file diff --git a/src/test/data/Union/SetConstraintMergedInnerRings.ili b/src/test/data/Union/MandatoryConstraintMergedInnerRings.ili similarity index 62% rename from src/test/data/Union/SetConstraintMergedInnerRings.ili rename to src/test/data/Union/MandatoryConstraintMergedInnerRings.ili index 379c702..efd9df3 100644 --- a/src/test/data/Union/SetConstraintMergedInnerRings.ili +++ b/src/test/data/Union/MandatoryConstraintMergedInnerRings.ili @@ -9,18 +9,20 @@ MODEL TestSuite 0 .. 10 [INTERLIS.m], ROTATION 2 -> 1; + Surface = SURFACE WITH (STRAIGHTS) VERTEX Coord WITHOUT OVERLAPS > 0.1; + TOPIC FunctionTestTopic = CLASS BaseClass = - surfaceAttribute : SURFACE WITH (STRAIGHTS) VERTEX Coord WITHOUT OVERLAPS > 0.1; + surfaceAttribute : BAG OF Surface; !! Surfaces evaluated separately - SET CONSTRAINT innerRings: - GeoW_FunctionsExt.GetInnerRingsCount(ALL, "surfaceAttribute") == 2; + MANDATORY CONSTRAINT innerRings: + GeoW_FunctionsExt.GetInnerRingsCount(THIS, "surfaceAttribute") == 2; !! Surfaces evaluated as union (inner rings overlap in test data) - SET CONSTRAINT innerRingsUnion: - GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(ALL, "surfaceAttribute"), UNDEFINED) == 1; + MANDATORY CONSTRAINT innerRingsUnion: + GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute), UNDEFINED) == 1; END BaseClass; diff --git a/src/test/data/Union/MandatoryConstraintThis.ili b/src/test/data/Union/MandatoryConstraintThis.ili index c3210e9..e2828f4 100644 --- a/src/test/data/Union/MandatoryConstraintThis.ili +++ b/src/test/data/Union/MandatoryConstraintThis.ili @@ -18,10 +18,10 @@ MODEL TestSuite surfaceAttribute : BAG OF Surface; MANDATORY CONSTRAINT falseConstraint: - GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute, UNDEFINED), UNDEFINED) > 3; + GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute), UNDEFINED) > 3; MANDATORY CONSTRAINT oneInnerRingConstraint: - GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute, UNDEFINED), UNDEFINED) == 1; + GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute), UNDEFINED) == 1; END BaseClass; diff --git a/src/test/data/Union/SetConstraintAll.ili b/src/test/data/Union/SetConstraintAll.ili deleted file mode 100644 index 472a3d6..0000000 --- a/src/test/data/Union/SetConstraintAll.ili +++ /dev/null @@ -1,31 +0,0 @@ -INTERLIS 2.4; - -MODEL TestSuite - AT "mailto:info@geowerkstatt.ch" VERSION "2023-12-13" = - IMPORTS GeoW_FunctionsExt; - - DOMAIN - !!@CRS=EPSG:2056 - CHKoord = COORD 2460000.000 .. 2870000.000 [INTERLIS.m], - 1045000.000 .. 1310000.000 [INTERLIS.m], - ROTATION 2 -> 1; - - TOPIC FunctionTestTopic = - - CLASS BaseClass = - surfaceAttribute : SURFACE WITH (STRAIGHTS) VERTEX CHKoord WITHOUT OVERLAPS > 0.1; - - SET CONSTRAINT falseConstraint: - GeoW_FunctionsExt.GetInnerRingsCount(ALL, "surfaceAttribute") > 3; - SET CONSTRAINT falseConstraintUnion: - GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(ALL, "surfaceAttribute"), UNDEFINED) > 3; - - SET CONSTRAINT trueConstraint: - GeoW_FunctionsExt.GetInnerRingsCount(ALL, "surfaceAttribute") == 1; - SET CONSTRAINT trueConstraintUnion: - GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(ALL, "surfaceAttribute"), UNDEFINED) == 1; - END BaseClass; - - END FunctionTestTopic; - -END TestSuite. diff --git a/src/test/data/Union/TestDataMergedInnerRings.xtf b/src/test/data/Union/TestDataMergedInnerRings.xtf index 64e9430..f163531 100644 --- a/src/test/data/Union/TestDataMergedInnerRings.xtf +++ b/src/test/data/Union/TestDataMergedInnerRings.xtf @@ -65,8 +65,6 @@ - - diff --git a/src/test/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPluginTest.java b/src/test/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPluginTest.java index 4b172e2..1d5bec7 100644 --- a/src/test/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPluginTest.java +++ b/src/test/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPluginTest.java @@ -28,18 +28,8 @@ void mandatoryConstraintOnThis() throws Ili2cFailure, IoxException { } @Test - void setConstraintAll() throws Ili2cFailure, IoxException { - vh.runValidation(new String[]{TEST_DATA}, new String[]{"Union/SetConstraintAll.ili"}); - Assert.equals(2, vh.getErrs().size()); - AssertionHelper.assertConstraintErrors(vh, 1, "falseConstraint"); - AssertionHelper.assertConstraintErrors(vh, 1, "falseConstraintUnion"); - AssertionHelper.assertNoConstraintError(vh, "trueConstraint"); - AssertionHelper.assertNoConstraintError(vh, "trueConstraintUnion"); - } - - @Test - void setConstraintMergedInnerRings() throws Ili2cFailure, IoxException { - vh.runValidation(new String[]{TEST_DATA_MERGED_INNER_RINGS}, new String[]{"Union/SetConstraintMergedInnerRings.ili"}); + void mandatoryConstraintMergedInnerRings() throws Ili2cFailure, IoxException { + vh.runValidation(new String[]{TEST_DATA_MERGED_INNER_RINGS}, new String[]{"Union/MandatoryConstraintMergedInnerRings.ili"}); Assert.equals(0, vh.getErrs().size()); AssertionHelper.assertNoConstraintError(vh, "innerRings"); AssertionHelper.assertNoConstraintError(vh, "innerRingsUnion");