Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
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
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,15 @@ private IEnumerable<FragmentBuilder> GetAllChildren(FragmentBuilder fragment)
{
foreach (var child in fragment.ChildrenFragments)
{
yield return child;
if (Parent.HasFragment(child.GetName()))
{
continue;
}
else
{
yield return child;
}

if (child.HasChildren)
{
foreach (var item in GetAllChildren(child))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,9 @@ public override FragmentBuilder AddFragments(params FragmentBuilder[] fragments)
}
return this;
}
public FragmentBuilder AddFragment(string path, FragmentBuilder fragment)
public override FragmentBuilder AddFragment(string path, FragmentBuilder fragment)
{
if (_childrenFragments.IsNull())
{
_childrenFragments = new List<FragmentBuilder>();
}
_childrenFragments ??= new List<FragmentBuilder>();
base.AddFragment(path, fragment);
_childrenFragments.Add(fragment);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,7 @@ public void AddFragment(FragmentBuilder fragmentBuilder)
{
_fragmentBuilders = new Dictionary<string, FragmentBuilder>();
}
if (!_fragmentBuilders.TryAdd(fragmentBuilder.GetName(), fragmentBuilder))
{
throw new ArgumentException($"Fragment [{fragmentBuilder.GetName()}] had added already.");
}
_fragmentBuilders.TryAdd(fragmentBuilder.GetName(), fragmentBuilder);
}
public IEnumerable<FragmentBuilder> GetFragments()
{
Expand Down Expand Up @@ -328,5 +325,10 @@ public void AddQuery(string typeQuery)
{
typeQueries.Add(typeQuery);
}

public bool HasFragment(string fragmentName)
{
return _fragmentBuilders.ContainsKey(fragmentName);
}
}
}
1 change: 1 addition & 0 deletions APIs/src/EpiServer.ContentGraph/Api/Querying/IQuery.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public interface IQuery
public Task<ContentGraphResult<TResult>> GetResultAsync<TResult>();
public Task<ContentGraphResult> GetResultAsync();
internal void AddFragment(FragmentBuilder fragmentBuilder);
internal bool HasFragment(string fragmentName);
internal void AddQuery(string typeQuery);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -225,5 +225,49 @@ public void fragment_on_field_should_generate_correct_query()
//expect full query
Assert.Equal(expectedFullQuery, graphQueryBuilder.GetQuery().Query);
}
[Fact]
public void cyclic_fragments_should_generate_correct_query()
{
const string expectedMainQuery = "query FragmentTest {FragmentObject{items{Name ...FirstFragment ...SecondFragment}}}";
const string expectedFistFragment = "fragment FirstFragment on PromoExtend {ProviderName Details{PromoImage{PromoExtend{...FirstFragment}}}}";
const string expectedSecondFragmment = "fragment SecondFragment on PromoObject {Url PromoExtend{...ThirdFragment}}";
const string expectedThirdFragmment = "fragment ThirdFragment on PromoExtend {ProviderName PromoExtend{...SecondFragment}}";
const string expectedFullQuery = $"{expectedMainQuery}\n{expectedFistFragment}\n{expectedSecondFragmment}\n{expectedThirdFragmment}";
//Self-referenced query: a -> a
var firstFragment = new FragmentBuilder<PromoExtend>("FirstFragment");
firstFragment.Fields(x => x.ProviderName);
firstFragment.AddFragment(x => x.Details.PromoImage.PromoExtend, firstFragment);

Assert.Equal(firstFragment.GetQuery().Query, expectedFistFragment);

//Cross-referenced: a -> b -> a
var secondFragment = new FragmentBuilder<PromoObject>("SecondFragment");
secondFragment.Fields(x => x.Url);

var thirdFragment = new FragmentBuilder<PromoExtend>("ThirdFragment");
thirdFragment.Fields(x => x.ProviderName);

secondFragment.AddFragment(x => x.PromoExtend, thirdFragment);
thirdFragment.AddFragment(x=> x.PromoExtend, secondFragment);

Assert.Equal(secondFragment.GetQuery().Query, expectedSecondFragmment);
Assert.Equal(thirdFragment.GetQuery().Query, expectedThirdFragmment);

GraphQueryBuilder graphQueryBuilder = new GraphQueryBuilder();
graphQueryBuilder
.OperationName("FragmentTest")
.ForType<FragmentObject>()
.Field(x => x.Name)
.AddFragments(firstFragment, secondFragment)
.ToQuery()
.BuildQueries();

Assert.Equal(graphQueryBuilder.GetFragments().First().GetQuery().Query, expectedFistFragment);
Assert.Equal(graphQueryBuilder.GetFragments().Skip(1).First().GetQuery().Query, expectedSecondFragmment);
Assert.Equal(graphQueryBuilder.GetFragments().Last().GetQuery().Query, expectedThirdFragmment);

//expect full query
Assert.Equal(expectedFullQuery, graphQueryBuilder.GetQuery().Query);
}
}
}
Loading