Browse Source

Added a NotInQuery filter operator

Kenric Nugteren 1 year ago
parent
commit
083b3b5a7d

+ 19 - 3
InABox.Core/Filter.cs

@@ -78,7 +78,8 @@ namespace InABox.Core
         NotInList,
         InQuery,
         All,
-        None
+        None,
+        NotInQuery
     }
 
 
@@ -311,6 +312,9 @@ namespace InABox.Core
         IFilter InQuery<U>(SubQuery<U> value);
         IFilter InQuery<U>(Filter<U>? filter, Expression<Func<U, object?>> column);
 
+        IFilter NotInQuery<U>(SubQuery<U> value);
+        IFilter NotInQuery<U>(Filter<U>? filter, Expression<Func<U, object?>> column);
+
         IFilter All();
         IFilter None();
 
@@ -926,6 +930,17 @@ namespace InABox.Core
 
         #endregion
 
+        #region NotInQuery
+
+        public Filter<T> NotInQuery<U>(SubQuery<U> value) => ApplyObjectOperator(Operator.NotInQuery, value);
+        IFilter IFilter.NotInQuery<U>(SubQuery<U> value) => NotInQuery(value);
+
+        public Filter<T> NotInQuery<U>(Filter<U>? filter, Expression<Func<U, object?>> column) => NotInQuery(new SubQuery<U>(filter, new Column<U>(column)));
+        IFilter IFilter.NotInQuery<U>(Filter<U>? filter, Expression<Func<U, object?>> column) => NotInQuery(filter, column);
+
+        #endregion
+
+
         #region All/None
 
         IFilter IFilter.All() => All();
@@ -1605,7 +1620,8 @@ namespace InABox.Core
                 { Operator.Contains, "substringof({1} {0}) eq true" },
                 { Operator.InList, "{0} in ({1})" },
                 { Operator.NotInList, "{0} not in ({1})" },
-                { Operator.InQuery, "{0} in ({1})" }
+                { Operator.InQuery, "{0} in ({1})" },
+                { Operator.NotInQuery, "{0} not in ({1})" }
             };
 
             var result = "";
@@ -2014,7 +2030,7 @@ namespace InABox.Core
             result.Operator = op;
             if(data.TryGetValue("Value", out var val))
             {
-                if (op == Operator.InQuery)
+                if (op == Operator.InQuery || op == Operator.NotInQuery)
                 {
                     var wrapper = Serialization.Deserialize<SubQuerySerializationWrapper>((string)val);
                     val = Activator.CreateInstance(typeof(SubQuery<>).MakeGenericType(CoreUtils.GetEntity(wrapper.Type)), null, null);

+ 5 - 4
inabox.database.sqlite/SQLiteProvider.cs

@@ -1318,7 +1318,8 @@ namespace InABox.Database.SQLite
             { Operator.EndsWith, "{0} LIKE '%' || {1}" },
             { Operator.InList, "{0} IN ({1})" },
             { Operator.NotInList, "{0} NOT IN ({1})" },
-            { Operator.InQuery, "{0} IN ({1})" }
+            { Operator.InQuery, "{0} IN ({1})" },
+            { Operator.NotInQuery, "{0} NOT IN ({1})" }
         };
 
         private static string EscapeValue(object? value)
@@ -1449,7 +1450,7 @@ namespace InABox.Database.SQLite
                         result = string.Format("(" + operators[filter.Operator] + ")", prop, string.Join(",", paramlist));
                     }
                 }
-                else if (filter.Operator == Operator.InQuery)
+                else if (filter.Operator == Operator.InQuery || filter.Operator == Operator.NotInQuery)
                 {
                     if(filter.Value is ISubQuery subQuery)
                     {
@@ -1508,7 +1509,7 @@ namespace InABox.Database.SQLite
             }
 
             var bChanged = false;
-            if (filter.Ands != null && filter.Ands.Count() > 0)
+            if (filter.Ands != null && filter.Ands.Any())
             {
                 foreach (var and in filter.Ands)
                 {
@@ -1525,7 +1526,7 @@ namespace InABox.Database.SQLite
             }
 
             bChanged = false;
-            if (filter.Ors != null && filter.Ors.Count() > 0)
+            if (filter.Ors != null && filter.Ors.Any())
             {
                 foreach (var or in filter.Ors)
                 {

+ 5 - 2
inabox.wpf/DynamicGrid/Editors/FilterEditor/FilterNode.cs

@@ -117,8 +117,8 @@ public class FilterNode<T> : BaseFilterNode
         Add(AndButton, 0, 7);
         Add(OrButton, 0, 8);
 
-        Add(Ands, 1, 1, 7);
-        Add(Ors, 2, 1, 7);
+        Add(Ands, 1, 1, 8);
+        Add(Ors, 2, 1, 8);
     }
 
     private void ClearButton_Click(object sender, RoutedEventArgs e)
@@ -220,6 +220,9 @@ public class FilterNode<T> : BaseFilterNode
             case Core.Operator.InQuery:
                 return new SubQueryNode(Configuration);
 
+            case Core.Operator.NotInQuery:
+                return new SubQueryNode(Configuration);
+
             case Core.Operator.All:
             case Core.Operator.None:
                 return null;