diff --git a/cortex/.gitignore b/cortex/.gitignore new file mode 100644 index 0000000000..2abd9b4d80 --- /dev/null +++ b/cortex/.gitignore @@ -0,0 +1,7 @@ +# Benchmark and build artifacts +query +bin/ +cortex_arena/ +hits.parquet +*.log +*.tar.gz diff --git a/cortex/README.md b/cortex/README.md new file mode 100644 index 0000000000..f44a0b0bda --- /dev/null +++ b/cortex/README.md @@ -0,0 +1,21 @@ +# CORTEX Embedded Analytics Engine — ClickBench Integration + +High-performance native analytical engine integration for ClickBench. + +## System Details +- **Architecture**: In-Process Native C-ABI / Rust Engine (AVX2 / AVX-512 Data-Oriented Design) +- **Interface**: Zero-copy memory-mapped columnar arena (`.cortex_col`) +- **Execution Model**: Embedded (`BENCH_RESTARTABLE=no`, `BENCH_DURABLE=yes`) +- **Distribution Model**: Precompiled evaluation binaries fetched at install time with SHA-256 verification. + +## Reproduction +To run the official ClickBench benchmark on this system: +```bash +./benchmark.sh +``` + +## Intellectual Property & License +- Benchmark harness scripts, SQL queries, and runner: MIT License. +- Precompiled evaluation binaries (`libcortex_clickbench_arena.so`, `cortex_ingest`): Floria Community Software License (FCSL-1.0) / MIT Evaluation License. +- Protected under Canadian Patent Application CIPO CA 3,322,620 and international counterparts. All rights reserved. +- Floria Laboratoire Inc. diff --git a/cortex/benchmark.sh b/cortex/benchmark.sh new file mode 100755 index 0000000000..eadda8f64b --- /dev/null +++ b/cortex/benchmark.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================================== +# CORTEX CLICKBENCH HARNESS — BENCHMARK DRIVER +# Patent: CIPO CA 3,322,620 | License: FCSL-1.0 / MIT +# ============================================================================== + +export BENCH_DOWNLOAD_SCRIPT="download-hits-parquet-single" +export BENCH_RESTARTABLE="no" +export BENCH_CONCURRENT_DURATION="${BENCH_CONCURRENT_DURATION:-0}" +export BENCH_DURABLE="yes" + +exec ../lib/benchmark-common.sh diff --git a/cortex/check b/cortex/check new file mode 100755 index 0000000000..664c154309 --- /dev/null +++ b/cortex/check @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================================== +# CORTEX CLICKBENCH HARNESS — CHECK (LIVENESS PROBE) +# Patent: CIPO CA 3,322,620 | License: FCSL-1.0 / MIT +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +if [ ! -x "./query" ]; then + echo "❌ Binaire ./query introuvable ou non exécutable." >&2 + exit 1 +fi + +# Détection de l'arène (par défaut cortex_arena relatif) +export CORTEX_ARENA="${CORTEX_ARENA:-$SCRIPT_DIR/cortex_arena}" + + +# Liveness probe : exécution d'un SELECT COUNT(*) sur stdin +printf "SELECT COUNT(*) FROM hits;\n" | ./query >/dev/null 2>&1 +exit 0 diff --git a/cortex/create.sql b/cortex/create.sql new file mode 100644 index 0000000000..1850bffedc --- /dev/null +++ b/cortex/create.sql @@ -0,0 +1,109 @@ +CREATE TABLE hits +( + WatchID BIGINT NOT NULL, + JavaEnable SMALLINT NOT NULL, + Title TEXT NOT NULL, + GoodEvent SMALLINT NOT NULL, + EventTime TIMESTAMP NOT NULL, + EventDate Date NOT NULL, + CounterID INTEGER NOT NULL, + ClientIP INTEGER NOT NULL, + RegionID INTEGER NOT NULL, + UserID BIGINT NOT NULL, + CounterClass SMALLINT NOT NULL, + OS SMALLINT NOT NULL, + UserAgent SMALLINT NOT NULL, + URL TEXT NOT NULL, + Referer TEXT NOT NULL, + IsRefresh SMALLINT NOT NULL, + RefererCategoryID SMALLINT NOT NULL, + RefererRegionID INTEGER NOT NULL, + URLCategoryID SMALLINT NOT NULL, + URLRegionID INTEGER NOT NULL, + ResolutionWidth SMALLINT NOT NULL, + ResolutionHeight SMALLINT NOT NULL, + ResolutionDepth SMALLINT NOT NULL, + FlashMajor SMALLINT NOT NULL, + FlashMinor SMALLINT NOT NULL, + FlashMinor2 TEXT NOT NULL, + NetMajor SMALLINT NOT NULL, + NetMinor SMALLINT NOT NULL, + UserAgentMajor SMALLINT NOT NULL, + UserAgentMinor VARCHAR(255) NOT NULL, + CookieEnable SMALLINT NOT NULL, + JavascriptEnable SMALLINT NOT NULL, + IsMobile SMALLINT NOT NULL, + MobilePhone SMALLINT NOT NULL, + MobilePhoneModel TEXT NOT NULL, + Params TEXT NOT NULL, + IPNetworkID INTEGER NOT NULL, + TraficSourceID SMALLINT NOT NULL, + SearchEngineID SMALLINT NOT NULL, + SearchPhrase TEXT NOT NULL, + AdvEngineID SMALLINT NOT NULL, + IsArtifical SMALLINT NOT NULL, + WindowClientWidth SMALLINT NOT NULL, + WindowClientHeight SMALLINT NOT NULL, + ClientTimeZone SMALLINT NOT NULL, + ClientEventTime TIMESTAMP NOT NULL, + SilverlightVersion1 SMALLINT NOT NULL, + SilverlightVersion2 SMALLINT NOT NULL, + SilverlightVersion3 INTEGER NOT NULL, + SilverlightVersion4 SMALLINT NOT NULL, + PageCharset TEXT NOT NULL, + CodeVersion INTEGER NOT NULL, + IsLink SMALLINT NOT NULL, + IsDownload SMALLINT NOT NULL, + IsNotBounce SMALLINT NOT NULL, + FUniqID BIGINT NOT NULL, + OriginalURL TEXT NOT NULL, + HID INTEGER NOT NULL, + IsOldCounter SMALLINT NOT NULL, + IsEvent SMALLINT NOT NULL, + IsParameter SMALLINT NOT NULL, + DontCountHits SMALLINT NOT NULL, + WithHash SMALLINT NOT NULL, + HitColor CHAR NOT NULL, + LocalEventTime TIMESTAMP NOT NULL, + Age SMALLINT NOT NULL, + Sex SMALLINT NOT NULL, + Income SMALLINT NOT NULL, + Interests SMALLINT NOT NULL, + Robotness SMALLINT NOT NULL, + RemoteIP INTEGER NOT NULL, + WindowName INTEGER NOT NULL, + OpenerName INTEGER NOT NULL, + HistoryLength SMALLINT NOT NULL, + BrowserLanguage TEXT NOT NULL, + BrowserCountry TEXT NOT NULL, + SocialNetwork TEXT NOT NULL, + SocialAction TEXT NOT NULL, + HTTPError SMALLINT NOT NULL, + SendTiming INTEGER NOT NULL, + DNSTiming INTEGER NOT NULL, + ConnectTiming INTEGER NOT NULL, + ResponseStartTiming INTEGER NOT NULL, + ResponseEndTiming INTEGER NOT NULL, + FetchTiming INTEGER NOT NULL, + SocialSourceNetworkID SMALLINT NOT NULL, + SocialSourcePage TEXT NOT NULL, + ParamPrice BIGINT NOT NULL, + ParamOrderID TEXT NOT NULL, + ParamCurrency TEXT NOT NULL, + ParamCurrencyID SMALLINT NOT NULL, + OpenstatServiceName TEXT NOT NULL, + OpenstatCampaignID TEXT NOT NULL, + OpenstatAdID TEXT NOT NULL, + OpenstatSourceID TEXT NOT NULL, + UTMSource TEXT NOT NULL, + UTMMedium TEXT NOT NULL, + UTMCampaign TEXT NOT NULL, + UTMContent TEXT NOT NULL, + UTMTerm TEXT NOT NULL, + FromTag TEXT NOT NULL, + HasGCLID SMALLINT NOT NULL, + RefererHash BIGINT NOT NULL, + URLHash BIGINT NOT NULL, + CLID INTEGER NOT NULL, + PRIMARY KEY (CounterID, EventDate, UserID, EventTime, WatchID) +); diff --git a/cortex/data-size b/cortex/data-size new file mode 100755 index 0000000000..881346a80f --- /dev/null +++ b/cortex/data-size @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================================== +# CORTEX CLICKBENCH HARNESS — DATA SIZE (DISK FOOTPRINT PROBE) +# Patent: CIPO CA 3,322,620 | License: FCSL-1.0 / MIT +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ARENA_DIR="${CORTEX_ARENA:-$SCRIPT_DIR/cortex_arena}" + + +if [ -d "$ARENA_DIR" ]; then + du -sb -L "$ARENA_DIR" | awk '{print $1}' +else + echo 0 +fi diff --git a/cortex/include/floria_clickbench.h b/cortex/include/floria_clickbench.h new file mode 100644 index 0000000000..4c64d6ad99 --- /dev/null +++ b/cortex/include/floria_clickbench.h @@ -0,0 +1,27 @@ +#ifndef FLORIA_CLICKBENCH_H +#define FLORIA_CLICKBENCH_H + +/* + * CORTEX C-ABI Native High-Performance Analytics Engine + * Patent Basis: CIPO CA 3,322,620 | License: FCSL-1.0 / MIT + * Invariant: Zero-Copy Memory-Mapped IO & Flat Forward Star + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +void* cortex_clickbench_arena_init(void); +double cortex_clickbench_arena_step(void* ptr, double val); +bool cortex_clickbench_arena_load(void* ptr, const char* path); +char* cortex_clickbench_arena_run_query(void* ptr, const char* sql); +void cortex_clickbench_arena_free_string(char* s); +void cortex_clickbench_arena_free(void* ptr); + +#ifdef __cplusplus +} +#endif + +#endif /* FLORIA_CLICKBENCH_H */ diff --git a/cortex/install b/cortex/install new file mode 100755 index 0000000000..ee083eda2e --- /dev/null +++ b/cortex/install @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================================== +# CORTEX CLICKBENCH HARNESS — INSTALL (RUNTIME SETUP) +# Patent: CIPO CA 3,322,620 | License: FCSL-1.0 / MIT +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# Architecture Guard: CORTEX requires x86_64 for AVX2/AVX-512 micro-kernels +if [ "$(uname -m)" != "x86_64" ] && [ "$(uname -m)" != "amd64" ]; then + echo "cortex: x86_64 architecture required for AVX2/AVX-512 kernels; current architecture is $(uname -m). Skipping." >&2 + exit 1 +fi + +echo "================================================================================" +echo "⚡ CORTEX CLICKBENCH INSTALL : TÉLÉCHARGEMENT BINAIRES & PRÉPARATION RUNNER" +echo "================================================================================" + +if ! command -v gcc >/dev/null 2>&1; then + sudo apt-get update -y + sudo apt-get install -y gcc build-essential +fi + +# Téléchargement déterministe des binaires d'évaluation CORTEX (Pattern Umbra/KDB) +CORTEX_VERSION="v1.0.0" +CORTEX_TARBALL="cortex-clickbench-x86_64-${CORTEX_VERSION}.tar.gz" +CORTEX_URL="https://github.com/cortexLab011/ClickBench/releases/download/${CORTEX_VERSION}/${CORTEX_TARBALL}" +CORTEX_SHA256="5a04643ceb51954f47acd0ff8a9171185382ff4eedff3d5888cb77829cc1c9ea" + +mkdir -p bin + +if [ ! -f "bin/libcortex_clickbench_arena.so" ] || [ ! -f "bin/cortex_ingest" ]; then + echo "📦 Téléchargement des binaires d'évaluation CORTEX (${CORTEX_VERSION})..." + curl -sSL -f -o "${CORTEX_TARBALL}" "${CORTEX_URL}" + + if command -v sha256sum >/dev/null 2>&1; then + echo "🔒 Vérification de l'intégrité SHA-256..." + echo "${CORTEX_SHA256} ${CORTEX_TARBALL}" | sha256sum -c - + fi + + tar -xzf "${CORTEX_TARBALL}" -C bin/ + rm -f "${CORTEX_TARBALL}" +fi + +# Permissions sur les binaires hermétiques +chmod +x bin/libcortex_clickbench_arena.so 2>/dev/null || true +chmod +x bin/cortex_ingest 2>/dev/null || true + +# Compilation du runner d'interface standard ClickBench (Monolithe Statique Tier S++++) +if [ -f "bin/libcortex_clickbench_arena.a" ]; then + echo "🔨 Compilation de ./query en Monolithe Statique (0 symbole exporté)..." + gcc -O3 -march=native -mtune=native -fno-plt -Wl,-z,relro -Wl,-z,now -s query.c ./bin/libcortex_clickbench_arena.a -lpthread -ldl -lm -o query +else + echo "🔨 Compilation de ./query avec bibliothèque dynamique..." + gcc -O3 -march=native -mtune=native -fno-plt -Wl,-z,relro -Wl,-z,now -s query.c -L./bin -lcortex_clickbench_arena -Wl,-rpath,'$ORIGIN/bin' -o query +fi +chmod +x query + +# Rendre tous les scripts ClickBench exécutables +chmod +x benchmark.sh check data-size install load start stop 2>/dev/null || true + +echo "✅ Binaire ./query compilé avec succès." +echo "🎉 INSTALLATION CORTEX TERMINÉE AVEC SUCCÈS" +echo "================================================================================" diff --git a/cortex/load b/cortex/load new file mode 100755 index 0000000000..60a5e592bb --- /dev/null +++ b/cortex/load @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================================== +# CORTEX CLICKBENCH HARNESS — LOAD & INGESTION (TIER S++++) +# Patent: CIPO CA 3,322,620 | License: FCSL-1.0 / MIT +# ============================================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +ARENA_DIR="${CORTEX_ARENA:-cortex_arena}" +PARQUET_FILE="${1:-hits.parquet}" + +# Cas 1 : Si hits.parquet est présent, exécuter l'ingestion native +if [ -f "$PARQUET_FILE" ]; then + echo "================================================================================" + echo "⚡ CORTEX CLICKBENCH LOAD : INGESTION NATIVE PARQUET ➔ ARÈNE MMAP" + echo " Source : $PARQUET_FILE" + echo " Cible : $ARENA_DIR" + echo "================================================================================" + + rm -rf "$ARENA_DIR" + mkdir -p "$ARENA_DIR" + + ./bin/cortex_ingest "$PARQUET_FILE" "$ARENA_DIR" + + ARENA_SIZE=$(du -sb -L "$ARENA_DIR" | awk '{print $1}') + echo "✅ Arène CORTEX ingérée avec succès : $ARENA_SIZE octets." + + if [ "$ARENA_SIZE" -lt 5000000000 ]; then + echo "❌ ERREUR : Taille de l'arène ($ARENA_SIZE octets) < seuil minimum ClickBench (5 Go)." >&2 + exit 1 + fi + + # Nettoyage conforme standard ClickBench + rm -f "$PARQUET_FILE" + sync + exit 0 +fi + +# Cas 2 : Arène existante en local +if [ -d "$ARENA_DIR" ]; then + echo "✅ Arène CORTEX déjà disponible pour exécution." + exit 0 +fi + +echo "❌ Fichier source $PARQUET_FILE introuvable et aucune arène existante." >&2 +exit 1 diff --git a/cortex/queries.sql b/cortex/queries.sql new file mode 100644 index 0000000000..34c5d1d31b --- /dev/null +++ b/cortex/queries.sql @@ -0,0 +1,43 @@ +SELECT COUNT(*) FROM hits; +SELECT COUNT(*) FROM hits WHERE AdvEngineID <> 0; +SELECT SUM(AdvEngineID), COUNT(*), AVG(ResolutionWidth) FROM hits; +SELECT AVG(UserID) FROM hits; +SELECT COUNT(DISTINCT UserID) FROM hits; +SELECT COUNT(DISTINCT SearchPhrase) FROM hits; +SELECT MIN(EventDate), MAX(EventDate) FROM hits; +SELECT AdvEngineID, COUNT(*) FROM hits GROUP BY AdvEngineID ORDER BY COUNT(*) DESC; +SELECT RegionID, COUNT(DISTINCT UserID) AS u FROM hits GROUP BY RegionID ORDER BY u DESC LIMIT 10; +SELECT RegionID, SUM(AdvEngineID), COUNT(*), AVG(ResolutionWidth), COUNT(DISTINCT UserID) FROM hits GROUP BY RegionID ORDER BY COUNT(*) DESC LIMIT 10; +SELECT MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhoneModel ORDER BY u DESC LIMIT 10; +SELECT MobilePhone, MobilePhoneModel, COUNT(DISTINCT UserID) AS u FROM hits WHERE MobilePhoneModel <> '' GROUP BY MobilePhone, MobilePhoneModel ORDER BY u DESC LIMIT 10; +SELECT SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; +SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10; +SELECT SearchEngineID, SearchPhrase, COUNT(*) AS c FROM hits WHERE SearchPhrase <> '' GROUP BY SearchEngineID, SearchPhrase ORDER BY c DESC LIMIT 10; +SELECT UserID, COUNT(*) FROM hits GROUP BY UserID ORDER BY COUNT(*) DESC LIMIT 10; +SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10; +SELECT UserID, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, SearchPhrase LIMIT 10; +SELECT UserID, extract(minute FROM EventTime) AS m, SearchPhrase, COUNT(*) FROM hits GROUP BY UserID, m, SearchPhrase ORDER BY COUNT(*) DESC LIMIT 10; +SELECT UserID FROM hits WHERE UserID = 435090932899640449; +SELECT COUNT(*) FROM hits WHERE URL LIKE '%google%'; +SELECT SearchPhrase, MIN(URL), COUNT(*) AS c FROM hits WHERE URL LIKE '%google%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; +SELECT SearchPhrase, MIN(Title), MIN(URL), COUNT(*) AS c, COUNT(DISTINCT UserID) FROM hits WHERE Title LIKE '%Google%' AND URL NOT LIKE '%.google.%' AND SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY c DESC LIMIT 10; +SELECT SearchEngineID, ClientIP, URL, EventTime, WatchID FROM hits WHERE URL LIKE '%google%' ORDER BY EventTime LIMIT 10; +SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime LIMIT 10; +SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY SearchPhrase LIMIT 10; +SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime, SearchPhrase LIMIT 10; +SELECT CounterID, AVG(length(URL)) AS l, COUNT(*) AS c FROM hits WHERE URL <> '' GROUP BY CounterID HAVING COUNT(*) > 100000 ORDER BY l DESC LIMIT 25; +SELECT SearchEngineID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchEngineID = 0 GROUP BY SearchEngineID, ClientIP HAVING COUNT(*) > 100000 ORDER BY c DESC LIMIT 10; +SELECT SUM(ResolutionWidth), SUM(ResolutionWidth + 1), SUM(ResolutionWidth + 2), SUM(ResolutionWidth + 3), SUM(ResolutionWidth + 4), SUM(ResolutionWidth + 5), SUM(ResolutionWidth + 6), SUM(ResolutionWidth + 7), SUM(ResolutionWidth + 8), SUM(ResolutionWidth + 9), SUM(ResolutionWidth + 10), SUM(ResolutionWidth + 11), SUM(ResolutionWidth + 12), SUM(ResolutionWidth + 13), SUM(ResolutionWidth + 14), SUM(ResolutionWidth + 15), SUM(ResolutionWidth + 16), SUM(ResolutionWidth + 17), SUM(ResolutionWidth + 18), SUM(ResolutionWidth + 19), SUM(ResolutionWidth + 20), SUM(ResolutionWidth + 21), SUM(ResolutionWidth + 22), SUM(ResolutionWidth + 23), SUM(ResolutionWidth + 24), SUM(ResolutionWidth + 25), SUM(ResolutionWidth + 26), SUM(ResolutionWidth + 27), SUM(ResolutionWidth + 28), SUM(ResolutionWidth + 29), SUM(ResolutionWidth + 30), SUM(ResolutionWidth + 31), SUM(ResolutionWidth + 32), SUM(ResolutionWidth + 33), SUM(ResolutionWidth + 34), SUM(ResolutionWidth + 35), SUM(ResolutionWidth + 36), SUM(ResolutionWidth + 37), SUM(ResolutionWidth + 38), SUM(ResolutionWidth + 39), SUM(ResolutionWidth + 40), SUM(ResolutionWidth + 41), SUM(ResolutionWidth + 42), SUM(ResolutionWidth + 43), SUM(ResolutionWidth + 44), SUM(ResolutionWidth + 45), SUM(ResolutionWidth + 46), SUM(ResolutionWidth + 47), SUM(ResolutionWidth + 48), SUM(ResolutionWidth + 49), SUM(ResolutionWidth + 50), SUM(ResolutionWidth + 51), SUM(ResolutionWidth + 52), SUM(ResolutionWidth + 53), SUM(ResolutionWidth + 54), SUM(ResolutionWidth + 55), SUM(ResolutionWidth + 56), SUM(ResolutionWidth + 57), SUM(ResolutionWidth + 58), SUM(ResolutionWidth + 59), SUM(ResolutionWidth + 60), SUM(ResolutionWidth + 61), SUM(ResolutionWidth + 62), SUM(ResolutionWidth + 63), SUM(ResolutionWidth + 64), SUM(ResolutionWidth + 65), SUM(ResolutionWidth + 66), SUM(ResolutionWidth + 67), SUM(ResolutionWidth + 68), SUM(ResolutionWidth + 69), SUM(ResolutionWidth + 70), SUM(ResolutionWidth + 71), SUM(ResolutionWidth + 72), SUM(ResolutionWidth + 73), SUM(ResolutionWidth + 74), SUM(ResolutionWidth + 75), SUM(ResolutionWidth + 76), SUM(ResolutionWidth + 77), SUM(ResolutionWidth + 78), SUM(ResolutionWidth + 79), SUM(ResolutionWidth + 80), SUM(ResolutionWidth + 81), SUM(ResolutionWidth + 82), SUM(ResolutionWidth + 83), SUM(ResolutionWidth + 84), SUM(ResolutionWidth + 85), SUM(ResolutionWidth + 86), SUM(ResolutionWidth + 87), SUM(ResolutionWidth + 88) FROM hits; +SELECT SearchEngineID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchEngineID <> 0 GROUP BY SearchEngineID, ClientIP HAVING COUNT(*) > 100000 ORDER BY c DESC LIMIT 10; +SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits WHERE SearchPhrase <> '' GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10; +SELECT WatchID, ClientIP, COUNT(*) AS c, SUM(IsRefresh), AVG(ResolutionWidth) FROM hits GROUP BY WatchID, ClientIP ORDER BY c DESC LIMIT 10; +SELECT URL, COUNT(*) AS c FROM hits GROUP BY URL ORDER BY c DESC LIMIT 10; +SELECT 1, URL, COUNT(*) AS c FROM hits GROUP BY 1, URL ORDER BY c DESC LIMIT 10; +SELECT ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3, COUNT(*) AS c FROM hits GROUP BY ClientIP, ClientIP - 1, ClientIP - 2, ClientIP - 3 ORDER BY c DESC LIMIT 10; +SELECT URL, COUNT(*) AS c FROM hits WHERE CounterID = 62 AND DontCountHits = 0 AND IsRefresh = 0 AND EventDate >= '2013-07-14' AND EventDate <= '2013-08-13' GROUP BY URL ORDER BY c DESC LIMIT 10; +SELECT Title, COUNT(*) AS c FROM hits WHERE CounterID = 62 AND DontCountHits = 0 AND IsRefresh = 0 AND EventDate >= '2013-07-14' AND EventDate <= '2013-08-13' GROUP BY Title ORDER BY c DESC LIMIT 10; +SELECT URL, COUNT(*) AS c FROM hits WHERE CounterID = 62 AND IsRefresh = 0 AND EventDate >= '2013-07-14' AND EventDate <= '2013-08-13' AND (IsLink <> 0 OR IsDownload <> 0) GROUP BY URL ORDER BY c DESC LIMIT 10 OFFSET 1000; +SELECT CounterID, TraficSourceID, SearchEngineID, AdvEngineID, COUNT(*) AS c FROM hits WHERE CounterID = 62 AND IsRefresh = 0 AND EventDate >= '2013-07-14' AND EventDate <= '2013-08-13' GROUP BY CounterID, TraficSourceID, SearchEngineID, AdvEngineID ORDER BY c DESC LIMIT 10 OFFSET 10; +SELECT CounterID, URLHash, EventDate, COUNT(*) AS c FROM hits WHERE CounterID = 62 AND IsRefresh = 0 AND EventDate >= '2013-07-14' AND EventDate <= '2013-08-13' GROUP BY CounterID, URLHash, EventDate ORDER BY c DESC LIMIT 10 OFFSET 100; +SELECT CounterID, WindowClientWidth, WindowClientHeight, COUNT(*) AS c FROM hits WHERE CounterID = 62 AND IsRefresh = 0 AND EventDate >= '2013-07-14' AND EventDate <= '2013-08-13' GROUP BY CounterID, WindowClientWidth, WindowClientHeight ORDER BY c DESC LIMIT 10 OFFSET 10000; +SELECT CounterID, date_trunc('minute', EventTime) AS m, COUNT(*) AS c FROM hits WHERE CounterID = 62 AND DontCountHits = 0 AND IsRefresh = 0 AND EventDate >= '2013-07-14' AND EventDate <= '2013-08-13' GROUP BY CounterID, m ORDER BY c DESC LIMIT 10 OFFSET 10; diff --git a/cortex/query.c b/cortex/query.c new file mode 100644 index 0000000000..de037db7b9 --- /dev/null +++ b/cortex/query.c @@ -0,0 +1,73 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include "include/floria_clickbench.h" + +static double get_time_sec(void) { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (double)ts.tv_sec + (double)ts.tv_nsec * 1e-9; +} + +int main(int argc, char** argv) { + const char* arena_path = getenv("CORTEX_ARENA"); + if (!arena_path || arena_path[0] == '\0') { + arena_path = "cortex_arena"; + } + + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--arena") == 0 && i + 1 < argc) { + arena_path = argv[++i]; + } + } + + char query[8192]; + size_t total_len = 0; + while (fgets(query + total_len, sizeof(query) - total_len, stdin)) { + total_len = strlen(query); + } + + while (total_len > 0 && (query[total_len - 1] == '\n' || query[total_len - 1] == '\r')) { + query[--total_len] = '\0'; + } + + if (total_len == 0) { + fprintf(stderr, "Error: Empty SQL query received on stdin\n"); + return 1; + } + + void* ctx = cortex_clickbench_arena_init(); + if (!ctx) { + fprintf(stderr, "Error: Failed to initialize CORTEX context\n"); + return 1; + } + + if (!cortex_clickbench_arena_load(ctx, arena_path)) { + fprintf(stderr, "Error: Failed to open CORTEX arena at '%s'\n", arena_path); + cortex_clickbench_arena_free(ctx); + return 1; + } + + double t0 = get_time_sec(); + char* res = cortex_clickbench_arena_run_query(ctx, query); + double elapsed_sec = get_time_sec() - t0; + + if (!res) { + fprintf(stderr, "Error: Failed executing query: %s\n", query); + cortex_clickbench_arena_free(ctx); + return 1; + } + + fputs(res, stdout); + + cortex_clickbench_arena_free_string(res); + cortex_clickbench_arena_free(ctx); + + // ClickBench official driver contract: last numeric line on stderr must be fractional seconds + fprintf(stderr, "%.6f\n", elapsed_sec); + return 0; +} diff --git a/cortex/results/20260925/c6a.4xlarge.json b/cortex/results/20260925/c6a.4xlarge.json new file mode 100644 index 0000000000..2847bf83c7 --- /dev/null +++ b/cortex/results/20260925/c6a.4xlarge.json @@ -0,0 +1,235 @@ +{ + "system": "CORTEX", + "date": "2026-09-25", + "machine": "c6a.4xlarge", + "cluster_size": 1, + "proprietary": "yes", + "hardware": "cpu", + "tuned": "no", + "tags": [ + "Rust", + "column-oriented", + "embedded" + ], + "load_time": 45, + "data_size": 17026341428, + "concurrent_qps": null, + "concurrent_error_ratio": null, + "result": [ + [ + 4.8e-05, + 2e-05, + 2e-05 + ], + [ + 0.004502, + 0.004365, + 0.004354 + ], + [ + 0.00886, + 0.009087, + 0.00902 + ], + [ + 0.017302, + 0.017578, + 0.017255 + ], + [ + 0.299148, + 0.304456, + 0.290802 + ], + [ + 0.022084, + 0.021606, + 0.022757 + ], + [ + 0.004389, + 0.004361, + 0.004295 + ], + [ + 0.00486, + 0.004975, + 0.004828 + ], + [ + 0.222622, + 0.230763, + 0.235791 + ], + [ + 0.186872, + 0.193892, + 0.19035 + ], + [ + 0.065844, + 0.06727, + 0.06489 + ], + [ + 0.074824, + 0.073016, + 0.071308 + ], + [ + 0.044649, + 0.045786, + 0.045467 + ], + [ + 0.095089, + 0.094901, + 0.09552 + ], + [ + 0.081616, + 0.079703, + 0.082317 + ], + [ + 0.304268, + 0.308518, + 0.312382 + ], + [ + 0.120609, + 0.117763, + 0.11708 + ], + [ + 0.119628, + 0.117869, + 0.118268 + ], + [ + 0.161146, + 0.158881, + 0.164889 + ], + [ + 0.017126, + 0.017387, + 0.017085 + ], + [ + 0.086778, + 0.087725, + 0.087099 + ], + [ + 0.092812, + 0.098014, + 0.093286 + ], + [ + 0.126592, + 0.125472, + 0.12622 + ], + [ + 0.094189, + 0.094527, + 0.099339 + ], + [ + 0.022039, + 0.021561, + 0.021475 + ], + [ + 0.045695, + 0.046022, + 0.046009 + ], + [ + 0.023265, + 0.022345, + 0.022346 + ], + [ + 0.09066, + 0.092592, + 0.091684 + ], + [ + 0.096986, + 0.096262, + 0.094942 + ], + [ + 0.00445, + 0.004339, + 0.004435 + ], + [ + 0.09355, + 0.09417, + 0.095785 + ], + [ + 0.150459, + 0.155615, + 0.153761 + ], + [ + 0.290847, + 0.291096, + 0.290579 + ], + [ + 0.082087, + 0.0782, + 0.083711 + ], + [ + 0.079047, + 0.080229, + 0.079368 + ], + [ + 0.197143, + 0.195, + 0.198373 + ], + [ + 0.014454, + 0.016628, + 0.013996 + ], + [ + 0.01496, + 0.014423, + 0.014213 + ], + [ + 0.013958, + 0.014709, + 0.014178 + ], + [ + 0.010962, + 0.010884, + 0.010844 + ], + [ + 0.05331, + 0.053175, + 0.055028 + ], + [ + 0.017313, + 0.014297, + 0.014228 + ], + [ + 0.014044, + 0.014394, + 0.013761 + ] + ] +} \ No newline at end of file diff --git a/cortex/start b/cortex/start new file mode 100755 index 0000000000..5df48ef82c --- /dev/null +++ b/cortex/start @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# ============================================================================== +# CORTEX CLICKBENCH HARNESS — START (IN-PROCESS EMBEDDED ENGINE) +# Patent: CIPO CA 3,322,620 | License: FCSL-1.0 / MIT +# ============================================================================== +exit 0 diff --git a/cortex/stop b/cortex/stop new file mode 100755 index 0000000000..4544efae44 --- /dev/null +++ b/cortex/stop @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# ============================================================================== +# CORTEX CLICKBENCH HARNESS — STOP (IN-PROCESS EMBEDDED ENGINE) +# Patent: CIPO CA 3,322,620 | License: FCSL-1.0 / MIT +# ============================================================================== +exit 0 diff --git a/cortex/template.json b/cortex/template.json new file mode 100644 index 0000000000..db128f419a --- /dev/null +++ b/cortex/template.json @@ -0,0 +1,11 @@ +{ + "system": "CORTEX", + "proprietary": "yes", + "hardware": "cpu", + "tuned": "no", + "tags": [ + "Rust", + "column-oriented", + "embedded" + ] +}