@Override public Map<Sha256Hash, Long> lookupStreamIdsByHash(Transaction t, final Set<Sha256Hash> hashes) { if (hashes.isEmpty()) { return ImmutableMap.of(); } SnapshotsStreamHashAidxTable idx = tables.getSnapshotsStreamHashAidxTable(t); Set<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow> rows = getHashIndexRowsForHashes(hashes); Multimap<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow, SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue> m = idx.getRowsMultimap(rows); Map<Long, Sha256Hash> hashForStreams = Maps.newHashMap(); for (SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow r : m.keySet()) { for (SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue v : m.get(r)) { Long streamId = v.getColumnName().getStreamId(); Sha256Hash hash = r.getHash(); if (hashForStreams.containsKey(streamId)) { AssertUtils.assertAndLog(log, hashForStreams.get(streamId).equals(hash), "(BUG) Stream ID has 2 different hashes: " + streamId); } hashForStreams.put(streamId, hash); } } Map<Long, StreamMetadata> metadata = getMetadata(t, hashForStreams.keySet()); Map<Sha256Hash, Long> ret = Maps.newHashMap(); for (Map.Entry<Long, StreamMetadata> e : metadata.entrySet()) { if (e.getValue().getStatus() != Status.STORED) { continue; } Sha256Hash hash = hashForStreams.get(e.getKey()); ret.put(hash, e.getKey()); } return ret; }
log.error("Empty hash for stream {}", streamId); SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow hashRow = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow.of(hash); SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumn column = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumn.of(streamId); shToDelete.put(hashRow, column);
@Override public List<SnapshotsStreamHashAidxColumnValue> getRowColumns(SnapshotsStreamHashAidxRow row, ColumnSelection columns) { byte[] bytes = row.persistToBytes(); RowResult<byte[]> rowResult = t.getRows(tableRef, ImmutableSet.of(bytes), columns).get(bytes); if (rowResult == null) { return ImmutableList.of(); } else { List<SnapshotsStreamHashAidxColumnValue> ret = Lists.newArrayListWithCapacity(rowResult.getColumns().size()); for (Entry<byte[], byte[]> e : rowResult.getColumns().entrySet()) { SnapshotsStreamHashAidxColumn col = SnapshotsStreamHashAidxColumn.BYTES_HYDRATOR.hydrateFromBytes(e.getKey()); Long val = SnapshotsStreamHashAidxColumnValue.hydrateValue(e.getValue()); ret.add(SnapshotsStreamHashAidxColumnValue.of(col, val)); } return ret; } }
log.error("Empty hash for stream {}", streamId); SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow hashRow = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow.of(hash); SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumn column = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumn.of(streamId); shToDelete.put(hashRow, column);
@Override public Map<Sha256Hash, Long> lookupStreamIdsByHash(Transaction t, final Set<Sha256Hash> hashes) { if (hashes.isEmpty()) { return ImmutableMap.of(); } SnapshotsStreamHashAidxTable idx = tables.getSnapshotsStreamHashAidxTable(t); Set<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow> rows = getHashIndexRowsForHashes(hashes); Multimap<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow, SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue> m = idx.getRowsMultimap(rows); Map<Long, Sha256Hash> hashForStreams = Maps.newHashMap(); for (SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow r : m.keySet()) { for (SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue v : m.get(r)) { Long streamId = v.getColumnName().getStreamId(); Sha256Hash hash = r.getHash(); if (hashForStreams.containsKey(streamId)) { AssertUtils.assertAndLog(log, hashForStreams.get(streamId).equals(hash), "(BUG) Stream ID has 2 different hashes: " + streamId); } hashForStreams.put(streamId, hash); } } Map<Long, StreamMetadata> metadata = getMetadata(t, hashForStreams.keySet()); Map<Sha256Hash, Long> ret = Maps.newHashMap(); for (Map.Entry<Long, StreamMetadata> e : metadata.entrySet()) { if (e.getValue().getStatus() != Status.STORED) { continue; } Sha256Hash hash = hashForStreams.get(e.getKey()); ret.put(hash, e.getKey()); } return ret; }
private void putHashIndexTask(Transaction t, Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> rowsToMetadata) { Multimap<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow, SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue> indexMap = HashMultimap.create(); for (Entry<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> e : rowsToMetadata.entrySet()) { SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow row = e.getKey(); StreamMetadata metadata = e.getValue(); Preconditions.checkArgument( metadata.getStatus() == Status.STORED, "Should only index successfully stored streams."); Sha256Hash hash = Sha256Hash.EMPTY; if (metadata.getHash() != com.google.protobuf.ByteString.EMPTY) { hash = new Sha256Hash(metadata.getHash().toByteArray()); } SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow hashRow = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow.of(hash); SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumn column = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumn.of(row.getId()); SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue columnValue = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue.of(column, 0L); indexMap.put(hashRow, columnValue); } SnapshotsStreamHashAidxTable hiTable = tables.getSnapshotsStreamHashAidxTable(t); hiTable.put(indexMap); }
@Override public List<SnapshotsStreamHashAidxColumnValue> getRowColumns(SnapshotsStreamHashAidxRow row, ColumnSelection columns) { byte[] bytes = row.persistToBytes(); RowResult<byte[]> rowResult = t.getRows(tableRef, ImmutableSet.of(bytes), columns).get(bytes); if (rowResult == null) { return ImmutableList.of(); } else { List<SnapshotsStreamHashAidxColumnValue> ret = Lists.newArrayListWithCapacity(rowResult.getColumns().size()); for (Entry<byte[], byte[]> e : rowResult.getColumns().entrySet()) { SnapshotsStreamHashAidxColumn col = SnapshotsStreamHashAidxColumn.BYTES_HYDRATOR.hydrateFromBytes(e.getKey()); Long val = SnapshotsStreamHashAidxColumnValue.hydrateValue(e.getValue()); ret.add(SnapshotsStreamHashAidxColumnValue.of(col, val)); } return ret; } }
@Override public SnapshotsStreamHashAidxRow apply(Sha256Hash row) { return SnapshotsStreamHashAidxRow.of(row); } };
public static SnapshotsStreamHashAidxRow of(Sha256Hash hash) { return new SnapshotsStreamHashAidxRow(hash); }
@Override public SnapshotsStreamHashAidxRow hydrateFromBytes(byte[] __input) { int __index = 0; Sha256Hash hash = new Sha256Hash(EncodingUtils.get32Bytes(__input, __index)); __index += 32; return new SnapshotsStreamHashAidxRow(hash); } };
private Set<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow> getHashIndexRowsForHashes(final Set<Sha256Hash> hashes) { Set<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow> rows = Sets.newHashSet(); for (Sha256Hash h : hashes) { rows.add(SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow.of(h)); } return rows; }
private void putHashIndexTask(Transaction t, Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> rowsToMetadata) { Multimap<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow, SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue> indexMap = HashMultimap.create(); for (Entry<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> e : rowsToMetadata.entrySet()) { SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow row = e.getKey(); StreamMetadata metadata = e.getValue(); Preconditions.checkArgument( metadata.getStatus() == Status.STORED, "Should only index successfully stored streams."); Sha256Hash hash = Sha256Hash.EMPTY; if (metadata.getHash() != com.google.protobuf.ByteString.EMPTY) { hash = new Sha256Hash(metadata.getHash().toByteArray()); } SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow hashRow = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow.of(hash); SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumn column = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumn.of(row.getId()); SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue columnValue = SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxColumnValue.of(column, 0L); indexMap.put(hashRow, columnValue); } SnapshotsStreamHashAidxTable hiTable = tables.getSnapshotsStreamHashAidxTable(t); hiTable.put(indexMap); }
public static SnapshotsStreamHashAidxRow of(Sha256Hash hash) { return new SnapshotsStreamHashAidxRow(hash); }
private Set<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow> getHashIndexRowsForHashes(final Set<Sha256Hash> hashes) { Set<SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow> rows = Sets.newHashSet(); for (Sha256Hash h : hashes) { rows.add(SnapshotsStreamHashAidxTable.SnapshotsStreamHashAidxRow.of(h)); } return rows; }
@Override public SnapshotsStreamHashAidxRow apply(Sha256Hash row) { return SnapshotsStreamHashAidxRow.of(row); } };
@Override public SnapshotsStreamHashAidxRow hydrateFromBytes(byte[] __input) { int __index = 0; Sha256Hash hash = new Sha256Hash(EncodingUtils.get32Bytes(__input, __index)); __index += 32; return new SnapshotsStreamHashAidxRow(hash); } };