Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
212a0b2
Merge pull request #1 from RagnarOkk11/weekly-dev
RagnarOkk11 Jan 1, 2026
69ee12e
Merge pull request #2 from RagnarOkk11/weekly-dev
RagnarOkk11 Jan 4, 2026
c3e54e7
Merge pull request #3 from RagnarOkk11/weekly-dev
RagnarOkk11 Jan 5, 2026
88a21fa
Merge pull request #4 from RagnarOkk11/weekly-dev
RagnarOkk11 Jan 15, 2026
bf1ffd5
Merge pull request #5 from RagnarOkk11/weekly-dev
RagnarOkk11 Jan 15, 2026
292f068
Merge pull request #6 from RagnarOkk11/weekly-dev
RagnarOkk11 Apr 3, 2026
2f4036b
huge project redesign
Miknil105 May 6, 2026
4f734e4
feat: like, not like filters added, queries 20-23 done
Miknil105 May 6, 2026
9c49b01
feat: query 27: length project function supported, having function su…
Miknil105 May 9, 2026
d815b84
fix: query 23 fixed, OrderByOperator batch processing fixed (it works…
Miknil105 May 10, 2026
1baaa28
feat: queries 29-35
Miknil105 May 10, 2026
267e61b
feat: queries 28, 36-39, 41
Miknil105 May 11, 2026
b92a604
feat: queries 40, 42 [ALL QUERIES DONE, LEGENDARY MOMENT]
Miknil105 May 12, 2026
9705d07
script: run all queries in one script
Miknil105 May 15, 2026
a255c75
optimize: problem with multiple parsing of metadata fixed, execution …
Miknil105 May 15, 2026
4214dcc
Merge pull request #8 from RagnarOkk11/to-review
RagnarOkk11 May 15, 2026
30dcc37
Merge pull request #9 from RagnarOkk11/reviewed
RagnarOkk11 May 15, 2026
2dd12a0
Merge pull request #7 from RagnarOkk11/weekly-dev
RagnarOkk11 May 15, 2026
0d2eedc
fix: tests fix
Miknil105 May 15, 2026
5d52419
Merge pull request #10 from RagnarOkk11/to-review
RagnarOkk11 May 15, 2026
b6c57ee
redesign: now push execution implemented instead of pull. Start of im…
Miknil105 May 16, 2026
2983e75
feat: multithread execution implemented
Miknil105 May 17, 2026
8ecdd4e
script: run all queries for multithreading supported
Miknil105 May 17, 2026
eef1da3
feat: every operator is under multithreading now. implementing multit…
Miknil105 May 18, 2026
df00b81
fix: CsvTokenizer fix, script fix
Miknil105 May 27, 2026
0e82a99
feat: engine no longer prints column names
Miknil105 May 27, 2026
b80430f
script: run all queries support --cold so queries can be executed wit…
Miknil105 May 30, 2026
8f6c901
Merge pull request #11 from RagnarOkk11/weekly-dev
RagnarOkk11 May 30, 2026
761f094
some unknown change
Miknil105 Jun 11, 2026
cc750dc
Merge pull request #12 from RagnarOkk11/weekly-dev
RagnarOkk11 Jun 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,18 @@ compile_commands.json
.clangd
test_csv
test.csv
test.log
test_csv2
test_main.cpp
hits_sample.csv
hits_10m.csv
columnar_hits_sample.tuff
report.txt
docker-test
docker-test-results
.vscode/
src/project_bundle.txt


# Prerequisites
*.d

Expand Down
23 changes: 21 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.28)
cmake_minimum_required(VERSION 3.30)

project(columnar-engine)

Expand All @@ -15,7 +15,26 @@ include(cmake/TestSolution.cmake)
include(cmake/SeminarUtils.cmake)

include(FetchContent)
include(cmake/FindGlog.cmake)

set(ABSL_PROPAGATE_CXX_STD ON)
set(BUILD_TESTING OFF)
set(ABSL_ENABLE_INSTALL ON)

FetchContent_Declare(
abseil-cpp
GIT_REPOSITORY https://github.com/abseil/abseil-cpp.git
GIT_TAG 20240116.2
SYSTEM
)
FetchContent_MakeAvailable(abseil-cpp)

