Skip to content

Commit f4388ef

Browse files
committed
Support IsNullOrWhiteSpace
1 parent f3fd4ed commit f4388ef

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

src/PgKeyValueDB/SqlExpressionVisitor.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
174174
Visit(node.Object);
175175
whereClause.Append(")");
176176
return node;
177+
178+
case nameof(string.IsNullOrWhiteSpace):
179+
whereClause.Append("(");
180+
Visit(node.Arguments[0]);
181+
whereClause.Append(" is null or trim(");
182+
Visit(node.Arguments[0]);
183+
whereClause.Append(") = '')");
184+
return node;
177185
}
178186
}
179187

test/PgKeyValueDB.Tests/PgKeyValueDBTest.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,4 +700,59 @@ private static async Task<List<T>> QueryByInterfaceBase<T>(string pid, bool notI
700700
var users = await kv.GetListAsync(pid, expr).ToListAsync();
701701
return users;
702702
}
703+
704+
[TestMethod]
705+
public async Task FilterByIsNullOrWhiteSpaceTest()
706+
{
707+
var key1 = nameof(FilterByIsNullOrWhiteSpaceTest) + "1";
708+
var key2 = nameof(FilterByIsNullOrWhiteSpaceTest) + "2";
709+
var key3 = nameof(FilterByIsNullOrWhiteSpaceTest) + "3";
710+
var key4 = nameof(FilterByIsNullOrWhiteSpaceTest) + "4";
711+
var pid = nameof(FilterByIsNullOrWhiteSpaceTest);
712+
713+
var user1 = new UserProfile
714+
{
715+
Name = "Alice",
716+
DisplayName = "Alice Smith"
717+
};
718+
719+
var user2 = new UserProfile
720+
{
721+
Name = "Bob",
722+
DisplayName = null // null value
723+
};
724+
725+
var user3 = new UserProfile
726+
{
727+
Name = "Charlie",
728+
DisplayName = "" // empty string
729+
};
730+
731+
var user4 = new UserProfile
732+
{
733+
Name = "David",
734+
DisplayName = " " // whitespace only
735+
};
736+
737+
await kv.UpsertAsync(key1, user1, pid);
738+
await kv.UpsertAsync(key2, user2, pid);
739+
await kv.UpsertAsync(key3, user3, pid);
740+
await kv.UpsertAsync(key4, user4, pid);
741+
742+
// This query should filter users with null, empty, or whitespace-only DisplayName
743+
Expression<Func<UserProfile, bool>> expr = u => string.IsNullOrWhiteSpace(u.DisplayName);
744+
var usersWithEmptyDisplayName = await kv.GetListAsync(pid, expr).ToListAsync();
745+
746+
Assert.AreEqual(3, usersWithEmptyDisplayName.Count);
747+
Assert.IsTrue(usersWithEmptyDisplayName.Any(u => u.Name == "Bob"));
748+
Assert.IsTrue(usersWithEmptyDisplayName.Any(u => u.Name == "Charlie"));
749+
Assert.IsTrue(usersWithEmptyDisplayName.Any(u => u.Name == "David"));
750+
751+
// Test the opposite - users with valid DisplayName
752+
Expression<Func<UserProfile, bool>> exprNotEmpty = u => !string.IsNullOrWhiteSpace(u.DisplayName);
753+
var usersWithValidDisplayName = await kv.GetListAsync(pid, exprNotEmpty).ToListAsync();
754+
755+
Assert.AreEqual(1, usersWithValidDisplayName.Count);
756+
Assert.AreEqual("Alice", usersWithValidDisplayName[0].Name);
757+
}
703758
}

0 commit comments

Comments
 (0)