Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions QueryBuilder.Tests/GeneralTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -601,5 +601,70 @@ public void Passing_Negative_Boolean_False_To_Where_Should_Call_WhereTrue_Or_Whe

Assert.Equal("SELECT * FROM [Table] WHERE [Col] != cast(0 as bit)", c[EngineCodes.SqlServer].ToString());
}

[Fact]
public void Clone_ShouldProduceIndependentIncludesList()
{
var query = new Query("users")
.Include("posts", new Query("posts"), "user_id", "id");

var clone = query.Clone();

// Adding an include to the clone should not affect the original
clone.Include("comments", new Query("comments"), "user_id", "id");

Assert.Single(query.Includes);
Assert.Equal(2, clone.Includes.Count);
}

[Fact]
public void Clone_ShouldProduceIndependentIncludeObjects()
{
var query = new Query("users")
.Include("posts", new Query("posts"), "user_id", "id");

var clone = query.Clone();

// Modifying an include property on the clone should not affect the original
clone.Includes[0].Name = "modified_name";

Assert.Equal("posts", query.Includes[0].Name);
Assert.Equal("modified_name", clone.Includes[0].Name);
}

[Fact]
public void Clone_ShouldProduceIndependentVariablesDictionary()
{
var query = new Query("users").Define("limit", 10);

var clone = query.Clone();

// Adding a variable to the clone should not affect the original
clone.Define("offset", 5);

Assert.False(query.Variables.ContainsKey("offset"));
Assert.True(clone.Variables.ContainsKey("offset"));
}

[Fact]
public void Clone_ShouldPreserveAllProperties()
{
var query = new Query("users")
.Select("id", "name")
.Where("active", true)
.Distinct()
.As("u")
.Include("posts", new Query("posts"), "user_id", "id")
.Define("myvar", 42);

var clone = query.Clone();

Assert.Equal(query.QueryAlias, clone.QueryAlias);
Assert.Equal(query.IsDistinct, clone.IsDistinct);
Assert.Equal(query.Method, clone.Method);
Assert.Equal(query.Includes.Count, clone.Includes.Count);
Assert.Equal(query.Includes[0].Name, clone.Includes[0].Name);
Assert.Equal(query.Variables["myvar"], clone.Variables["myvar"]);
}
}
}
12 changes: 12 additions & 0 deletions QueryBuilder/Include.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,17 @@ public class Include
public string ForeignKey { get; set; }
public string LocalKey { get; set; }
public bool IsMany { get; set; }

public Include Clone()
{
return new Include
{
Name = Name,
Query = Query.Clone(),
ForeignKey = ForeignKey,
LocalKey = LocalKey,
IsMany = IsMany,
};
}
}
}
4 changes: 2 additions & 2 deletions QueryBuilder/Query.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ public override Query Clone()
clone.QueryAlias = QueryAlias;
clone.IsDistinct = IsDistinct;
clone.Method = Method;
clone.Includes = Includes;
clone.Variables = Variables;
clone.Includes = Includes.Select(i => i.Clone()).ToList();
clone.Variables = new Dictionary<string, object>(Variables);
return clone;
}

Expand Down
5 changes: 3 additions & 2 deletions SqlKata.Execution/XQuery.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using SqlKata.Compilers;
Expand Down Expand Up @@ -35,8 +36,8 @@ public override Query Clone()
query.QueryAlias = QueryAlias;
query.IsDistinct = IsDistinct;
query.Method = Method;
query.Includes = Includes;
query.Variables = Variables;
query.Includes = Includes.Select(i => i.Clone()).ToList();
query.Variables = new Dictionary<string, object>(Variables);

query.SetEngineScope(EngineScope);

Expand Down
Loading