Skip to content

Commit c9a78c9

Browse files
committed
Fixed for issue #89
Where a tool had two routes leading back to the same parent nodes, those nodes would be defined in the query more than once
1 parent d6b6e7e commit c9a78c9

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

Engine/NodeBase.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,11 @@ private static string BuildWithSql(IEnumerable<NodeBase> orderedUpstreamDependen
210210

211211
internal virtual void FetchOrderedDependencies(IList<NodeBase> dependencies)
212212
{
213+
if (dependencies.Contains(this))
214+
{
215+
dependencies.Remove(this);
216+
}
217+
213218
dependencies.Insert(0, this);
214219
}
215220

Tests/AppendTests.cs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,102 @@ namespace QueryTree.Engine.Tests
77
{
88
public class AppendTests
99
{
10+
private List<ITableInfo> DatabaseInfo
11+
{
12+
get
13+
{
14+
return new List<ITableInfo>()
15+
{
16+
new MockTableInfo()
17+
{
18+
DisplayName = "employees",
19+
Columns = new List<IColumnInfo>()
20+
{
21+
new MockColumnInfo() { DataType = "int", Name = "ID" },
22+
new MockColumnInfo() { DataType = "varchar", Name = "Name" },
23+
new MockColumnInfo() { DataType = "int", Name = "department_id" }
24+
}
25+
},
26+
new MockTableInfo()
27+
{
28+
DisplayName = "departments",
29+
Columns = new List<IColumnInfo>()
30+
{
31+
new MockColumnInfo() { DataType = "int", Name = "ID" },
32+
new MockColumnInfo() { DataType = "varchar", Name = "Name" }
33+
}
34+
}
35+
};
36+
}
37+
}
1038

39+
private string NodesJsonWithComplexAppend
40+
{
41+
get
42+
{
43+
return @"[
44+
{
45+
""Id"": ""1"",
46+
""Type"": ""Data Table"",
47+
""Table"": ""employees""
48+
},
49+
{
50+
""Id"": ""2"",
51+
""Type"": ""Data Table"",
52+
""Table"": ""departments""
53+
},
54+
{
55+
""Id"": ""3"",
56+
""Inputs"": [""1"",""2""],
57+
""Type"": ""Join"",
58+
""JoinType"": ""Inner"",
59+
""Table1Column"": ""department_id"",
60+
""Table2Column"": ""ID""
61+
},
62+
{
63+
""Id"": ""4"",
64+
""Inputs"": [""3""],
65+
""Type"": ""Filter"",
66+
""FilterColumnIndex"": 0,
67+
""Operator"": ""EqualTo"",
68+
""FilterValue1"": ""1""
69+
},
70+
{
71+
""Id"": ""5"",
72+
""Inputs"": [""3""],
73+
""Type"": ""Filter"",
74+
""FilterColumnIndex"": 0,
75+
""Operator"": ""EqualTo"",
76+
""FilterValue1"": ""2""
77+
},
78+
{
79+
""Id"": ""6"",
80+
""Inputs"": [""4"",""5""],
81+
""Type"": ""Append"",
82+
""IncludeUniqueColumns"": true
83+
}
84+
]";
85+
}
86+
}
87+
88+
[Fact]
89+
public void TestMultipleRoutesToDataTablesDoesntDefineThemTwice()
90+
{
91+
var query = new Query(
92+
DatabaseType.PostgreSQL,
93+
NodesJsonWithComplexAppend,
94+
DatabaseInfo);
95+
96+
var sql = query.GetSql("6");
97+
98+
// count how many times "node_1" is defined
99+
int c = 0;
100+
int i = -1;
101+
while ((i = sql.IndexOf("node_1 AS", i+1)) >= 0)
102+
c++;
103+
104+
// The "node_1" datatable should only be defined once in the query
105+
Assert.Equal(1, c);
106+
}
11107
}
12108
}

0 commit comments

Comments
 (0)