diff --git a/src/Carbunql/Analysis/Parser/FromArgumentParser.cs b/src/Carbunql/Analysis/Parser/FromArgumentParser.cs
index 25e99e2a..1c77a549 100644
--- a/src/Carbunql/Analysis/Parser/FromArgumentParser.cs
+++ b/src/Carbunql/Analysis/Parser/FromArgumentParser.cs
@@ -14,7 +14,7 @@ public static class FromArgumentParser
/// The unit value.
/// The SQL text containing the FROM argument.
/// The parsed FROM argument.
- public static FromArgument Parse(ValueBase unit, string argument)
+ public static FromArgument Parse(string unit, string argument)
{
var r = new SqlTokenReader(argument);
return Parse(unit, r);
@@ -26,7 +26,7 @@ public static FromArgument Parse(ValueBase unit, string argument)
/// The unit value.
/// The token reader.
/// The parsed FROM argument.
- public static FromArgument Parse(ValueBase unit, ITokenReader r)
+ public static FromArgument Parse(string unit, ITokenReader r)
{
var value = ValueParser.Parse(r);
return new FromArgument(unit, value);
diff --git a/src/Carbunql/Analysis/Parser/ValueCollectionParser.cs b/src/Carbunql/Analysis/Parser/ValueCollectionParser.cs
index 376f7c2e..89b81885 100644
--- a/src/Carbunql/Analysis/Parser/ValueCollectionParser.cs
+++ b/src/Carbunql/Analysis/Parser/ValueCollectionParser.cs
@@ -58,7 +58,7 @@ internal static IEnumerable ReadValues(ITokenReader r)
if (r.ReadOrDefault("from") != null)
{
- yield return FromArgumentParser.Parse(v, r);
+ yield return FromArgumentParser.Parse(v.ToText(), r);
}
else if (r.ReadOrDefault("as") != null)
{
diff --git a/src/Carbunql/Carbunql.csproj b/src/Carbunql/Carbunql.csproj
index 87f11871..ef52a863 100644
--- a/src/Carbunql/Carbunql.csproj
+++ b/src/Carbunql/Carbunql.csproj
@@ -8,7 +8,7 @@
mk3008net
Carbunql is an advanced Raw SQL editing library.
- 0.8.13
+ 0.8.13.1
mk3008net
https://github.com/mk3008/Carbunql
README.md
diff --git a/src/Carbunql/Values/FromArgument.cs b/src/Carbunql/Values/FromArgument.cs
index 2856b4f6..61ffdfa0 100644
--- a/src/Carbunql/Values/FromArgument.cs
+++ b/src/Carbunql/Values/FromArgument.cs
@@ -22,7 +22,7 @@ public FromArgument()
///
/// The unit value.
/// The value.
- public FromArgument(ValueBase unit, ValueBase value)
+ public FromArgument(string unit, ValueBase value)
{
Unit = unit;
Value = value;
@@ -31,7 +31,7 @@ public FromArgument(ValueBase unit, ValueBase value)
///
/// Gets or sets the unit value.
///
- public ValueBase Unit { get; init; }
+ public string Unit { get; init; }
///
/// Gets or sets the value.
@@ -41,10 +41,6 @@ public FromArgument(ValueBase unit, ValueBase value)
///
protected override IEnumerable GetInternalQueriesCore()
{
- foreach (var item in Unit.GetInternalQueries())
- {
- yield return item;
- }
foreach (var item in Value.GetInternalQueries())
{
yield return item;
@@ -54,7 +50,9 @@ protected override IEnumerable GetInternalQueriesCore()
///
public override IEnumerable GetCurrentTokens(Token? parent)
{
- foreach (var item in Unit.GetTokens(parent)) yield return item;
+ if (string.IsNullOrEmpty(Unit)) throw new InvalidProgramException();
+
+ yield return Token.Reserved(this, parent, Unit);
yield return Token.Reserved(this, parent, "from");
foreach (var item in Value.GetTokens(parent)) yield return item;
}
@@ -62,10 +60,6 @@ public override IEnumerable GetCurrentTokens(Token? parent)
///
protected override IEnumerable GetParametersCore()
{
- foreach (var item in Unit.GetParameters())
- {
- yield return item;
- }
foreach (var item in Value.GetParameters())
{
yield return item;
@@ -75,10 +69,6 @@ protected override IEnumerable GetParametersCore()
///
protected override IEnumerable GetPhysicalTablesCore()
{
- foreach (var item in Unit.GetPhysicalTables())
- {
- yield return item;
- }
foreach (var item in Value.GetPhysicalTables())
{
yield return item;
@@ -88,10 +78,6 @@ protected override IEnumerable GetPhysicalTablesCore()
///
protected override IEnumerable GetCommonTablesCore()
{
- foreach (var item in Unit.GetCommonTables())
- {
- yield return item;
- }
foreach (var item in Value.GetCommonTables())
{
yield return item;
@@ -100,10 +86,6 @@ protected override IEnumerable GetCommonTablesCore()
internal override IEnumerable GetColumnsCore()
{
- foreach (var item in Unit.GetColumns())
- {
- yield return item;
- }
foreach (var item in Value.GetColumns())
{
yield return item;
@@ -114,11 +96,6 @@ public override IEnumerable GetValues()
{
yield return this;
- foreach (var item in Unit.GetValues())
- {
- yield return item;
- }
-
foreach (var item in Value.GetValues())
{
yield return item;
diff --git a/test/Carbunql.Fluent.Test/FluentWhereTest.cs b/test/Carbunql.Fluent.Test/FluentWhereTest.cs
new file mode 100644
index 00000000..0ac62c4e
--- /dev/null
+++ b/test/Carbunql.Fluent.Test/FluentWhereTest.cs
@@ -0,0 +1,80 @@
+using Xunit.Abstractions;
+
+namespace Carbunql.Fluent.Test;
+
+public class FluentWhereTest
+{
+ private readonly QueryCommandMonitor Monitor;
+
+ public FluentWhereTest(ITestOutputHelper output)
+ {
+ Monitor = new QueryCommandMonitor(output);
+ }
+
+ [Fact]
+ public void EqualTest()
+ {
+ var sq = new SelectQuery("""
+ select
+ a.id
+ , a.value
+ from
+ table_a a
+ """)
+ .Equal("id", 1);
+ ;
+
+ Monitor.Log(sq);
+
+ var expect = """
+ SELECT
+ a.id,
+ a.value
+ FROM
+ table_a AS a
+ WHERE
+ a.id = 1
+ """;
+
+ Assert.Equal(expect, sq.ToText());
+ }
+
+ [Fact]
+ public void EqualTest_ExtractYear()
+ {
+ var sq = new SelectQuery("""
+ SELECT
+ o.order_id,
+ c.customer_name,
+ o.order_date,
+ EXTRACT(YEAR FROM o.order_date) AS order_year,
+ EXTRACT(MONTH FROM o.order_date) AS order_month,
+ o.amount
+ FROM
+ orders o
+ JOIN
+ customers c ON o.customer_id = c.customer_id
+ """)
+ .Equal("order_year", 1);
+ ;
+
+ Monitor.Log(sq);
+
+ var expect = """
+ SELECT
+ o.order_id,
+ c.customer_name,
+ o.order_date,
+ EXTRACT(YEAR FROM o.order_date) AS order_year,
+ EXTRACT(MONTH FROM o.order_date) AS order_month,
+ o.amount
+ FROM
+ orders AS o
+ JOIN customers AS c ON o.customer_id = c.customer_id
+ WHERE
+ EXTRACT(YEAR FROM o.order_date) = 1
+ """;
+
+ Assert.Equal(expect, sq.ToText());
+ }
+}
\ No newline at end of file