Skip to content

Commit e825ec2

Browse files
Initial import of code and dataset
0 parents  commit e825ec2

78 files changed

Lines changed: 271607 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
dataset/public.init
2+
dataset/public.result
3+
dataset/public.work
4+
dataset/r0
5+
dataset/r1
6+
dataset/r2
7+
dataset/r3
8+
dataset/r4
9+
dataset/r5
10+
dataset/r6
11+
dataset/r7
12+
dataset/r8

CMakeLists.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
cmake_minimum_required (VERSION 2.6)
2+
project (Sig18)
3+
4+
set(CMAKE_CXX_STANDARD 17)
5+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
set(CMAKE_CXX_EXTENSIONS OFF)
7+
# set(CMAKE_C_COMPILER /usr/local/bin/gcc)
8+
# set(CMAKE_CXX_COMPILER /usr/local/bin/g++)
9+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -fsanitize=address -Wall")
10+
11+
include_directories(include)
12+
13+
14+
add_library(database Relation.cpp Operators.cpp Parser.cpp Utils.cpp Joiner.cpp)
15+
target_include_directories(database PUBLIC
16+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
17+
$<INSTALL_INTERFACE:include>
18+
PRIVATE src)
19+
20+
OPTION(FORCE_TESTS "Build tests, regardless of build type." ON)
21+
if (CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]" OR FORCE_TESTS)
22+
add_subdirectory(test)
23+
endif()
24+
25+
add_executable(Driver main.cpp)
26+
target_link_libraries(Driver database)
27+
28+
# Interactive command line tool to translate our query format to SQL queries
29+
add_executable(Query2SQL Query2SQL.cpp)
30+
target_link_libraries(Query2SQL database)
31+
32+
# Test harness
33+
add_executable(harness harness.cpp)
34+
35+
ADD_CUSTOM_TARGET(link_target ALL
36+
COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/workloads
37+
${CMAKE_CURRENT_BINARY_DIR}/workloads)

Joiner.cpp

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#include "Joiner.hpp"
2+
#include <cassert>
3+
#include <iostream>
4+
#include <string>
5+
#include <unordered_map>
6+
#include <utility>
7+
#include <set>
8+
#include <sstream>
9+
#include <vector>
10+
#include "Parser.hpp"
11+
//---------------------------------------------------------------------------
12+
using namespace std;
13+
//---------------------------------------------------------------------------
14+
void Joiner::addRelation(const char* fileName)
15+
// Loads a relation from disk
16+
{
17+
relations.emplace_back(fileName);
18+
}
19+
//---------------------------------------------------------------------------
20+
Relation& Joiner::getRelation(unsigned relationId)
21+
// Loads a relation from disk
22+
{
23+
if (relationId >= relations.size()) {
24+
cerr << "Relation with id: " << relationId << " does not exist" << endl;
25+
throw;
26+
}
27+
return relations[relationId];
28+
}
29+
//---------------------------------------------------------------------------
30+
unique_ptr<Operator> Joiner::addScan(set<unsigned>& usedRelations,SelectInfo& info,QueryInfo& query)
31+
// Add scan to query
32+
{
33+
usedRelations.emplace(info.binding);
34+
vector<FilterInfo> filters;
35+
for (auto& f : query.filters) {
36+
if (f.filterColumn.binding==info.binding) {
37+
filters.emplace_back(f);
38+
}
39+
}
40+
return filters.size()?make_unique<FilterScan>(getRelation(info.relId),filters):make_unique<Scan>(getRelation(info.relId),info.binding);
41+
}
42+
//---------------------------------------------------------------------------
43+
enum QueryGraphProvides { Left, Right, Both, None };
44+
//---------------------------------------------------------------------------
45+
static QueryGraphProvides analyzeInputOfJoin(set<unsigned>& usedRelations,SelectInfo& leftInfo,SelectInfo& rightInfo)
46+
// Analyzes inputs of join
47+
{
48+
bool usedLeft=usedRelations.count(leftInfo.binding);
49+
bool usedRight=usedRelations.count(rightInfo.binding);
50+
51+
if (usedLeft^usedRight)
52+
return usedLeft?QueryGraphProvides::Left:QueryGraphProvides::Right;
53+
if (usedLeft&&usedRight)
54+
return QueryGraphProvides::Both;
55+
return QueryGraphProvides::None;
56+
}
57+
//---------------------------------------------------------------------------
58+
string Joiner::join(QueryInfo& query)
59+
// Executes a join query
60+
{
61+
//cerr << query.dumpText() << endl;
62+
set<unsigned> usedRelations;
63+
64+
// We always start with the first join predicate and append the other joins to it (--> left-deep join trees)
65+
// You might want to choose a smarter join ordering ...
66+
auto& firstJoin=query.predicates[0];
67+
auto left=addScan(usedRelations,firstJoin.left,query);
68+
auto right=addScan(usedRelations,firstJoin.right,query);
69+
unique_ptr<Operator> root=make_unique<Join>(move(left),move(right),firstJoin);
70+
71+
72+
73+
for (unsigned i=1;i<query.predicates.size();++i) {
74+
auto& pInfo=query.predicates[i];
75+
auto& leftInfo=pInfo.left; auto& rightInfo=pInfo.right;
76+
unique_ptr<Operator> left, right;
77+
switch(analyzeInputOfJoin(usedRelations,leftInfo,rightInfo)) {
78+
case QueryGraphProvides::Left:
79+
left=move(root);
80+
right=addScan(usedRelations,rightInfo,query);
81+
root=make_unique<Join>(move(left),move(right),pInfo);
82+
break;
83+
case QueryGraphProvides::Right:
84+
left=addScan(usedRelations,leftInfo,query);
85+
right=move(root);
86+
root=make_unique<Join>(move(left),move(right),pInfo);
87+
break;
88+
case QueryGraphProvides::Both:
89+
// All relations of this join are already used somewhere else in the query.
90+
// Thus, we have either a cycle in our join graph or more than one join predicate per join.
91+
root=make_unique<SelfJoin>(move(root),pInfo);
92+
break;
93+
case QueryGraphProvides::None:
94+
// Process this predicate later when we can connect it to the other joins
95+
// We never have cross products
96+
query.predicates.push_back(pInfo);
97+
break;
98+
};
99+
}
100+
101+
Checksum checkSum(move(root),query.selections);
102+
checkSum.run();
103+
104+
105+
stringstream out;
106+
auto& results=checkSum.checkSums;
107+
for (unsigned i=0;i<results.size();++i) {
108+
out << (checkSum.resultSize==0?"NULL":to_string(results[i]));
109+
if (i<results.size()-1)
110+
out << " ";
111+
}
112+
out << "\n";
113+
return out.str();
114+
}
115+
//---------------------------------------------------------------------------

0 commit comments

Comments
 (0)