Skip to content

Commit bd33e8e

Browse files
mdesalvoclaude
andcommitted
Migrate Union/Minus tests to tree operators and fix prefix/describe traversal
Adjust the test suite to the new tree-based Union/Minus algebra (which is SPARQL-compliant, unlike the old sequential flag-based evaluation): - Regenerate the printer expected strings for nested operator trees and drop the stale "will not be printed" comments left over from the flag-based API. - Update RDFQueryEngine evaluation tests: row ordering now follows the left-then-right Union merge, and Union/Minus operators surface as a single fused result table (one QueryMemberResultTables entry) instead of two. Two production gaps surfaced by the migration are fixed as well: - RDFQuery.GetPrefixes now traverses operator tree members so prefixes declared by subqueries nested inside Union/Minus are collected (otherwise the printed query references prefixes it never declares). - RDFQueryEngine.FetchDescribeVariablesFromQueryMembers handles operator nodes so "DESCRIBE *" collects variables from the operator tree's leaves. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent c4b9908 commit bd33e8e

4 files changed

Lines changed: 945 additions & 840 deletions

File tree

‎RDFSharp.Test/Query/Mirella/Engines/RDFQueryEngineTest.cs‎

Lines changed: 63 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -939,20 +939,20 @@ public void ShouldEvaluateSelectQueryOnGraphWithComplexQuery2()
939939
Assert.AreEqual(4, result.SelectResultsCount);
940940
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?X"].ToString(), "ex:paperino", StringComparison.Ordinal));
941941
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?N"].ToString(), "Donald Duck@EN-US", StringComparison.Ordinal));
942-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
943-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
942+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
943+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?C"].ToString(), "white", StringComparison.Ordinal));
944944
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?X"].ToString(), "ex:paperino", StringComparison.Ordinal));
945945
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?N"].ToString(), "Donald Duck@EN-US", StringComparison.Ordinal));
946-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
947-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?C"].ToString(), "white", StringComparison.Ordinal));
946+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
947+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
948948
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?X"].ToString(), "ex:topolino", StringComparison.Ordinal));
949949
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?N"].ToString(), "Mickey Mouse@EN-US", StringComparison.Ordinal));
950-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
951-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
950+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
951+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?C"].ToString(), "white", StringComparison.Ordinal));
952952
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?X"].ToString(), "ex:topolino", StringComparison.Ordinal));
953953
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?N"].ToString(), "Mickey Mouse@EN-US", StringComparison.Ordinal));
954-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
955-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?C"].ToString(), "white", StringComparison.Ordinal));
954+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
955+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
956956
}
957957

