Skip to content

Commit

Permalink
Add support for filtering nullable enums
Browse files Browse the repository at this point in the history
  • Loading branch information
jabellard authored and jeremydmiller committed Nov 1, 2022
1 parent 3f78d6a commit 0e43894
Showing 1 changed file with 38 additions and 13 deletions.
51 changes: 38 additions & 13 deletions src/Weasel.Postgresql/SqlGeneration/EnumIsOneOfWhereFragment.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Linq;
using Baseline;
using NpgsqlTypes;
using Weasel.Core;
Expand All @@ -10,44 +11,68 @@ public class EnumIsOneOfWhereFragment: ISqlFragment
private readonly object _values;
private readonly string _locator;
private readonly NpgsqlDbType _dbType;
private readonly bool _listContainsNullEntry;

public EnumIsOneOfWhereFragment(object values, EnumStorage enumStorage, string locator)
{
var array = values.As<Array>();
if (enumStorage == EnumStorage.AsInteger)
{
var numbers = new int[array.Length];

for (int i = 0; i < array.Length; i++)
var numberEntries = new int?[array.Length];
for (var i = 0; i < array.Length; i++)
{
numbers[i] = array.GetValue(i)!.As<int>();
var numberEntry = array.GetValue(i);
if (numberEntry is null)
{
_listContainsNullEntry = true;
numberEntries[i] = null;
continue;
}
numberEntries[i] = numberEntry.As<int>();
}

_values = numbers;
_values = numberEntries.Where(n => n != null).ToArray();
_dbType = NpgsqlDbType.Integer | NpgsqlDbType.Array;
}
else
{
var strings = new string[array.Length];

for (int i = 0; i < array.Length; i++)
var stringEntries = new string?[array.Length];
for (var i = 0; i < array.Length; i++)
{
strings[i] = array.GetValue(i)!.ToString()!;
var stringEntry = array.GetValue(i);
if (stringEntry is null)
{
_listContainsNullEntry = true;
stringEntries[i] = null;
continue;
}
stringEntries[i] = stringEntry.ToString()!;
}

_values = strings;
_values = stringEntries.Where(n => n != null).ToArray();
_dbType = NpgsqlDbType.Varchar | NpgsqlDbType.Array;
}

_locator = locator;
}

public void Apply(CommandBuilder builder)
{
builder.Append("(");
builder.Append(_locator);
builder.Append(" = ANY(");
builder.AppendParameter(_values, _dbType);
builder.Append(")");
if (_listContainsNullEntry)
{
builder.Append(" OR ");
builder.Append(_locator);
builder.Append(" is null");
}
else
{
builder.Append(" AND ");
builder.Append(_locator);
builder.Append(" is not null");
}
builder.Append(")");
}

public bool Contains(string sqlText)
Expand Down

0 comments on commit 0e43894

Please sign in to comment.