diff --git a/src/Artemis.Core/Models/Profile/Conditions/Abstract/DisplayConditionPart.cs b/src/Artemis.Core/Models/Profile/Conditions/Abstract/DisplayConditionPart.cs
index 534f48926..0531e1a5b 100644
--- a/src/Artemis.Core/Models/Profile/Conditions/Abstract/DisplayConditionPart.cs
+++ b/src/Artemis.Core/Models/Profile/Conditions/Abstract/DisplayConditionPart.cs
@@ -35,8 +35,19 @@ namespace Artemis.Core.Models.Profile.Conditions.Abstract
}
}
+ ///
+ /// Evaluates the condition part on the data model
+ ///
+ ///
public abstract bool Evaluate();
+ ///
+ /// Evaluates the condition part on the given target (currently only for lists)
+ ///
+ ///
+ ///
+ public abstract bool EvaluateObject(object target);
+
internal abstract void Initialize(IDataModelService dataModelService);
internal abstract void ApplyToEntity();
internal abstract DisplayConditionPartEntity GetEntity();
diff --git a/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionGroup.cs b/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionGroup.cs
index e6d2591f7..627571163 100644
--- a/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionGroup.cs
+++ b/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionGroup.cs
@@ -37,9 +37,12 @@ namespace Artemis.Core.Models.Profile.Conditions
public override bool Evaluate()
{
- // If there are less than two children, ignore the boolean operator
- if (Children.Count <= 2)
- return Children.All(c => c.Evaluate());
+ // Empty groups are always true
+ if (Children.Count == 0)
+ return true;
+ // Groups with only one child ignore the boolean operator
+ if (Children.Count == 1)
+ return Children[0].Evaluate();
switch (BooleanOperator)
{
@@ -56,6 +59,25 @@ namespace Artemis.Core.Models.Profile.Conditions
}
}
+ public override bool EvaluateObject(object target)
+ {
+ // Empty groups are always true
+ if (Children.Count == 0)
+ return true;
+ // Groups with only one child ignore the boolean operator
+ if (Children.Count == 1)
+ return Children[0].EvaluateObject(target);
+
+ return BooleanOperator switch
+ {
+ BooleanOperator.And => Children.All(c => c.EvaluateObject(target)),
+ BooleanOperator.Or => Children.Any(c => c.EvaluateObject(target)),
+ BooleanOperator.AndNot => Children.All(c => !c.EvaluateObject(target)),
+ BooleanOperator.OrNot => Children.Any(c => !c.EvaluateObject(target)),
+ _ => throw new ArgumentOutOfRangeException()
+ };
+ }
+
internal override void ApplyToEntity()
{
DisplayConditionGroupEntity.BooleanOperator = (int) BooleanOperator;
diff --git a/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionListPredicate.cs b/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionListPredicate.cs
index b40560add..d79c2efa1 100644
--- a/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionListPredicate.cs
+++ b/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionListPredicate.cs
@@ -1,4 +1,7 @@
-using System.Linq;
+using System;
+using System.Collections;
+using System.Linq;
+using System.Linq.Expressions;
using Artemis.Core.Exceptions;
using Artemis.Core.Models.Profile.Conditions.Abstract;
using Artemis.Core.Plugins.Abstract.DataModels;
@@ -44,7 +47,23 @@ namespace Artemis.Core.Models.Profile.Conditions
public override bool Evaluate()
{
- return true;
+ return EvaluateObject(CompiledListAccessor(ListDataModel));
+ }
+
+ public override bool EvaluateObject(object target)
+ {
+ if (!(target is IList list))
+ return false;
+
+ var objectList = list.Cast