GetFacts implements a ReadOnlyFactStore method.
(query ast.Atom, cb func(ast.Atom) error)
| 113 | |
| 114 | // GetFacts implements a ReadOnlyFactStore method. |
| 115 | func (s *SimpleColumnStore) GetFacts(query ast.Atom, cb func(ast.Atom) error) error { |
| 116 | pred := query.Predicate |
| 117 | numFacts := 0 |
| 118 | toSkip := 1 + len(s.predicates) |
| 119 | for i, p := range s.predicates { |
| 120 | if p == pred { |
| 121 | if p.Arity == 0 { // Special case 0-arity predicates, we are done. |
| 122 | if s.predicateFactCount[i] > 0 { |
| 123 | cb(ast.Atom{pred, nil}) |
| 124 | } |
| 125 | return nil |
| 126 | } |
| 127 | numFacts = s.predicateFactCount[i] |
| 128 | if numFacts == 0 { |
| 129 | return nil // Special case empty set of facts. |
| 130 | } |
| 131 | break |
| 132 | } |
| 133 | if p.Arity == 0 { |
| 134 | continue |
| 135 | } |
| 136 | toSkip += s.predicateFactCount[i] * p.Arity |
| 137 | } |
| 138 | |
| 139 | f, inputErr := s.input() |
| 140 | if inputErr != nil { |
| 141 | return ErrCouldNotRead |
| 142 | } |
| 143 | defer f.Close() |
| 144 | |
| 145 | scanner := bufio.NewScanner(f) |
| 146 | for i := 0; i < toSkip; i++ { |
| 147 | if ok := scanner.Scan(); !ok { |
| 148 | return ErrCouldNotRead |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | var sc SimpleColumn |
| 153 | if err := sc.readPred(scanner, pred, numFacts, query.Args, func(args []ast.BaseTerm) error { |
| 154 | if err := cb(ast.Atom{pred, args}); err != nil { |
| 155 | return err |
| 156 | } |
| 157 | return nil |
| 158 | }); err != nil { |
| 159 | return err |
| 160 | } |
| 161 | return nil |
| 162 | } |
| 163 | |
| 164 | var ( |
| 165 | // ErrCouldNotRead is returned when the input file could not be read. |