Ilivalidator: WHERE Bedingung in VIEWS

Schreibe ich in einem Validierungsmodell eine VIEW mit einer WHERE-Bedingung in der Form

VIEW myView
  PROJECTION OF myClass;
  WHERE myClass->a1 == 2012;    !! a1: 1900..2050
    =
  ALL OF myClass;
  MANDATORY CONSTRAINT DEFINED(a2);
END myView;

… so erhalte ich dasselbe Resultat, wie wenn ich die WHERE-Bedingung weglasse.

Liegt das daran, dass
a) meine WHERE-Bedingung falsch formuliert ist oder
b) die Auswertung der WHERE-Bedingung in ilivalidator nicht implementiert ist?

Damit habe ich auch immer Probleme. Gemäss RefMan kommt nach dem WHERE eine Selection wie du gemacht hast. Die Selection ist eine „Logical-Expression“ mit Ergebnistyp Boolean – wie du gemacht hast. Wo ich immer unsicher bin, ist, dass „Logical-Expression“ im RefMan nicht eigentlich definiert ist. Es ist „halt einfach ein logischer Ausdruck“. In deinem Fall ist auch der Attributzugang richtig…
ABER: was ist denn tatsächlich alles möglich in „Logical-Expression“? – Eben alles, was (der Mensch…!) als logischen Ausdruck verstehen und interpretieren kann. M.E. ist daher die Implementierung sehr anspruchsvoll und ich würde frech darauf tippen, dass das einfach nicht vollumfänglich gemacht ist… (lasse mich gerne anders überzeugen, wenn es dem klareren Verständnis der Sache dient…!)

Logical-Expression erscheint ja zum Glück auch noch an anderen Orten im RefHB, z. B. bei den Constraints. Was also bei den Constraints funktioniert, sollte auch in einer WHERE-Bedingung funktionieren (my logical guess…).

Aber ja, Ausdrücke (Expressions) sind nicht ganz trivial. Das offenbart auch ein Blick ins Metamodell:

Es scheint, als gäbe es zum Thema bereits ein offenes ilivalidator issue.

Die Bedingung kann jedoch auch auf der Klasse myClass als Mandatory Constraint mit WHERE Bedingung oder einer Implikation umgesetzt werden, sofern der Use Case dies zulässt.

Validate VIEW in non-validation models · Issue #324 · claeis/ilivalidator (github.com)

Bei dem von dir erwähnten Issue geht es darum, dass VIEWS zzt. nur in einem separaten Validierungsmodell ausgewertet werden, jedoch nicht, wenn sie im Ursprungsmodell definiert sind. Ob mit oder ohne WHERE-Bedingung scheint (noch) gar nicht thematisiert worden zu sein…

Mein Anwendungsfall ist ein Validierungsmodell mit ca. 50 separaten Mandatory Constraints, die aber alle einen Satz gemeinsame Bedingungen haben. Diese hätte ich gerne in der WHERE-Bedingung der VIEW einmalig zusammengefasst. Kurz: Es funktioniert schon mit den einzelnen Constraints, wäre aber eleganter und übersichtlicher mit der WHERE-Bedingung. :sunglasses:

1 „Gefällt mir“

@beistehen
Ich habe mir deine Definition nochmals etwas genauer angeschaut. Wenn ich es richtig im Kopf habe, müsste deine WHERE Bedingung etwas vereinfacht werden. Ich glaube die Referenz auf myClass ist ein Typ und kein Wert. Immer etwas Kontextabhänig.

VIEW myView
  PROJECTION OF myClass;
  WHERE a1 == 2012;    !! a1: 1900..2050
    =
  ALL OF myClass;
  MANDATORY CONSTRAINT DEFINED(a2);
END myView;

oder alternativ: (Hier bin ich mir jedoch nicht ganz sicher, ob dies so funktioniert. Ich glaube jedoch THIS sollte hier auch legal sein.)

VIEW myView
  PROJECTION OF myClass;
  WHERE THIS->a1 == 2012;    !! a1: 1900..2050
...

Meldet der Compiler keine Probleme mit der Definition? Nach meinem Verständnis wäre auch folgender Ausdruck legal. Die Semantik ist hier jedoch ganz eine andere, als was du versuchst zu erreichen. Der Logische Ausdruck wird hier für jedes Objekt immer false sein, da die Menge aller a1 attribute aller Objekte der Klasse myClass bereits durch den Umstand, dass es eine Menge ist nicht gleich 2012 sein kann.

VIEW myView
  PROJECTION OF myClass;
  WHERE >myClass->a1 == 2012;    !! a1: 1900..2050
   ...

Also ich muss bei mir sogar diese Umbennenungssyntax verwenden, damit es kompiliert:

    VIEW v_Gemeinde
      PROJECTION OF G ~ MyModel.MyTopic.Gemeinde;
      WHERE G->Nummer < 9999;
    =
      ALL OF G;

      MANDATORY CONSTRAINT Nummer < 9999;
    END v_Gemeinde;

Die View ist in einem separaten Validierungsmodell.

Funktionieren tut es aber trotzdem nicht. Der WHERE-Filter greift nicht.

@ceis Kannst du hier noch Licht ins Dunkle bringen?

Eine Logical-Expression ist eine Expression, deren Auswertung True oder False liefert.

VIEWs sind im ilivalidator nicht implementiert (mit Ausnahme von minimalen PROJECTIONs (also ohne WHERE), die es zum Ergänzen von Constraints zu bestehenden Modellen benötigt).

Grundsätzlich ist die Expression Auswertung im ilivalidator aber implementiert (z.B: bei MANDATORY CONSTRAINTs).

Es wäre m.E. also nicht zu aufwändig die PROJECTIONs so zu erweitern, dass WHERE auch benutzt werden kann. (VIEWs im Allgemeinen zu implementieren, wäre aufwändig).

1 „Gefällt mir“

Ich habe hinblicklich dem DMAV-Support dazu das folgende Issue eröffnet:
Support von WHERE Bedingungen in Views · Issue #408 · claeis/ilivalidator (github.com)

@beistehen Wir haben diesen Issue im Rahmen des DMAV-Supports gepatcht (gesponsert vom AGI Kt. Solothurn): Validate views in data models by domi-b · Pull Request #128 · claeis/iox-ili (github.com)

@olivergrimm Noch nicht ganz, wenn ich richtig gelesen habe…

Gepatcht wurde das Issue betreffend VIEWS in Datenmodellen (Issue #324). :ok_hand: :star_struck:

In diesem Thread geht es jedoch um Auswertung der WHERE-Bedingung von VIEWS (Issue #408). Letzteres ist aber wohl in Vorbereitung, wie es scheint :rocket:

Trotzdem vielen Dank fürs Sponsoring, @edigonzales !

@beistehen ja, stimmt. Das läuft auf einen zweiten PR raus, ist aber ebenfalls umgesetzt.