FetchContent_Declare(
re2
GIT_REPOSITORY https://github.com/google/re2.git
GIT_TAG 2024-02-01
SYSTEM
)
FetchContent_MakeAvailable(re2)

find_package(Catch REQUIRED)
find_package(Benchmark REQUIRED)
Expand Down
2 changes: 1 addition & 1 deletion script/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ cmake -S "${ROOT_DIR}" -B "${BUILD_DIR}" \
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
-DCMAKE_CXX_STANDARD=23

cmake --build "${BUILD_DIR}" --target columnar-engine -j "$(nproc)"
cmake --build "${BUILD_DIR}" -j "$(nproc)"
145 changes: 145 additions & 0 deletions script/run_all_queries.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
#!/bin/bash
set -e

# usage:
# -i 3 - count of iterations (or --iterations)
# --answers - print answers for each query
# --debug - print time of execution for each query
# --cold - drop OS page cache before each query (requires sudo)

cd "$(dirname "$0")" || exit 1

# Значения по умолчанию
ITERATIONS=1
SHOW_DEBUG=0
SHOW_ANSWERS=0
COLD_CACHE=0

# Парсинг аргументов командной строки
while [[ "$#" -gt 0 ]]; do
case $1 in
--debug) SHOW_DEBUG=1; shift ;;
--answers) SHOW_ANSWERS=1; shift ;;
--cold) COLD_CACHE=1; shift ;;
-i|--iterations) ITERATIONS="$2"; shift 2 ;;
*) echo "Unknown parameter passed: $1"; exit 1 ;;
esac
done

echo ">>> Running queries 0-42 (single thread)..."
echo ">>> Iterations: $ITERATIONS | Show Debug: $SHOW_DEBUG | Show Answers: $SHOW_ANSWERS | Cold Cache: $COLD_CACHE"

RESULTS_DIR="query_results"
if [ "$SHOW_ANSWERS" -eq 1 ] || [ "$SHOW_DEBUG" -eq 1 ]; then
mkdir -p "${RESULTS_DIR}"
fi

# Массив для хранения всех времён (для общего geomean)
ALL_TIMES=()

for (( iter=1; iter<=ITERATIONS; iter++ ))
do
echo "========================================="
echo ">>> Iteration $iter / $ITERATIONS"
echo "========================================="

# Массив времён для текущей итерации
ITER_TIMES=()

for i in {0..42}
do
echo -n ">>> Executing query $i ... "

# Куда пишем ответы
if [ "$SHOW_ANSWERS" -eq 1 ]; then
CSV_FILE="${RESULTS_DIR}/query_${i}_iter_${iter}.csv"
else
CSV_FILE="/dev/null"
fi

# Куда пишем логи (чтобы вытащить время)
if [ "$SHOW_DEBUG" -eq 1 ]; then
LOG_FILE="${RESULTS_DIR}/query_${i}_iter_${iter}.log"
else
LOG_FILE=$(mktemp) # Временный файл, который мы потом удалим
fi

# Формируем аргументы для run_query.sh
COLD_ARG=""
if [ "$COLD_CACHE" -eq 1 ]; then
COLD_ARG="--cold"
fi

set +e
./run_query.sh "$i" ../columnar_hits_sample.tuff "$CSV_FILE" "$LOG_FILE" $COLD_ARG
exit_code=$?
set -e

# Вытаскиваем время из лога (формат: "Query 0 completed in 2.57227 ms")
EXEC_TIME=$(grep "completed in" "$LOG_FILE" | awk '{print $5, $6}' || true)
EXEC_TIME_MS=$(grep "completed in" "$LOG_FILE" | awk '{print $5}' || true)

if [ $exit_code -ne 0 ]; then
echo "FAILED with exit code $exit_code"
echo "--- CRASH LOG ---"
cat "$LOG_FILE"
if [ "$SHOW_DEBUG" -eq 0 ]; then rm -f "$LOG_FILE"; fi
exit $exit_code
fi

# Красиво выводим время
if [ -n "$EXEC_TIME" ]; then
echo "${EXEC_TIME} ... OK"
else
echo "OK"
fi

# Сохраняем время для geomean
if [ -n "$EXEC_TIME_MS" ]; then
ITER_TIMES+=("$EXEC_TIME_MS")
ALL_TIMES+=("$EXEC_TIME_MS")
fi

