-
Notifications
You must be signed in to change notification settings - Fork 1
/
analyze.ts
101 lines (93 loc) · 3.21 KB
/
analyze.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import fs from "fs";
import { TestData } from "./src/TestData";
const pwd = process.cwd();
const resultDir = pwd + "/results/";
function parseInput(filename: string) {
const pattern = /Query (?<query>A|B|C) - (?<repeat>\d+)\.input/;
const match = filename.match(pattern);
const query = match?.groups?.query;
const repeat = match?.groups?.repeat;
return {
query,
repeat: parseInt(repeat!),
input: JSON.parse(fs.readFileSync(resultDir + filename).toString()),
};
}
function parseBenchmark(filename: string) {
const pattern = /Query (?<query>A|B|C) - (?<repeat>\d+)\.json/;
const match = filename.match(pattern);
const query = match?.groups?.query;
const repeat = match?.groups?.repeat;
const benchmark = JSON.parse(
fs.readFileSync(resultDir + filename).toString()
);
const map = new Map<string, Array<number>>();
benchmark.results.forEach((result: any) => {
map.set(result.name, result.details.sampleResults);
});
return {
query,
repeat: parseInt(repeat!),
samples: map,
};
}
function parseOutput(filename: string) {
const output = fs.readFileSync(resultDir + filename);
const pattern = /Query (?<query>A|B|C) - (?<repeat>\d+)\.output/;
const match = filename.match(pattern);
const query = match?.groups?.query;
const repeat = match?.groups?.repeat;
switch (query) {
case "A": {
const patternA = /(?<database>\w+) => (?<output>.*)\n/g;
const results = output.toString().matchAll(patternA);
const map = new Map<string, TestData>();
Array.from(results).forEach((result) => {
map.set(result.groups?.database!, JSON.parse(result.groups?.output!));
});
return {
query,
repeat: parseInt(repeat!),
resultsA: map,
};
}
case "B": {
const patternB = /(?<database>\w+) => (?<count>\d*)\n/g;
const results = output.toString().matchAll(patternB);
const map = new Map<string, number>();
Array.from(results).forEach((result) => {
map.set(result.groups?.database!, parseInt(result.groups?.count!));
});
return {
query,
repeat: parseInt(repeat!),
resultsB: map,
};
}
case "C": {
const patternC = /(?<database>\w+) => (?<count>\d*) => (?<output>.*)\n/g;
const results = output.toString().matchAll(patternC);
const map = new Map<string, { furthest: TestData; count: number }>();
Array.from(results).forEach((result) => {
map.set(result.groups?.database!, {
furthest: JSON.parse(result.groups?.output!),
count: parseInt(result.groups?.count!),
});
});
return {
query,
repeat: parseInt(repeat!),
resultsC: map,
};
}
}
}
const fileList = fs.readdirSync(resultDir);
const benchmarkInputs = fileList.filter((file) => file.endsWith(".input"));
const benchmarkResults = fileList.filter((file) => file.endsWith(".json"));
const benchmarkOutput = fileList.filter((file) => file.endsWith(".output"));
const inputs = benchmarkInputs.map(parseInput);
const benchmarks = benchmarkResults.map(parseBenchmark);
const outputs = benchmarkOutput.map(parseOutput);
const queries = ["A", "B", "C"];
const databases = ["MongoDB", "RedisJson", "RedisGeohash", "Stub"];