Skip to content

Commit

Permalink
Fix collection field support on default fields
Browse files Browse the repository at this point in the history
  • Loading branch information
ejsmith committed Mar 19, 2024
1 parent ab61b30 commit 9f34eeb
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 3 deletions.
19 changes: 17 additions & 2 deletions src/Foundatio.Parsers.SqlQueries/Extensions/SqlNodeExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,23 @@ public static string ToSqlString(this TermNode node, ISqlQueryVisitorContext con
{
builder.Append(index == 0 ? "(" : " OR ");

string defaultField = context.DefaultFields[index];
builder.Append(defaultField).Append(".Contains(\"").Append(node.Term).Append("\")");
var defaultField = GetFieldInfo(context.Fields, context.DefaultFields[index]);
if (defaultField.IsCollection)
{
var dotIndex = defaultField.Field.LastIndexOf('.');
var collectionField = defaultField.Field.Substring(0, dotIndex);
var fieldName = defaultField.Field.Substring(dotIndex + 1);

builder.Append(collectionField);
builder.Append(".Any(");
builder.Append(fieldName);
builder.Append(".Contains(\"").Append(node.Term).Append("\")");
builder.Append(")");
}
else
{
builder.Append(defaultField.Field).Append(".Contains(\"").Append(node.Term).Append("\")");
}

if (index == context.DefaultFields.Length - 1)
builder.Append(")");
Expand Down
20 changes: 19 additions & 1 deletion tests/Foundatio.Parsers.SqlQueries.Tests/SqlQueryParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ public async Task CanSearchDefaultFields()
var sp = GetServiceProvider();
await using var db = await GetSampleContextWithDataAsync(sp);
var parser = sp.GetRequiredService<SqlQueryParser>();
parser.Configuration.SetDefaultFields(["FullName", "Title"]);

var context = parser.GetContext(db.Employees.EntityType);
parser.Configuration.SetDefaultFields(["FullName", "Title"]);

string sqlExpected = db.Employees.Where(e => e.FullName.Contains("John") || e.Title.Contains("John")).ToQueryString();
string sqlActual = db.Employees.Where("""FullName.Contains("John") || Title.Contains("John")""").ToQueryString();
Expand All @@ -95,6 +95,24 @@ public async Task CanUseDateFilter()
Assert.Equal(sqlExpected, sqlActual);
}

[Fact]
public async Task CanUseCollectionDefaultFields()
{
var sp = GetServiceProvider();
await using var db = await GetSampleContextWithDataAsync(sp);
var parser = sp.GetRequiredService<SqlQueryParser>();
parser.Configuration.SetDefaultFields(["Companies.Name"]);

var context = parser.GetContext(db.Employees.EntityType);

string sqlExpected = db.Employees.Where(e => e.Companies.Any(c => c.Name.Contains("acme"))).ToQueryString();
string sqlActual = db.Employees.Where("""Companies.Any(Name.Contains("acme"))""").ToQueryString();
Assert.Equal(sqlExpected, sqlActual);
string sql = await parser.ToSqlAsync("acme", context);
sqlActual = db.Employees.Where(sql).ToQueryString();
Assert.Equal(sqlExpected, sqlActual);
}

[Fact]
public async Task CanGenerateSql()
{
Expand Down

0 comments on commit 9f34eeb

Please sign in to comment.