Skip to content

Commit

Permalink
Small progress
Browse files Browse the repository at this point in the history
  • Loading branch information
ejsmith committed Mar 4, 2024
1 parent fb12c7c commit 59284db
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 5 deletions.
54 changes: 54 additions & 0 deletions src/Foundatio.Parsers.SqlQueries/Visitors/GenerateSqlVisitor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System.Text;
using System.Threading.Tasks;
using Foundatio.Parsers.LuceneQueries.Nodes;
using Foundatio.Parsers.LuceneQueries.Visitors;

namespace Foundatio.Parsers.SqlQueries.Visitors;

public class GenerateSqlVisitor : QueryNodeVisitorWithResultBase<string>
{
private readonly StringBuilder _builder = new();

public override Task VisitAsync(GroupNode node, IQueryVisitorContext context)
{
_builder.Append(node.ToString(context != null ? context.DefaultOperator : GroupOperator.Default));

return Task.CompletedTask;
}

public override void Visit(TermNode node, IQueryVisitorContext context)
{
_builder.Append(node);
}

public override void Visit(TermRangeNode node, IQueryVisitorContext context)
{
_builder.Append(node);
}

public override void Visit(ExistsNode node, IQueryVisitorContext context)
{
_builder.Append(node);
}

public override void Visit(MissingNode node, IQueryVisitorContext context)
{
_builder.Append(node);
}

public override async Task<string> AcceptAsync(IQueryNode node, IQueryVisitorContext context)
{
await node.AcceptAsync(this, context).ConfigureAwait(false);
return _builder.ToString();
}

public static Task<string> RunAsync(IQueryNode node, IQueryVisitorContext context = null)
{
return new GenerateSqlVisitor().AcceptAsync(node, context);
}

public static string Run(IQueryNode node, IQueryVisitorContext context = null)
{
return RunAsync(node, context).GetAwaiter().GetResult();
}
}
11 changes: 6 additions & 5 deletions tests/Foundatio.Parsers.SqlQueries.Tests/SqlQueryParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,19 @@ public async Task CanGenerateSql() {
});
await context.SaveChangesAsync();

// "age:30"
var parser = new SqlQueryParser();
parser.Configuration.UseFieldMap(new Dictionary<string, string> {{ "age", "DataValues.Any(DataDefinitionId = 1 AND NumberValue = " }});
// translate AST to dynamic linq
// lookup custom fields and convert to sql
// know what data type each column is in order to know if it support range operators
var node = await parser.ParseAsync("""title:"software developer" age:30""");
var node = await parser.ParseAsync("""company.name:acme age:30""");

string sqlExpected = context.Employees.Where(e => e.DataValues.Any(dv => dv.DataDefinitionId == 1 && dv.NumberValue == 30)).ToQueryString();
string sqlActual = context.Employees.Where("""DataValues.Any(DataDefinitionId = 1 AND NumberValue = 30) """).ToQueryString();

string sqlExpected = context.Employees.Where(e => e.Company.Name == "acme" && e.DataValues.Any(dv => dv.DataDefinitionId == 1 && dv.NumberValue == 30)).ToQueryString();
string sqlActual = context.Employees.Where("""company.name = "acme" AND DataValues.Any(DataDefinitionId = 1 AND NumberValue = 30) """).ToQueryString();
Assert.Equal(sqlExpected, sqlActual);

var employees = await context.Employees.Where(e => e.DataValues.Any(dv => dv.DataDefinitionId == 1 && dv.NumberValue == 30))
var employees = await context.Employees.Where(e => e.Title == "software developer" && e.DataValues.Any(dv => dv.DataDefinitionId == 1 && dv.NumberValue == 30))
.ToListAsync();

Assert.Single(employees);
Expand Down

0 comments on commit 59284db

Please sign in to comment.