|
@@ -79,7 +79,8 @@ namespace InABox.Core
|
|
InQuery,
|
|
InQuery,
|
|
All,
|
|
All,
|
|
None,
|
|
None,
|
|
- NotInQuery
|
|
|
|
|
|
+ NotInQuery,
|
|
|
|
+ Not = byte.MaxValue
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -218,6 +219,8 @@ namespace InABox.Core
|
|
Operator Operator { get; set; }
|
|
Operator Operator { get; set; }
|
|
object? Value { get; set; }
|
|
object? Value { get; set; }
|
|
|
|
|
|
|
|
+ bool IsNot { get; set; }
|
|
|
|
+
|
|
IEnumerable<IFilter> Ands { get; }
|
|
IEnumerable<IFilter> Ands { get; }
|
|
IEnumerable<IFilter> Ors { get; }
|
|
IEnumerable<IFilter> Ors { get; }
|
|
|
|
|
|
@@ -318,6 +321,8 @@ namespace InABox.Core
|
|
IFilter All();
|
|
IFilter All();
|
|
IFilter None();
|
|
IFilter None();
|
|
|
|
|
|
|
|
+ IFilter Not();
|
|
|
|
+
|
|
string AsOData();
|
|
string AsOData();
|
|
|
|
|
|
IEnumerable<string> ColumnNames();
|
|
IEnumerable<string> ColumnNames();
|
|
@@ -380,6 +385,8 @@ namespace InABox.Core
|
|
|
|
|
|
public object? Value { get; set; }
|
|
public object? Value { get; set; }
|
|
|
|
|
|
|
|
+ public bool IsNot { get; set; }
|
|
|
|
+
|
|
IEnumerable<IFilter> IFilter.Ands => Ands;
|
|
IEnumerable<IFilter> IFilter.Ands => Ands;
|
|
|
|
|
|
IEnumerable<IFilter> IFilter.Ors => Ors;
|
|
IEnumerable<IFilter> IFilter.Ors => Ors;
|
|
@@ -946,6 +953,16 @@ namespace InABox.Core
|
|
|
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
+ #region Not
|
|
|
|
+
|
|
|
|
+ public Filter<T> Not()
|
|
|
|
+ {
|
|
|
|
+ IsNot = !IsNot;
|
|
|
|
+ return this;
|
|
|
|
+ }
|
|
|
|
+ IFilter IFilter.Not() => Not();
|
|
|
|
+
|
|
|
|
+ #endregion
|
|
|
|
|
|
#region All/None
|
|
#region All/None
|
|
|
|
|
|
@@ -1138,6 +1155,7 @@ namespace InABox.Core
|
|
{
|
|
{
|
|
info.AddValue("Operator", Operator.ToString());
|
|
info.AddValue("Operator", Operator.ToString());
|
|
info.AddValue("Value", Value);
|
|
info.AddValue("Value", Value);
|
|
|
|
+ info.AddValue("IsNot", IsNot);
|
|
if (Ands.Count > 0)
|
|
if (Ands.Count > 0)
|
|
info.AddValue("Ands", Ands, typeof(List<Filter<T>>));
|
|
info.AddValue("Ands", Ands, typeof(List<Filter<T>>));
|
|
if (Ors.Count > 0)
|
|
if (Ors.Count > 0)
|
|
@@ -1150,6 +1168,7 @@ namespace InABox.Core
|
|
|
|
|
|
Operator = (Operator)Enum.Parse(typeof(Operator), (string)info.GetValue("Operator", typeof(string)));
|
|
Operator = (Operator)Enum.Parse(typeof(Operator), (string)info.GetValue("Operator", typeof(string)));
|
|
Value = info.GetValue("Value", typeof(object));
|
|
Value = info.GetValue("Value", typeof(object));
|
|
|
|
+ IsNot = info.GetBoolean("IsNot");
|
|
|
|
|
|
try
|
|
try
|
|
{
|
|
{
|
|
@@ -1548,6 +1567,10 @@ namespace InABox.Core
|
|
public void SerializeBinary(CoreBinaryWriter writer)
|
|
public void SerializeBinary(CoreBinaryWriter writer)
|
|
{
|
|
{
|
|
writer.SerialiseExpression(typeof(T), Expression, false);
|
|
writer.SerialiseExpression(typeof(T), Expression, false);
|
|
|
|
+ if (IsNot)
|
|
|
|
+ {
|
|
|
|
+ writer.Write((byte)Operator.Not);
|
|
|
|
+ }
|
|
writer.Write((byte)Operator);
|
|
writer.Write((byte)Operator);
|
|
|
|
|
|
SerializeValue(writer, Value, true);
|
|
SerializeValue(writer, Value, true);
|
|
@@ -1568,7 +1591,14 @@ namespace InABox.Core
|
|
public void DeserializeBinary(CoreBinaryReader reader)
|
|
public void DeserializeBinary(CoreBinaryReader reader)
|
|
{
|
|
{
|
|
Expression = reader.DeserialiseExpression(typeof(T));
|
|
Expression = reader.DeserialiseExpression(typeof(T));
|
|
|
|
+
|
|
Operator = (Operator)reader.ReadByte();
|
|
Operator = (Operator)reader.ReadByte();
|
|
|
|
+ if(Operator == Operator.Not)
|
|
|
|
+ {
|
|
|
|
+ IsNot = true;
|
|
|
|
+ Operator = (Operator)reader.ReadByte();
|
|
|
|
+ }
|
|
|
|
+
|
|
var val = DeserializeValue(reader);
|
|
var val = DeserializeValue(reader);
|
|
var type = (Operator == Operator.InList || Operator == Operator.NotInList)
|
|
var type = (Operator == Operator.InList || Operator == Operator.NotInList)
|
|
? Expression.Type.MakeArrayType()
|
|
? Expression.Type.MakeArrayType()
|
|
@@ -1659,6 +1689,10 @@ namespace InABox.Core
|
|
value
|
|
value
|
|
);
|
|
);
|
|
}
|
|
}
|
|
|
|
+ if (IsNot)
|
|
|
|
+ {
|
|
|
|
+ result = $"not {result}";
|
|
|
|
+ }
|
|
|
|
|
|
if (Ands != null && Ands.Count > 0)
|
|
if (Ands != null && Ands.Count > 0)
|
|
foreach (var and in Ands)
|
|
foreach (var and in Ands)
|
|
@@ -1933,6 +1967,9 @@ namespace InABox.Core
|
|
writer.WritePropertyName("Operator");
|
|
writer.WritePropertyName("Operator");
|
|
writer.WriteValue(op);
|
|
writer.WriteValue(op);
|
|
|
|
|
|
|
|
+ writer.WritePropertyName("IsNot");
|
|
|
|
+ writer.WriteValue(filter.IsNot);
|
|
|
|
+
|
|
if (val is FilterConstant)
|
|
if (val is FilterConstant)
|
|
{
|
|
{
|
|
writer.WritePropertyName("FilterConstant");
|
|
writer.WritePropertyName("FilterConstant");
|
|
@@ -2051,6 +2088,11 @@ namespace InABox.Core
|
|
var exp = CoreUtils.StringToExpression(prop);
|
|
var exp = CoreUtils.StringToExpression(prop);
|
|
var op = (Operator)int.Parse(data["Operator"].ToString());
|
|
var op = (Operator)int.Parse(data["Operator"].ToString());
|
|
|
|
|
|
|
|
+ if(data.TryGetValue("IsNot", out var isNotValue) && isNotValue is bool b)
|
|
|
|
+ {
|
|
|
|
+ result.IsNot = b;
|
|
|
|
+ }
|
|
|
|
+
|
|
result.Expression = exp;
|
|
result.Expression = exp;
|
|
result.Operator = op;
|
|
result.Operator = op;
|
|
if(data.TryGetValue("Value", out var val))
|
|
if(data.TryGetValue("Value", out var val))
|