#!/usr/bin/env python3
"""Recalculate the published measurements; does not run a new benchmark.

Usage: python3 analyze.py benchmark-data.json
Only Python's standard library is required.
"""
from pathlib import Path
import json
import statistics
import sys

path = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(__file__).with_name('benchmark-data.json')
data = json.loads(path.read_text())
metrics = {}
for version in ('2.7.3', '3.0.5'):
    batches = [batch for batch in data['batches'] if batch['version'] == version]
    assert len(batches) == 15, 'Expected 15 batches per version'
    for batch in batches:
        assert batch['helper_sha256'] == data['source_helper_sha256']
        assert len(batch['workflow_ms']) == 10
        assert [call['rows'] for call in batch['calls']] == [1, 7] * 10
        assert abs(statistics.mean(batch['workflow_ms']) - batch['mean_ms']) < 1e-10
    means = [batch['mean_ms'] for batch in batches]
    metrics[version] = {
        'mean_ms_per_audit': statistics.mean(means),
        'median_batch_mean_ms_per_audit': statistics.median(means),
        'maximum_batch_mean_ms_per_audit': max(means),
    }
    for key, value in metrics[version].items():
        assert abs(value - data['summary'][version][key]) < 1e-10

print('| Metric | ProxySQL 2.7.3 | ProxySQL 3.0.5 | Time reduction | Ratio |')
print('|---|---:|---:|---:|---:|')
for key, before in metrics['2.7.3'].items():
    after = metrics['3.0.5'][key]
    print(f'| {key} | {before:.6f} | {after:.6f} | {100 * (1 - after / before):.2f}% | {before / after:.2f}x |')