958958
[TestMethod]
@@ -993,28 +993,28 @@ public void ShouldEvaluateSelectQueryOnGraphWithComplexQuery3()
993993
Assert.AreEqual(6, result.SelectResultsCount);
994994
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?X"].ToString(), "ex:paperino", StringComparison.Ordinal));
995995
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?N"].ToString(), "Donald Duck@EN-US", StringComparison.Ordinal));
996-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
997-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
996+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
997+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[0]["?C"].ToString(), "white", StringComparison.Ordinal));
998998
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?X"].ToString(), "ex:paperino", StringComparison.Ordinal));
999999
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?N"].ToString(), "Donald Duck@EN-US", StringComparison.Ordinal));
1000-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
1001-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?C"].ToString(), "white", StringComparison.Ordinal));
1000+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
1001+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[1]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
10021002
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?X"].ToString(), "ex:topolino", StringComparison.Ordinal));
10031003
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?N"].ToString(), "Mickey Mouse@EN-US", StringComparison.Ordinal));
1004-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
1005-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
1004+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
1005+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[2]["?C"].ToString(), "white", StringComparison.Ordinal));
10061006
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?X"].ToString(), "ex:topolino", StringComparison.Ordinal));
10071007
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?N"].ToString(), "Mickey Mouse@EN-US", StringComparison.Ordinal));
1008-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
1009-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?C"].ToString(), "white", StringComparison.Ordinal));
1008+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
1009+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[3]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
10101010
Assert.IsTrue(string.Equals(result.SelectResults.Rows[4]["?X"].ToString(), "ex:whoever", StringComparison.Ordinal));
10111011
Assert.IsTrue(string.Equals(result.SelectResults.Rows[4]["?N"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
1012-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[4]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
1013-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[4]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
1012+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[4]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
1013+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[4]["?C"].ToString(), "white", StringComparison.Ordinal));
10141014
Assert.IsTrue(string.Equals(result.SelectResults.Rows[5]["?X"].ToString(), "ex:whoever", StringComparison.Ordinal));
10151015
Assert.IsTrue(string.Equals(result.SelectResults.Rows[5]["?N"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
1016-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[5]["?Y"].ToString(), "ex:paperoga", StringComparison.Ordinal));
1017-
Assert.IsTrue(string.Equals(result.SelectResults.Rows[5]["?C"].ToString(), "white", StringComparison.Ordinal));
1016+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[5]["?Y"].ToString(), "ex:linus", StringComparison.Ordinal));
1017+
Assert.IsTrue(string.Equals(result.SelectResults.Rows[5]["?C"].ToString(), DBNull.Value.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
10181018
}
10191019

10201020
[TestMethod]
@@ -1074,15 +1074,15 @@ public void ShouldEvaluateSelectQueryOnGraphWithComplexQuery4()
10741074
}
10751075
MINUS
10761076
{
1077-
{
1078-
SELECT *
1079-
WHERE {
1080-
{
1081-
?Y <ex:dogOf> ?X .
1082-
?X <ex:hasColor> ?C .
1083-
}
1077+
{
1078+
SELECT *
1079+
WHERE {
1080+
{
1081+
?Y <ex:dogOf> ?X .
1082+
?X <ex:hasColor> ?C .
10841083
}
10851084
}
1085+
}
10861086
UNION
10871087
{
10881088
VALUES (?Y ?X) {
@@ -2949,22 +2949,21 @@ public void ShouldEvaluateQueryMembersWithResultsAndExtendedPropertiesOpUn()
29492949
queryEngine.EvaluateQueryMembers(evaluableQueryMembers, graph);
29502950

29512951
Assert.IsNotNull(queryEngine.QueryMemberResultTables);
2952-
Assert.HasCount(2, queryEngine.QueryMemberResultTables);
2953-
Assert.IsTrue(queryEngine.QueryMemberResultTables.ElementAt(0).Value != null);
2954-
Assert.IsTrue((bool)queryEngine.QueryMemberResultTables.ElementAt(0).Value.IsOptional);
2955-
Assert.AreEqual(3, queryEngine.QueryMemberResultTables.ElementAt(0).Value.Columns.Count);
2956-
Assert.AreEqual(2, queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows.Count);
2957-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[0]["?Y"].ToString(), "ex:pluto", StringComparison.Ordinal));
2958-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[0]["?X"].ToString(), "ex:topolino", StringComparison.Ordinal));
2959-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[0]["?N"].ToString(), "Mickey Mouse@EN-US", StringComparison.Ordinal));
2960-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[1]["?Y"].ToString(), "ex:fido", StringComparison.Ordinal));
2961-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[1]["?X"].ToString(), "ex:paperino", StringComparison.Ordinal));
2962-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[1]["?N"].ToString(), "Donald Duck@EN-US", StringComparison.Ordinal));
2963-
Assert.IsTrue(queryEngine.QueryMemberResultTables.ElementAt(1).Value != null);
2964-
Assert.IsFalse((bool)queryEngine.QueryMemberResultTables.ElementAt(1).Value.IsOptional);
2965-
Assert.AreEqual(1, queryEngine.QueryMemberResultTables.ElementAt(1).Value.Columns.Count);
2966-
Assert.AreEqual(1, queryEngine.QueryMemberResultTables.ElementAt(1).Value.Rows.Count);
2967-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(1).Value.Rows[0]["?Y"].ToString(), "ex:pluto", StringComparison.Ordinal));
2952+
Assert.HasCount(1, queryEngine.QueryMemberResultTables);
2953+
var opUnTable = queryEngine.QueryMemberResultTables.ElementAt(0).Value;
2954+
Assert.IsNotNull(opUnTable);
2955+
Assert.IsTrue((bool)opUnTable.IsOptional);
2956+
Assert.AreEqual(3, opUnTable.Columns.Count);
2957+
Assert.AreEqual(3, opUnTable.Rows.Count);
2958+
Assert.IsTrue(string.Equals(opUnTable.Rows[0]["?Y"], "ex:pluto", StringComparison.Ordinal));
2959+
Assert.IsTrue(string.Equals(opUnTable.Rows[0]["?X"], "ex:topolino", StringComparison.Ordinal));
2960+
Assert.IsTrue(string.Equals(opUnTable.Rows[0]["?N"], "Mickey Mouse@EN-US", StringComparison.Ordinal));
2961+
Assert.IsTrue(string.Equals(opUnTable.Rows[1]["?Y"], "ex:fido", StringComparison.Ordinal));
2962+
Assert.IsTrue(string.Equals(opUnTable.Rows[1]["?X"], "ex:paperino", StringComparison.Ordinal));
2963+
Assert.IsTrue(string.Equals(opUnTable.Rows[1]["?N"], "Donald Duck@EN-US", StringComparison.Ordinal));
2964+
Assert.IsTrue(string.Equals(opUnTable.Rows[2]["?Y"], "ex:pluto", StringComparison.Ordinal));
2965+
Assert.IsNull(opUnTable.Rows[2]["?X"]);
2966+
Assert.IsNull(opUnTable.Rows[2]["?N"]);
29682967
}
29692968

29702969
[TestMethod]
@@ -2996,22 +2995,21 @@ public void ShouldEvaluateQueryMembersWithResultsAndExtendedPropertiesUnOp()
29962995
queryEngine.EvaluateQueryMembers(evaluableQueryMembers, graph);
29972996

