| 125 | } |
| 126 | |
| 127 | @SuppressWarnings("unchecked") |
| 128 | public V getOrAdd(K key) { |
| 129 | Transaction currentT = Transaction.getCurrent(); |
| 130 | TableKey tkey = new TableKey(name, key); |
| 131 | |
| 132 | var cr = currentT.getRecordAccessed(tkey); |
| 133 | if (cr != null) { |
| 134 | V crv = (V)cr.newestValue(); |
| 135 | if (crv != null) |
| 136 | return crv; |
| 137 | // add |
| 138 | } else { |
| 139 | Record<K> r = getOrLoad(key); |
| 140 | cr = new Transaction.RecordAccessed(r); |
| 141 | currentT.addRecordAccessed(r.createRootInfoIfNeed(tkey), cr); |
| 142 | if (r.getValue() != null) |
| 143 | return (V)r.getValue(); |
| 144 | // add |
| 145 | } |
| 146 | |
| 147 | V add = newValue(); |
| 148 | add.initRootInfo(cr.getOrigin().createRootInfoIfNeed(tkey), null); |
| 149 | cr.put(currentT, add); |
| 150 | return add; |
| 151 | } |
| 152 | |
| 153 | private Record<K> getOrLoad(K key) { |
| 154 | return getOrLoad(key, null); |