TEST_F(TransactionTests, delete_op_and_concurrent_read) { auto writeCtx = tx::TransactionManager::getInstance().buildContext(); size_t before = linxxxs->size(); // Add One read all auto pc = storage::PointerCalculator::create(linxxxs, new pos_list_t({0})); ASSERT_EQ(1u, pc->size()); DeleteOp del; del.setTXContext(writeCtx); del.addInput(pc); del.execute(); auto& mod = hyrise::tx::TransactionManager::getInstance()[writeCtx.tid]; ASSERT_EQ(1u, mod.deleted.size()); auto readCtx = tx::TransactionManager::getInstance().buildContext(); ProjectionScan ps; ps.addInput(linxxxs); ps.setTXContext(readCtx); ps.addField(0); ps.addField(1); ps.execute(); ValidatePositions vp; vp.setTXContext(readCtx); vp.addInput(ps.getResultTable()); vp.execute(); auto res = vp.getResultTable(); ASSERT_EQ(before, res->size()); }
TEST_F(TransactionTests, read_own_writes) { auto writeCtx = hyrise::tx::TransactionManager::getInstance().buildContext(); auto& mod = hyrise::tx::TransactionManager::getInstance()[writeCtx.tid]; ASSERT_EQ(0u, mod.inserted.size()); size_t before = linxxxs->size(); // Add One read all InsertScan is; is.setTXContext(writeCtx); is.addInput(linxxxs); is.setInputData(one_row); is.execute(); ASSERT_EQ(1u, mod.inserted.size()); ASSERT_EQ(1u, mod.inserted[linxxxs].size()); ProjectionScan ps; ps.addField(0); ps.setTXContext(writeCtx); ps.addInput(is.getResultTable()); ps.execute(); ValidatePositions vp; vp.setTXContext(writeCtx); vp.addInput(ps.getResultTable()); vp.execute(); auto r1 = vp.getResultTable(); ASSERT_EQ(before + 1, r1->size()); }
TEST_F(TransactionTests, read_your_own_deletes) { auto writeCtx = tx::TransactionManager::getInstance().buildContext(); size_t before = linxxxs->size(); // Add One read all auto pc = storage::PointerCalculator::create(linxxxs, new pos_list_t({0})); ASSERT_EQ(1u, pc->size()); DeleteOp del; del.setTXContext(writeCtx); del.addInput(pc); del.execute(); auto& mod = tx::TransactionManager::getInstance()[writeCtx.tid]; ASSERT_EQ(1u, mod.deleted.size()); ProjectionScan ps; ps.addInput(linxxxs); ps.setTXContext(writeCtx); ps.addField(0); ps.addField(1); ps.execute(); ValidatePositions vp; vp.setTXContext(writeCtx); vp.addInput(ps.getResultTable()); vp.execute(); auto res = vp.getResultTable(); ASSERT_EQ(before - 1, res->size()) << "We expect not to see the row we deleted earlier"; }
TEST_F(TransactionTests, concurrent_writer) { auto writeCtx = tx::TransactionManager::getInstance().buildContext(); auto writeCtx2 = tx::TransactionManager::getInstance().buildContext(); auto& mod = tx::TransactionManager::getInstance()[writeCtx.tid]; ASSERT_EQ(0u, mod.inserted.size()); size_t before = linxxxs->size(); // Add One read all InsertScan is; is.setTXContext(writeCtx); is.addInput(linxxxs); is.setInputData(one_row); is.execute(); ASSERT_EQ(1u, mod.inserted.size()); ASSERT_EQ(1u, mod.inserted[linxxxs].size()); // Add One read all InsertScan is2; is2.setTXContext(writeCtx2); is2.addInput(linxxxs); is2.setInputData(second_row); is2.execute(); ASSERT_EQ(1u, mod.inserted[linxxxs].size()); ASSERT_EQ(before + 2, linxxxs->size()); // Commit the changes from the first TX and check that we still dont see it for the second Commit c; c.addInput(linxxxs); c.setTXContext(writeCtx); c.execute(); ProjectionScan ps; ps.addInput(linxxxs); ps.setTXContext(writeCtx2); ps.addField(0); ps.addField(1); ps.execute(); ValidatePositions vp; vp.setTXContext(writeCtx2); vp.addInput(ps.getResultTable()); vp.execute(); auto res = vp.getResultTable(); ASSERT_EQ(before + 1, res->size()); ASSERT_EQ(222, res->getValue<hyrise_int_t>(1, res->size() - 1)); }
TEST_F(SelectTests, simple_projection_with_position) { auto t = Loader::shortcuts::load("test/lin_xxs.tbl"); ProjectionScan gs; gs.setProducesPositions(true); gs.addInput(t); gs.addField(0); const auto& result = gs.execute()->getResultTable(); const auto& reference = Loader::shortcuts::load("test/reference/simple_projection.tbl"); ASSERT_TRUE(result->contentEquals(reference)); }
void BenchmarkSetUp() { ps = new ProjectionScan(); ps->setEvent("NO_PAPI"); sm = StorageManager::getInstance(); t = sm->getTable("district"); ps->setProducesPositions(true); ps->addInput(t); ps->addField(0); ps->addField(1); }
TEST_F(ProjectionScanTests, basic_projection_scan_test) { auto t = Loader::shortcuts::load("test/lin_xxs.tbl"); auto reference = Loader::shortcuts::load("test/reference/simple_projection.tbl"); ProjectionScan ps; ps.addInput(t); ps.addField(0); ps.execute(); const auto &result = ps.getResultTable(); ASSERT_TRUE(result->contentEquals(reference)); }
TEST_F(TransactionTests, delete_op_and_merge) { auto writeCtx = tx::TransactionManager::getInstance().buildContext(); size_t before = linxxxs->size(); // Add One read all auto pc = storage::PointerCalculator::create(linxxxs, new pos_list_t({0})); ASSERT_EQ(1u, pc->size()); DeleteOp del; del.setTXContext(writeCtx); del.addInput(pc); del.execute(); auto& mod = hyrise::tx::TransactionManager::getInstance()[writeCtx.tid]; ASSERT_EQ(1u, mod.deleted.size()); // Commit the changes from the first TX and check that we still dont see it for the second Commit c; c.addInput(linxxxs); c.setTXContext(writeCtx); c.execute(); // No merge the table MergeStore mt; mt.addInput(linxxxs); mt.execute(); auto result = mt.getResultTable(); // Check after merge auto readCtx = tx::TransactionManager::getInstance().buildContext(); ProjectionScan ps; ps.addInput(result); ps.setTXContext(readCtx); ps.addField(0); ps.addField(1); ps.execute(); ValidatePositions vp; vp.setTXContext(readCtx); vp.addInput(ps.getResultTable()); vp.execute(); auto res = vp.getResultTable(); ASSERT_EQ(before - 1, res->size()); }
TEST_F(SelectTests, simple_projection_with_position_all_mat) { auto t = Loader::shortcuts::load("test/lin_xxxs.tbl"); ProjectionScan gs; gs.setProducesPositions(true); gs.addInput(t); gs.addField(0); gs.addField(1); auto result = gs.execute()->getResultTable(); MaterializingScan ms(false); ms.addInput(result); const auto& result2 = ms.execute()->getResultTable(); const auto& reference = Loader::shortcuts::load("test/lin_xxxs.tbl"); ASSERT_TRUE(result2->contentEquals(reference)); }
TEST_F(SelectTests, simple_projection_on_empty_table) { hyrise::storage::c_atable_ptr_t t = Loader::shortcuts::load("test/empty.tbl"); ProjectionScan gs; gs.setProducesPositions(true); gs.addInput(t); gs.addField(2); gs.addField(3); gs.addField(4); gs.addField(5); gs.addField(6); const auto& result = gs.execute()->getResultTable(); const auto& reference = Loader::shortcuts::load("test/reference/empty_after_projection.tbl"); ASSERT_TRUE(result->contentEquals(reference)); }
TEST_F(SelectTests, simple_projection_with_position_mat_and_sample) { auto t = Loader::shortcuts::load("test/lin_xxs.tbl"); ProjectionScan gs; gs.setProducesPositions(true); gs.addInput(t); gs.addField(0); auto result = gs.execute()->getResultTable(); MaterializingScan ms(false); ms.addInput(result); ms.setSamples(3); const auto& result2 = ms.execute()->getResultTable(); ASSERT_EQ((unsigned) 3, result2->size()); }
TEST_F(PerformanceDataTests, single_op_data) { storage::atable_ptr_t w = io::Loader::shortcuts::loadWithHeader("test/regression/projection_fail.data", "test/regression/projection_fail.tbl"); ProjectionScan ps; ps.addInput(w); ps.addField(w->numberOfColumn("w_tax")); performance_attributes_t perf; perf.startTime = 0; perf.endTime = 0; ps.setPerformanceData(&perf); ps.execute(); ASSERT_GT(perf.startTime, 0u) << "start time should be set"; ASSERT_GT(perf.endTime, 0u) << "end time should be set"; }
TEST_F(SelectTests, simple_projection_with_position_mat_memcpy) { auto t = Loader::shortcuts::load("test/lin_xxs.tbl"); ProjectionScan gs; gs.setProducesPositions(true); gs.addInput(t); gs.addField(0); ASSERT_EQ((unsigned) 10, t->columnCount()); auto result = gs.execute()->getResultTable(); MaterializingScan ms(true); ms.addInput(result); const auto& result2 = ms.execute()->getResultTable(); ASSERT_EQ((unsigned) 100, result2->size()); const auto& reference = Loader::shortcuts::load("test/reference/simple_projection.tbl"); ASSERT_TABLE_EQUAL(reference, result2); }
TEST_F(TransactionTests, parallel_writer) { // first insert a lot in parallel const size_t thread_count = getNumberOfCoresOnSystem(); const size_t inserts_per_thread = 1000; std::vector<std::thread> threads; for (size_t i = 0; i < thread_count; ++i) { threads.push_back(std::thread(parallel_writer_thread_function, linxxxs, one_row, inserts_per_thread)); } for (auto& thread : threads) { thread.join(); } // read all inserted rows and check if correct auto readCtx = tx::TransactionManager::getInstance().buildContext(); // std::cout << "read context. cid: " << readCtx.cid << ". lastCid: " << readCtx.lastCid << ". tid: " << readCtx.tid // << std::endl; ProjectionScan ps; ps.addInput(linxxxs); ps.setTXContext(readCtx); ps.addField(0); ps.addField(1); ps.execute(); ValidatePositions vp; vp.setTXContext(readCtx); vp.addInput(ps.getResultTable()); vp.execute(); auto res = vp.getResultTable(); auto size = res->size(); long sum = 0; for (size_t i = 0; i < size; ++i) { sum += res->getValue<hyrise_int_t>(0, i); } ASSERT_EQ(sum, (thread_count * inserts_per_thread * 99) + 8 + 6 + 400 + 200); }
TEST_F(TransactionTests, update_and_read_values) { auto writeCtx = tx::TransactionManager::getInstance().buildContext(); auto& mod = tx::TransactionManager::getInstance()[writeCtx.tid]; ASSERT_EQ(0u, mod.inserted.size()); size_t before = linxxxs->size(); // create PC to simulate position auto pc = storage::PointerCalculator::create(linxxxs, new pos_list_t({0, 4})); PosUpdateScan is; is.setTXContext(writeCtx); is.addInput(pc); Json::Value v; v["col_1"] = 99; is.setRawData(v); is.execute(); ASSERT_EQ(1u, mod.inserted.size()); ASSERT_EQ(2u, mod.inserted[linxxxs].size()); ASSERT_EQ(1u, mod.deleted.size()); ASSERT_EQ(2u, mod.deleted[linxxxs].size()); ProjectionScan ps; ps.addField(0); ps.setTXContext(writeCtx); ps.addInput(is.getResultTable()); ps.execute(); ValidatePositions vp; vp.setTXContext(writeCtx); vp.addInput(ps.getResultTable()); vp.execute(); auto r1 = vp.getResultTable(); ASSERT_EQ(before, r1->size()); }
TEST_F(MaterializingScanTests, basic_materializing_scan_test) { auto t = io::Loader::shortcuts::load("test/lin_xxs.tbl"); auto no_p = (storage::PointerCalculator*) nullptr; ProjectionScan ps; ps.addInput(t); ps.addField(0); ps.setProducesPositions(true); ps.execute(); const auto &t2 = ps.getResultTable(); ASSERT_NE(no_p, dynamic_cast<const storage::PointerCalculator*>(t2.get())); MaterializingScan ms; ms.addInput(t2); ms.addField(0); ms.execute(); const auto &result = ms.getResultTable(); ASSERT_EQ(no_p, dynamic_cast<const storage::PointerCalculator*>(result.get())); ASSERT_EQ(100u, result->size()); ASSERT_EQ(1u, result->columnCount()); }
TEST_F(TransactionTests, update_and_merge) { auto writeCtx = tx::TransactionManager::getInstance().buildContext(); auto& mod = tx::TransactionManager::getInstance()[writeCtx.tid]; ASSERT_EQ(0u, mod.inserted.size()); size_t before = linxxxs->size(); // create PC to simulate position auto pc = storage::PointerCalculator::create(linxxxs, new pos_list_t({0, 4})); PosUpdateScan is; is.setTXContext(writeCtx); is.addInput(pc); Json::Value v; v["col_1"] = 99; is.setRawData(v); is.execute(); ASSERT_EQ(1u, mod.inserted.size()); ASSERT_EQ(2u, mod.inserted[linxxxs].size()); ASSERT_EQ(1u, mod.deleted.size()); ASSERT_EQ(2u, mod.deleted[linxxxs].size()); Commit c; c.addInput(linxxxs); c.setTXContext(writeCtx); c.execute(); writeCtx = hyrise::tx::TransactionManager::getInstance().buildContext(); // No merge the table MergeStore mt; mt.addInput(linxxxs); mt.setTXContext(writeCtx); mt.execute(); auto result = mt.getResultTable(); const auto& ref = io::Loader::shortcuts::load("test/reference/lin_xxxs_update.tbl"); EXPECT_RELATION_EQ(ref, result); ProjectionScan ps; ps.addField(0); ps.addField(1); ps.setTXContext(writeCtx); ps.addInput(result); ps.execute(); ValidatePositions vp; vp.setTXContext(writeCtx); vp.addInput(ps.getResultTable()); vp.execute(); auto r1 = vp.getResultTable(); ASSERT_EQ(before, r1->size()); ASSERT_EQ(99, r1->getValue<hyrise_int_t>(1, 3)); ASSERT_EQ(99, r1->getValue<hyrise_int_t>(1, 4)); }