if [ "$SHOW_ANSWERS" -eq 1 ]; then
echo "------ ANSWERS (Query $i) ------"
cat "$CSV_FILE"
echo "--------------------------------"
fi

if [ "$SHOW_DEBUG" -eq 1 ]; then
echo "------- DEBUG (Query $i) -------"
cat "$LOG_FILE"
echo "--------------------------------"
else
# Удаляем мусор, если дебаг не нужен
rm -f "$LOG_FILE"
fi
done

# Считаем geomean для текущей итерации
if [ ${#ITER_TIMES[@]} -gt 0 ]; then
GEOMEAN=$(printf '%s\n' "${ITER_TIMES[@]}" | awk '{
sum += log($1); n++
} END {
if (n > 0) printf "%.5f", exp(sum / n)
}')
echo "========================================="
echo ">>> Geomean for iteration $iter: ${GEOMEAN} ms"
echo "========================================="
fi
done

# Считаем общий geomean по всем итерациям
if [ ${#ALL_TIMES[@]} -gt 0 ]; then
TOTAL_GEOMEAN=$(printf '%s\n' "${ALL_TIMES[@]}" | awk '{
sum += log($1); n++
} END {
if (n > 0) printf "%.5f", exp(sum / n)
}')
echo ""
echo "========================================="
echo ">>> Overall geomean ($ITERATIONS iterations): ${TOTAL_GEOMEAN} ms"
echo "========================================="
fi

echo ">>> All $ITERATIONS iterations of all queries completed successfully."
145 changes: 145 additions & 0 deletions script/run_all_queries_mt.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
#!/bin/bash
set -e

# usage:
# -i 3 - count of iterations (or --iterations)
# --answers - print answers for each query
# --debug - print time of execution for each query
# --cold - drop OS page cache before each query (requires sudo)

cd "$(dirname "$0")" || exit 1

# Значения по умолчанию
ITERATIONS=1
SHOW_DEBUG=0
SHOW_ANSWERS=0
COLD_CACHE=0

# Парсинг аргументов командной строки
while [[ "$#" -gt 0 ]]; do
case $1 in
--debug) SHOW_DEBUG=1; shift ;;
--answers) SHOW_ANSWERS=1; shift ;;
--cold) COLD_CACHE=1; shift ;;
-i|--iterations) ITERATIONS="$2"; shift 2 ;;
*) echo "Unknown parameter passed: $1"; exit 1 ;;
esac
done

echo ">>> Running queries 0-42 (multi thread)..."
echo ">>> Iterations: $ITERATIONS | Show Debug: $SHOW_DEBUG | Show Answers: $SHOW_ANSWERS | Cold Cache: $COLD_CACHE"

RESULTS_DIR="query_mt_results"
if [ "$SHOW_ANSWERS" -eq 1 ] || [ "$SHOW_DEBUG" -eq 1 ]; then
mkdir -p "${RESULTS_DIR}"
fi

# Массив для хранения всех времён (для общего geomean)
ALL_TIMES=()

for (( iter=1; iter<=ITERATIONS; iter++ ))
do
echo "========================================="
echo ">>> Iteration $iter / $ITERATIONS"
echo "========================================="

# Массив времён для текущей итерации
ITER_TIMES=()

for i in {0..42}
do
echo -n ">>> Executing query $i ... "

# Куда пишем ответы
if [ "$SHOW_ANSWERS" -eq 1 ]; then
CSV_FILE="${RESULTS_DIR}/query_${i}_iter_${iter}.csv"
else
CSV_FILE="/dev/null"
fi

# Куда пишем логи (чтобы вытащить время)
if [ "$SHOW_DEBUG" -eq 1 ]; then
LOG_FILE="${RESULTS_DIR}/query_${i}_iter_${iter}.log"
else
LOG_FILE=$(mktemp) # Временный файл, который мы потом удалим
fi

# Формируем аргументы для run_query_mt.sh
COLD_ARG=""
if [ "$COLD_CACHE" -eq 1 ]; then
COLD_ARG="--cold"
fi

set +e
./run_query_mt.sh "$i" ../columnar_hits_sample.tuff "$CSV_FILE" "$LOG_FILE" $COLD_ARG
exit_code=$?
set -e

