|
24 | 24 | #include <silkworm/db/chain/local_chain_storage.hpp>
|
25 | 25 | #include <silkworm/db/datastore/domain_get_as_of_query.hpp>
|
26 | 26 | #include <silkworm/db/datastore/domain_get_latest_query.hpp>
|
| 27 | +#include <silkworm/db/datastore/history_get_query.hpp> |
27 | 28 | #include <silkworm/db/datastore/history_range_query.hpp>
|
28 | 29 | #include <silkworm/db/datastore/inverted_index_range_by_key_query.hpp>
|
29 | 30 | #include <silkworm/db/datastore/kvdb/raw_codec.hpp>
|
@@ -68,6 +69,17 @@ using CodeDomainGetAsOfQuery = RawDomainGetAsOfQuery<state::kHistorySegmentAndId
|
68 | 69 | using CommitmentDomainGetAsOfQuery = RawDomainGetAsOfQuery<state::kHistorySegmentAndIdxNamesCommitment>;
|
69 | 70 | using ReceiptsDomainGetAsOfQuery = RawDomainGetAsOfQuery<state::kHistorySegmentAndIdxNamesReceipts>;
|
70 | 71 |
|
| 72 | +template <const snapshots::SegmentAndAccessorIndexNames& history_segment_names> |
| 73 | +using RawHistoryGetQuery = HistoryGetQuery< |
| 74 | + kvdb::RawEncoder<ByteView>, snapshots::RawEncoder<ByteView>, |
| 75 | + kvdb::RawDecoder<Bytes>, snapshots::RawDecoder<Bytes>, |
| 76 | + history_segment_names>; |
| 77 | +using AccountsHistoryGetQuery = RawHistoryGetQuery<state::kHistorySegmentAndIdxNamesAccounts>; |
| 78 | +using StorageHistoryGetQuery = RawHistoryGetQuery<state::kHistorySegmentAndIdxNamesStorage>; |
| 79 | +using CodeHistoryGetQuery = RawHistoryGetQuery<state::kHistorySegmentAndIdxNamesCode>; |
| 80 | +using CommitmentHistoryGetQuery = RawHistoryGetQuery<state::kHistorySegmentAndIdxNamesCommitment>; |
| 81 | +using ReceiptsHistoryGetQuery = RawHistoryGetQuery<state::kHistorySegmentAndIdxNamesReceipts>; |
| 82 | + |
71 | 83 | using RawInvertedIndexRangeByKeyQuery = InvertedIndexRangeByKeyQuery<
|
72 | 84 | kvdb::RawEncoder<Bytes>, snapshots::RawEncoder<Bytes>>; // TODO(canepat) try ByteView
|
73 | 85 |
|
@@ -180,9 +192,35 @@ Task<GetAsOfResult> LocalTransaction::get_as_of(GetAsOfQuery query) {
|
180 | 192 | co_return GetAsOfResult{.success = true, .value = std::move(*value)};
|
181 | 193 | }
|
182 | 194 |
|
183 |
| -Task<HistoryPointResult> LocalTransaction::history_seek(HistoryPointQuery /*query*/) { |
184 |
| - // TODO(canepat) implement using E3-like aggregator abstraction [tx_id_ must be changed] |
185 |
| - co_return HistoryPointResult{}; |
| 195 | +Task<HistoryPointResult> LocalTransaction::history_seek(HistoryPointQuery query) { |
| 196 | + if (!kTable2EntityNames.contains(query.table)) { |
| 197 | + co_return HistoryPointResult{}; |
| 198 | + } |
| 199 | + |
| 200 | + const auto domain_name = kTable2EntityNames.at(query.table); |
| 201 | + const auto domain = data_store_.chaindata.domain(domain_name); |
| 202 | + if (!domain.history) { |
| 203 | + co_return HistoryPointResult{}; |
| 204 | + } |
| 205 | + |
| 206 | + const auto timestamp = static_cast<datastore::Timestamp>(query.timestamp); |
| 207 | + |
| 208 | + std::optional<Bytes> value; |
| 209 | + if (domain_name == state::kDomainNameAccounts) { |
| 210 | + value = query_history_get<AccountsHistoryGetQuery>(*domain.history, query.key, timestamp); |
| 211 | + } else if (domain_name == state::kDomainNameStorage) { |
| 212 | + value = query_history_get<StorageHistoryGetQuery>(*domain.history, query.key, timestamp); |
| 213 | + } else if (domain_name == state::kDomainNameCode) { |
| 214 | + value = query_history_get<CodeHistoryGetQuery>(*domain.history, query.key, timestamp); |
| 215 | + } else if (domain_name == state::kDomainNameCommitment) { |
| 216 | + value = query_history_get<CommitmentHistoryGetQuery>(*domain.history, query.key, timestamp); |
| 217 | + } else if (domain_name == state::kDomainNameReceipts) { |
| 218 | + value = query_history_get<ReceiptsHistoryGetQuery>(*domain.history, query.key, timestamp); |
| 219 | + } |
| 220 | + if (!value) { |
| 221 | + co_return HistoryPointResult{}; |
| 222 | + } |
| 223 | + co_return HistoryPointResult{.success = true, .value = std::move(*value)}; |
186 | 224 | }
|
187 | 225 |
|
188 | 226 | Task<PaginatedTimestamps> LocalTransaction::index_range(IndexRangeQuery query) {
|
|
0 commit comments