agent_patch
runs/2026-02-28__13-38-10__gpt-5-1-codex-mini/flux-pr-1087/flux-pr-1087.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/agent-logs/agent.patch
6310 bytes
diff --git a/app/pkg/testing/permutations/permutations.go b/app/pkg/testing/permutations/permutations.go
new file mode 100644
index 0000000..f67baee
--- /dev/null
+++ b/app/pkg/testing/permutations/permutations.go
@@ -0,0 +1,29 @@
+package permutations
+
+import "gonum.org/v1/gonum/stat/combin"
+
+type Permutation[T any] struct {
+ Order []int
+ Items []T
+}
+
+func Permutations[T any](items []T) []*Permutation[T] {
+ size := len(items)
+ orderPermutations := combin.Permutations(size, size)
+
+ permutations := make([]*Permutation[T], 0, len(orderPermutations))
+ for _, order := range orderPermutations {
+ orderCopy := append([]int(nil), order...)
+ itemsCopy := make([]T, size)
+ for i, idx := range orderCopy {
+ itemsCopy[i] = items[idx]
+ }
+
+ permutations = append(permutations, &Permutation[T]{
+ Order: orderCopy,
+ Items: itemsCopy,
+ })
+ }
+
+ return permutations
+}
diff --git a/tmp/agent-patch-flux-pr-1087.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/datasourcetesting/datasourcetesting.go b/app/v2/pkg/engine/datasourcetesting/datasourcetesting.go
index 9a02e3e..6ca32f7 100644
--- a/tmp/agent-patch-flux-pr-1087.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/datasourcetesting/datasourcetesting.go
+++ b/app/v2/pkg/engine/datasourcetesting/datasourcetesting.go
@@ -13,7 +13,8 @@ import (
"github.com/kylelemons/godebug/pretty"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
- "gonum.org/v1/gonum/stat/combin"
+
+ permutations "github.com/wundergraph/graphql-go-tools/v2/pkg/testing/permutations"
"github.com/wundergraph/graphql-go-tools/v2/pkg/internal/unsafeprinter"
@@ -70,13 +71,12 @@ func WithPrintPlan() func(*testOptions) {
func RunWithPermutations(t *testing.T, definition, operation, operationName string, expectedPlan plan.Plan, config plan.Configuration, options ...func(*testOptions)) {
t.Helper()
- dataSourcePermutations := DataSourcePermutations(config.DataSources)
+ dataSourcePermutations := permutations.Permutations(config.DataSources)
- for i := range dataSourcePermutations {
- permutation := dataSourcePermutations[i]
+ for _, permutation := range dataSourcePermutations {
t.Run(fmt.Sprintf("permutation %v", permutation.Order), func(t *testing.T) {
permutationPlanConfiguration := config
- permutationPlanConfiguration.DataSources = permutation.DataSources
+ permutationPlanConfiguration.DataSources = permutation.Items
t.Run("run", RunTest(
definition,
@@ -91,7 +91,7 @@ func RunWithPermutations(t *testing.T, definition, operation, operationName stri
}
func RunWithPermutationsVariants(t *testing.T, definition, operation, operationName string, expectedPlans []plan.Plan, config plan.Configuration, options ...func(*testOptions)) {
- dataSourcePermutations := DataSourcePermutations(config.DataSources)
+ dataSourcePermutations := permutations.Permutations(config.DataSources)
if len(dataSourcePermutations) != len(expectedPlans) {
t.Fatalf("expected %d plan variants, got %d", len(dataSourcePermutations), len(expectedPlans))
@@ -101,7 +101,7 @@ func RunWithPermutationsVariants(t *testing.T, definition, operation, operationN
permutation := dataSourcePermutations[i]
t.Run(fmt.Sprintf("permutation %v", permutation.Order), func(t *testing.T) {
permutationPlanConfiguration := config
- permutationPlanConfiguration.DataSources = permutation.DataSources
+ permutationPlanConfiguration.DataSources = permutation.Items
t.Run("run", RunTest(
definition,
@@ -232,35 +232,3 @@ func ShuffleDS(dataSources []plan.DataSource) []plan.DataSource {
return dataSources
}
-
-func OrderDS(dataSources []plan.DataSource, order []int) (out []plan.DataSource) {
- out = make([]plan.DataSource, 0, len(dataSources))
-
- for _, i := range order {
- out = append(out, dataSources[i])
- }
-
- return out
-}
-
-func DataSourcePermutations(dataSources []plan.DataSource) []*Permutation {
- size := len(dataSources)
- elementsCount := len(dataSources)
- list := combin.Permutations(size, elementsCount)
-
- permutations := make([]*Permutation, 0, len(list))
-
- for _, v := range list {
- permutations = append(permutations, &Permutation{
- Order: v,
- DataSources: OrderDS(dataSources, v),
- })
- }
-
- return permutations
-}
-
-type Permutation struct {
- Order []int
- DataSources []plan.DataSource
-}
diff --git a/tmp/agent-patch-flux-pr-1087.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/plan/datasource_filter_collect_nodes_visitor.go b/app/v2/pkg/engine/plan/datasource_filter_collect_nodes_visitor.go
index 1262c2e..fdc35eb 100644
--- a/tmp/agent-patch-flux-pr-1087.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/plan/datasource_filter_collect_nodes_visitor.go
+++ b/app/v2/pkg/engine/plan/datasource_filter_collect_nodes_visitor.go
@@ -197,8 +197,11 @@ func (f *collectNodesVisitor) isInterfaceObject(typeName string) bool {
// has disabled entity resolver
func (f *collectNodesVisitor) allKeysHasDisabledEntityResolver(typeName string) bool {
- keys := f.dataSource.FederationConfiguration().Keys
- return !slices.ContainsFunc(keys.FilterByTypeAndResolvability(typeName, false), func(k FederationFieldConfiguration) bool {
+ keys := f.dataSource.FederationConfiguration().Keys.FilterByTypeAndResolvability(typeName, false)
+ if len(keys) == 0 {
+ return false
+ }
+ return !slices.ContainsFunc(keys, func(k FederationFieldConfiguration) bool {
return !k.DisableEntityResolver
})
}
diff --git a/tmp/agent-patch-flux-pr-1087.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/plan/datasource_filter_visitor.go b/app/v2/pkg/engine/plan/datasource_filter_visitor.go
index f96b8e8..1746eab 100644
--- a/tmp/agent-patch-flux-pr-1087.1-of-1.2026-02-28__13-38-10__gpt-5-1-codex-mini/app/v2/pkg/engine/plan/datasource_filter_visitor.go
+++ b/app/v2/pkg/engine/plan/datasource_filter_visitor.go
@@ -206,6 +206,10 @@ func (f *DataSourceFilter) selectUniqNodeParentsUpToRootNode(i int) {
if !ok {
break
}
+ parent := f.nodes.items[parentIdx]
+ if parent.IsExternal && !parent.IsProvided {
+ break
+ }
f.nodes.items[parentIdx].selectWithReason(ReasonStage1SameSourceParent, f.enableSelectionReasons)
current = parentIdx