| 129 | } |
| 130 | |
| 131 | bool PrefilterTree::KeepNode(Prefilter* node) const { |
| 132 | if (node == NULL) |
| 133 | return false; |
| 134 | |
| 135 | switch (node->op()) { |
| 136 | default: |
| 137 | LOG(DFATAL) << "Unexpected op in KeepNode: " << node->op(); |
| 138 | return false; |
| 139 | |
| 140 | case Prefilter::ALL: |
| 141 | case Prefilter::NONE: |
| 142 | return false; |
| 143 | |
| 144 | case Prefilter::ATOM: |
| 145 | return node->atom().size() >= static_cast<size_t>(min_atom_len_); |
| 146 | |
| 147 | case Prefilter::AND: { |
| 148 | int j = 0; |
| 149 | std::vector<Prefilter*>* subs = node->subs(); |
| 150 | for (size_t i = 0; i < subs->size(); i++) |
| 151 | if (KeepNode((*subs)[i])) |
| 152 | (*subs)[j++] = (*subs)[i]; |
| 153 | else |
| 154 | delete (*subs)[i]; |
| 155 | |
| 156 | subs->resize(j); |
| 157 | return j > 0; |
| 158 | } |
| 159 | |
| 160 | case Prefilter::OR: |
| 161 | for (size_t i = 0; i < node->subs()->size(); i++) |
| 162 | if (!KeepNode((*node->subs())[i])) |
| 163 | return false; |
| 164 | return true; |
| 165 | } |
| 166 | } |
| 167 | |
| 168 | void PrefilterTree::AssignUniqueIds(NodeMap* nodes, |
| 169 | std::vector<std::string>* atom_vec) { |