29982997
Assert.IsNotNull(queryEngine.QueryMemberResultTables);
2999-
Assert.HasCount(2, queryEngine.QueryMemberResultTables);
3000-
Assert.IsTrue(queryEngine.QueryMemberResultTables.ElementAt(0).Value != null);
3001-
Assert.IsFalse((bool)queryEngine.QueryMemberResultTables.ElementAt(0).Value.IsOptional);
3002-
Assert.AreEqual(3, queryEngine.QueryMemberResultTables.ElementAt(0).Value.Columns.Count);
3003-
Assert.AreEqual(2, queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows.Count);
3004-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[0]["?Y"].ToString(), "ex:pluto", StringComparison.Ordinal));
3005-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[0]["?X"].ToString(), "ex:topolino", StringComparison.Ordinal));
3006-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[0]["?N"].ToString(), "Mickey Mouse@EN-US", StringComparison.Ordinal));
3007-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[1]["?Y"].ToString(), "ex:fido", StringComparison.Ordinal));
3008-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[1]["?X"].ToString(), "ex:paperino", StringComparison.Ordinal));
3009-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(0).Value.Rows[1]["?N"].ToString(), "Donald Duck@EN-US", StringComparison.Ordinal));
3010-
Assert.IsTrue(queryEngine.QueryMemberResultTables.ElementAt(1).Value != null);
3011-
Assert.IsTrue((bool)queryEngine.QueryMemberResultTables.ElementAt(1).Value.IsOptional);
3012-
Assert.AreEqual(1, queryEngine.QueryMemberResultTables.ElementAt(1).Value.Columns.Count);
3013-
Assert.AreEqual(1, queryEngine.QueryMemberResultTables.ElementAt(1).Value.Rows.Count);
3014-
Assert.IsTrue(string.Equals(queryEngine.QueryMemberResultTables.ElementAt(1).Value.Rows[0]["?Y"].ToString(), "ex:pluto", StringComparison.Ordinal));
2998+
Assert.HasCount(1, queryEngine.QueryMemberResultTables);
2999+
var unOpTable = queryEngine.QueryMemberResultTables.ElementAt(0).Value;
3000+
Assert.IsNotNull(unOpTable);
3001+
Assert.IsFalse((bool)unOpTable.IsOptional);
3002+
Assert.AreEqual(3, unOpTable.Columns.Count);
3003+
Assert.AreEqual(3, unOpTable.Rows.Count);
3004+
Assert.IsTrue(string.Equals(unOpTable.Rows[0]["?Y"], "ex:pluto", StringComparison.Ordinal));
3005+
Assert.IsTrue(string.Equals(unOpTable.Rows[0]["?X"], "ex:topolino", StringComparison.Ordinal));
3006+
Assert.IsTrue(string.Equals(unOpTable.Rows[0]["?N"], "Mickey Mouse@EN-US", StringComparison.Ordinal));
3007+
Assert.IsTrue(string.Equals(unOpTable.Rows[1]["?Y"], "ex:fido", StringComparison.Ordinal));
3008+
Assert.IsTrue(string.Equals(unOpTable.Rows[1]["?X"], "ex:paperino", StringComparison.Ordinal));
3009+
Assert.IsTrue(string.Equals(unOpTable.Rows[1]["?N"], "Donald Duck@EN-US", StringComparison.Ordinal));
3010+
Assert.IsTrue(string.Equals(unOpTable.Rows[2]["?Y"], "ex:pluto", StringComparison.Ordinal));
3011+
Assert.IsNull(unOpTable.Rows[2]["?X"]);
3012+
Assert.IsNull(unOpTable.Rows[2]["?N"]);
30153013
}
30163014

30173015
[TestMethod]
@@ -3116,15 +3114,12 @@ public void ShouldEvaluatePatternGroupWithNoResultsFromPattern()
31163114

31173115
Assert.IsNotNull(queryEngine.PatternGroupMemberResultTables);
31183116
Assert.HasCount(1, queryEngine.PatternGroupMemberResultTables);
3119-
Assert.HasCount(2, queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value);
3120-
Assert.IsTrue(queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[0] != null);
3121-
Assert.IsFalse((bool)queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[0].IsOptional);
3122-
Assert.AreEqual(2, queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[0].Columns.Count);
3123-
Assert.AreEqual(0, queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[0].Rows.Count);
3124-
Assert.IsTrue(queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[1] != null);
3125-
Assert.IsTrue((bool)queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[1].IsOptional);
3126-
Assert.AreEqual(1, queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[1].Columns.Count);
3127-
Assert.AreEqual(0, queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[1].Rows.Count);
3117+
Assert.HasCount(1, queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value);
3118+
var noResTable = queryEngine.PatternGroupMemberResultTables.ElementAt(0).Value[0];
3119+
Assert.IsNotNull(noResTable);
3120+
Assert.IsFalse((bool)noResTable.IsOptional);
3121+
Assert.AreEqual(3, noResTable.Columns.Count);
3122+
Assert.AreEqual(0, noResTable.Rows.Count);
31283123
}
31293124

31303125
[TestMethod]

0 commit comments

Comments
 (0)