aboutsummaryrefslogtreecommitdiffstats
path: root/ydb/core/scheme/scheme_tablecell.cpp
diff options
context:
space:
mode:
authorMaksim Kita <kitaetoya@gmail.com>2023-07-11 14:07:13 +0000
committermaksim-kita <maksim-kita@yandex-team.com>2023-07-11 17:07:13 +0300
commit341dec40451fa14efd03d41ae055e96d8490761d (patch)
tree85973cf3772ef943fe419e3b80b9a2a3d467e51e /ydb/core/scheme/scheme_tablecell.cpp
parentb82748c710edb310a5171647a19cbdc9055f70a6 (diff)
downloadydb-341dec40451fa14efd03d41ae055e96d8490761d.tar.gz
Datashard added OwnedCellVecBatch
Datashard added OwnedCellVecBatch Pull Request resolved: #304
Diffstat (limited to 'ydb/core/scheme/scheme_tablecell.cpp')
-rw-r--r--ydb/core/scheme/scheme_tablecell.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/ydb/core/scheme/scheme_tablecell.cpp b/ydb/core/scheme/scheme_tablecell.cpp
index 04c2aaf4a6..3d30ca1d80 100644
--- a/ydb/core/scheme/scheme_tablecell.cpp
+++ b/ydb/core/scheme/scheme_tablecell.cpp
@@ -197,6 +197,54 @@ bool TSerializedCellVec::DoTryParse(const TString& data) {
return TryDeserializeCellVec(data, Buf, Cells);
}
+TOwnedCellVecBatch::TOwnedCellVecBatch()
+ : Pool(std::make_unique<TMemoryPool>(InitialPoolSize)) {
+}
+
+size_t TOwnedCellVecBatch::Append(TConstArrayRef<TCell> cells) {
+ size_t cellsSize = cells.size();
+ if (cellsSize == 0) {
+ CellVectors.emplace_back();
+ return 0;
+ }
+
+ size_t size = sizeof(TCell) * cellsSize;
+ for (auto& cell : cells) {
+ if (!cell.IsNull() && !cell.IsInline()) {
+ const size_t cellSize = cell.Size();
+ size += AlignUp(cellSize);
+ }
+ }
+
+ char * allocatedBuffer = reinterpret_cast<char *>(Pool->Allocate(size));
+
+ TCell* ptrCell = reinterpret_cast<TCell*>(allocatedBuffer);
+ char* ptrData = reinterpret_cast<char*>(ptrCell + cellsSize);
+
+ TConstArrayRef<TCell> cellvec(ptrCell, ptrCell + cellsSize);
+
+ for (auto& cell : cells) {
+ if (cell.IsNull()) {
+ new (ptrCell) TCell();
+ } else if (cell.IsInline()) {
+ new (ptrCell) TCell(cell);
+ } else {
+ const size_t cellSize = cell.Size();
+ if (Y_LIKELY(cellSize > 0)) {
+ ::memcpy(ptrData, cell.Data(), cellSize);
+ }
+ new (ptrCell) TCell(ptrData, cellSize);
+ ptrData += AlignUp(cellSize);
+ }
+
+ ++ptrCell;
+ }
+
+ CellVectors.push_back(cellvec);
+ return size;
+}
+
+
TString DbgPrintCell(const TCell& r, NScheme::TTypeInfo typeInfo, const NScheme::TTypeRegistry &reg) {
auto typeId = typeInfo.GetTypeId();
TString res;