Zusammengetztes ANY-Predicate

  • Zusammengetztes ANY-Predicate

    Ich hab eine Liste von Akten. Hierfür existiert ein Array-Controller. Für dessen arranged Objects hate ich ein Predicate definiert, welches nur die Akten anzeigen soll, welche heute ein Ereignis haben.:

    "ANY events.time >= 28.03.2007"

    (Das sieht natürlich wegen des Casts etwas anders aus, aber gut.) Funktioniert wunderbar!

    Nun will ich aber, dass nur Akten getroffen werden, die ein Ereignis in einem bestimmten Zeitraum haben. Ich dachte an so etwas:

    "ANY ((events.time >= 28.03.2007) AND (events.time <31.03.2007))"

    Was aber wegen der Klammerung nicht geht. Mit BETWEEN funktioniert es ebenfalls nicht:

    "ANY events.time BETWEEN { 28.03.2007, 31.03.2007}"


    Ich habe langsam Zweifel, dass es mit Boardmitteln gar nicht geht.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Also als ich ein Filterpredicate zusammengesetzt habe um Entitäten eines ArrayController nach minimal Datum (und anderem) zu filtern habe ich es letzten Endes komplett imperativ gemacht,
    also mit NSExpression für den constant value und dann einem NSComparisonPredicate.

    Die Ganzen ComparisonPredicates habe ich dann am Ende mit AND zusammengefügt...
    Klappt ganz gut.

    Bei Interesse kann ich gerne Codeauszüge posten.

    Gruß Julian
  • Damit bekommt du alle Objekte, die ein Attrbut in einem bestimmten Wertebereich haben. Ich will aber alle Objekte, die auf mindestens ein Objekt verweisen, welches ein Attribut im Wertebereich hat.

    Also noch einmal vllt verständlich:

    Akte hat eine Beziehung zu Ereignissen. Jedes Ereignis (nicht die Akte) hat ein Datum. Ich will die *Akten* finden, die auf mindestens ein Ereignis verweisen, welches (Das *Ereignis*, nicht die Akte) in einem bestimmtn Zeitraum liegt.

    Dabei muss es nicht unbedingt irgendein Ereignis sein. Wenn es das nächste in der Liste ist, reicht mir das. Daher auch meine obige Lösung.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ach, bevor sich jemand vergebliche Liebesmüh macht. Es reicht nicht aus, die ANY-Aggregate zu verunden:

    "(ANY events.time >= 28.03.2007) AND (ANY events.time < 31.03.2007)"

    Denn dann würde er auch eine Akte finden, die ein Ereignis gstern hatte und eines nächste Woche. Ich muss schon innerhalb des ANY-Aggregates das Und durchführen. Es kommen übrigens noch weitere UND hinzu, nämlich für den Ereignistyp.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ok, hier der Code den ich verwende zum filtern. Das zusammengesetzte Predicate wird später als filterPredicate des ArrayController gesetzt.
    Der Check auf hasMinimumDate ist nötig weil das Filterpredicate zusammengesetzt wird aus Einzelbedingungen, welche nicht immer alle gleichzeitig gelten.

    Hoffe der Code hilft.

    Quellcode

    1. NSExpression* dateKey;
    2. dateKey = [NSExpression expressionForKeyPath:@"date"];
    3. if(hasMinimumDate == YES) {
    4. NSExpression* userStartDate;
    5. userStartDate = [NSExpression expressionForConstantValue:minimumDate];
    6. NSComparisonPredicate* startsAfterPredicate;
    7. startsAfterPredicate = [NSComparisonPredicate predicateWithLeftExpression:userStartDate
    8. rightExpression:dateKey
    9. modifier:NSDirectPredicateModifier
    10. type:NSLessThanOrEqualToPredicateOperatorType
    11. options:0];
    12. // collect the predicate for later concatenation
    13. [predicates addObject:startsAfterPredicate];
    14. }
    Alles anzeigen
  • Ah, wenn ich das richtig verstehe, ist es aber letztlich das, was auch Objcler meinte. Das ist bei mir aber sozusagen "eine Ebene tiefer". Daher habe ich ja auch das ANY-Aggregat und nicht einen einfachen Ausdruck.

    Scheint wohl wirklich nicht zu gehen. Ich lasse es mal bei meiner Lösung und warte auf die Osterferien.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?