MCPcopy Create free account
hub / github.com/github/gh-aw / optimizeDisjunctionNode

Function optimizeDisjunctionNode

pkg/workflow/expression_optimizer.go:445–541  ·  view source on GitHub ↗
(n *DisjunctionNode)

Source from the content-addressed store, hash-verified

443}
444
445func optimizeDisjunctionNode(n *DisjunctionNode) ConditionNode {
446 if len(n.Terms) == 0 {
447 return n
448 }
449
450 // Bottom-up: optimise each term first.
451 optimised := make([]ConditionNode, 0, len(n.Terms))
452 for _, term := range n.Terms {
453 optimised = append(optimised, optimizeNode(term))
454 }
455
456 // Short-circuit: if any term is true the whole disjunction is true.
457 for _, term := range optimised {
458 if isBoolLiteral(term, true) {
459 expressionOptimizerLog.Printf("Disjunction short-circuit on true")
460 return &BooleanLiteralNode{Value: true}
461 }
462 }
463
464 // Filter out false terms (identity: A || false → A).
465 filtered := make([]ConditionNode, 0, len(optimised))
466 for _, term := range optimised {
467 if !isBoolLiteral(term, false) {
468 filtered = append(filtered, term)
469 }
470 }
471 if len(filtered) == 0 {
472 expressionOptimizerLog.Printf("Disjunction all-false → false")
473 return &BooleanLiteralNode{Value: false}
474 }
475
476 // Deduplicate terms by rendered form.
477 seen := make(map[string]struct{}, len(filtered))
478 deduped := make([]ConditionNode, 0, len(filtered))
479 for _, term := range filtered {
480 key := term.Render()
481 if _, exists := seen[key]; !exists {
482 seen[key] = struct{}{}
483 deduped = append(deduped, term)
484 } else {
485 expressionOptimizerLog.Printf("Disjunction dedup: removing duplicate term %q", key)
486 }
487 }
488
489 if len(deduped) == 1 {
490 return deduped[0]
491 }
492
493 // Complement: A || !A → true (mirrors the OrNode complement rule).
494 // Guard: skip when any term contains a status function so that
495 // status-function expressions are never silently eliminated.
496 if !slices.ContainsFunc(deduped, containsStatusFunc) {
497 for i := range deduped {
498 for j := i + 1; j < len(deduped); j++ {
499 if isNegationOf(deduped[i], deduped[j]) {
500 expressionOptimizerLog.Printf("Disjunction complement: %s || %s → true", deduped[i].Render(), deduped[j].Render())
501 return &BooleanLiteralNode{Value: true}
502 }

Callers 2

optimizeNodeFunction · 0.85
optimizeOrNodeFunction · 0.85

Calls 6

optimizeNodeFunction · 0.85
isBoolLiteralFunction · 0.85
isNegationOfFunction · 0.85
termSubsumedByFunction · 0.85
RenderMethod · 0.65
PrintfMethod · 0.45

Tested by

no test coverage detected