Skip to content

Commit

Permalink
Add list look up test (#3210)
Browse files Browse the repository at this point in the history
* list look up test
  • Loading branch information
hououou committed Apr 7, 2024
1 parent c6897b4 commit f391b28
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 2 deletions.
5 changes: 4 additions & 1 deletion src/storage/store/list_column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ void ListColumn::scan(Transaction* transaction, node_group_idx_t nodeGroupIdx,
resultVector->getValue<list_entry_t>(offsetInVector - 1).size;
auto offsetToWriteListData = listOffsetInVector;
auto numValues = endOffsetInGroup - startOffsetInGroup;
numValues = std::min(numValues, listOffsetInfoInStorage.numTotal);
KU_ASSERT(numValues >= 0);
for (auto i = 0u; i < numValues; i++) {
list_size_t size = listOffsetInfoInStorage.getListSize(i);
Expand Down Expand Up @@ -197,6 +198,7 @@ void ListColumn::append(ColumnChunk* columnChunk, uint64_t nodeGroupIdx) {
void ListColumn::scanUnfiltered(Transaction* transaction, node_group_idx_t nodeGroupIdx,
ValueVector* resultVector, const ListOffsetSizeInfo& listOffsetInfoInStorage) {
auto numValuesToScan = resultVector->state->selVector->selectedSize;
numValuesToScan = std::min(numValuesToScan, listOffsetInfoInStorage.numTotal);
offset_t offsetInVector = 0;
for (auto i = 0u; i < numValuesToScan; i++) {
auto listLen = listOffsetInfoInStorage.getListSize(i);
Expand Down Expand Up @@ -303,7 +305,8 @@ ListOffsetSizeInfo ListColumn::getListOffsetSizeInfo(Transaction* transaction,
endOffsetInNodeGroup);
sizeColumn->scan(transaction, nodeGroupIdx, sizeColumnChunk.get(), startOffsetInNodeGroup,
endOffsetInNodeGroup);
return {numOffsetsToRead, std::move(offsetColumnChunk), std::move(sizeColumnChunk)};
auto numValuesScan = offsetColumnChunk->getNumValues();
return {numValuesScan, std::move(offsetColumnChunk), std::move(sizeColumnChunk)};
}

void ListColumn::prepareCommitForChunk(Transaction* transaction, node_group_idx_t nodeGroupIdx,
Expand Down
6 changes: 5 additions & 1 deletion src/storage/store/list_column_chunk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,13 +159,17 @@ void ListColumnChunk::lookup(offset_t offsetInChunk, ValueVector& output,
}
auto startOffset = offsetInChunk == 0 ? 0 : getValue<offset_t>(offsetInChunk - 1);
auto listSize = getListSize(offsetInChunk);
output.setValue<list_entry_t>(posInOutputVector, list_entry_t{startOffset, listSize});
auto dataVector = ListVector::getDataVector(&output);
auto currentListDataSize = ListVector::getDataVectorSize(&output);
ListVector::resizeDataVector(&output, currentListDataSize + listSize);
// TODO(Guodong): Should add `scan` interface and use `scan` here.
for (auto i = 0u; i < listSize; i++) {
listDataColumnChunk->dataColumnChunk->lookup(startOffset + i, *dataVector, i);
listDataColumnChunk->dataColumnChunk->lookup(
startOffset + i, *dataVector, currentListDataSize + i);
}
// reset offset
output.setValue<list_entry_t>(posInOutputVector, list_entry_t{currentListDataSize, listSize});
}

void ListColumnChunk::write(ColumnChunk* chunk, ColumnChunk* dstOffsets,
Expand Down
87 changes: 87 additions & 0 deletions test/test_files/transaction/create_rel/list_disk_memory_scan.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
-GROUP TinySnbCreateNodeTest
-DATASET CSV rel-update-tests

--

-DEFINE_STATEMENT_BLOCK INSERT_RELS_TO_SMALL_LIST [
-STATEMENT MATCH (a:person),(b:person) WHERE a.ID=1 and b.ID=700 CREATE (a)-[e:knows{length: 45, tag: ['123', 'good']}]->(b)
---- ok
-STATEMENT MATCH (a:person),(b:person) WHERE a.ID=1 and b.ID=400 CREATE (a)-[e:knows{length: 34, place: 'short'}]->(b)
---- ok
-STATEMENT MATCH (a:person),(b:person) WHERE a.ID=1 and b.ID=600 CREATE (a)-[e:knows{}]->(b)
---- ok
]

-CASE listNodeCreateDiskAndMemoryScan
-STATEMENT CREATE NODE TABLE person2(ID INT64, workedHours INT64[], PRIMARY KEY (ID))
---- ok
-STATEMENT CREATE (:person2 {ID: 17, workedHours: [4,5,6]})
---- ok
-STATEMENT BEGIN TRANSACTION
---- ok
-STATEMENT CREATE (:person2 {ID: 12, workedHours: [2,3]})
---- ok
-STATEMENT CREATE (:person2 {ID: 14, workedHours: [2,5]})
---- ok
-STATEMENT MATCH (p:person2) RETURN p.workedHours
---- 3
[4,5,6]
[2,3]
[2,5]


-CASE listRelInsertDiskAndMemoryScan
-STATEMENT MATCH (a:person),(b:person) WHERE a.ID=1 and b.ID=300 CREATE (a)-[e:knows{length: 300, place: 'this is a long str', tag: ['123', 'good']}]->(b)
---- ok
-STATEMENT BEGIN TRANSACTION
---- ok
-INSERT_STATEMENT_BLOCK INSERT_RELS_TO_SMALL_LIST
-STATEMENT MATCH (a:person)-[e:knows]->(b:person) where b.ID > 200 AND a.ID = 1 RETURN e.length, e.place, e.tag
---- 4
300|this is a long str|[123,good]
34|short|
45||[123,good]
||


-CASE listCreateEmptyDiskAndMemoryScan
-STATEMENT CREATE NODE TABLE person2(ID INT64, workedHours INT64[], PRIMARY KEY (ID))
---- ok
-STATEMENT CREATE REL TABLE knows2(FROM person2 TO person2, workedHours INT64[])
---- ok
-STATEMENT CREATE (:person2 {ID: 1, workedHours: [4,5,6]})
---- ok
-STATEMENT BEGIN TRANSACTION
---- ok
-STATEMENT CREATE (:person2 {ID: 2, workedHours: [2,3]})
---- ok
-STATEMENT CREATE (:person2 {ID: 3, workedHours: [2,5]})
---- ok
-STATEMENT MATCH (p:person2) RETURN p.workedHours
---- 3
[4,5,6]
[2,3]
[2,5]
-STATEMENT Commit
---- ok
-STATEMENT MATCH (p:person2) RETURN p.workedHours
---- 3
[4,5,6]
[2,3]
[2,5]
-STATEMENT MATCH (a:person2),(b:person2) WHERE a.ID=1 and b.ID=2 CREATE (a)-[e:knows2{workedHours: [2,3,5,6,7,89]}]->(b)
---- ok
-STATEMENT BEGIN TRANSACTION
---- ok
-STATEMENT MATCH (a:person2),(b:person2) WHERE a.ID=2 and b.ID=3 CREATE (a)-[e:knows2{workedHours: [1,2,3]}]->(b)
---- ok
-STATEMENT MATCH (a:person2)-[e:knows2]->(b:person2) return e.workedHours
---- 2
[2,3,5,6,7,89]
[1,2,3]
-STATEMENT Commit
---- ok
-STATEMENT MATCH (a:person2)-[e:knows2]->(b:person2) return e.workedHours
---- 2
[2,3,5,6,7,89]
[1,2,3]

0 comments on commit f391b28

Please sign in to comment.