# Вытаскиваем время из лога (формат: "Query 0 completed in 2.57227 ms")
EXEC_TIME=$(grep "completed in" "$LOG_FILE" | awk '{print $5, $6}' || true)
EXEC_TIME_MS=$(grep "completed in" "$LOG_FILE" | awk '{print $5}' || true)

if [ $exit_code -ne 0 ]; then
echo "FAILED with exit code $exit_code"
echo "--- CRASH LOG ---"
cat "$LOG_FILE"
if [ "$SHOW_DEBUG" -eq 0 ]; then rm -f "$LOG_FILE"; fi
exit $exit_code
fi

# Красиво выводим время
if [ -n "$EXEC_TIME" ]; then
echo "${EXEC_TIME} ... OK"
else
echo "OK"
fi

# Сохраняем время для geomean
if [ -n "$EXEC_TIME_MS" ]; then
ITER_TIMES+=("$EXEC_TIME_MS")
ALL_TIMES+=("$EXEC_TIME_MS")
fi

if [ "$SHOW_ANSWERS" -eq 1 ]; then
echo "------ ANSWERS (Query $i) ------"
cat "$CSV_FILE"
echo "--------------------------------"
fi

if [ "$SHOW_DEBUG" -eq 1 ]; then
echo "------- DEBUG (Query $i) -------"
cat "$LOG_FILE"
echo "--------------------------------"
else
# Удаляем мусор, если дебаг не нужен
rm -f "$LOG_FILE"
fi
done

# Считаем geomean для текущей итерации
if [ ${#ITER_TIMES[@]} -gt 0 ]; then
GEOMEAN=$(printf '%s\n' "${ITER_TIMES[@]}" | awk '{
sum += log($1); n++
} END {
if (n > 0) printf "%.5f", exp(sum / n)
}')
echo "========================================="
echo ">>> Geomean for iteration $iter: ${GEOMEAN} ms"
echo "========================================="
fi
done

# Считаем общий geomean по всем итерациям
if [ ${#ALL_TIMES[@]} -gt 0 ]; then
TOTAL_GEOMEAN=$(printf '%s\n' "${ALL_TIMES[@]}" | awk '{
sum += log($1); n++
} END {
if (n > 0) printf "%.5f", exp(sum / n)
}')
echo ""
echo "========================================="
echo ">>> Overall geomean ($ITERATIONS iterations): ${TOTAL_GEOMEAN} ms"
echo "========================================="
fi

echo ">>> All $ITERATIONS iterations of all queries completed successfully."
22 changes: 17 additions & 5 deletions script/run_query.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

if [[ $# -lt 4 ]]; then
echo "Usage: script/run_query.sh <query_num> <columnar> <output_csv> <log_file>" >&2
echo "Usage: script/run_query.sh <query_num> <columnar> <output_csv> <log_file> [--cold]" >&2
exit 2
fi

QUERY_NUM="$1"
COLUMNAR="$2"
OUTPUT_CSV="$3"
LOG_FILE="$4"
DROP_CACHE="${5:-}"

BUILD_DIR="${ROOT_DIR}/cmake-build-release"
BIN="${BUILD_DIR}/columnar-engine"
Expand All @@ -27,8 +28,19 @@ if [[ ! -f "${COLUMNAR}" ]]; then
exit 2
fi

mkdir -p "$(dirname "${OUTPUT_CSV}")"
mkdir -p "$(dirname "${LOG_FILE}")"
# Создаем директории, только если это реальные файлы, а не /dev/null
if [[ "${OUTPUT_CSV}" != "/dev/null" ]]; then
mkdir -p "$(dirname "${OUTPUT_CSV}")"
fi
if [[ "${LOG_FILE}" != "/dev/null" ]]; then
mkdir -p "$(dirname "${LOG_FILE}")"
fi

# Очищаем кэш ОС для холодного запуска
if [[ "${DROP_CACHE}" == "--cold" ]]; then
sync
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
fi

# Run the query, capture stdout (CSV result) and tee stderr+stdout to log
"${BIN}" query "${COLUMNAR}" "${QUERY_NUM}" > "${OUTPUT_CSV}" 2> >(tee "${LOG_FILE}" >&2)
# Run the query, capture stdout to CSV and stderr to log
"${BIN}" query "${COLUMNAR}" "${QUERY_NUM}" > "${OUTPUT_CSV}" 2> "${LOG_FILE}"
Loading