()
| 492 | } |
| 493 | |
| 494 | func (e *engine) eval() error { |
| 495 | predicateAllowList := *e.options.predicateAllowList |
| 496 | // First round. |
| 497 | for _, clause := range e.programInfo.Rules { |
| 498 | if !predicateAllowList(clause.Head.Predicate) { |
| 499 | continue |
| 500 | } |
| 501 | if clause.Transform != nil && !clause.Transform.IsLetTransform() { |
| 502 | // clauses with do-transforms assume a single subgoal as body. |
| 503 | continue |
| 504 | } |
| 505 | derivedFacts, err := e.oneStepEvalClause(clause) |
| 506 | if err != nil { |
| 507 | return err |
| 508 | } |
| 509 | for _, tf := range derivedFacts { |
| 510 | // Add to temporal store if interval is present |
| 511 | if tf.Interval != nil && e.temporalStore != nil { |
| 512 | if _, err := e.temporalStore.Add(tf.Atom, *tf.Interval); err != nil { |
| 513 | return err |
| 514 | } |
| 515 | if e.temporalDeltaStore != nil { |
| 516 | if _, err := e.temporalDeltaStore.Add(tf.Atom, *tf.Interval); err != nil { |
| 517 | return err |
| 518 | } |
| 519 | } |
| 520 | } else { |
| 521 | // Add to delta store (for incremental evaluation) |
| 522 | e.deltaStore.Add(tf.Atom) |
| 523 | } |
| 524 | } |
| 525 | } |
| 526 | if e.deltaStore.EstimateFactCount() > 0 || (e.temporalDeltaStore != nil && e.temporalDeltaStore.EstimateFactCount() > 0) { |
| 527 | // Incremental rounds. |
| 528 | deltaRules := makeDeltaRules(e.programInfo.Decls, e.predToRules) |
| 529 | if err := e.mergeDelta(); err != nil { |
| 530 | return err |
| 531 | } |
| 532 | for { |
| 533 | newDeltaStore := factstore.NewMultiIndexedArrayInMemoryStore() |
| 534 | var newTemporalDeltaStore factstore.TemporalFactStore |
| 535 | if e.temporalStore != nil { |
| 536 | newTemporalDeltaStore = factstore.NewTemporalStore() |
| 537 | } |
| 538 | var incrementalFactAdded bool |
| 539 | for _, predDeltaRule := range deltaRules { |
| 540 | for _, deltaRule := range predDeltaRule { |
| 541 | if !predicateAllowList(deltaRule.Head.Predicate) { |
| 542 | continue |
| 543 | } |
| 544 | derivedFacts, err := e.oneStepEvalClause(deltaRule) |
| 545 | if err != nil { |
| 546 | return err |
| 547 | } |
| 548 | for _, tf := range derivedFacts { |
| 549 | if tf.Interval != nil && e.temporalStore != nil { |
| 550 | added, err := e.temporalStore.Add(tf.Atom, *tf.Interval) |
| 551 | if err != nil { |
no test coverage detected