name: Rust Benchmarks+Nyrkiö

on:
  workflow_dispatch:
  push:
    branches: ["main", "master", "notmain"]
  pull_request:
    branches: ["main", "notmain", "master"]

env:
  CARGO_TERM_COLOR: never

jobs:
  bench:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v3
      - uses: useblacksmith/setup-node@v5
        with:
          node-version: 20
      #     cache: 'npm'
      # - name: Install dependencies
      #   run: npm install && npm run build

      - name: Bench
        run: make bench-exclude-tpc-h  2>&1 | tee output.txt
      - name: Analyze benchmark result with Nyrkiö
        uses: nyrkio/change-detection@HEAD
        with:
          name: turso
          tool: criterion
          output-file-path: output.txt

          # What to do if a change is immediately detected by Nyrkiö.
          # Note that smaller changes are only detected with delay, usually after a change
          # persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
          # Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
          # on pull events isn't compatible with this workflow being required to pass branch protection.
          fail-on-alert: false
          comment-on-alert: true
          comment-always: true
          # Nyrkiö configuration
          # Get yours from https://nyrkio.com/docs/getting-started
          nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
          # HTTP requests will fail for all non-core contributors that don't have their own token.
          # Don't want that to spoil the build, so:
          never-fail: true
          # Make results and change points public, so that any oss contributor can see them
          nyrkio-public: true

          # parameters of the algorithm. Note: These are global, so we only set them once and for all.
          # Smaller p-value = less change points found. Larger p-value = more, but also more false positives.
          nyrkio-settings-pvalue: 0.00001
          nyrkio-settings-threshold: 0%

  clickbench:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v3
      - uses: useblacksmith/setup-node@v5
        with:
          node-version: 20

      - name: Clickbench
        run: make clickbench

      - name: Analyze TURSO result with Nyrkiö
        uses: nyrkio/change-detection@HEAD
        with:
          name: clickbench/turso
          tool: time
          output-file-path: clickbench-tursodb.txt
          # What to do if a change is immediately detected by Nyrkiö.
          # Note that smaller changes are only detected with delay, usually after a change
          # persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
          # Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
          # on pull events isn't compatible with this workflow being required to pass branch protection.
          fail-on-alert: false
          comment-on-alert: true
          comment-always: true
          # Nyrkiö configuration
          # Get yours from https://nyrkio.com/docs/getting-started
          nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
          # HTTP requests will fail for all non-core contributors that don't have their own token.
          # Don't want that to spoil the build, so:
          never-fail: true
          # Make results and change points public, so that any oss contributor can see them
          nyrkio-public: true
          nyrkio-settings-pvalue: 0.00001
          nyrkio-settings-threshold: 0%

      - name: Analyze SQLITE3 result with Nyrkiö
        uses: nyrkio/change-detection@HEAD
        with:
          name: clickbench/sqlite3
          tool: time
          output-file-path: clickbench-sqlite3.txt
          fail-on-alert: false
          comment-on-alert: true
          comment-always: false
          nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
          never-fail: true
          nyrkio-public: true
          nyrkio-settings-pvalue: 0.00001
          nyrkio-settings-threshold: 0%

  tpc-h-criterion:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    env:
      DB_FILE: "perf/tpc-h/TPC-H.db"
    steps:
      - uses: actions/checkout@v3
      - uses: useblacksmith/rust-cache@v3
        with:
          prefix-key: "v1-rust" # can be updated if we need to reset caches due to non-trivial change in the dependencies (for example, custom env var were set for single workspace project)

      - name: Cache TPC-H
        id: cache-primes
        uses: useblacksmith/cache@v5
        with:
          path: ${{ env.DB_FILE }}
          key: tpc-h
      - name: Download TPC-H
        if: steps.cache-primes.outputs.cache-hit != 'true'
        env:
          DB_URL: "https://github.com/lovasoa/TPCH-sqlite/releases/download/v1.0/TPC-H.db"
        run: wget -O $DB_FILE --no-verbose $DB_URL

      - name: Bench
        run: cargo bench --bench tpc_h_benchmark  2>&1 | tee output.txt
      - name: Analyze benchmark result with Nyrkiö
        uses: nyrkio/change-detection@HEAD
        with:
          name: tpc-h
          tool: criterion
          output-file-path: output.txt

          # What to do if a change is immediately detected by Nyrkiö.
          # Note that smaller changes are only detected with delay, usually after a change
          # persisted over 2-7 commits. Go to nyrkiö.com to view those or configure alerts.
          # Note that Nyrkiö will find all changes, also improvements. This means fail-on-alert
          # on pull events isn't compatible with this workflow being required to pass branch protection.
          fail-on-alert: false
          comment-on-alert: true
          comment-always: true
          # Nyrkiö configuration
          # Get yours from https://nyrkio.com/docs/getting-started
          nyrkio-token: ${{ secrets.NYRKIO_JWT_TOKEN }}
          # HTTP requests will fail for all non-core contributors that don't have their own token.
          # Don't want that to spoil the build, so:
          never-fail: true
          # Make results and change points public, so that any oss contributor can see them
          nyrkio-public: true

          # parameters of the algorithm. Note: These are global, so we only set them once and for all.
          # Smaller p-value = less change points found. Larger p-value = more, but also more false positives.
          nyrkio-settings-pvalue: 0.00001
          nyrkio-settings-threshold: 0%

  tpc-h:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v3
      - name: TPC-H
        run: ./perf/tpc-h/benchmark.sh

  vfs-bench-compile:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v3
      - uses: useblacksmith/rust-cache@v3
        with:
          prefix-key: "v1-rust" # can be updated if we need to reset caches due to non-trivial change in the dependencies (for example, custom env var were set for single workspace project)

      - name: Build
        run: cargo build --release --verbose

      - name: Install uv
        uses: useblacksmith/setup-uv@v4
        with:
          enable-cache: true

      - name: Set up Python
        run: uv python install

      - name: Install the project
        run: uv sync --package turso_test

      - name: Run benchmark
        run: uv run bench-vfs "SELECT 1;" 100
