diff --git a/src/include/processor/operator/persistent/delete_executor.h b/src/include/processor/operator/persistent/delete_executor.h index 3d6ad25a319..404c4d292e5 100644 --- a/src/include/processor/operator/persistent/delete_executor.h +++ b/src/include/processor/operator/persistent/delete_executor.h @@ -75,7 +75,7 @@ class RelDeleteExecutor { void init(ResultSet* resultSet, ExecutionContext* context); - virtual void delete_() = 0; + virtual void delete_(ExecutionContext* context) = 0; virtual std::unique_ptr copy() const = 0; @@ -97,7 +97,7 @@ class SingleLabelRelDeleteExecutor final : public RelDeleteExecutor { relsStatistic{relsStatistic}, table{table} {} SingleLabelRelDeleteExecutor(const SingleLabelRelDeleteExecutor& other) = default; - void delete_(); + void delete_(ExecutionContext* context); inline std::unique_ptr copy() const { return std::make_unique(*this); @@ -119,7 +119,7 @@ class MultiLabelRelDeleteExecutor final : public RelDeleteExecutor { tableIDToTableMap)} {} MultiLabelRelDeleteExecutor(const MultiLabelRelDeleteExecutor& other) = default; - void delete_(); + void delete_(ExecutionContext* context); inline std::unique_ptr copy() const { return std::make_unique(*this); diff --git a/src/include/storage/local_storage/local_rel_table.h b/src/include/storage/local_storage/local_rel_table.h index a2c86bf4ff7..a709a520fee 100644 --- a/src/include/storage/local_storage/local_rel_table.h +++ b/src/include/storage/local_storage/local_rel_table.h @@ -73,7 +73,7 @@ class LocalRelNG final : public LocalNodeGroup { const std::vector& propertyVectors); void update(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector, common::column_id_t columnID, common::ValueVector* propertyVector); - void delete_(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector); + bool delete_(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector); inline LocalVectorCollection* getAdjChunk() { return adjChunk.get(); } inline LocalVectorCollection* getPropertyChunk(common::column_id_t columnID) { @@ -99,7 +99,7 @@ class LocalRelTableData final : public LocalTableData { const std::vector& propertyVectors); void update(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector, common::column_id_t columnID, common::ValueVector* propertyVector); - void delete_(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector); + bool delete_(common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector); private: LocalNodeGroup* getOrCreateLocalNodeGroup(common::ValueVector* nodeIDVector); diff --git a/src/include/storage/local_storage/local_table.h b/src/include/storage/local_storage/local_table.h index bdff88340c2..cba9c28698b 100644 --- a/src/include/storage/local_storage/local_table.h +++ b/src/include/storage/local_storage/local_table.h @@ -44,8 +44,8 @@ class LocalVector { // contains 64 vectors (chunks). class LocalVectorCollection { public: - LocalVectorCollection(const common::LogicalType* dataType, MemoryManager* mm) - : dataType{dataType}, mm{mm}, numRows{0} {} + LocalVectorCollection(std::unique_ptr dataType, MemoryManager* mm) + : dataType{std::move(dataType)}, mm{mm}, numRows{0} {} void read(common::row_idx_t rowIdx, common::ValueVector* outputVector, common::sel_t posInOutputVector); @@ -62,7 +62,7 @@ class LocalVectorCollection { void prepareAppend(); private: - const common::LogicalType* dataType; + std::unique_ptr dataType; MemoryManager* mm; std::vector> vectors; common::row_idx_t numRows; diff --git a/src/include/storage/store/rel_table.h b/src/include/storage/store/rel_table.h index 2a81f2e5ecb..2cc0cfb8348 100644 --- a/src/include/storage/store/rel_table.h +++ b/src/include/storage/store/rel_table.h @@ -19,18 +19,23 @@ class RelTable : public Table { common::RelDataDirection direction, std::vector columnIDs, common::ValueVector* inNodeIDVector, RelDataReadState* readState) { return direction == common::RelDataDirection::FWD ? - fwdRelTableData->initializeReadState( - transaction, direction, columnIDs, inNodeIDVector, readState) : - bwdRelTableData->initializeReadState( - transaction, direction, columnIDs, inNodeIDVector, readState); + fwdRelTableData->initializeReadState(transaction, direction, columnIDs, + inNodeIDVector, readState) : + bwdRelTableData->initializeReadState(transaction, direction, columnIDs, + inNodeIDVector, readState); } void read(transaction::Transaction* transaction, TableReadState& readState, common::ValueVector* inNodeIDVector, const std::vector& outputVectors) final; + void insert(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, + common::ValueVector* dstNodeIDVector, + const std::vector& propertyVectors); void update(transaction::Transaction* transaction, common::column_id_t columnID, common::ValueVector* srcNodeIDVector, common::ValueVector* dstNodeIDVector, common::ValueVector* relIDVector, common::ValueVector* propertyVector); + void delete_(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, + common::ValueVector* dstNodeIDVector, common::ValueVector* relIDVector); void addColumn(transaction::Transaction* transaction, const catalog::Property& property, common::ValueVector* defaultValueVector) final; diff --git a/src/include/storage/store/rel_table_data.h b/src/include/storage/store/rel_table_data.h index a7b46ed767a..168b9bce0a3 100644 --- a/src/include/storage/store/rel_table_data.h +++ b/src/include/storage/store/rel_table_data.h @@ -57,17 +57,22 @@ class RelTableData final : public TableData { common::ValueVector* inNodeIDVector, const std::vector& outputVectors); + void insert(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, + common::ValueVector* dstNodeIDVector, + const std::vector& propertyVectors); void update(transaction::Transaction* transaction, common::column_id_t columnID, common::ValueVector* srcNodeIDVector, common::ValueVector* relIDVector, common::ValueVector* propertyVector); + bool delete_(transaction::Transaction* transaction, common::ValueVector* srcNodeIDVector, + common::ValueVector* dstNodeIDVector, common::ValueVector* relIDVector); void append(NodeGroup* nodeGroup); inline Column* getAdjColumn() const { return adjColumn.get(); } inline common::ColumnDataFormat getDataFormat() const { return dataFormat; } - void prepareLocalTableToCommit( - transaction::Transaction* transaction, LocalTableData* localTable); + void prepareLocalTableToCommit(transaction::Transaction* transaction, + LocalTableData* localTable); void checkpointInMemory(); void rollbackInMemory(); @@ -79,14 +84,25 @@ class RelTableData final : public TableData { common::ValueVector* inNodeIDVector, const std::vector& outputVectors); - void prepareCommitForRegularColumns( - transaction::Transaction* transaction, LocalRelTableData* localTableData); - void prepareCommitForCSRColumns( - transaction::Transaction* transaction, LocalRelTableData* localTableData); + void prepareCommitForRegularColumns(transaction::Transaction* transaction, + LocalRelTableData* localTableData); + void prepareCommitForCSRColumns(transaction::Transaction* transaction, + LocalRelTableData* localTableData); void prepareCommitCSRNGWithoutSliding(transaction::Transaction* transaction, common::node_group_idx_t nodeGroupIdx, CSRRelNGInfo* relNodeGroupInfo, ColumnChunk* csrOffsetChunk, ColumnChunk* relIDChunk, LocalRelNG* localNodeGroup); + void prepareCommitCSRNGWithSliding(transaction::Transaction* transaction, + common::node_group_idx_t nodeGroupIdx, CSRRelNGInfo* relNodeGroupInfo, + ColumnChunk* csrOffsetChunk, ColumnChunk* relIDChunk, LocalRelNG* localNodeGroup); + + std::unique_ptr slideCSROffsetColumnChunk(ColumnChunk* csrOffsetChunk, + CSRRelNGInfo* relNodeGroupInfo, common::offset_t nodeGroupStartOffset); + std::unique_ptr slideCSRColumnChunk(transaction::Transaction* transaction, + ColumnChunk* csrOffsetChunk, ColumnChunk* slidedCSROffsetChunkForCheck, + ColumnChunk* relIDChunk, const offset_to_offset_to_row_idx_t& insertInfo, + const offset_to_offset_to_row_idx_t& updateInfo, const offset_to_offset_set_t& deleteInfo, + common::node_group_idx_t nodeGroupIdx, Column* column, LocalVectorCollection* localChunk); static inline common::ColumnDataFormat getDataFormatFromSchema( catalog::RelTableSchema* tableSchema, common::RelDataDirection direction) { diff --git a/src/processor/operator/persistent/delete.cpp b/src/processor/operator/persistent/delete.cpp index 20e86c6db5d..772aed15709 100644 --- a/src/processor/operator/persistent/delete.cpp +++ b/src/processor/operator/persistent/delete.cpp @@ -39,7 +39,7 @@ bool DeleteRel::getNextTuplesInternal(ExecutionContext* context) { return false; } for (auto& executor : executors) { - executor->delete_(); + executor->delete_(context); } return true; } diff --git a/src/processor/operator/persistent/delete_executor.cpp b/src/processor/operator/persistent/delete_executor.cpp index c7e8f3d93e4..2e95f2deac8 100644 --- a/src/processor/operator/persistent/delete_executor.cpp +++ b/src/processor/operator/persistent/delete_executor.cpp @@ -48,22 +48,19 @@ void RelDeleteExecutor::init(ResultSet* resultSet, ExecutionContext* /*context*/ relIDVector = resultSet->getValueVector(relIDPos).get(); } -void SingleLabelRelDeleteExecutor::delete_() { - // TODO(Guodong): Fix delete. - // table->deleteRel(srcNodeIDVector, dstNodeIDVector, relIDVector); - // relsStatistic->updateNumRelsByValue(table->getTableID(), -1); +void SingleLabelRelDeleteExecutor::delete_(ExecutionContext* context) { + table->delete_(context->clientContext->getActiveTransaction(), srcNodeIDVector, dstNodeIDVector, + relIDVector); } -void MultiLabelRelDeleteExecutor::delete_() { +void MultiLabelRelDeleteExecutor::delete_(ExecutionContext* context) { KU_ASSERT(relIDVector->state->isFlat()); auto pos = relIDVector->state->selVector->selectedPositions[0]; auto relID = relIDVector->getValue(pos); KU_ASSERT(tableIDToTableMap.contains(relID.tableID)); auto [table, statistic] = tableIDToTableMap.at(relID.tableID); - // TODO(Guodong): Fix delete. - // table->deleteRel(srcNodeIDVector, dstNodeIDVector, relIDVector); - // KU_ASSERT(table->getTableID() == relID.tableID); - // statistic->updateNumRelsByValue(table->getTableID(), -1); + table->delete_(context->clientContext->getActiveTransaction(), srcNodeIDVector, dstNodeIDVector, + relIDVector); } } // namespace processor diff --git a/src/processor/operator/persistent/insert_executor.cpp b/src/processor/operator/persistent/insert_executor.cpp index e78d9bb2d62..5bb811966bb 100644 --- a/src/processor/operator/persistent/insert_executor.cpp +++ b/src/processor/operator/persistent/insert_executor.cpp @@ -128,9 +128,7 @@ void RelInsertExecutor::insert(transaction::Transaction* tx) { for (auto i = 1; i < propertyRhsEvaluators.size(); ++i) { propertyRhsEvaluators[i]->evaluate(); } - // TODO(Guodong): Fix insert. - // table->insertRel(srcNodeIDVector, dstNodeIDVector, propertyRhsVectors); - // relsStatistics.updateNumRelsByValue(table->getRelTableID(), 1); + table->insert(tx, srcNodeIDVector, dstNodeIDVector, propertyRhsVectors); for (auto i = 0u; i < propertyLhsVectors.size(); ++i) { auto lhsVector = propertyLhsVectors[i]; auto rhsVector = propertyRhsVectors[i]; diff --git a/src/storage/local_storage/local_rel_table.cpp b/src/storage/local_storage/local_rel_table.cpp index 77c651ed376..21ab069fe19 100644 --- a/src/storage/local_storage/local_rel_table.cpp +++ b/src/storage/local_storage/local_rel_table.cpp @@ -141,11 +141,12 @@ LocalRelNG::LocalRelNG(ColumnDataFormat dataFormat, std::vector da KU_UNREACHABLE; } } + adjChunk = std::make_unique(LogicalType::INTERNAL_ID(), mm); } void LocalRelNG::insert(ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, const std::vector& propertyVectors) { - KU_ASSERT(propertyVectors.size() == chunks.size() && propertyVectors.size() > 1); + KU_ASSERT(propertyVectors.size() == chunks.size() && propertyVectors.size() >= 1); auto adjNodeIDRowIdx = adjChunk->append(dstNodeIDVector); std::vector propertyValuesRowIdx; for (auto i = 0u; i < propertyVectors.size(); ++i) { @@ -169,12 +170,12 @@ void LocalRelNG::update(ValueVector* srcNodeIDVector, ValueVector* relIDVector, relNGInfo->update(srcNodeOffset, relOffset, columnID, rowIdx); } -void LocalRelNG::delete_(ValueVector* srcNodeIDVector, ValueVector* relIDVector) { +bool LocalRelNG::delete_(ValueVector* srcNodeIDVector, ValueVector* relIDVector) { auto srcNodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; auto srcNodeOffset = srcNodeIDVector->getValue(srcNodeIDPos).offset; auto relIDPos = relIDVector->state->selVector->selectedPositions[0]; auto relOffset = relIDVector->getValue(relIDPos).offset; - relNGInfo->delete_(srcNodeOffset, relOffset); + return relNGInfo->delete_(srcNodeOffset, relOffset); } void LocalRelTableData::insert(ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, @@ -205,12 +206,12 @@ void LocalRelTableData::update(ValueVector* srcNodeIDVector, ValueVector* relIDV localNodeGroup->update(srcNodeIDVector, relIDVector, columnID, propertyVector); } -void LocalRelTableData::delete_(ValueVector* srcNodeIDVector, ValueVector* relIDVector) { +bool LocalRelTableData::delete_(ValueVector* srcNodeIDVector, ValueVector* relIDVector) { KU_ASSERT(srcNodeIDVector->state->selVector->selectedSize == 1 && relIDVector->state->selVector->selectedSize == 1); auto srcNodeIDPos = srcNodeIDVector->state->selVector->selectedPositions[0]; if (srcNodeIDVector->isNull(srcNodeIDPos)) { - return; + return false; } auto localNodeGroup = ku_dynamic_cast(getOrCreateLocalNodeGroup(srcNodeIDVector)); diff --git a/src/storage/local_storage/local_table.cpp b/src/storage/local_storage/local_table.cpp index 4c9fe68c07c..8a8e4b4bd89 100644 --- a/src/storage/local_storage/local_table.cpp +++ b/src/storage/local_storage/local_table.cpp @@ -59,7 +59,7 @@ LocalNodeGroup::LocalNodeGroup(std::vector dataTypes, MemoryManage for (auto i = 0u; i < dataTypes.size(); ++i) { // To avoid unnecessary memory consumption, we chunk local changes of each column in the // node group into chunks of size DEFAULT_VECTOR_CAPACITY. - chunks[i] = std::make_unique(dataTypes[i], mm); + chunks[i] = std::make_unique(dataTypes[i]->copy(), mm); } } diff --git a/src/storage/store/column_chunk.cpp b/src/storage/store/column_chunk.cpp index 70cf04b2caa..f78dedb5a88 100644 --- a/src/storage/store/column_chunk.cpp +++ b/src/storage/store/column_chunk.cpp @@ -13,18 +13,18 @@ ColumnChunkMetadata fixedSizedFlushBuffer(const uint8_t* buffer, uint64_t buffer BMFileHandle* dataFH, page_idx_t startPageIdx, const ColumnChunkMetadata& metadata) { FileUtils::writeToFile(dataFH->getFileInfo(), buffer, bufferSize, startPageIdx * BufferPoolConstants::PAGE_4KB_SIZE); - return ColumnChunkMetadata( - startPageIdx, metadata.numPages, metadata.numValues, metadata.compMeta); + return ColumnChunkMetadata(startPageIdx, metadata.numPages, metadata.numValues, + metadata.compMeta); } -ColumnChunkMetadata fixedSizedGetMetadata( - const uint8_t* /*buffer*/, uint64_t bufferSize, uint64_t /*capacity*/, uint64_t numValues) { +ColumnChunkMetadata fixedSizedGetMetadata(const uint8_t* /*buffer*/, uint64_t bufferSize, + uint64_t /*capacity*/, uint64_t numValues) { return ColumnChunkMetadata(INVALID_PAGE_IDX, ColumnChunk::getNumPagesForBytes(bufferSize), numValues, CompressionMetadata()); } -ColumnChunkMetadata booleanGetMetadata( - const uint8_t* /*buffer*/, uint64_t bufferSize, uint64_t /*capacity*/, uint64_t numValues) { +ColumnChunkMetadata booleanGetMetadata(const uint8_t* /*buffer*/, uint64_t bufferSize, + uint64_t /*capacity*/, uint64_t numValues) { return ColumnChunkMetadata(INVALID_PAGE_IDX, ColumnChunk::getNumPagesForBytes(bufferSize), numValues, CompressionMetadata(CompressionType::BOOLEAN_BITPACKING)); } @@ -61,8 +61,8 @@ class CompressedFlushBuffer { (startPageIdx + numPages) * BufferPoolConstants::PAGE_4KB_SIZE); numPages++; } while (valuesRemaining > 0); - return ColumnChunkMetadata( - startPageIdx, metadata.numPages, metadata.numValues, metadata.compMeta); + return ColumnChunkMetadata(startPageIdx, metadata.numPages, metadata.numValues, + metadata.compMeta); } }; @@ -76,8 +76,8 @@ class GetCompressionMetadata { GetCompressionMetadata(const GetCompressionMetadata& other) = default; - ColumnChunkMetadata operator()( - const uint8_t* buffer, uint64_t /*bufferSize*/, uint64_t capacity, uint64_t numValues) { + ColumnChunkMetadata operator()(const uint8_t* buffer, uint64_t /*bufferSize*/, + uint64_t capacity, uint64_t numValues) { auto metadata = alg->getCompressionMetadata(buffer, numValues); auto numValuesPerPage = metadata.numValues(BufferPoolConstants::PAGE_4KB_SIZE, dataType); auto numPages = capacity / numValuesPerPage + (capacity % numValuesPerPage == 0 ? 0 : 1); @@ -85,8 +85,8 @@ class GetCompressionMetadata { } }; -static std::shared_ptr getCompression( - const LogicalType& dataType, bool enableCompression) { +static std::shared_ptr getCompression(const LogicalType& dataType, + bool enableCompression) { if (!enableCompression) { return std::make_shared(dataType); } @@ -124,8 +124,8 @@ static std::shared_ptr getCompression( ColumnChunk::ColumnChunk(std::unique_ptr dataType, uint64_t capacity, bool enableCompression, bool hasNullChunk) - : dataType{std::move(dataType)}, - numBytesPerValue{getDataTypeSizeInChunk(*this->dataType)}, numValues{0} { + : dataType{std::move(dataType)}, numBytesPerValue{getDataTypeSizeInChunk(*this->dataType)}, + numValues{0} { if (hasNullChunk) { nullChunk = std::make_unique(capacity); } @@ -187,8 +187,8 @@ void ColumnChunk::append(ValueVector* vector) { numValues += vector->state->selVector->selectedSize; } -void ColumnChunk::append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { +void ColumnChunk::append(ColumnChunk* other, offset_t startPosInOtherChunk, + uint32_t numValuesToAppend) { KU_ASSERT(other->dataType->getPhysicalType() == dataType->getPhysicalType()); if (nullChunk) { KU_ASSERT(nullChunk->getNumValues() == getNumValues()); @@ -266,8 +266,8 @@ void ColumnChunk::populateWithDefaultVal(ValueVector* defaultValueVector) { } auto numValuesAppended = 0u; while (numValuesAppended < StorageConstants::NODE_GROUP_SIZE) { - auto numValuesToAppend = std::min( - DEFAULT_VECTOR_CAPACITY, StorageConstants::NODE_GROUP_SIZE - numValuesAppended); + auto numValuesToAppend = std::min(DEFAULT_VECTOR_CAPACITY, + StorageConstants::NODE_GROUP_SIZE - numValuesAppended); defaultValueVector->state->selVector->selectedSize = numValuesToAppend; append(defaultValueVector); numValuesAppended += numValuesToAppend; @@ -309,8 +309,8 @@ ColumnChunkMetadata ColumnChunk::getMetadataToFlush() const { return getMetadataFunction(buffer.get(), bufferSize, capacity, numValues); } -ColumnChunkMetadata ColumnChunk::flushBuffer( - BMFileHandle* dataFH, page_idx_t startPageIdx, const ColumnChunkMetadata& metadata) { +ColumnChunkMetadata ColumnChunk::flushBuffer(BMFileHandle* dataFH, page_idx_t startPageIdx, + const ColumnChunkMetadata& metadata) { return flushBufferFunction(buffer.get(), bufferSize, dataFH, startPageIdx, metadata); } @@ -366,8 +366,8 @@ void BoolColumnChunk::append(ValueVector* vector) { numValues += vector->state->selVector->selectedSize; } -void BoolColumnChunk::append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) { +void BoolColumnChunk::append(ColumnChunk* other, offset_t startPosInOtherChunk, + uint32_t numValuesToAppend) { NullMask::copyNullMask((uint64_t*)static_cast(other)->buffer.get(), startPosInOtherChunk, (uint64_t*)buffer.get(), numValues, numValuesToAppend); if (nullChunk) { @@ -398,16 +398,16 @@ void BoolColumnChunk::write(ValueVector* valueVector, ValueVector* offsetInChunk void BoolColumnChunk::write(ValueVector* vector, offset_t offsetInVector, offset_t offsetInChunk) { KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::BOOL); KU_ASSERT(offsetInChunk < capacity); - NullMask::copyNullMask( - (uint64_t*)vector->getData(), offsetInVector, (uint64_t*)buffer.get(), offsetInChunk, 1); + NullMask::copyNullMask((uint64_t*)vector->getData(), offsetInVector, (uint64_t*)buffer.get(), + offsetInChunk, 1); if (nullChunk) { nullChunk->setNull(offsetInChunk, vector->isNull(offsetInVector)); } numValues = offsetInChunk >= numValues ? offsetInChunk + 1 : numValues; } -void NullColumnChunk::append( - ColumnChunk* other, offset_t startOffsetInOtherChunk, uint32_t numValuesToAppend) { +void NullColumnChunk::append(ColumnChunk* other, offset_t startOffsetInOtherChunk, + uint32_t numValuesToAppend) { copyFromBuffer((uint64_t*)static_cast(other)->buffer.get(), startOffsetInOtherChunk, numValues, numValuesToAppend); numValues += numValuesToAppend; @@ -415,12 +415,12 @@ void NullColumnChunk::append( class FixedListColumnChunk : public ColumnChunk { public: - FixedListColumnChunk( - std::unique_ptr dataType, uint64_t capacity, bool enableCompression) + FixedListColumnChunk(std::unique_ptr dataType, uint64_t capacity, + bool enableCompression) : ColumnChunk(std::move(dataType), capacity, enableCompression, true /* hasNullChunk */) {} - void append( - ColumnChunk* other, offset_t startPosInOtherChunk, uint32_t numValuesToAppend) final { + void append(ColumnChunk* other, offset_t startPosInOtherChunk, + uint32_t numValuesToAppend) final { auto otherChunk = (FixedListColumnChunk*)other; if (nullChunk) { nullChunk->append(otherChunk->nullChunk.get(), startPosInOtherChunk, numValuesToAppend); @@ -477,6 +477,29 @@ class FixedListColumnChunk : public ColumnChunk { } }; +class InternalIDColumnChunk final : public ColumnChunk { +public: + // Physically, we only materialize offset of INTERNAL_ID, which is same as INT64, + InternalIDColumnChunk(uint64_t capacity) + : ColumnChunk(LogicalType::INT64(), capacity, false /* enableCompression */) {} + + void append(ValueVector* vector) { + KU_ASSERT(vector->dataType.getPhysicalType() == PhysicalTypeID::INTERNAL_ID); + copyVectorToBuffer(vector, numValues); + numValues += vector->state->selVector->selectedSize; + } + + void copyVectorToBuffer(ValueVector* vector, offset_t startPosInChunk) { + auto relIDsInVector = (internalID_t*)vector->getData(); + for (auto i = 0u; i < vector->state->selVector->selectedSize; i++) { + auto pos = vector->state->selVector->selectedPositions[i]; + nullChunk->setNull(startPosInChunk + i, vector->isNull(pos)); + memcpy(buffer.get() + (startPosInChunk + i) * numBytesPerValue, + &relIDsInVector[pos].offset, numBytesPerValue); + } + } +}; + std::unique_ptr ColumnChunkFactory::createColumnChunk( std::unique_ptr dataType, bool enableCompression, uint64_t capacity) { switch (dataType->getPhysicalType()) { @@ -504,23 +527,22 @@ std::unique_ptr ColumnChunkFactory::createColumnChunk( } // Physically, we only materialize offset of INTERNAL_ID, which is same as INT64, case PhysicalTypeID::INTERNAL_ID: { - return std::make_unique( - LogicalType::INT64(), capacity, false /* enableCompression */); + return std::make_unique(capacity); } case PhysicalTypeID::FIXED_LIST: { - return std::make_unique( - std::move(dataType), capacity, enableCompression); + return std::make_unique(std::move(dataType), capacity, + enableCompression); } case PhysicalTypeID::STRING: { return std::make_unique(std::move(dataType), capacity); } case PhysicalTypeID::VAR_LIST: { - return std::make_unique( - std::move(dataType), capacity, enableCompression); + return std::make_unique(std::move(dataType), capacity, + enableCompression); } case PhysicalTypeID::STRUCT: { - return std::make_unique( - std::move(dataType), capacity, enableCompression); + return std::make_unique(std::move(dataType), capacity, + enableCompression); } default: KU_UNREACHABLE; diff --git a/src/storage/store/rel_table.cpp b/src/storage/store/rel_table.cpp index 89b5bd1501c..2e5b6e29589 100644 --- a/src/storage/store/rel_table.cpp +++ b/src/storage/store/rel_table.cpp @@ -30,6 +30,14 @@ void RelTable::read(Transaction* transaction, TableReadState& readState, } } +void RelTable::insert(Transaction* transaction, ValueVector* srcNodeIDVector, + ValueVector* dstNodeIDVector, const std::vector& propertyVectors) { + fwdRelTableData->insert(transaction, srcNodeIDVector, dstNodeIDVector, propertyVectors); + bwdRelTableData->insert(transaction, dstNodeIDVector, srcNodeIDVector, propertyVectors); + auto relsStats = ku_dynamic_cast(tablesStatistics); + relsStats->updateNumRelsByValue(tableID, 1); +} + void RelTable::update(transaction::Transaction* transaction, column_id_t columnID, ValueVector* srcNodeIDVector, ValueVector* dstNodeIDVector, ValueVector* relIDVector, ValueVector* propertyVector) { @@ -37,6 +45,18 @@ void RelTable::update(transaction::Transaction* transaction, column_id_t columnI bwdRelTableData->update(transaction, columnID, dstNodeIDVector, relIDVector, propertyVector); } +void RelTable::delete_(Transaction* transaction, ValueVector* srcNodeIDVector, + ValueVector* dstNodeIDVector, ValueVector* relIDVector) { + auto fwdDeleted = + fwdRelTableData->delete_(transaction, srcNodeIDVector, dstNodeIDVector, relIDVector); + auto bwdDeleted = + bwdRelTableData->delete_(transaction, dstNodeIDVector, srcNodeIDVector, relIDVector); + KU_ASSERT(fwdDeleted == bwdDeleted); + if (fwdDeleted && bwdDeleted) { + auto relsStats = ku_dynamic_cast(tablesStatistics); + relsStats->updateNumRelsByValue(tableID, -1); + } +} void RelTable::scan(Transaction* transaction, RelDataReadState& scanState, ValueVector* inNodeIDVector, const std::vector& outputVectors) { auto tableData = getDirectedTableData(scanState.direction); @@ -49,19 +69,19 @@ void RelTable::lookup(Transaction* transaction, RelDataReadState& scanState, tableData->lookup(transaction, scanState, inNodeIDVector, outputVectors); } -void RelTable::addColumn( - Transaction* transaction, const Property& property, ValueVector* defaultValueVector) { +void RelTable::addColumn(Transaction* transaction, const Property& property, + ValueVector* defaultValueVector) { auto relsStats = ku_dynamic_cast(tablesStatistics); relsStats->setPropertyStatisticsForTable(tableID, property.getPropertyID(), PropertyStatistics{!defaultValueVector->hasNoNullsGuarantee()}); relsStats->addMetadataDAHInfo(tableID, *property.getDataType()); fwdRelTableData->addColumn(transaction, fwdRelTableData->getAdjColumn()->getMetadataDA(), - *relsStats->getPropertyMetadataDAHInfo( - transaction, tableID, fwdRelTableData->getNumColumns(), RelDataDirection::FWD), + *relsStats->getPropertyMetadataDAHInfo(transaction, tableID, + fwdRelTableData->getNumColumns(), RelDataDirection::FWD), property, defaultValueVector, relsStats); bwdRelTableData->addColumn(transaction, bwdRelTableData->getAdjColumn()->getMetadataDA(), - *relsStats->getPropertyMetadataDAHInfo( - transaction, tableID, bwdRelTableData->getNumColumns(), RelDataDirection::BWD), + *relsStats->getPropertyMetadataDAHInfo(transaction, tableID, + bwdRelTableData->getNumColumns(), RelDataDirection::BWD), property, defaultValueVector, relsStats); // TODO(Guodong): addColumn is not going through localStorage design for now. So it needs to add // tableID into the wal's updated table set separately, as it won't trigger prepareCommit. diff --git a/src/storage/store/rel_table_data.cpp b/src/storage/store/rel_table_data.cpp index bb7a1b3421f..3dc562a45e1 100644 --- a/src/storage/store/rel_table_data.cpp +++ b/src/storage/store/rel_table_data.cpp @@ -62,8 +62,8 @@ RelTableData::RelTableData(BMFileHandle* dataFH, BMFileHandle* metadataFH, columns.reserve(properties.size()); for (auto i = 0u; i < properties.size(); i++) { auto property = tableSchema->getProperties()[i]; - auto metadataDAHInfo = relsStoreStats->getPropertyMetadataDAHInfo( - &DUMMY_WRITE_TRANSACTION, tableID, i, direction); + auto metadataDAHInfo = relsStoreStats->getPropertyMetadataDAHInfo(&DUMMY_WRITE_TRANSACTION, + tableID, i, direction); columns.push_back(ColumnFactory::createColumn(properties[i]->getDataType()->copy(), *metadataDAHInfo, dataFH, metadataFH, bufferManager, wal, &DUMMY_READ_TRANSACTION, RWPropertyStats(relsStoreStats, tableID, property->getPropertyID()), @@ -113,8 +113,8 @@ void RelTableData::scanRegularColumns(Transaction* transaction, RelDataReadState outputVectors[outputVectorId]->setAllNull(); continue; } - columns[readState.columnIDs[i]]->scan( - transaction, inNodeIDVector, outputVectors[outputVectorId]); + columns[readState.columnIDs[i]]->scan(transaction, inNodeIDVector, + outputVectors[outputVectorId]); } } @@ -154,11 +154,19 @@ void RelTableData::lookup(Transaction* transaction, TableReadState& readState, outputVectors[outputVectorId]->setAllNull(); continue; } - columns[readState.columnIDs[i]]->lookup( - transaction, inNodeIDVector, outputVectors[outputVectorId]); + columns[readState.columnIDs[i]]->lookup(transaction, inNodeIDVector, + outputVectors[outputVectorId]); } } +void RelTableData::insert(transaction::Transaction* transaction, ValueVector* srcNodeIDVector, + ValueVector* dstNodeIDVector, const std::vector& propertyVectors) { + auto localTableData = ku_dynamic_cast( + transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns, TableType::REL, + dataFormat, getDataIdxFromDirection(direction))); + localTableData->insert(srcNodeIDVector, dstNodeIDVector, propertyVectors); +} + void RelTableData::update(transaction::Transaction* transaction, column_id_t columnID, ValueVector* srcNodeIDVector, ValueVector* relIDVector, ValueVector* propertyVector) { KU_ASSERT(columnID < columns.size() && columnID != REL_ID_COLUMN_ID); @@ -168,6 +176,14 @@ void RelTableData::update(transaction::Transaction* transaction, column_id_t col localTableData->update(srcNodeIDVector, relIDVector, columnID, propertyVector); } +bool RelTableData::delete_(transaction::Transaction* transaction, ValueVector* srcNodeIDVector, + ValueVector* /*dstNodeIDVector*/, ValueVector* relIDVector) { + auto localTableData = ku_dynamic_cast( + transaction->getLocalStorage()->getOrCreateLocalTableData(tableID, columns, TableType::REL, + dataFormat, getDataIdxFromDirection(direction))); + return localTableData->delete_(srcNodeIDVector, relIDVector); +} + void RelTableData::append(NodeGroup* nodeGroup) { if (dataFormat == ColumnDataFormat::CSR) { auto csrNodeGroup = static_cast(nodeGroup); @@ -175,13 +191,13 @@ void RelTableData::append(NodeGroup* nodeGroup) { } adjColumn->append(nodeGroup->getColumnChunk(0), nodeGroup->getNodeGroupIdx()); for (auto columnID = 0; columnID < columns.size(); columnID++) { - columns[columnID]->append( - nodeGroup->getColumnChunk(columnID + 1), nodeGroup->getNodeGroupIdx()); + columns[columnID]->append(nodeGroup->getColumnChunk(columnID + 1), + nodeGroup->getNodeGroupIdx()); } } -void RelTableData::prepareLocalTableToCommit( - Transaction* transaction, LocalTableData* localTableData) { +void RelTableData::prepareLocalTableToCommit(Transaction* transaction, + LocalTableData* localTableData) { auto localRelTableData = ku_dynamic_cast(localTableData); if (dataFormat == ColumnDataFormat::REGULAR) { prepareCommitForRegularColumns(transaction, localRelTableData); @@ -190,8 +206,8 @@ void RelTableData::prepareLocalTableToCommit( } } -void RelTableData::prepareCommitForRegularColumns( - transaction::Transaction* transaction, kuzu::storage::LocalRelTableData* localTableData) { +void RelTableData::prepareCommitForRegularColumns(transaction::Transaction* transaction, + kuzu::storage::LocalRelTableData* localTableData) { for (auto& [nodeGroupIdx, nodeGroup] : localTableData->nodeGroups) { auto relNG = ku_dynamic_cast(nodeGroup.get()); KU_ASSERT(relNG); @@ -207,15 +223,15 @@ void RelTableData::prepareCommitForRegularColumns( } } -void RelTableData::prepareCommitForCSRColumns( - transaction::Transaction* transaction, kuzu::storage::LocalRelTableData* localTableData) { +void RelTableData::prepareCommitForCSRColumns(transaction::Transaction* transaction, + kuzu::storage::LocalRelTableData* localTableData) { for (auto& [nodeGroupIdx, nodeGroup] : localTableData->nodeGroups) { auto relNG = ku_dynamic_cast(nodeGroup.get()); KU_ASSERT(relNG); auto relNodeGroupInfo = ku_dynamic_cast(relNG->getRelNGInfo()); // First, scan the whole csr offset column chunk, whose size is NODE_GROUP_SIZE. - auto csrOffsetChunk = ColumnChunkFactory::createColumnChunk( - LogicalType::INT64(), false /* enableCompression */); + auto csrOffsetChunk = ColumnChunkFactory::createColumnChunk(LogicalType::INT64(), + false /* enableCompression */); csrOffsetColumn->scan(transaction, nodeGroupIdx, csrOffsetChunk.get()); // Next, scan the whole relID column chunk. // TODO: We can only scan partial relID column chunk based on csr offset of the max @@ -227,8 +243,8 @@ void RelTableData::prepareCommitForCSRColumns( // in-memory representation of INTERNAL_ID, we only store offset as INT64 on disk. Here // we directly read relID's offset part from disk into an INT64 column chunk. // TODO: The term of relID and relOffset is mixed. We should use relOffset instead. - auto relIDChunk = ColumnChunkFactory::createColumnChunk( - LogicalType::INT64(), false /* enableCompression */, numRels); + auto relIDChunk = ColumnChunkFactory::createColumnChunk(LogicalType::INT64(), + false /* enableCompression */, numRels); columns[REL_ID_COLUMN_ID]->scan(transaction, nodeGroupIdx, relIDChunk.get()); if (relNodeGroupInfo->deleteInfo.empty() && relNodeGroupInfo->adjInsertInfo.empty()) { // We don't need to update the csr offset column if there is no deletion or insertion. @@ -239,21 +255,22 @@ void RelTableData::prepareCommitForCSRColumns( } else { // We need to update the csr offset column. Thus, we cannot simply fall back to directly // update the adj column and property columns based on csr offsets. - KU_UNREACHABLE; + prepareCommitCSRNGWithSliding(transaction, nodeGroupIdx, relNodeGroupInfo, + csrOffsetChunk.get(), relIDChunk.get(), relNG); } } } -static std::pair getCSRStartAndEndOffset( - offset_t nodeGroupStartOffset, offset_t* csrOffsets, offset_t nodeOffset) { +static std::pair getCSRStartAndEndOffset(offset_t nodeGroupStartOffset, + offset_t* csrOffsets, offset_t nodeOffset) { auto offsetInNodeGroup = nodeOffset - nodeGroupStartOffset; return offsetInNodeGroup == 0 ? std::make_pair((offset_t)0, csrOffsets[offsetInNodeGroup]) : std::make_pair(csrOffsets[offsetInNodeGroup - 1], csrOffsets[offsetInNodeGroup]); } -static uint64_t findPosOfRelIDFromArray( - offset_t* relIDArray, uint64_t startPos, uint64_t endPos, offset_t relOffset) { +static uint64_t findPosOfRelIDFromArray(offset_t* relIDArray, uint64_t startPos, uint64_t endPos, + offset_t relOffset) { for (auto i = startPos; i < endPos; i++) { if (relIDArray[i] == relOffset) { return i; @@ -291,6 +308,164 @@ void RelTableData::prepareCommitCSRNGWithoutSliding(Transaction* transaction, } } +void RelTableData::prepareCommitCSRNGWithSliding(Transaction* transaction, + node_group_idx_t nodeGroupIdx, CSRRelNGInfo* relNodeGroupInfo, ColumnChunk* csrOffsetChunk, + ColumnChunk* relIDChunk, LocalRelNG* localNodeGroup) { + // We need to update the csr offset column. Thus, we cannot simply fall back to directly update + // the adj column and property columns based on csr offsets. Instead, we need to for loop each + // node in the node group, slide accordingly, and update the csr offset column, adj column and + // property columns. + auto csrOffsets = (offset_t*)csrOffsetChunk->getData(); + auto relIDs = (offset_t*)relIDChunk->getData(); + auto nodeGroupStartOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); + auto currentNumSrcNodesInNG = csrOffsetChunk->getNumValues(); + auto newNumSrcNodesInNG = currentNumSrcNodesInNG; + // Slide column by column. + // First we slide the csr offset column chunk, and keep the slided csr offset column chunk in + // memory, so it can be used for assertion checking later. + auto slidedCSROffsetChunk = + slideCSROffsetColumnChunk(csrOffsetChunk, relNodeGroupInfo, nodeGroupStartOffset); + csrOffsetColumn->append(slidedCSROffsetChunk.get(), nodeGroupIdx); + // Then we slide the adj column chunk, rel id column chunk, and all property column chunks. + auto slidedAdjColumnChunk = + slideCSRColumnChunk(transaction, csrOffsetChunk, slidedCSROffsetChunk.get(), relIDChunk, + relNodeGroupInfo->adjInsertInfo, {}, relNodeGroupInfo->deleteInfo, nodeGroupStartOffset, + adjColumn.get(), localNodeGroup->getAdjChunk()); + adjColumn->append(slidedAdjColumnChunk.get(), nodeGroupIdx); + slidedAdjColumnChunk.reset(); + for (auto columnID = 0u; columnID < columns.size(); columnID++) { + auto slidedColumnChunk = slideCSRColumnChunk(transaction, csrOffsetChunk, + slidedCSROffsetChunk.get(), relIDChunk, relNodeGroupInfo->insertInfoPerChunk[columnID], + relNodeGroupInfo->updateInfoPerChunk[columnID], relNodeGroupInfo->deleteInfo, + nodeGroupStartOffset, columns[columnID].get(), + localNodeGroup->getLocalColumnChunk(columnID)); + columns[columnID]->append(slidedColumnChunk.get(), nodeGroupIdx); + slidedColumnChunk.reset(); + } +} + +std::unique_ptr RelTableData::slideCSROffsetColumnChunk(ColumnChunk* csrOffsetChunk, + CSRRelNGInfo* relNodeGroupInfo, offset_t nodeGroupStartOffset) { + auto csrOffsets = (offset_t*)csrOffsetChunk->getData(); + auto slidedCSRChunk = + ColumnChunkFactory::createColumnChunk(LogicalType::INT64(), enableCompression); + int64_t currentCSROffset = 0; + auto currentNumSrcNodesInNG = csrOffsetChunk->getNumValues(); + auto newNumSrcNodesInNG = currentNumSrcNodesInNG; + for (auto i = 0; i < currentNumSrcNodesInNG; i++) { + auto nodeOffset = nodeGroupStartOffset + i; + int64_t numRowsInCSR = i == 0 ? csrOffsets[i] : csrOffsets[i] - csrOffsets[i - 1]; + KU_ASSERT(numRowsInCSR >= 0); + int64_t numDeletions = relNodeGroupInfo->deleteInfo.contains(nodeOffset) ? + relNodeGroupInfo->deleteInfo[nodeOffset].size() : + 0; + int64_t numInsertions = relNodeGroupInfo->adjInsertInfo.contains(nodeOffset) ? + relNodeGroupInfo->adjInsertInfo[nodeOffset].size() : + 0; + int64_t numRowsAfterSlide = numRowsInCSR + numInsertions - numDeletions; + KU_ASSERT(numRowsAfterSlide >= 0); + currentCSROffset += numRowsAfterSlide; + slidedCSRChunk->setValue(currentCSROffset, i); + } + for (auto i = currentNumSrcNodesInNG; i < StorageConstants::NODE_GROUP_SIZE; i++) { + auto nodeOffset = nodeGroupStartOffset + i; + // Assert that should only have insertions for these nodes. + KU_ASSERT(!relNodeGroupInfo->deleteInfo.contains(nodeOffset)); + for (auto columnID = 0u; columnID < columns.size(); columnID++) { + KU_ASSERT(!relNodeGroupInfo->updateInfoPerChunk[columnID].contains(nodeOffset)); + } + auto numRowsInCSR = 0; + if (relNodeGroupInfo->adjInsertInfo.contains(nodeOffset)) { + // This node is inserted now. Update csr offset accordingly. + numRowsInCSR += relNodeGroupInfo->adjInsertInfo.at(nodeOffset).size(); + newNumSrcNodesInNG = i + 1; + } + currentCSROffset += numRowsInCSR; + slidedCSRChunk->setValue(currentCSROffset, i); + } + slidedCSRChunk->setNumValues(newNumSrcNodesInNG); + return slidedCSRChunk; +} + +std::unique_ptr RelTableData::slideCSRColumnChunk(Transaction* transaction, + ColumnChunk* csrOffsetChunk, ColumnChunk* slidedCSROffsetChunkForCheck, ColumnChunk* relIDChunk, + const offset_to_offset_to_row_idx_t& insertInfo, + const offset_to_offset_to_row_idx_t& updateInfo, const offset_to_offset_set_t& deleteInfo, + node_group_idx_t nodeGroupIdx, Column* column, LocalVectorCollection* localChunk) { + auto oldCapacity = csrOffsetChunk->getNumValues() == 0 ? + 0 : + csrOffsetChunk->getValue(csrOffsetChunk->getNumValues() - 1); + auto newCapacity = slidedCSROffsetChunkForCheck->getNumValues() == 0 ? + 0 : + slidedCSROffsetChunkForCheck->getValue( + slidedCSROffsetChunkForCheck->getNumValues() - 1); + // TODO: No need to allocate the new column chunk if this is relID. + auto columnChunk = ColumnChunkFactory::createColumnChunk(column->getDataType()->copy(), + enableCompression, oldCapacity); + column->scan(transaction, nodeGroupIdx, columnChunk.get()); + auto newColumnChunk = ColumnChunkFactory::createColumnChunk(column->getDataType()->copy(), + enableCompression, newCapacity); + auto currentNumSrcNodesInNG = csrOffsetChunk->getNumValues(); + auto csrOffsets = (offset_t*)csrOffsetChunk->getData(); + auto relIDs = (offset_t*)relIDChunk->getData(); + auto nodeGroupStartOffset = StorageUtils::getStartOffsetOfNodeGroup(nodeGroupIdx); + for (auto i = 0; i < currentNumSrcNodesInNG; i++) { + auto nodeOffset = nodeGroupStartOffset + i; + auto [startCSROffset, endCSROffset] = + getCSRStartAndEndOffset(nodeGroupStartOffset, csrOffsets, nodeOffset); + auto hasDeletions = deleteInfo.contains(nodeOffset); + auto hasUpdates = updateInfo.contains(nodeOffset); + auto hasInsertions = insertInfo.contains(nodeOffset); + if (!hasDeletions && !hasUpdates && !hasInsertions) { + // Append the whole csr. + newColumnChunk->append(columnChunk.get(), startCSROffset, + endCSROffset - startCSROffset); + continue; + } + for (auto csrOffset = startCSROffset; csrOffset < endCSROffset; csrOffset++) { + auto relID = relIDs[csrOffset]; + if (hasDeletions && deleteInfo.at(nodeOffset).contains(relID)) { + // This rel is deleted now. Skip. + } else if (hasUpdates && updateInfo.at(nodeOffset).contains(relID)) { + // This rel is inserted or updated. Append from local data to the column chunk. + auto rowIdx = insertInfo.at(nodeOffset).at(relID); + auto localVector = localChunk->getLocalVector(rowIdx)->getVector(); + auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); + localVector->state->selVector->selectedPositions[0] = offsetInVector; + newColumnChunk->append(localVector); + } else { + // This rel is not updated. Append to the column chunk. + newColumnChunk->append(columnChunk.get(), csrOffset, 1 /* numValuesToAppend */); + } + } + if (hasInsertions) { + // Append the newly inserted rels. + for (auto [_, rowIdx] : insertInfo.at(nodeOffset)) { + auto localVector = localChunk->getLocalVector(rowIdx)->getVector(); + auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); + localVector->state->selVector->selectedPositions[0] = offsetInVector; + newColumnChunk->append(localVector); + } + } + } + if (!insertInfo.empty()) { + // Append the newly inserted rels. + for (auto i = currentNumSrcNodesInNG; i < StorageConstants::NODE_GROUP_SIZE; i++) { + auto nodeOffset = nodeGroupStartOffset + i; + if (insertInfo.contains(nodeOffset)) { + for (auto [relID, rowIdx] : insertInfo.at(nodeOffset)) { + auto localVector = localChunk->getLocalVector(rowIdx)->getVector(); + auto offsetInVector = rowIdx & (DEFAULT_VECTOR_CAPACITY - 1); + localVector->state->selVector->selectedPositions[0] = offsetInVector; + newColumnChunk->append(localVector); + } + } + } + } + KU_ASSERT(newColumnChunk->getNumValues() == newCapacity); + return newColumnChunk; +} + void RelTableData::checkpointInMemory() { if (csrOffsetColumn) { csrOffsetColumn->checkpointInMemory(); diff --git a/test/test_files/demo_db/demo_db_create.test b/test/test_files/demo_db/demo_db_create.test index 4f99d047b37..c545029a5cf 100644 --- a/test/test_files/demo_db/demo_db_create.test +++ b/test/test_files/demo_db/demo_db_create.test @@ -31,7 +31,6 @@ Alice|35 Dimitri| -CASE CreateRelTest1 --SKIP -STATEMENT CREATE (u:User {name: 'Alice'}) ---- ok -STATEMENT MATCH (a:User) WHERE a.name = 'Adam' WITH a MATCH (b:User) WHERE b.name = 'Alice' WITH a, b CREATE (a)-[e:Follows {since:1990}]->(b) @@ -44,7 +43,6 @@ Karissa Zhang -CASE CreateRelTest2 --SKIP -STATEMENT MATCH (a:User), (b:User) WHERE a.name='Zhang' AND b.name='Karissa' CREATE (a)-[:Follows {since:2022}]->(b) ---- ok -CHECK_ORDER @@ -54,7 +52,6 @@ Karissa Noura -CASE CreateAvgNullTest --SKIP -STATEMENT MATCH (a:User) WHERE a.name = 'Adam' CREATE (a)-[:Follows]->(b:User {name:'Alice'}) ---- ok -CHECK_ORDER @@ -67,7 +64,6 @@ Noura {_ID: 0:3, _LABEL: User, name: Noura, age: 25}|25.000000|25|1|1 -CASE MergeComplexPattern --SKIP -STATEMENT MERGE (a:User {name:'A'})-[e:Follows]->(b:User {name:'B'})-[:LivesIn]->(:City {name:'Toronto'}); ---- ok -STATEMENT MATCH (a:User)-[:Follows]->(b:User)-[:LivesIn]->(c:City) RETURN a.name, b.name, c.name; diff --git a/test/test_files/demo_db/demo_db_delete.test b/test/test_files/demo_db/demo_db_delete.test index a625f4d5c14..6de2ea709d6 100644 --- a/test/test_files/demo_db/demo_db_delete.test +++ b/test/test_files/demo_db/demo_db_delete.test @@ -16,7 +16,6 @@ 4 -CASE DeleteRelTest --SKIP -STATEMENT MATCH (u:User)-[f:Follows]->(u1:User) WHERE u.name = 'Adam' AND u1.name = 'Karissa' DELETE f ---- ok -STATEMENT MATCH (u:User)-[f:Follows]->(u1:User) WHERE u.name='Adam' RETURN u1.name diff --git a/test/test_files/transaction/create_rel/insert_rels_to_different_nodes.test b/test/test_files/transaction/create_rel/insert_rels_to_different_nodes.test index 0d8b60f909b..e175c1aa313 100644 --- a/test/test_files/transaction/create_rel/insert_rels_to_different_nodes.test +++ b/test/test_files/transaction/create_rel/insert_rels_to_different_nodes.test @@ -1,6 +1,5 @@ -GROUP CreateRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK INSERT_RELS_TO_DIFFERENT_NODES [ diff --git a/test/test_files/transaction/create_rel/insert_rels_to_large_list.test b/test/test_files/transaction/create_rel/insert_rels_to_large_list.test index 4aaaa9f36c3..49faf54f50c 100644 --- a/test/test_files/transaction/create_rel/insert_rels_to_large_list.test +++ b/test/test_files/transaction/create_rel/insert_rels_to_large_list.test @@ -1,6 +1,5 @@ -GROUP CreateRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK INSERT_RELS_TO_LARGE_LIST [ diff --git a/test/test_files/transaction/create_rel/insert_rels_to_many_to_one_rel_table.test b/test/test_files/transaction/create_rel/insert_rels_to_many_to_one_rel_table.test index 109dde28672..aae9b064402 100644 --- a/test/test_files/transaction/create_rel/insert_rels_to_many_to_one_rel_table.test +++ b/test/test_files/transaction/create_rel/insert_rels_to_many_to_one_rel_table.test @@ -1,6 +1,5 @@ -GROUP CreateRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK INSERT_RELS_TO_MANY_TO_ONE_REL_TABLE [ diff --git a/test/test_files/transaction/create_rel/insert_rels_to_newly_added_node.test b/test/test_files/transaction/create_rel/insert_rels_to_newly_added_node.test index 6fccfd50e80..f85fc6d8b23 100644 --- a/test/test_files/transaction/create_rel/insert_rels_to_newly_added_node.test +++ b/test/test_files/transaction/create_rel/insert_rels_to_newly_added_node.test @@ -1,6 +1,5 @@ -GROUP CreateRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK INSERT_RELS_TO_DIFFERENT_NODES [ diff --git a/test/test_files/transaction/create_rel/insert_rels_to_one_to_one_rel_table.test b/test/test_files/transaction/create_rel/insert_rels_to_one_to_one_rel_table.test index 6a81858b4c8..b83a9104de5 100644 --- a/test/test_files/transaction/create_rel/insert_rels_to_one_to_one_rel_table.test +++ b/test/test_files/transaction/create_rel/insert_rels_to_one_to_one_rel_table.test @@ -1,6 +1,5 @@ -GROUP CreateRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK INSERT_RELS_TO_ONE_TO_ONE_REL_TABLE [ diff --git a/test/test_files/transaction/create_rel/insert_rels_to_small_list.test b/test/test_files/transaction/create_rel/insert_rels_to_small_list.test index 22c09c4baad..d3b357d6737 100644 --- a/test/test_files/transaction/create_rel/insert_rels_to_small_list.test +++ b/test/test_files/transaction/create_rel/insert_rels_to_small_list.test @@ -1,6 +1,5 @@ -GROUP CreateRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK INSERT_RELS_TO_SMALL_LIST [ diff --git a/test/test_files/transaction/create_rel/small_list_becomes_large_list_after_insertion.test b/test/test_files/transaction/create_rel/small_list_becomes_large_list_after_insertion.test index 3438e89a52f..43a47a97d03 100644 --- a/test/test_files/transaction/create_rel/small_list_becomes_large_list_after_insertion.test +++ b/test/test_files/transaction/create_rel/small_list_becomes_large_list_after_insertion.test @@ -1,6 +1,5 @@ -GROUP CreateRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE smallListBecomesLargeListAfterInsertionCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/delete_all_inserted_rels.test b/test/test_files/transaction/delete_rel/delete_all_inserted_rels.test index 49bb377d638..9b1a88d7e83 100644 --- a/test/test_files/transaction/delete_rel/delete_all_inserted_rels.test +++ b/test/test_files/transaction/delete_rel/delete_all_inserted_rels.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK DELETE_REL_TEST_DELETE_ALL_INSERTED_RELS [ diff --git a/test/test_files/transaction/delete_rel/delete_all_rels_from_large_list.test b/test/test_files/transaction/delete_rel/delete_all_rels_from_large_list.test index eab98a288fb..3c7ccb1c54a 100644 --- a/test/test_files/transaction/delete_rel/delete_all_rels_from_large_list.test +++ b/test/test_files/transaction/delete_rel/delete_all_rels_from_large_list.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE deleteAllRelsFromLargeListCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/delete_all_rels_from_small_list.test b/test/test_files/transaction/delete_rel/delete_all_rels_from_small_list.test index 70baedde8f4..258bd35d14b 100644 --- a/test/test_files/transaction/delete_rel/delete_all_rels_from_small_list.test +++ b/test/test_files/transaction/delete_rel/delete_all_rels_from_small_list.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE deleteAllRelsFromSmallListCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/delete_large_num_rels_from_large_list.test b/test/test_files/transaction/delete_rel/delete_large_num_rels_from_large_list.test index bbaea0da101..d9aa9c11af0 100644 --- a/test/test_files/transaction/delete_rel/delete_large_num_rels_from_large_list.test +++ b/test/test_files/transaction/delete_rel/delete_large_num_rels_from_large_list.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest_deleteLargeNumRelsFromLargeList -DATASET CSV rel-update-tests --SKIP -- -CASE deleteLargeNumRelsFromLargeListCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/delete_multiple_rels.test b/test/test_files/transaction/delete_rel/delete_multiple_rels.test index 9de724ae21a..2ac4ca53b11 100644 --- a/test/test_files/transaction/delete_rel/delete_multiple_rels.test +++ b/test/test_files/transaction/delete_rel/delete_multiple_rels.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE deleteMultipleRelsCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/delete_rels_from_large_list.test b/test/test_files/transaction/delete_rel/delete_rels_from_large_list.test index e0d2b541c5c..0cfd66a9b0b 100644 --- a/test/test_files/transaction/delete_rel/delete_rels_from_large_list.test +++ b/test/test_files/transaction/delete_rel/delete_rels_from_large_list.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE deleteRelsFromLargeListCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/delete_rels_from_many_to_one_table.test b/test/test_files/transaction/delete_rel/delete_rels_from_many_to_one_table.test index b899d33e22c..9df38d58aca 100644 --- a/test/test_files/transaction/delete_rel/delete_rels_from_many_to_one_table.test +++ b/test/test_files/transaction/delete_rel/delete_rels_from_many_to_one_table.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE deleteRelsFromManyToOneTableCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/delete_rels_from_one_to_one_table.test b/test/test_files/transaction/delete_rel/delete_rels_from_one_to_one_table.test index 90eec896dfa..898266b71af 100644 --- a/test/test_files/transaction/delete_rel/delete_rels_from_one_to_one_table.test +++ b/test/test_files/transaction/delete_rel/delete_rels_from_one_to_one_table.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK DELETE_RELS_FROM_ONE_TO_ONE_TABLE [ diff --git a/test/test_files/transaction/delete_rel/delete_rels_from_small_list.test b/test/test_files/transaction/delete_rel/delete_rels_from_small_list.test index 3fa7bd1138f..88388c439d7 100644 --- a/test/test_files/transaction/delete_rel/delete_rels_from_small_list.test +++ b/test/test_files/transaction/delete_rel/delete_rels_from_small_list.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE deleteRelsFromSmallListCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/delete_rels_from_update_store.test b/test/test_files/transaction/delete_rel/delete_rels_from_update_store.test index d24af0064f4..0ee3e9a7c39 100644 --- a/test/test_files/transaction/delete_rel/delete_rels_from_update_store.test +++ b/test/test_files/transaction/delete_rel/delete_rels_from_update_store.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK DELETE_RELS_FROM_UPDATE_STORE [ diff --git a/test/test_files/transaction/delete_rel/delete_rels_two_hop.test b/test/test_files/transaction/delete_rel/delete_rels_two_hop.test index 753eb704653..3271d0b2d7a 100644 --- a/test/test_files/transaction/delete_rel/delete_rels_two_hop.test +++ b/test/test_files/transaction/delete_rel/delete_rels_two_hop.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE DeleteRelsTwoHopCommitNormalExecution diff --git a/test/test_files/transaction/delete_rel/mixed_delete_and_create_rels.test b/test/test_files/transaction/delete_rel/mixed_delete_and_create_rels.test index 301e6385c7d..66ceb582d0e 100644 --- a/test/test_files/transaction/delete_rel/mixed_delete_and_create_rels.test +++ b/test/test_files/transaction/delete_rel/mixed_delete_and_create_rels.test @@ -1,6 +1,5 @@ -GROUP DeleteRelTest -DATASET CSV rel-update-tests --SKIP -- -CASE MixedDeleteAndCreateRelsCommitNormalExecution diff --git a/test/test_files/transaction/update_rel/update_one_to_one_rel_table.test b/test/test_files/transaction/update_rel/update_one_to_one_rel_table.test index 65ba9f4f223..1220f2fa9a2 100644 --- a/test/test_files/transaction/update_rel/update_one_to_one_rel_table.test +++ b/test/test_files/transaction/update_rel/update_one_to_one_rel_table.test @@ -1,6 +1,5 @@ -GROUP UpdateRelTest -DATASET CSV rel-update-tests --SKIP -- -DEFINE_STATEMENT_BLOCK UPDATE_ONE_TO_ONE_REL_TABLE [ diff --git a/test/test_files/update_node/create_tinysnb.test b/test/test_files/update_node/create_tinysnb.test index fdae44d5937..9ae43853b31 100644 --- a/test/test_files/update_node/create_tinysnb.test +++ b/test/test_files/update_node/create_tinysnb.test @@ -68,7 +68,6 @@ 9|Greg|40 -CASE InsertSingleNToNRelTest --SKIP -STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 9 AND b.ID = 10 CREATE (a)-[:knows {meetTime:timestamp('1976-12-23 11:21:42'), validInterval:interval('2 years'), comments:['A', 'k'], date:date('1997-03-22')}]->(b) ---- ok -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID > 8 RETURN a.ID, b.ID, e, ID(e) @@ -85,7 +84,6 @@ 9|934|(0:6)-{_LABEL: studyAt, _ID: 4:3, year: 2022}->(1:1)|4:3 -CASE InsertRepeatedNToNRelTest --SKIP -STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 7 AND b.ID = 8 CREATE (a)-[:knows {validInterval:interval('3 years')}]->(b) ---- ok -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID=7 RETURN b.ID, e.validInterval @@ -95,7 +93,6 @@ 9|00:47:58 -CASE InsertMixedRelTest --SKIP -STATEMENT MATCH (a:person), (b:person), (c:organisation) WHERE a.ID = 0 AND b.ID = 9 AND c.ID = 4 CREATE (b)-[:studyAt]->(c), (a)<-[:knows]-(b) ---- ok -STATEMENT MATCH (a:person)-[:knows]->(b:person)-[:studyAt]->(c:organisation) RETURN COUNT(*) @@ -114,7 +111,6 @@ 9|7|3:15 -CASE InsertNodeAndRelTest --SKIP -STATEMENT CREATE (a:person {ID:100})-[:knows {date:date('1997-03-22')}]->(b:person {ID:202}) ---- ok -STATEMENT MATCH (a:person)-[e:knows]->(b:person) WHERE a.ID > 50 RETURN a.ID, b.ID, e.date @@ -122,7 +118,6 @@ 100|202|1997-03-22 -CASE InsertNodeAndRelTest2 --SKIP -STATEMENT CREATE (c:organisation {ID:50})<-[:workAt]-(a:person {ID:100}), (a)-[:studyAt]->(c) ---- ok -STATEMENT MATCH (a:person)-[e1:studyAt]->(b:organisation), (a)-[e2:workAt]->(b) RETURN a.ID, b.ID, ID(e1), ID(e2) diff --git a/test/test_files/update_rel/create_read_tinysnb.test b/test/test_files/update_rel/create_read_tinysnb.test index 1beeff5ef70..d49b7a3c473 100644 --- a/test/test_files/update_rel/create_read_tinysnb.test +++ b/test/test_files/update_rel/create_read_tinysnb.test @@ -1,6 +1,5 @@ -GROUP TinySnbCreateReadRelTest -DATASET CSV tinysnb --SKIP -- -CASE CreateRelRead1 diff --git a/test/test_files/update_rel/delete_tinysnb.test b/test/test_files/update_rel/delete_tinysnb.test index ae8fe7ff4d6..2a37c929d16 100644 --- a/test/test_files/update_rel/delete_tinysnb.test +++ b/test/test_files/update_rel/delete_tinysnb.test @@ -1,6 +1,5 @@ -GROUP TinySnbDeleteRelTest -DATASET CSV tinysnb --SKIP -- -CASE DeleteRelMultiLabel1 diff --git a/test/test_files/update_rel/merge_tinysnb.test b/test/test_files/update_rel/merge_tinysnb.test index 223a39da816..9a4ccbfeb29 100644 --- a/test/test_files/update_rel/merge_tinysnb.test +++ b/test/test_files/update_rel/merge_tinysnb.test @@ -1,6 +1,5 @@ -GROUP TinySnbMergeRelTest -DATASET CSV tinysnb --SKIP -- -CASE Merge1 diff --git a/test/test_files/update_rel/set_read_tinysnb.test b/test/test_files/update_rel/set_read_tinysnb.test index 48dcc43013f..c4f8680b08c 100644 --- a/test/test_files/update_rel/set_read_tinysnb.test +++ b/test/test_files/update_rel/set_read_tinysnb.test @@ -19,7 +19,6 @@ ---- 1 -CASE SetReadTest2 --SKIP -STATEMENT CREATE REL TABLE play(FROM person TO person, date DATE, year INT64); ---- ok -STATEMENT MATCH (a:person), (b:person) WHERE a.ID=0 AND b.ID = 2 CREATE (a)-[e:play {date:date('2023-01-01'), year:2023}]->(b); diff --git a/test/test_files/update_rel/set_tinysnb.test b/test/test_files/update_rel/set_tinysnb.test index d430dc2b9af..64f5e7b9c79 100644 --- a/test/test_files/update_rel/set_tinysnb.test +++ b/test/test_files/update_rel/set_tinysnb.test @@ -1,6 +1,5 @@ -GROUP TinySnbSetRelTest -DATASET CSV tinysnb --SKIP -- -CASE SETMultiLabelNodePropTest