| 134 | } |
| 135 | |
| 136 | func (iter *JoinIter) next() bool { |
| 137 | if (iter.keyOrigin == FromMem || iter.keyOrigin == FromBoth) && iter.nextMemEnd == false { |
| 138 | iter.nextMemEnd = !iter.memdb.Next() |
| 139 | } |
| 140 | if (iter.keyOrigin == FromBack || iter.keyOrigin == FromBoth) && iter.nextBackEnd == false { |
| 141 | iter.nextBackEnd = !iter.backend.Next() |
| 142 | } |
| 143 | |
| 144 | // check error |
| 145 | if iter.Error() != nil { |
| 146 | return false |
| 147 | } |
| 148 | |
| 149 | if iter.nextBackEnd { |
| 150 | if iter.nextMemEnd { |
| 151 | iter.key = nil |
| 152 | iter.value = nil |
| 153 | return false |
| 154 | } else { |
| 155 | iter.key = iter.memdb.Key() |
| 156 | iter.value = iter.memdb.Value() |
| 157 | iter.keyOrigin = FromMem |
| 158 | } |
| 159 | } else { |
| 160 | if iter.nextMemEnd { |
| 161 | iter.key = iter.backend.Key() |
| 162 | iter.value = iter.backend.Value() |
| 163 | iter.keyOrigin = FromBack |
| 164 | } else { |
| 165 | bkey := iter.backend.Key() |
| 166 | mkey := iter.memdb.Key() |
| 167 | cmp := iter.cmp.Compare(mkey, bkey) |
| 168 | switch cmp { |
| 169 | case -1: |
| 170 | iter.key = mkey |
| 171 | iter.value = iter.memdb.Value() |
| 172 | iter.keyOrigin = FromMem |
| 173 | case 0: |
| 174 | iter.key = mkey |
| 175 | iter.value = iter.memdb.Value() |
| 176 | iter.keyOrigin = FromBoth |
| 177 | case 1: |
| 178 | iter.key = bkey |
| 179 | iter.value = iter.backend.Value() |
| 180 | iter.keyOrigin = FromBack |
| 181 | default: |
| 182 | panic("unreachable") |
| 183 | } |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | return true |
| 188 | } |
| 189 | |
| 190 | func (iter *JoinIter) Release() { |
| 191 | iter.memdb.Release() |